From 0094fe765add2084821a969530f7c8d9428a6096 Mon Sep 17 00:00:00 2001 From: Redande Date: Wed, 31 Jan 2024 16:42:47 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20rage/ohj?= =?UTF-8?q?elmointi-23@8976423fa39dfcc458f34121e2154e7538b7dd45=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 404.html | 2 +- 404/index.html | 2 +- arvostelu-ja-kokeet/index.html | 4 ++-- commons-042af59ccee387ac69c9.js.map | 1 - ...f59ccee387ac69c9.js => commons-b45a34d9f38c59e43d0c.js | 6 +++--- ...NSE.txt => commons-b45a34d9f38c59e43d0c.js.LICENSE.txt | 0 commons-b45a34d9f38c59e43d0c.js.map | 1 + credits/index.html | 2 +- edit-page/index.html | 2 +- index.html | 4 ++-- kaikki-tehtavat/index.html | 2 +- missing-info/index.html | 2 +- osa-1/1-ohjelmoinnin-aloittaminen/index.html | 4 ++-- osa-1/2-tietoa-kayttajalta/index.html | 4 ++-- osa-1/3-lisaa-muuttujista/index.html | 6 +++--- osa-1/4-laskentaa-luvuilla/index.html | 4 ++-- osa-1/5-ehtorakenne/index.html | 4 ++-- osa-1/index.html | 4 ++-- osa-10/1-luokkahierarkiat/index.html | 4 ++-- osa-10/2-nakyvyysmaareet/index.html | 4 ++-- osa-10/3-olio-ohjelmoinnin-tekniikoita/index.html | 4 ++-- osa-10/4-lisaa-esimerkkeja/index.html | 4 ++-- osa-10/index.html | 4 ++-- osa-11/1-koosteet/index.html | 4 ++-- osa-11/2-lisaa-koosteesta/index.html | 4 ++-- osa-11/3-rekursio/index.html | 4 ++-- osa-11/4-lisaa-esimerkkeja/index.html | 4 ++-- osa-11/index.html | 4 ++-- osa-12/1-funktio-parametrina/index.html | 4 ++-- osa-12/2-generaattorit/index.html | 4 ++-- osa-12/3-funktionaalista-ohjelmointia/index.html | 4 ++-- osa-12/4-saannolliset-lausekkeet/index.html | 4 ++-- osa-12/index.html | 4 ++-- osa-13/1-pygame-kayttoon/index.html | 4 ++-- osa-13/2-animaatio/index.html | 4 ++-- osa-13/3-tapahtumat/index.html | 4 ++-- osa-13/4-lisaa-tekniikoita/index.html | 4 ++-- osa-13/index.html | 4 ++-- osa-14/1-peliprojekti/index.html | 4 ++-- osa-14/2-robo-ja-laatikot/index.html | 4 ++-- osa-14/3-pelin-viimeistely/index.html | 4 ++-- osa-14/4-oma-peli/index.html | 8 ++++---- osa-14/index.html | 4 ++-- osa-2/1-ohjelmoinnin-termeja/index.html | 4 ++-- osa-2/2-else-elif/index.html | 4 ++-- "osa-2/3-ehtojen-yhdist\303\244minen/index.html" | 4 ++-- osa-2/4-yksinkertainen-silmukka/index.html | 4 ++-- osa-2/index.html | 4 ++-- osa-3/1-ehdot-silmukoissa/index.html | 4 ++-- osa-3/2-merkkijonojen-kasittely/index.html | 4 ++-- osa-3/3-lisaa-silmukoista/index.html | 4 ++-- osa-3/4-omat-funktiot/index.html | 4 ++-- osa-3/index.html | 4 ++-- osa-4/1-vscode/index.html | 4 ++-- osa-4/2-lisaa-funktioista/index.html | 4 ++-- osa-4/3-listat/index.html | 4 ++-- osa-4/4-silmukat-ja-iterointi/index.html | 4 ++-- osa-4/5-tulostuksen-muotoilu/index.html | 4 ++-- osa-4/6-lisaa-rakenteista/index.html | 4 ++-- osa-4/index.html | 4 ++-- osa-5/1-lisaa-listoja/index.html | 4 ++-- osa-5/2-viittaukset/index.html | 4 ++-- osa-5/3-dictionary/index.html | 4 ++-- osa-5/4-tuple/index.html | 4 ++-- osa-5/index.html | 4 ++-- osa-6/1-tiedostojen-lukeminen/index.html | 4 ++-- osa-6/2-tiedostojen-kirjoittaminen/index.html | 4 ++-- osa-6/3-virheet/index.html | 4 ++-- osa-6/4-paikalliset-muuttujat/index.html | 4 ++-- osa-6/index.html | 4 ++-- osa-7/1-moduulit/index.html | 4 ++-- osa-7/2-satunnaisuus/index.html | 4 ++-- osa-7/3-aikojen-kasittely/index.html | 4 ++-- osa-7/4-datan-kasittely/index.html | 4 ++-- osa-7/5-omat-moduulit/index.html | 4 ++-- osa-7/6-lisaa-pythonista/index.html | 4 ++-- osa-7/index.html | 4 ++-- osa-8/1-oliot-ja-metodit/index.html | 4 ++-- osa-8/2-luokat-ja-oliot/index.html | 4 ++-- osa-8/3-omat-luokat/index.html | 4 ++-- osa-8/4-metodit-omissa-luokissa/index.html | 4 ++-- osa-8/5-lisaa-esimerkkeja/index.html | 4 ++-- osa-8/index.html | 4 ++-- osa-9/1-oliot-ja-viittaukset/index.html | 4 ++-- osa-9/2-oliot-attribuuttina/index.html | 4 ++-- osa-9/3-kapselointi/index.html | 4 ++-- osa-9/4-metodien-nakyvyys/index.html | 4 ++-- osa-9/5-staattiset-piirteet/index.html | 4 ++-- osa-9/6-lisaa-esimerkkeja/index.html | 4 ++-- osa-9/index.html | 4 ++-- page-data/app-data.json | 2 +- page-data/kaikki-tehtavat/page-data.json | 2 +- .../osa-1/1-ohjelmoinnin-aloittaminen/page-data.json | 2 +- page-data/osa-1/2-tietoa-kayttajalta/page-data.json | 2 +- page-data/osa-1/3-lisaa-muuttujista/page-data.json | 2 +- page-data/osa-1/4-laskentaa-luvuilla/page-data.json | 2 +- page-data/osa-1/5-ehtorakenne/page-data.json | 2 +- page-data/osa-1/page-data.json | 2 +- page-data/osa-10/1-luokkahierarkiat/page-data.json | 2 +- page-data/osa-10/2-nakyvyysmaareet/page-data.json | 2 +- .../osa-10/3-olio-ohjelmoinnin-tekniikoita/page-data.json | 2 +- page-data/osa-10/4-lisaa-esimerkkeja/page-data.json | 2 +- page-data/osa-10/page-data.json | 2 +- page-data/osa-11/1-koosteet/page-data.json | 2 +- page-data/osa-11/2-lisaa-koosteesta/page-data.json | 2 +- page-data/osa-11/3-rekursio/page-data.json | 2 +- page-data/osa-11/4-lisaa-esimerkkeja/page-data.json | 2 +- page-data/osa-11/page-data.json | 2 +- page-data/osa-12/1-funktio-parametrina/page-data.json | 2 +- page-data/osa-12/2-generaattorit/page-data.json | 2 +- .../osa-12/3-funktionaalista-ohjelmointia/page-data.json | 2 +- page-data/osa-12/4-saannolliset-lausekkeet/page-data.json | 2 +- page-data/osa-12/page-data.json | 2 +- page-data/osa-13/1-pygame-kayttoon/page-data.json | 2 +- page-data/osa-13/2-animaatio/page-data.json | 2 +- page-data/osa-13/3-tapahtumat/page-data.json | 2 +- page-data/osa-13/4-lisaa-tekniikoita/page-data.json | 2 +- page-data/osa-13/page-data.json | 2 +- page-data/osa-14/1-peliprojekti/page-data.json | 2 +- page-data/osa-14/2-robo-ja-laatikot/page-data.json | 2 +- page-data/osa-14/3-pelin-viimeistely/page-data.json | 2 +- page-data/osa-14/4-oma-peli/page-data.json | 2 +- page-data/osa-14/page-data.json | 2 +- page-data/osa-2/1-ohjelmoinnin-termeja/page-data.json | 2 +- page-data/osa-2/2-else-elif/page-data.json | 2 +- .../osa-2/3-ehtojen-yhdist\303\244minen/page-data.json" | 2 +- page-data/osa-2/4-yksinkertainen-silmukka/page-data.json | 2 +- page-data/osa-2/page-data.json | 2 +- page-data/osa-3/1-ehdot-silmukoissa/page-data.json | 2 +- page-data/osa-3/2-merkkijonojen-kasittely/page-data.json | 2 +- page-data/osa-3/3-lisaa-silmukoista/page-data.json | 2 +- page-data/osa-3/4-omat-funktiot/page-data.json | 2 +- page-data/osa-3/page-data.json | 2 +- page-data/osa-4/1-vscode/page-data.json | 2 +- page-data/osa-4/2-lisaa-funktioista/page-data.json | 2 +- page-data/osa-4/3-listat/page-data.json | 2 +- page-data/osa-4/4-silmukat-ja-iterointi/page-data.json | 2 +- page-data/osa-4/5-tulostuksen-muotoilu/page-data.json | 2 +- page-data/osa-4/6-lisaa-rakenteista/page-data.json | 2 +- page-data/osa-4/page-data.json | 2 +- page-data/osa-5/1-lisaa-listoja/page-data.json | 2 +- page-data/osa-5/2-viittaukset/page-data.json | 2 +- page-data/osa-5/3-dictionary/page-data.json | 2 +- page-data/osa-5/4-tuple/page-data.json | 2 +- page-data/osa-5/page-data.json | 2 +- page-data/osa-6/1-tiedostojen-lukeminen/page-data.json | 2 +- .../osa-6/2-tiedostojen-kirjoittaminen/page-data.json | 2 +- page-data/osa-6/3-virheet/page-data.json | 2 +- page-data/osa-6/4-paikalliset-muuttujat/page-data.json | 2 +- page-data/osa-6/page-data.json | 2 +- page-data/osa-7/1-moduulit/page-data.json | 2 +- page-data/osa-7/2-satunnaisuus/page-data.json | 2 +- page-data/osa-7/3-aikojen-kasittely/page-data.json | 2 +- page-data/osa-7/4-datan-kasittely/page-data.json | 2 +- page-data/osa-7/5-omat-moduulit/page-data.json | 2 +- page-data/osa-7/6-lisaa-pythonista/page-data.json | 2 +- page-data/osa-7/page-data.json | 2 +- page-data/osa-8/1-oliot-ja-metodit/page-data.json | 2 +- page-data/osa-8/2-luokat-ja-oliot/page-data.json | 2 +- page-data/osa-8/3-omat-luokat/page-data.json | 2 +- page-data/osa-8/4-metodit-omissa-luokissa/page-data.json | 2 +- page-data/osa-8/5-lisaa-esimerkkeja/page-data.json | 2 +- page-data/osa-8/page-data.json | 2 +- page-data/osa-9/1-oliot-ja-viittaukset/page-data.json | 2 +- page-data/osa-9/2-oliot-attribuuttina/page-data.json | 2 +- page-data/osa-9/3-kapselointi/page-data.json | 2 +- page-data/osa-9/4-metodien-nakyvyys/page-data.json | 2 +- page-data/osa-9/5-staattiset-piirteet/page-data.json | 2 +- page-data/osa-9/6-lisaa-esimerkkeja/page-data.json | 2 +- page-data/osa-9/page-data.json | 2 +- profile/index.html | 2 +- report-issue/index.html | 2 +- sanasto/index.html | 2 +- sign-in/index.html | 2 +- sign-up/index.html | 2 +- tuki/index.html | 4 ++-- usein-kysytyt-kysymykset/index.html | 4 ++-- verkkotentti-ohja/index.html | 4 ++-- verkkotentti-ohpe/index.html | 4 ++-- verkkotentti/index.html | 4 ++-- virheilmoitukset/index.html | 4 ++-- ...a329cac6.js => webpack-runtime-e0a18af5b515cd69e75f.js | 4 ++-- ....js.map => webpack-runtime-e0a18af5b515cd69e75f.js.map | 2 +- webpack.stats.json | 2 +- 184 files changed, 274 insertions(+), 274 deletions(-) delete mode 100644 commons-042af59ccee387ac69c9.js.map rename commons-042af59ccee387ac69c9.js => commons-b45a34d9f38c59e43d0c.js (57%) rename commons-042af59ccee387ac69c9.js.LICENSE.txt => commons-b45a34d9f38c59e43d0c.js.LICENSE.txt (100%) create mode 100644 commons-b45a34d9f38c59e43d0c.js.map rename webpack-runtime-f1d78a558bd0a329cac6.js => webpack-runtime-e0a18af5b515cd69e75f.js (97%) rename webpack-runtime-f1d78a558bd0a329cac6.js.map => webpack-runtime-e0a18af5b515cd69e75f.js.map (99%) diff --git a/404.html b/404.html index 21aa29cb2..e05f4fe34 100644 --- a/404.html +++ b/404.html @@ -134,4 +134,4 @@ } } }) -
\ No newline at end of file +
\ No newline at end of file diff --git a/404/index.html b/404/index.html index 5e9c1efe5..aebc8eba8 100644 --- a/404/index.html +++ b/404/index.html @@ -134,4 +134,4 @@ } } }) -
\ No newline at end of file +
\ No newline at end of file diff --git a/arvostelu-ja-kokeet/index.html b/arvostelu-ja-kokeet/index.html index 4f7f0eecd..7ebb75bbd 100644 --- a/arvostelu-ja-kokeet/index.html +++ b/arvostelu-ja-kokeet/index.html @@ -138,7 +138,7 @@ } } }) -

Arvostelu ja kokeet

Kurssit suoritetaan ratkomalla tehtäviä ja osallistumalla lopuksi kokeeseen.

Ohjelmoinnin perusteet koepäivät 2023

Ohjelmoinnin jatkokurssi koepäivät 2023

    +

    Arvostelu ja kokeet

    Kurssit suoritetaan ratkomalla tehtäviä ja osallistumalla lopuksi kokeeseen.

    Ohjelmoinnin perusteet koepäivät 2023

    Ohjelmoinnin jatkokurssi koepäivät 2023

    • Lauantai 20.01.2024
    • Lauantai 24.02.2024

    Tenttiin osallistuminen

    Voit osallistua mihin tahansa kokeeseen, kun olet saanut minimimäärän tehtäviä tehtyä. Käytännössä tämä tarkoittaa, että sinulla tulee olla 25 % kaikista kokeeseen kuuluvien yksittäisten tehtäväkierrosten pisteistä valmiina koepäivän aamuna klo 08.00. Jos teet jatkokurssin tenttiä, kierros 14 pitää olla kokonaan suoritettuna. Jos pisteitä puuttuu, tenttisuoritustasi ei arvioida.

    Pisteitä tarkastellaan erikseen peruskurssin (osat 1-7) ja jatkokurssin (osat 8-14) osalta.

    Kurssilla saa osallistua halutessaan useampaan kokeeseen. Opintorekisteriin jää paras suoritus.

    Tentin järjestelyistä

      @@ -180,4 +180,4 @@ hylätty -

    Arvostelu perustuu sekä tehtyihin tehtäviin (50 % kokonaispisteistä) että kokeeseen (50 % kokonaispisteistä). Tämä tarkoittaa, että arvosteluasteikon kokonaispisteet saadaan laskemalla tämän sivun pistevisualisaation (sininen pallo oikeassa alakulmassa) kurssipisteet ja saamasi koepisteet yhteen.

    Kurssin läpipääsyyn vaaditaan vähintään 25% jokaisen osan ohjelmointitehtävien pisteistä.

    Koeleikkuri

    Kokeesta tulee saada vähintään puolet pisteistä kurssin läpäisemiseksi.

\ No newline at end of file +

Arvostelu perustuu sekä tehtyihin tehtäviin (50 % kokonaispisteistä) että kokeeseen (50 % kokonaispisteistä). Tämä tarkoittaa, että arvosteluasteikon kokonaispisteet saadaan laskemalla tämän sivun pistevisualisaation (sininen pallo oikeassa alakulmassa) kurssipisteet ja saamasi koepisteet yhteen.

Kurssin läpipääsyyn vaaditaan vähintään 25% jokaisen osan ohjelmointitehtävien pisteistä.

Koeleikkuri

Kokeesta tulee saada vähintään puolet pisteistä kurssin läpäisemiseksi.

\ No newline at end of file diff --git a/commons-042af59ccee387ac69c9.js.map b/commons-042af59ccee387ac69c9.js.map deleted file mode 100644 index de3c7153d..000000000 --- a/commons-042af59ccee387ac69c9.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack://ohjelmoinnin-mooc/./node_modules/@babel/runtime/helpers/arrayLikeToArray.js","webpack://ohjelmoinnin-mooc/./node_modules/@babel/runtime/helpers/arrayWithHoles.js","webpack://ohjelmoinnin-mooc/./node_modules/@babel/runtime/helpers/classCallCheck.js","webpack://ohjelmoinnin-mooc/./node_modules/@babel/runtime/helpers/createClass.js","webpack://ohjelmoinnin-mooc/./node_modules/@babel/runtime/helpers/defineProperty.js","webpack://ohjelmoinnin-mooc/./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","webpack://ohjelmoinnin-mooc/./node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteralLoose.js","webpack://ohjelmoinnin-mooc/./node_modules/@babel/runtime/helpers/iterableToArrayLimit.js","webpack://ohjelmoinnin-mooc/./node_modules/@babel/runtime/helpers/nonIterableRest.js","webpack://ohjelmoinnin-mooc/./node_modules/@babel/runtime/helpers/objectWithoutProperties.js","webpack://ohjelmoinnin-mooc/./node_modules/@babel/runtime/helpers/regeneratorRuntime.js","webpack://ohjelmoinnin-mooc/./node_modules/@babel/runtime/helpers/slicedToArray.js","webpack://ohjelmoinnin-mooc/./node_modules/@babel/runtime/helpers/toPrimitive.js","webpack://ohjelmoinnin-mooc/./node_modules/@babel/runtime/helpers/toPropertyKey.js","webpack://ohjelmoinnin-mooc/./node_modules/@babel/runtime/helpers/typeof.js","webpack://ohjelmoinnin-mooc/./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js","webpack://ohjelmoinnin-mooc/./node_modules/@babel/runtime/regenerator/index.js","webpack://ohjelmoinnin-mooc/./node_modules/@fortawesome/react-fontawesome/node_modules/prop-types/factoryWithThrowingShims.js","webpack://ohjelmoinnin-mooc/./node_modules/@fortawesome/react-fontawesome/node_modules/prop-types/index.js","webpack://ohjelmoinnin-mooc/./node_modules/@fortawesome/react-fontawesome/node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack://ohjelmoinnin-mooc/./node_modules/@fortawesome/fontawesome-svg-core/index.mjs","webpack://ohjelmoinnin-mooc/./node_modules/@fortawesome/react-fontawesome/index.es.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/Button/Button.js","webpack://ohjelmoinnin-mooc/./node_modules/react-transition-group/esm/utils/ChildMapping.js","webpack://ohjelmoinnin-mooc/./node_modules/react-transition-group/esm/TransitionGroup.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/ButtonBase/Ripple.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/ButtonBase/TouchRipple.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/ButtonBase/ButtonBase.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/Card/Card.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/CardContent/CardContent.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/internal/svg-icons/Cancel.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/Chip/Chip.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/CircularProgress/CircularProgress.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/Divider/Divider.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/Modal/ModalManager.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/Unstable_TrapFocus/Unstable_TrapFocus.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/Modal/SimpleBackdrop.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/Modal/Modal.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/Paper/Paper.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/Portal/Portal.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/SvgIcon/SvgIcon.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/utils/capitalize.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/utils/createChainedFunction.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/utils/createSvgIcon.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/utils/getScrollbarSize.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/utils/ownerDocument.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/utils/ownerWindow.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/utils/setRef.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/utils/useEventCallback.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/utils/useForkRef.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/utils/useIsFocusVisible.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/helpers/bind.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/utils.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/core/AxiosError.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/env/classes/FormData.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/helpers/toFormData.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/helpers/AxiosURLSearchParams.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/helpers/buildURL.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/core/InterceptorManager.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/platform/browser/index.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/defaults/transitional.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/platform/browser/classes/URLSearchParams.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/platform/browser/classes/FormData.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/helpers/formDataToJSON.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/defaults/index.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/helpers/toURLEncodedForm.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/helpers/parseHeaders.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/core/AxiosHeaders.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/core/transformData.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/cancel/isCancel.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/cancel/CanceledError.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/helpers/cookies.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/core/buildFullPath.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/helpers/isAbsoluteURL.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/helpers/combineURLs.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/helpers/isURLSameOrigin.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/helpers/speedometer.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/adapters/xhr.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/adapters/adapters.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/helpers/null.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/core/settle.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/helpers/parseProtocol.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/core/dispatchRequest.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/core/mergeConfig.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/env/data.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/helpers/validator.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/core/Axios.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/cancel/CancelToken.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/axios.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/helpers/spread.js","webpack://ohjelmoinnin-mooc/./node_modules/axios/lib/helpers/isAxiosError.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/lib/index.js","webpack://ohjelmoinnin-mooc/./node_modules/classnames/index.js","webpack://ohjelmoinnin-mooc/./node_modules/css-unit-converter/index.js","webpack://ohjelmoinnin-mooc/./node_modules/decimal.js-light/decimal.js","webpack://ohjelmoinnin-mooc/./node_modules/fast-equals/dist/fast-equals.js","webpack://ohjelmoinnin-mooc/./node_modules/fetch-polyfill/fetch.js","webpack://ohjelmoinnin-mooc/./node_modules/fetch-ponyfill/build/fetch-browser.js","webpack://ohjelmoinnin-mooc/./node_modules/focus-visible/dist/focus-visible.js","webpack://ohjelmoinnin-mooc/./node_modules/form-data/lib/browser.js","webpack://ohjelmoinnin-mooc/./node_modules/@babel/runtime/helpers/esm/objectSpread.js","webpack://ohjelmoinnin-mooc/./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js","webpack://ohjelmoinnin-mooc/./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","webpack://ohjelmoinnin-mooc/./node_modules/@babel/runtime/helpers/esm/inherits.js","webpack://ohjelmoinnin-mooc/./node_modules/i18next/dist/esm/i18next.js","webpack://ohjelmoinnin-mooc/./node_modules/react-i18next/dist/es/context.js","webpack://ohjelmoinnin-mooc/./node_modules/react-i18next/dist/es/useTranslation.js","webpack://ohjelmoinnin-mooc/./node_modules/react-i18next/dist/es/utils.js","webpack://ohjelmoinnin-mooc/./node_modules/react-i18next/dist/es/withTranslation.js","webpack://ohjelmoinnin-mooc/./node_modules/react-motion/lib/Motion.js","webpack://ohjelmoinnin-mooc/./node_modules/react-motion/lib/StaggeredMotion.js","webpack://ohjelmoinnin-mooc/./node_modules/react-motion/lib/TransitionMotion.js","webpack://ohjelmoinnin-mooc/./node_modules/react-motion/lib/mapToZero.js","webpack://ohjelmoinnin-mooc/./node_modules/react-motion/lib/mergeDiff.js","webpack://ohjelmoinnin-mooc/./node_modules/react-motion/lib/presets.js","webpack://ohjelmoinnin-mooc/./node_modules/react-motion/lib/react-motion.js","webpack://ohjelmoinnin-mooc/./node_modules/react-motion/lib/reorderKeys.js","webpack://ohjelmoinnin-mooc/./node_modules/react-motion/lib/shouldStopAnimation.js","webpack://ohjelmoinnin-mooc/./node_modules/react-motion/lib/spring.js","webpack://ohjelmoinnin-mooc/./node_modules/react-motion/lib/stepper.js","webpack://ohjelmoinnin-mooc/./node_modules/react-motion/lib/stripStyle.js","webpack://ohjelmoinnin-mooc/./node_modules/react-motion/node_modules/performance-now/lib/performance-now.js","webpack://ohjelmoinnin-mooc/./node_modules/react-smooth/node_modules/react-transition-group/CSSTransition.js","webpack://ohjelmoinnin-mooc/./node_modules/react-smooth/node_modules/react-transition-group/ReplaceTransition.js","webpack://ohjelmoinnin-mooc/./node_modules/react-smooth/node_modules/react-transition-group/Transition.js","webpack://ohjelmoinnin-mooc/./node_modules/react-smooth/node_modules/react-transition-group/TransitionGroup.js","webpack://ohjelmoinnin-mooc/./node_modules/react-smooth/node_modules/react-transition-group/index.js","webpack://ohjelmoinnin-mooc/./node_modules/react-smooth/node_modules/react-transition-group/utils/ChildMapping.js","webpack://ohjelmoinnin-mooc/./node_modules/react-smooth/node_modules/react-transition-group/utils/PropTypes.js","webpack://ohjelmoinnin-mooc/./node_modules/react-transition-group/esm/TransitionGroupContext.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/node_modules/eventemitter3/index.js","webpack://ohjelmoinnin-mooc/./node_modules/reduce-css-calc/dist/index.js","webpack://ohjelmoinnin-mooc/./node_modules/reduce-css-calc/dist/lib/convert.js","webpack://ohjelmoinnin-mooc/./node_modules/reduce-css-calc/dist/lib/reducer.js","webpack://ohjelmoinnin-mooc/./node_modules/reduce-css-calc/dist/lib/stringifier.js","webpack://ohjelmoinnin-mooc/./node_modules/reduce-css-calc/dist/parser.js","webpack://ohjelmoinnin-mooc/./node_modules/reduce-css-calc/node_modules/postcss-value-parser/lib/index.js","webpack://ohjelmoinnin-mooc/./node_modules/reduce-css-calc/node_modules/postcss-value-parser/lib/parse.js","webpack://ohjelmoinnin-mooc/./node_modules/reduce-css-calc/node_modules/postcss-value-parser/lib/stringify.js","webpack://ohjelmoinnin-mooc/./node_modules/reduce-css-calc/node_modules/postcss-value-parser/lib/unit.js","webpack://ohjelmoinnin-mooc/./node_modules/reduce-css-calc/node_modules/postcss-value-parser/lib/walk.js","webpack://ohjelmoinnin-mooc/./node_modules/shallowequal/index.js","webpack://ohjelmoinnin-mooc/./node_modules/store/dist/store.legacy.js","webpack://ohjelmoinnin-mooc/./node_modules/store/plugins/json2.js","webpack://ohjelmoinnin-mooc/./node_modules/store/plugins/lib/json2.js","webpack://ohjelmoinnin-mooc/./node_modules/store/src/store-engine.js","webpack://ohjelmoinnin-mooc/./node_modules/store/src/util.js","webpack://ohjelmoinnin-mooc/./node_modules/store/storages/all.js","webpack://ohjelmoinnin-mooc/./node_modules/store/storages/cookieStorage.js","webpack://ohjelmoinnin-mooc/./node_modules/store/storages/localStorage.js","webpack://ohjelmoinnin-mooc/./node_modules/store/storages/memoryStorage.js","webpack://ohjelmoinnin-mooc/./node_modules/store/storages/oldFF-globalStorage.js","webpack://ohjelmoinnin-mooc/./node_modules/store/storages/oldIE-userDataStorage.js","webpack://ohjelmoinnin-mooc/./node_modules/store/storages/sessionStorage.js","webpack://ohjelmoinnin-mooc/./node_modules/@emotion/stylis/dist/stylis.browser.esm.js","webpack://ohjelmoinnin-mooc/./node_modules/@emotion/unitless/dist/unitless.browser.esm.js","webpack://ohjelmoinnin-mooc/./node_modules/styled-components/node_modules/@emotion/memoize/dist/emotion-memoize.esm.js","webpack://ohjelmoinnin-mooc/./node_modules/styled-components/node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js","webpack://ohjelmoinnin-mooc/./node_modules/styled-components/dist/styled-components.browser.esm.js","webpack://ohjelmoinnin-mooc/./node_modules/tmc-client-js/build/index.js","webpack://ohjelmoinnin-mooc/./node_modules/tmc-client-js/build/tmc-client.js","webpack://ohjelmoinnin-mooc/./node_modules/tmc-client-js/build/utils/api.js","webpack://ohjelmoinnin-mooc/./node_modules/tmc-client-js/build/utils/user-store.js","webpack://ohjelmoinnin-mooc/./node_modules/tmc-client-js/node_modules/fetch-ponyfill/build/fetch-browser.js","webpack://ohjelmoinnin-mooc/./node_modules/tmc-client-js/node_modules/store/store.js","webpack://ohjelmoinnin-mooc/./node_modules/uuid/dist/esm-browser/native.js","webpack://ohjelmoinnin-mooc/./node_modules/uuid/dist/esm-browser/rng.js","webpack://ohjelmoinnin-mooc/./node_modules/uuid/dist/esm-browser/stringify.js","webpack://ohjelmoinnin-mooc/./node_modules/uuid/dist/esm-browser/v4.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/fn/regexp/escape.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_a-number-value.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_add-to-unscopables.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_advance-string-index.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_an-instance.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_array-copy-within.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_array-fill.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_array-from-iterable.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_array-includes.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_array-reduce.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-constructor.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-create.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_bind.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_classof.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_collection-strong.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_collection-to-json.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_collection-weak.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_collection.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_core.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_create-property.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_date-to-iso-string.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_date-to-primitive.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_dom-create.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_enum-bug-keys.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_enum-keys.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_export.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_fails-is-regexp.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_fix-re-wks.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_flags.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_flatten-into-array.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_for-of.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_function-to-string.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_global.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_has.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_html.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_ie8-dom-define.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_inherit-if-required.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_invoke.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_iobject.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_is-array-iter.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_is-array.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_is-integer.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_is-regexp.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_iter-call.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_iter-create.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_iter-define.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_iter-detect.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_iter-step.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_iterators.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_library.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_math-expm1.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_math-fround.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_math-log1p.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_math-scale.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_math-sign.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_meta.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_microtask.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_new-promise-capability.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_object-assign.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_object-create.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_object-dps.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_object-forced-pam.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn-ext.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_object-gops.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys-internal.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_object-pie.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_object-to-array.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_own-keys.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_parse-float.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_parse-int.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_perform.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_promise-resolve.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_property-desc.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_redefine-all.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec-abstract.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_regexp-exec.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_replacer.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_same-value.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-from.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-of.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_set-proto.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_set-species.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_set-to-string-tag.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_shared-key.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_shared.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_species-constructor.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_string-at.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_string-context.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_string-pad.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_string-repeat.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_string-trim.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_string-ws.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_task.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_to-absolute-index.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_to-index.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_typed-buffer.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_typed.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_uid.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_user-agent.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_validate-collection.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_wks-define.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_wks-ext.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/core.get-iterator-method.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/core.regexp.escape.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.copy-within.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.every.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.fill.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.filter.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.find-index.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.find.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.for-each.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.from.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.index-of.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.is-array.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.iterator.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.join.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.last-index-of.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.map.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.of.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.reduce-right.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.reduce.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.slice.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.some.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.sort.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.species.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.now.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-iso-string.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-json.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-primitive.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-string.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.bind.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.has-instance.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.name.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.map.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.acosh.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.asinh.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.atanh.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.cbrt.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.clz32.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.cosh.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.expm1.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.fround.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.hypot.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.imul.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log10.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log1p.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log2.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.sign.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.sinh.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.tanh.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.trunc.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.constructor.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.epsilon.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-finite.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-integer.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-nan.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-safe-integer.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.max-safe-integer.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.min-safe-integer.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.parse-float.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.parse-int.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.to-fixed.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.to-precision.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.assign.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.create.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.define-properties.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.define-property.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.freeze.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-own-property-descriptor.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-own-property-names.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-prototype-of.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-extensible.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-frozen.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-sealed.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.keys.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.prevent-extensions.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.seal.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.set-prototype-of.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.to-string.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.parse-float.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.parse-int.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.promise.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.apply.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.construct.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.define-property.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.delete-property.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.enumerate.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get-prototype-of.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.has.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.is-extensible.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.own-keys.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.prevent-extensions.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.set-prototype-of.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.set.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.constructor.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.exec.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.flags.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.match.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.replace.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.search.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.split.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.to-string.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.set.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.anchor.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.big.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.blink.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.bold.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.code-point-at.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.ends-with.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fixed.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fontcolor.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fontsize.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.from-code-point.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.includes.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.italics.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.iterator.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.link.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.raw.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.repeat.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.small.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.starts-with.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.strike.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.sub.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.sup.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.trim.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.symbol.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.array-buffer.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.data-view.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.float32-array.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.float64-array.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int16-array.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int32-array.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int8-array.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint16-array.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint32-array.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint8-array.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint8-clamped-array.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.weak-map.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es6.weak-set.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.flat-map.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.flatten.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.includes.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.asap.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.error.is-error.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.global.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.from.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.of.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.to-json.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.clamp.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.deg-per-rad.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.degrees.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.fscale.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.iaddh.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.imulh.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.isubh.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.rad-per-deg.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.radians.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.scale.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.signbit.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.umulh.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.define-getter.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.define-setter.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.entries.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.get-own-property-descriptors.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.lookup-getter.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.lookup-setter.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.values.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.observable.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.promise.finally.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.promise.try.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.define-metadata.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.delete-metadata.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-metadata-keys.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-metadata.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-own-metadata-keys.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-own-metadata.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.has-metadata.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.has-own-metadata.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.metadata.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.from.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.of.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.to-json.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.at.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.match-all.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.pad-end.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.pad-start.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.trim-left.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.trim-right.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.symbol.async-iterator.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.symbol.observable.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.system.global.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-map.from.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-map.of.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-set.from.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-set.of.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/web.dom.iterable.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/web.immediate.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/modules/web.timers.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/core-js/shim.js","webpack://ohjelmoinnin-mooc/./node_modules/babel-polyfill/node_modules/regenerator-runtime/runtime.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/a-constructor.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/advance-string-index.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/classof.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/correct-prototype-getter.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/create-iter-result-object.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/function-bind-context.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/function-uncurry-this-clause.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/get-iterator-method.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/get-iterator.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/html.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/is-array-iterator-method.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/is-constructor.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/is-regexp.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/iterate.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/iterator-close.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/iterator-create-constructor.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/iterators-core.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/iterators.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/new-promise-capability.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/object-create.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/object-define-properties.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/object-get-prototype-of.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/object-keys.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/perform.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/regexp-exec-abstract.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/regexp-exec.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/regexp-flags.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/regexp-get-flags.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/regexp-sticky-helpers.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/regexp-unsupported-dot-all.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/regexp-unsupported-ncg.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/set-to-string-tag.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/species-constructor.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/string-multibyte.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/to-string-tag-support.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/internals/to-string.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/modules/es.promise.all-settled.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/modules/es.string.match-all.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/modules/esnext.promise.all-settled.js","webpack://ohjelmoinnin-mooc/./node_modules/core-js/modules/esnext.string.match-all.js","webpack://ohjelmoinnin-mooc/./course-settings.js","webpack://ohjelmoinnin-mooc/./src/components/Button.js","webpack://ohjelmoinnin-mooc/./src/components/Container.js","webpack://ohjelmoinnin-mooc/./src/components/Loading.js","webpack://ohjelmoinnin-mooc/./src/components/LoginControls.js","webpack://ohjelmoinnin-mooc/./src/contexes/LoginStateContext.js","webpack://ohjelmoinnin-mooc/./src/contexes/PagesContext.js","webpack://ohjelmoinnin-mooc/./src/services/moocfi.js","webpack://ohjelmoinnin-mooc/./src/services/quizzes.js","webpack://ohjelmoinnin-mooc/./src/i18n.js","webpack://ohjelmoinnin-mooc/./src/components/Logo.js","webpack://ohjelmoinnin-mooc/./src/images/logo.png","webpack://ohjelmoinnin-mooc/./src/util/trackHeight.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/internal/svg-icons/Person.js","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/Avatar/Avatar.js","webpack://ohjelmoinnin-mooc/./src/components/TreeView/TreeViewItem.js","webpack://ohjelmoinnin-mooc/./src/components/TreeView/index.js","webpack://ohjelmoinnin-mooc/./src/util/constants.js","webpack://ohjelmoinnin-mooc/./src/components/Sidebar.js","webpack://ohjelmoinnin-mooc/./src/components/ContentArea.js","webpack://ohjelmoinnin-mooc/./src/components/TopBar.js","webpack://ohjelmoinnin-mooc/./src/images/banner.svg","webpack://ohjelmoinnin-mooc/./src/images/moocfi-logo-bw.png","webpack://ohjelmoinnin-mooc/./src/components/Footer.js","webpack://ohjelmoinnin-mooc/./src/images/uh-logo.png","webpack://ohjelmoinnin-mooc/./node_modules/@material-ui/core/esm/Fab/Fab.js","webpack://ohjelmoinnin-mooc/./src/components/PointsBalloon/PointsBalloonBalloon.js","webpack://ohjelmoinnin-mooc/./src/util/arrays.js","webpack://ohjelmoinnin-mooc/./src/services/progress.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/util/types.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/container/Surface.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/container/Layer.js","webpack://ohjelmoinnin-mooc/./node_modules/react-smooth/es6/setRafTimeout.js","webpack://ohjelmoinnin-mooc/./node_modules/react-smooth/es6/AnimateManager.js","webpack://ohjelmoinnin-mooc/./node_modules/react-smooth/es6/util.js","webpack://ohjelmoinnin-mooc/./node_modules/react-smooth/es6/easing.js","webpack://ohjelmoinnin-mooc/./node_modules/react-smooth/es6/configUpdate.js","webpack://ohjelmoinnin-mooc/./node_modules/react-smooth/es6/Animate.js","webpack://ohjelmoinnin-mooc/./node_modules/react-smooth/es6/AnimateGroupChild.js","webpack://ohjelmoinnin-mooc/./node_modules/react-smooth/es6/AnimateGroup.js","webpack://ohjelmoinnin-mooc/./node_modules/react-smooth/es6/index.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/util/DataUtils.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/component/DefaultTooltipContent.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/util/Global.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/component/Tooltip.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/math.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/symbol/circle.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/symbol/cross.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/symbol/diamond.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/symbol/square.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/symbol/star.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/symbol/triangle.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/symbol/wye.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-path/src/path.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/constant.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/shape/Symbols.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/symbol.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/component/DefaultLegendContent.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/component/Legend.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/noop.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/curve/basis.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/curve/basisClosed.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/curve/basisOpen.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/curve/linearClosed.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/curve/linear.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/curve/monotone.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/curve/natural.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/curve/step.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/array.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/point.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/line.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/area.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/shape/Curve.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/shape/Cross.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/util/PolarUtils.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/shape/Sector.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/shape/Dot.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/shape/Rectangle.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/util/ShallowEqual.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/util/ReactUtils.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/util/DOMUtils.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/component/Text.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/component/Label.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/cartesian/CartesianAxis.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-array/src/range.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-scale/src/init.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-scale/src/ordinal.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-scale/src/band.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts-scale/es6/util/utils.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts-scale/es6/util/arithmetic.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts-scale/es6/getNiceTickValues.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-array/src/ticks.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-array/src/ascending.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-array/src/bisector.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-array/src/number.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-array/src/bisect.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-color/src/define.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-color/src/color.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-interpolate/src/basis.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-interpolate/src/constant.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-interpolate/src/color.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-interpolate/src/rgb.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-interpolate/src/basisClosed.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-interpolate/src/array.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-interpolate/src/date.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-interpolate/src/number.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-interpolate/src/object.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-interpolate/src/string.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-interpolate/src/numberArray.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-interpolate/src/value.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-interpolate/src/round.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-scale/src/number.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-scale/src/continuous.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-scale/src/constant.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-format/src/formatSpecifier.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-format/src/formatPrefixAuto.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-format/src/formatDecimal.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-format/src/exponent.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-format/src/formatRounded.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-format/src/formatTypes.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-format/src/identity.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-format/src/locale.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-format/src/defaultLocale.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-format/src/formatGroup.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-format/src/formatNumerals.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-format/src/formatTrim.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-scale/src/tickFormat.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-format/src/precisionPrefix.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-format/src/precisionRound.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-format/src/precisionFixed.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-scale/src/linear.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-scale/src/identity.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-scale/src/nice.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-scale/src/log.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-scale/src/symlog.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-scale/src/pow.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-scale/src/radial.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-array/src/max.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-array/src/min.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-array/src/quickselect.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-array/src/quantile.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-scale/src/quantile.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-scale/src/quantize.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-scale/src/threshold.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-time/src/duration.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-time/src/interval.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-time/src/millisecond.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-time/src/second.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-time/src/minute.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-time/src/hour.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-time/src/day.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-time/src/week.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-time/src/month.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-time/src/year.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-time/src/utcMinute.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-time/src/utcHour.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-time/src/utcDay.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-time/src/utcWeek.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-time/src/utcMonth.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-time/src/utcYear.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-time/src/ticks.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-time-format/src/locale.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-time-format/src/defaultLocale.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-scale/src/time.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-scale/src/utcTime.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-scale/src/sequential.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-scale/src/sequentialQuantile.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-interpolate/src/piecewise.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-scale/src/diverging.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/offset/none.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/order/none.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/stack.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/util/ChartUtils.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/offset/expand.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/offset/silhouette.js","webpack://ohjelmoinnin-mooc/./node_modules/d3-shape/src/offset/wiggle.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/util/CssPrefixUtils.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/cartesian/Brush.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/util/IfOverflowMatches.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/util/CartesianUtils.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/util/LogUtils.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/cartesian/ReferenceDot.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/cartesian/ReferenceLine.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/cartesian/ReferenceArea.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/util/DetectReferenceElementsDomain.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/util/Events.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/chart/generateCategoricalChart.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/cartesian/ErrorBar.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/component/Cell.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/component/LabelList.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/cartesian/Bar.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/cartesian/XAxis.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/cartesian/YAxis.js","webpack://ohjelmoinnin-mooc/./node_modules/recharts/es6/chart/BarChart.js","webpack://ohjelmoinnin-mooc/./src/components/PointsBalloon/CustomTooltip.js","webpack://ohjelmoinnin-mooc/./src/components/PointsBalloon/PartProgress.js","webpack://ohjelmoinnin-mooc/./src/components/PointsBalloon/CourseProgress.js","webpack://ohjelmoinnin-mooc/./src/components/PointsBalloon/PointsBalloonContent.js","webpack://ohjelmoinnin-mooc/./src/components/PointsBalloon/index.js","webpack://ohjelmoinnin-mooc/./src/templates/Layout.js","webpack://ohjelmoinnin-mooc/./src/util/strings.js","webpack://ohjelmoinnin-mooc/./src/util/withSimpleErrorBoundary.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_DataView.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_Hash.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_ListCache.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_Map.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_MapCache.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_Promise.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_Set.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_SetCache.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_Stack.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_Symbol.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_Uint8Array.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_WeakMap.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_apply.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_arrayEvery.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_arrayFilter.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_arrayIncludes.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_arrayIncludesWith.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_arrayLikeKeys.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_arrayMap.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_arrayPush.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_arraySome.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_asciiToArray.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_assocIndexOf.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseAssignValue.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseEach.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseEvery.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseExtremum.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseFindIndex.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseFlatten.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseFor.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseForOwn.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseGet.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseGetAllKeys.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseGetTag.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseGt.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseHasIn.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseIndexOf.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseIsArguments.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseIsEqual.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseIsEqualDeep.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseIsMatch.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseIsNaN.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseIsNative.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseIsTypedArray.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseIteratee.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseKeys.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseLt.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseMap.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseMatches.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseMatchesProperty.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseOrderBy.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseProperty.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_basePropertyDeep.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseRange.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseRest.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseSetToString.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseSlice.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseSome.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseSortBy.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseTimes.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseToString.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseTrim.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseUnary.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_baseUniq.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_cacheHas.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_castPath.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_castSlice.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_compareAscending.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_compareMultiple.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_coreJsData.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_createBaseEach.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_createBaseFor.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_createCaseFirst.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_createFind.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_createRange.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_createSet.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_defineProperty.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_equalArrays.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_equalByTag.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_equalObjects.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_freeGlobal.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_getAllKeys.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_getMapData.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_getMatchData.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_getNative.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_getRawTag.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_getSymbols.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_getTag.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_getValue.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_hasPath.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_hasUnicode.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_hashClear.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_hashDelete.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_hashGet.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_hashHas.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_hashSet.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_isFlattenable.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_isIndex.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_isIterateeCall.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_isKey.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_isKeyable.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_isMasked.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_isPrototype.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_isStrictComparable.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_listCacheClear.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_listCacheDelete.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_listCacheGet.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_listCacheHas.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_listCacheSet.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_mapCacheClear.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_mapCacheDelete.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_mapCacheGet.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_mapCacheHas.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_mapCacheSet.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_mapToArray.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_matchesStrictComparable.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_memoizeCapped.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_nativeCreate.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_nativeKeys.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_nodeUtil.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_objectToString.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_overArg.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_overRest.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_root.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_setCacheAdd.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_setCacheHas.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_setToArray.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_setToString.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_shortOut.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_stackClear.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_stackDelete.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_stackGet.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_stackHas.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_stackSet.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_strictIndexOf.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_stringToArray.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_stringToPath.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_toKey.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_toSource.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_trimmedEndIndex.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/_unicodeToArray.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/constant.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/debounce.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/eq.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/every.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/find.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/findIndex.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/flatMap.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/get.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/hasIn.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/identity.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/isArguments.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/isArray.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/isArrayLike.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/isBoolean.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/isBuffer.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/isEqual.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/isFunction.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/isLength.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/isNaN.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/isNil.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/isNumber.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/isObject.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/isObjectLike.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/isString.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/isSymbol.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/isTypedArray.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/keys.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/last.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/map.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/mapValues.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/max.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/memoize.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/min.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/noop.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/now.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/property.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/range.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/some.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/sortBy.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/stubArray.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/stubFalse.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/throttle.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/toFinite.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/toInteger.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/toNumber.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/toString.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/uniqBy.js","webpack://ohjelmoinnin-mooc/./node_modules/lodash/upperFirst.js","webpack://ohjelmoinnin-mooc/./node_modules/react-smooth/node_modules/dom-helpers/class/addClass.js","webpack://ohjelmoinnin-mooc/./node_modules/react-smooth/node_modules/dom-helpers/class/hasClass.js","webpack://ohjelmoinnin-mooc/./node_modules/react-smooth/node_modules/dom-helpers/class/removeClass.js"],"names":["module","exports","arr","len","length","i","arr2","Array","__esModule","isArray","instance","Constructor","TypeError","toPropertyKey","_defineProperties","target","props","descriptor","enumerable","configurable","writable","Object","defineProperty","key","protoProps","staticProps","prototype","obj","value","asyncGeneratorStep","gen","resolve","reject","_next","_throw","arg","info","error","done","Promise","then","_asyncToGenerator","fn","self","this","args","arguments","apply","err","undefined","_taggedTemplateLiteralLoose","strings","raw","slice","_i","Symbol","iterator","_s","_e","_x","_r","_arr","_n","_d","call","next","push","objectWithoutPropertiesLoose","source","excluded","getOwnPropertySymbols","sourceSymbolKeys","indexOf","propertyIsEnumerable","_typeof","_regeneratorRuntime","Op","hasOwn","hasOwnProperty","desc","$Symbol","iteratorSymbol","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","define","wrap","innerFn","outerFn","tryLocsList","protoGenerator","Generator","generator","create","context","Context","makeInvokeMethod","tryCatch","type","ContinueSentinel","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","getPrototypeOf","NativeIteratorPrototype","values","Gp","defineIteratorMethods","forEach","method","_invoke","AsyncIterator","PromiseImpl","invoke","record","result","__await","unwrapped","previousPromise","callInvokeWithMethodAndArg","state","Error","doneResult","delegate","delegateResult","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","methodName","resultName","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","displayName","isGeneratorFunction","genFun","ctor","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","iter","keys","val","object","reverse","pop","skipTempReset","prev","charAt","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","arrayWithHoles","iterableToArrayLimit","unsupportedIterableToArray","nonIterableRest","input","hint","prim","toPrimitive","res","String","Number","arrayLikeToArray","o","minLen","n","toString","from","test","runtime","regeneratorRuntime","accidentalStrictMode","globalThis","Function","ReactPropTypesSecret","emptyFunction","emptyFunctionWithReset","resetWarningCache","shim","propName","componentName","location","propFullName","secret","getShim","isRequired","ReactPropTypes","array","bigint","bool","func","number","string","symbol","any","arrayOf","element","elementType","instanceOf","node","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes","PropTypes","ownKeys","enumerableOnly","symbols","filter","sym","getOwnPropertyDescriptor","_objectSpread2","_defineProperty","getOwnPropertyDescriptors","defineProperties","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","_toConsumableArray","_arrayLikeToArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","noop","_WINDOW","_DOCUMENT","_MUTATION_OBSERVER","_PERFORMANCE","measure","window","document","MutationObserver","performance","e","_familyProxy","_familyProxy2","_familyProxy3","_familyProxy4","_familyProxy5","_ref$userAgent","navigator","userAgent","WINDOW","DOCUMENT","MUTATION_OBSERVER","PERFORMANCE","IS_DOM","documentElement","head","addEventListener","createElement","IS_IE","NAMESPACE_IDENTIFIER","DEFAULT_REPLACEMENT_CLASS","DATA_FA_I2SVG","DATA_FA_PSEUDO_ELEMENT","DATA_PREFIX","DATA_ICON","HTML_CLASS_I2SVG_BASE_CLASS","TAGNAMES_TO_SKIP_FOR_PSEUDOELEMENTS","PRODUCTION","FAMILY_CLASSIC","FAMILY_SHARP","FAMILIES","familyProxy","Proxy","get","prop","PREFIX_TO_STYLE","STYLE_TO_PREFIX","PREFIX_TO_LONG_STYLE","LONG_STYLE_TO_PREFIX","ICON_SELECTION_SYNTAX_PATTERN","LAYERS_TEXT_CLASSNAME","FONT_FAMILY_PATTERN","FONT_WEIGHT_TO_PREFIX","oneToTen","oneToTwenty","concat","ATTRIBUTES_WATCHED_FOR_MUTATION","DUOTONE_CLASSES","prefixes","Set","map","add","bind","RESERVED_CLASSES","initial","FontAwesomeConfig","querySelector","_ref","_ref2","attr","coerce","getAttribute","getAttrConfig","_default","styleDefault","familyDefault","cssPrefix","replacementClass","autoReplaceSvg","autoAddCss","autoA11y","searchPseudoElements","observeMutations","mutateApproach","keepOriginalSource","measurePerformance","showMissingIcons","familyPrefix","_config","config","set","_onChangeCb","cb","d","meaninglessTransform","size","x","y","rotate","flipX","flipY","nextUniqueId","id","Math","random","toArray","classArray","classList","split","htmlEscape","str","replace","joinStyles","styles","reduce","acc","styleName","trim","transformIsMeaningful","transform","css","dcp","drc","fp","rc","s","dPatt","RegExp","customPropPatt","rPatt","_cssInserted","ensureCss","style","setAttribute","innerHTML","headChildren","childNodes","beforeChild","child","tagName","toUpperCase","insertBefore","insertCss","InjectCSS","mixout","dom","hooks","beforeDOMElementCreation","beforeI2svg","w","shims","namespace","functions","loaded","domready","setTimeout","toHtml","abstractNodes","tag","_abstractNodes$attrib","attributes","_abstractNodes$childr","children","attributeName","joinAttributes","join","iconFromMapping","mapping","prefix","iconName","icon","doScroll","readyState","listener","removeEventListener","subject","initialValue","thisContext","a","b","c","bindInternal4","toHex","unicode","decoded","output","counter","charCodeAt","extra","ucs2decode","normalizeIcons","icons","defineIcons","params","_params$skipHooks","skipHooks","normalized","addPack","_LONG_STYLE","_PREFIXES","_PREFIXES_FOR_FAMILY","LONG_STYLE","_defaultUsablePrefix","_byUnicode","_byLigature","_byOldName","_byOldUnicode","_byAlias","PREFIXES","getIconName","cls","parts","build","lookup","reducer","alias","aliases","hasRegular","autoFetchSvg","shimLookups","maybeNameMaybeUnicode","names","unicodes","getCanonicalPrefix","family","byUnicode","byAlias","byOldName","getDefaultUsablePrefix","styleOrPrefix","_params$family","defined","PREFIXES_FOR_FAMILY","getCanonicalIcon","_famProps","_params$skipLookups","skipLookups","famProps","givenPrefix","includes","some","v","canonical","rest","aliasIconName","Library","_classCallCheck","definitions","_this","_len","_key","additions","_pullDefinitions","longPrefix","definition","_normalized$key","_plugins","_hooks","providers","defaultProviderKeys","chainHooks","hook","accumulator","hookFns","hookFn","callHooks","_len2","_key2","callProvided","findIconDefinition","iconLookup","library","i2svg","watch","autoReplaceSvgRoot","autoReplace","api","noAuto","parse","_icon","match","canonicalIcon","_prefix","_params$autoReplaceSv","domVariants","abstractCreator","abstract","container","html","makeInlineSvgAbstract","_params$icons","main","mask","title","maskId","titleId","_params$watchable","watchable","found","width","height","isUploadedIcon","attrClass","classes","content","role","uploadedIconWidthStyle","asSymbol","offset","asIcon","makeLayersTextAbstract","_params$watchable2","_ref2$width","_ref2$height","_ref2$startCentered","startCentered","transformForCss","styleString","class","makeLayersCounterAbstract","styles$1","asFoundIcon","vectorData","fill","missingIconResolutionMixin","findIcon","console","maybeNotifyMissing","noop$1","p","preamble","end","perf","noop$2","isWatched","createElementNS","convertSVG","abstractObj","_params$ceFn","ceFn","createTextNode","appendChild","mutators","mutation","parentNode","comment","createComment","outerHTML","nodeAsComment","replaceChild","remove","nest","forSvg","splitClasses","toSvg","toNode","removeAttribute","newInnerHTML","performOperationSync","op","perform","mutations","callback","callbackFunction","frame","requestAnimationFrame","mutator","disabled","disableObservation","enableObservation","mo","observe","options","_options$treeCallback","treeCallback","_options$nodeCallback","nodeCallback","_options$pseudoElemen","pseudoElementsCallback","_options$observeMutat","observeMutationsRoot","objects","defaultPrefix","mutationRecord","addedNodes","hasPrefixAndIcon","_getCanonicalIcon","contains","childList","characterData","subtree","styleParser","classParser","ligature","existingPrefix","existingIconName","innerText","firstChild","nodeType","Node","TEXT_NODE","data","attributesParser","extraAttributes","parseMeta","parser","_classParser","extraClasses","pluginMeta","extraStyles","styles$2","generateMutation","nodeMeta","knownPrefixes","onTree","root","htmlClassList","hclAdd","suffix","hclRemove","f","prefixesDomQuery","candidates","querySelectorAll","all","resolvedMutations","catch","onNode","render","iconDefinition","_params$transform","_params$symbol","_params$mask","_params$maskId","_params$title","_params$titleId","_params$classes","_params$attributes","_params$styles","ReplaceElements","maybeIconDefinition","mutationObserverCallbacks","provides","providers$$1","_params$node","_params$callback","generateSvgReplacementMutation","generateAbstractIcon","_ref3","nextChild","containerWidth","iconWidth","Layers","layer","assembler","LayersCounter","LayersText","text","generateLayersText","computedFontSize","parseInt","getComputedStyle","fontSize","boundingClientRect","getBoundingClientRect","CLEAN_CONTENT_PATTERN","SECONDARY_UNICODE_RANGE","replaceForPosition","position","pendingAttribute","oldUnicode","newUnicode","alreadyProcessedPseudoElement","fontFamily","getPropertyValue","fontWeight","removeChild","_content","toLowerCase","_hexValueFromContent","index","second","first","cleaned","codePoint","isPrependTen","isDoubled","isSecondary","hexValueFromContent","hexValue","isV4","startsWith","iconIdentifier","iconName4","meta","processable","operations","_unwatched","parseTransformString","transformString","parseFloat","PowerTransforms","parseNodeAttributes","generateAbstractTransformGrouping","outer","innerTranslate","innerScale","innerRotate","inner","path","ALL_SPACE","fillBlack","force","Masks","maskData","generateAbstractMask","explicitMaskId","mainWidth","mainPath","maskWidth","maskPath","trans","transformForSvg","maskRect","maskInnerGroupChildrenMixin","maskInnerGroup","maskOuterGroup","clipId","maskTag","maskUnits","maskContentUnits","defs","MissingIconIndicator","reduceMotion","matchMedia","matches","missingIconAbstract","gChildren","FILL","ANIMATION_BASE","attributeType","repeatCount","dur","OPACITY_ANIMATE","dot","cx","cy","r","opacity","nextPlugins","mixoutsTo","k","plugin","tk","sk","registerPlugins","pseudoElements2svg","unwatch","bootstrap","disconnect","symbolData","config$1","parse$1","_objectWithoutProperties","sourceKeys","_objectWithoutPropertiesLoose","camelize","chr","substr","_excluded","styleToObject","pair","normalizeIconArgs","objectWithKey","FontAwesomeIcon","ref","iconArgs","maskArgs","className","_classes","beat","fade","beatFade","bounce","shake","flash","spin","spinPulse","spinReverse","pulse","fixedWidth","inverse","border","listItem","flip","rotation","pull","swapOpacity","renderedIcon","_console","log","extraProps","defaultProps","convertCurry","propTypes","convert","mixins","attrs","_extraProps$style","existingStyle","remaining","Button","_props$color","color","_props$component","component","_props$disabled","_props$disableElevati","disableElevation","_props$disableFocusRi","disableFocusRipple","endIconProp","endIcon","focusVisibleClassName","_props$fullWidth","fullWidth","_props$size","startIconProp","startIcon","_props$type","_props$variant","variant","other","colorInherit","focusRipple","focusVisible","label","theme","typography","button","boxSizing","minWidth","padding","borderRadius","palette","primary","transition","transitions","duration","short","textDecoration","backgroundColor","action","hoverOpacity","display","alignItems","justifyContent","textPrimary","textSecondary","secondary","outlined","disabledBackground","outlinedPrimary","outlinedSecondary","contained","getContrastText","grey","boxShadow","shadows","A100","containedPrimary","contrastText","dark","containedSecondary","borderColor","textSizeSmall","pxToRem","textSizeLarge","outlinedSizeSmall","outlinedSizeLarge","containedSizeSmall","containedSizeLarge","sizeSmall","sizeLarge","marginRight","marginLeft","iconSizeSmall","iconSizeMedium","iconSizeLarge","getChildMapping","mapFn","Children","isValidElement","mapper","getProp","getNextChildMapping","nextProps","prevChildMapping","onExited","nextChildMapping","getValueForKey","nextKeysPending","pendingKeys","prevKey","childMapping","nextKey","pendingNextKey","mergeChildMappings","hasPrev","hasNext","prevChild","isLeaving","in","cloneElement","exit","enter","TransitionGroup","_React$Component","handleExited","contextValue","isMounting","firstRender","_proto","componentDidMount","mounted","setState","componentWillUnmount","getDerivedStateFromProps","appear","currentChildMapping","_this$props","Component","childFactory","TransitionGroupContext","useEnhancedEffect","_props$pulsate","pulsate","rippleX","rippleY","rippleSize","inProp","_props$onExited","timeout","_React$useState","leaving","setLeaving","rippleClassName","ripple","rippleVisible","ripplePulsate","rippleStyles","top","left","childClassName","childLeaving","childPulsate","useEventCallback","timeoutId","clearTimeout","TouchRipple","_props$center","center","centerProp","ripples","setRipples","rippleCallback","current","ignoringMouseDown","startTimer","startTimerCommit","startCommit","oldRipples","start","event","_options$pulsate","_options$center","_options$fakeElement","fakeElement","rect","clientX","clientY","touches","round","sqrt","pow","sizeX","max","abs","clientWidth","sizeY","clientHeight","persist","withStyles","overflow","pointerEvents","zIndex","right","bottom","animation","easing","easeInOut","animationDuration","shorter","ButtonBase","buttonRefProp","buttonRef","_props$centerRipple","centerRipple","_props$disableRipple","disableRipple","_props$disableTouchRi","disableTouchRipple","_props$focusRipple","onBlur","onClick","onFocus","onFocusVisible","onKeyDown","onKeyUp","onMouseDown","onMouseLeave","onMouseUp","onTouchEnd","onTouchMove","onTouchStart","onDragLeave","_props$tabIndex","tabIndex","TouchRippleProps","rippleRef","setFocusVisible","_useIsFocusVisible","useIsFocusVisible","isFocusVisible","onBlurVisible","focusVisibleRef","useRippleHandler","rippleAction","eventCallback","skipRippleAction","focus","handleMouseDown","handleDragLeave","handleMouseUp","handleMouseLeave","preventDefault","handleTouchStart","handleTouchEnd","handleTouchMove","handleBlur","handleFocus","currentTarget","isNonNativeButton","href","keydownRef","handleKeyDown","handleKeyUp","defaultPrevented","ComponentProp","buttonProps","handleUserRef","useForkRef","handleOwnRef","handleRef","_React$useState2","mountedState","setMountedState","enableTouchRipple","WebkitTapHighlightColor","outline","margin","cursor","userSelect","verticalAlign","borderStyle","colorAdjust","Card","_props$raised","raised","elevation","CardContent","paddingBottom","isDeleteKeyboardEvent","keyboardEvent","Chip","avatarProp","avatar","clickableProp","clickable","deleteIconProp","deleteIcon","iconProp","onDelete","chipRef","handleDeleteIconClick","stopPropagation","small","moreProps","customClasses","capitalize","deleteIconSmall","Cancel","avatarSmall","iconSmall","deletable","blur","labelSmall","deleteIconColor","whiteSpace","colorPrimary","colorSecondary","clickableColorPrimary","clickableColorSecondary","deletableColorPrimary","deletableColorSecondary","avatarColorPrimary","avatarColorSecondary","iconColorPrimary","iconColorSecondary","textOverflow","paddingLeft","paddingRight","deleteIconColorPrimary","deleteIconColorSecondary","deleteIconOutlinedColorPrimary","deleteIconOutlinedColorSecondary","SIZE","CircularProgress","_props$disableShrink","disableShrink","_props$thickness","thickness","_props$value","circleStyle","rootStyle","rootProps","circumference","PI","strokeDasharray","toFixed","strokeDashoffset","determinate","indeterminate","static","svg","viewBox","circle","circleDisableShrink","circleDeterminate","circleIndeterminate","circleStatic","strokeWidth","stroke","transformOrigin","Divider","_props$absolute","absolute","_props$flexItem","flexItem","_props$light","light","_props$orientation","orientation","_props$role","vertical","flexShrink","divider","inset","middle","spacing","alignSelf","ariaHidden","show","getPaddingRight","ariaHiddenSiblings","mountNode","currentNode","nodesToExclude","blacklist","blacklistTagNames","findIndexOf","containerInfo","idx","item","handleContainer","fixedNodes","restoreStyle","restorePaddings","disableScrollLock","doc","ownerDocument","body","ownerWindow","innerWidth","scrollHeight","isOverflowing","scrollbarSize","getScrollbarSize","el","parent","parentElement","scrollContainer","nodeName","removeProperty","setProperty","ModalManager","modals","containers","modal","modalIndex","modalRef","hiddenSiblingNodes","hiddenSiblings","getHiddenSiblings","containerIndex","restore","splice","nextTop","_props$disableAutoFoc","disableAutoFocus","_props$disableEnforce","disableEnforceFocus","_props$disableRestore","disableRestoreFocus","getDoc","isEnabled","open","ignoreNextEnforceFocus","sentinelStart","sentinelEnd","nodeToRestore","rootRef","prevOpenRef","activeElement","hasAttribute","contain","hasFocus","loopFocus","keyCode","shiftKey","interval","setInterval","clearInterval","invisible","_props$invisible","defaultManager","inProps","useTheme","getThemeProps","_props$BackdropCompon","BackdropComponent","BackdropProps","_props$closeAfterTran","closeAfterTransition","_props$disableBackdro","disableBackdropClick","_props$disableEscapeK","disableEscapeKeyDown","_props$disablePortal","disablePortal","_props$disableScrollL","_props$hideBackdrop","hideBackdrop","_props$keepMounted","keepMounted","_props$manager","manager","onBackdropClick","onClose","onEscapeKeyDown","onRendered","exited","setExited","mountNodeRef","hasTransition","getHasTransition","getModal","handleMounted","mount","scrollTop","handleOpen","resolvedContainer","getContainer","isTopModal","handlePortalRef","handleClose","inlineStyle","hidden","visibility","childProps","onEnter","createChainedFunction","Portal","Paper","_props$square","square","_props$elevation","rounded","elevations","shadow","background","paper","setMountNode","SvgIcon","_props$fontSize","htmlColor","titleAccess","_props$viewBox","focusable","muiName","colorAction","active","colorError","colorDisabled","fontSizeInherit","fontSizeSmall","fontSizeLarge","funcs","createSvgIcon","scrollDiv","offsetWidth","defaultView","setRef","refA","refB","refValue","hadKeyboardEvent","hadFocusVisibleRecently","hadFocusVisibleRecentlyTimeout","inputTypesWhitelist","search","url","tel","email","password","date","month","week","time","datetime","metaKey","altKey","ctrlKey","handlePointerDown","handleVisibilityChange","visibilityState","readOnly","isContentEditable","handleBlurVisible","thisArg","cache","kindOf","thing","kindOfTest","typeOfTest","isUndefined","isArrayBuffer","isString","isFunction","isNumber","isObject","isPlainObject","isDate","isFile","isBlob","isFileList","isURLSearchParams","l","_ref$allOwnKeys","allOwnKeys","getOwnPropertyNames","findKey","_global","g","isContextDefined","TypedArray","isTypedArray","Uint8Array","isHTMLForm","isRegExp","reduceDescriptors","descriptors","reducedDescriptors","isBuffer","isFormData","pattern","FormData","isArrayBufferView","ArrayBuffer","isView","buffer","isBoolean","isStream","pipe","merge","caseless","assignValue","targetKey","extend","stripBOM","inherits","superConstructor","assign","toFlatObject","sourceObj","destObj","propFilter","merged","endsWith","searchString","lastIndex","forEachEntry","matchAll","regExp","exec","hasOwnProp","freezeMethods","toObjectSet","arrayOrString","delimiter","toCamelCase","m","p1","p2","toFiniteNumber","defaultValue","isFinite","global","toJSONObject","stack","visit","reducedValue","AxiosError","message","code","request","response","captureStackTrace","utils","toJSON","description","fileName","lineNumber","columnNumber","status","customProps","axiosError","cause","isVisitable","removeBrackets","renderKey","dots","token","predicates","formData","metaTokens","indexes","option","visitor","defaultVisitor","useBlob","Blob","append","convertValue","toISOString","Buffer","JSON","stringify","isFlatArray","exposedHelpers","encode","charMap","encodeURIComponent","AxiosURLSearchParams","_pairs","encoder","_encode","buildURL","serializedParams","serializeFn","serialize","hashmarkIndex","product","InterceptorManager","handlers","fulfilled","rejected","synchronous","runWhen","h","silentJSONParsing","forcedJSONParsing","clarifyTimeoutError","URLSearchParams","isStandardBrowserEnv","isBrowser","protocols","buildPath","isNumericKey","isLast","arrayToObject","entries","parsePropPath","DEFAULT_CONTENT_TYPE","defaults","transitional","adapter","transformRequest","headers","contentType","getContentType","hasJSONContentType","isObjectPayload","setContentType","helpers","toURLEncodedForm","formSerializer","_FormData","env","rawValue","stringifySafely","transformResponse","JSONRequested","responseType","strictJSONParsing","xsrfCookieName","xsrfHeaderName","maxContentLength","maxBodyLength","validateStatus","common","ignoreDuplicateOf","$internals","normalizeHeader","header","normalizeValue","matchHeaderValue","AxiosHeaders","_Symbol$iterator","_Symbol$toStringTag","valueOrRewrite","rewrite","setHeader","_value","_header","_rewrite","lHeader","setHeaders","rawHeaders","parsed","line","substring","parseHeaders","tokens","tokensRE","parseTokens","matcher","deleted","deleteHeader","delete","format","char","formatHeader","_this$constructor","targets","asStrings","computed","accessors","defineAccessor","accessorName","arg1","arg2","arg3","buildAccessors","accessor","transformData","fns","normalize","isCancel","__CANCEL__","CanceledError","write","expires","domain","secure","cookie","Date","toGMTString","read","decodeURIComponent","now","buildFullPath","baseURL","requestedURL","relativeURL","combineURLs","originURL","msie","urlParsingNode","resolveURL","protocol","host","hash","hostname","port","pathname","requestURL","samplesCount","min","firstSampleTS","bytes","timestamps","tail","chunkLength","startedAt","bytesCount","passed","progressEventReducer","isDownloadStream","bytesNotified","_speedometer","total","lengthComputable","progressBytes","rate","progress","estimated","knownAdapters","http","xhr","XMLHttpRequest","onCanceled","requestData","requestHeaders","cancelToken","unsubscribe","signal","auth","username","unescape","btoa","fullPath","onloadend","responseHeaders","getAllResponseHeaders","floor","settle","responseText","statusText","paramsSerializer","onreadystatechange","responseURL","onabort","onerror","ontimeout","timeoutErrorMessage","xsrfValue","withCredentials","isURLSameOrigin","cookies","setRequestHeader","onDownloadProgress","onUploadProgress","upload","cancel","abort","subscribe","aborted","send","adapters","nameOrAdapter","throwIfCancellationRequested","throwIfRequested","dispatchRequest","reason","headersToObject","mergeConfig","config1","config2","getMergedValue","mergeDeepProperties","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","timeoutMessage","decompress","beforeRedirect","transport","httpAgent","httpsAgent","socketPath","responseEncoding","configValue","VERSION","validators","deprecatedWarnings","validator","version","formatMessage","opt","opts","warn","assertOptions","schema","allowUnknown","Axios","instanceConfig","interceptors","configOrUrl","contextHeaders","boolean","function","requestInterceptorChain","synchronousRequestInterceptors","interceptor","unshift","promise","responseInterceptorChain","chain","newConfig","onFulfilled","onRejected","generateHTTPMethod","isForm","CancelToken","executor","resolvePromise","_listeners","onfulfilled","_resolve","axios","createInstance","defaultConfig","toFormData","promises","spread","isAxiosError","payload","formToJSON","default","_babelPolyfill","O","padStart","padEnd","classNames","argType","conversions","sourceUnit","targetUnit","precision","converted","globalScope","ONE","MAX_DIGITS","Decimal","rounding","toExpNeg","toExpPos","LN10","external","decimalError","invalidArgument","exponentOutOfRange","mathfloor","mathpow","isDecimal","BASE","MAX_SAFE_INTEGER","MAX_E","P","carry","xd","yd","Ctor","pr","ceil","checkInt32","digitsToString","ws","indexOfLastWord","getZeroString","absoluteValue","comparedTo","cmp","j","xdL","ydL","decimalPlaces","dp","dividedBy","div","divide","dividedToIntegerBy","idiv","equals","eq","exponent","getBase10Exponent","greaterThan","gt","greaterThanOrEqualTo","gte","isInteger","isint","isNegative","isneg","isPositive","ispos","isZero","lessThan","lt","lessThanOrEqualTo","lte","logarithm","base","wpr","ln","minus","sub","subtract","modulo","mod","q","times","naturalExponential","exp","naturalLogarithm","negated","neg","plus","sd","z","squareRoot","t","toExponential","mul","rL","shift","toDecimalPlaces","todp","rm","toInteger","toint","toNumber","toPower","sign","yIsInt","yn","truncate","toPrecision","toSignificantDigits","tosd","valueOf","multiplyInteger","temp","compare","aL","bL","prod","prodL","qd","rem","remL","rem0","xi","xL","yd0","yL","yz","denominator","sum","getLn10","zs","c0","numerator","x2","parseDecimal","rd","doRound","xdi","xe","xLTy","isExp","ps","clone","ROUND_UP","ROUND_DOWN","ROUND_CEIL","ROUND_FLOOR","ROUND_HALF_UP","ROUND_HALF_DOWN","ROUND_HALF_EVEN","ROUND_HALF_CEIL","ROUND_HALF_FLOOR","HAS_WEAKSET_SUPPORT","WeakSet","sameValueZeroEqual","isPromiseLike","isReactElement","$$typeof","getNewCacheFallback","has","getNewCache","createCircularEqualCreator","isEqual","comparator","_comparator","isCacheableA","isCacheableB","hasA","hasB","areArraysEqual","areMapsEqual","isValueEqual","matchedIndices_1","aValue","aKey","hasMatch_1","matchIndex_1","bValue","bKey","OWNER","areObjectsEqual","keysA","reactElementA","reactElementB","areRegExpsEqual","ignoreCase","multiline","sticky","areSetsEqual","matchedIndices_2","hasMatch_2","matchIndex_2","HAS_MAP_SUPPORT","Map","HAS_SET_SUPPORT","createComparator","createIsEqual","aShape","bShape","getTime","deepEqual","shallowEqual","circularDeepEqual","circularShallowEqual","createCustomEqual","factory","fetch","Headers","normalizeName","list","getAll","support","methods","noXhrPatch","ActiveXObject","dispatchEvent","Body","Request","Response","init","isPrototypeOf","usingActiveXhr","getXhr","onload","getResponseHeader","credentials","_bodyInit","polyfill","consumed","bodyUsed","fileReaderReady","reader","readBlobAsArrayBuffer","blob","FileReader","readAsArrayBuffer","_initBody","_bodyText","_bodyBlob","_bodyFormData","arrayBuffer","readAsText","decode","json","upcased","mode","referrer","form","bodyInit","ok","fetchPonyfill","searchParams","isDataView","DataView","viewClasses","iteratorFor","items","readBlobAsText","readArrayBufferAsText","buf","view","chars","fromCharCode","bufferClone","byteLength","_bodyArrayBuffer","isConsumed","byteOffset","oldValue","normalizeMethod","reParamSearch","reQueryString","redirectStatuses","redirect","RangeError","DOMException","abortXhr","fixUrl","applyFocusVisiblePolyfill","scope","inputTypesAllowlist","isValidFocusTarget","focusTriggersKeyboardModality","addFocusVisibleClass","removeFocusVisibleClass","onPointerDown","onVisibilityChange","addInitialPointerMoveListeners","onInitialPointerMove","removeInitialPointerMoveListeners","DOCUMENT_FRAGMENT_NODE","DOCUMENT_NODE","CustomEvent","createEvent","initCustomEvent","_objectSpread","_possibleConstructorReturn","assertThisInitialized","_getPrototypeOf","_inherits","subClass","superClass","consoleLogger","Logger","concreteLogger","logger","debug","forward","_len3","_key3","_len4","_key4","lvl","debugOnly","moduleName","baseLogger","EventEmitter","observers","events","cloned","observer","_cloned","defer","rej","makeString","copy","getLastOfPath","Empty","cleanKey","canNotTraverseDeeper","setPath","newValue","_getLastOfPath","getPath","_getLastOfPath3","getPathWithDefaults","defaultData","deepExtend","overwrite","regexEscape","_entityMap","isIE10","deepFind","keySeparator","paths","mix","joinedPath","ResourceStore","_EventEmitter","ns","defaultNS","ignoreJSONStructure","lng","silent","addNamespaces","emit","resources","addResource","deep","pack","hasResourceBundle","removeNamespaces","getResource","compatibilityAPI","postProcessor","processors","addPostProcessor","translator","processor","process","checkedLoadedFor","Translator","services","language","interpolation","resolved","nsSeparator","namespaces","interpolator","nestingRegexp","lastKey","_this2","overloadTranslationOptionHandler","_this$extractFromKey","extractFromKey","appendNamespaceToCIMode","resUsedKey","usedKey","resExactUsedKey","exactUsedKey","resType","noObject","joinArrays","handleAsObjectInI18nFormat","i18nFormat","handleAsObject","returnObjects","returnedObjectHandler","resTypeIsArray","newKeyToUse","deepKey","translate","extendTranslation","usedDefault","needsPluralHandling","count","hasDefaultValue","defaultValueSuffix","pluralResolver","getSuffix","isValidLookup","updateMissing","fk","lngs","fallbackLngs","languageUtils","getFallbackCodes","fallbackLng","saveMissingTo","toResolveHierarchy","fallbackValue","missingKeyHandler","backendConnector","saveMissing","saveMissingPlurals","getSuffixes","appendNamespaceToMissingKey","parseMissingKeyHandler","_this3","usedLng","usedNS","skipInterpolation","nestBef","skipOnVariables","nb","defaultVariables","interpolate","na","postProcess","postProcessorNames","applyPostProcessor","postProcessPassResolved","i18nResolved","_this4","extracted","fallbackNS","needsContextHandling","codes","hasLoadedNamespace","pluralSuffix","possibleKey","finalKey","finalKeys","addLookupKeys","contextSeparator","returnNull","returnEmptyString","resourceStore","LanguageUtil","whitelist","supportedLngs","formatLanguageCode","specialCases","lowerCaseLng","part","cleanCode","deprecate","isSupportedCode","load","nonExplicitSupportedLngs","getLanguagePartFromCode","cleanedLng","lngOnly","find","supportedLng","fallbacks","getScriptPartFromCode","fallbackCode","fallbackCodes","addCode","fc","sets","nr","_rulesPluralsTypes","createRules","rules","numbers","plurals","PluralResolver","rule","getRule","noAbs","simplifyPluralSuffix","returnSuffix","prepend","compatibilityJSON","Interpolator","escapeValue","iOpts","escape","useRawValueToEscape","prefixEscaped","suffixEscaped","formatSeparator","unescapePrefix","unescapeSuffix","nestingPrefix","nestingPrefixEscaped","nestingSuffix","nestingSuffixEscaped","nestingOptionsSeparator","maxReplaces","alwaysFormat","resetRegExp","regexpStr","regexp","regexpUnescapeStr","regexpUnescape","nestingRegexpStr","replaces","regexSafe","handleFormat","interpolationkey","missingInterpolationHandler","regex","safeValue","todo","clonedOptions","handleHasOptions","inheritedOptions","sep","optionsString","formatters","doReduce","elem","Connector","backend","store","queue","languages","toLoad","pending","toLoadLanguages","toLoadNamespaces","hasAllNamespaces","reload","errors","addResourceBundle","_getLastOfPath2","what","fcName","tried","wait","queueLoad","loadOne","prepareLoading","_this5","isUpdate","initImmediate","nonExplicitWhitelist","preload","pluralSeparator","partialBundledLanguages","ret","tDescription","_format","transformOptions","I18n","modules","isInitialized","isClone","createClassOnDemand","ClassOrObject","lu","on","languageDetector","detection","storeApi","_this2$store","storeApiChained","_this2$store2","deferred","changeLanguage","usedCallback","isLanguageChangingTo","setLng","getBestMatchFromCodes","cacheUserLanguage","loadResources","detect","fixedT","_this$translator","_this$translator2","exists","_this6","lastLng","loadNotPending","loadState","precheck","preResult","_this7","preloaded","newLngs","_this8","mergedOptions","membersToCopy","i18nInstance","defaultOptions","bindI18n","bindI18nStore","transEmptyNodeValue","transSupportBasicHtmlNodes","transWrapTextNodes","transKeepBasicHtmlNodesFor","useSuspense","I18nContext","getDefaults","ReportNamespaces","usedNamespaces","getI18n","initReactI18next","setDefaults","react","setI18n","useTranslation","i18nFromProps","i18n","useContext","i18nFromContext","defaultNSFromContext","reportNamespaces","notReadyT","retNotReady","ready","i18nOptions","addUsedNamespaces","initializedStoreOnce","every","getT","getFixedT","nsMode","_useState","useState","_useState2","setT","isMounted","useRef","useEffect","boundReset","off","isInitial","alreadyWarned","warnOnce","loadNamespaces","initialized","getDisplayName","withTranslation","WrappedComponent","I18nextWithTranslation","forwardedRef","_useTranslation","_useTranslation2","passDownProps","tReady","withRef","_extends","_createClass","_interopRequireDefault","_mapToZero2","_stripStyle2","_stepper4","_performanceNow2","_raf2","_shouldStopAnimation2","_react2","_propTypes2","msPerFrame","Motion","wasAnimating","animationID","prevTime","accumulatedTime","unreadPropStyle","clearUnreadPropStyle","destStyle","dirty","_state","currentStyle","currentVelocity","lastIdealStyle","lastIdealVelocity","styleValue","startAnimationIfNecessary","timestamp","propsStyle","onRest","currentTime","timeDelta","currentFrameCompletion","framesToCatchUp","newLastIdealStyle","newLastIdealVelocity","newCurrentStyle","newCurrentVelocity","newLastIdealStyleValue","newLastIdealVelocityValue","_stepper","stiffness","damping","_stepper2","nextIdealX","nextIdealV","defaultState","defaultStyle","_props","componentWillReceiveProps","renderedChildren","only","StaggeredMotion","unreadPropStyles","currentStyles","currentVelocities","lastIdealStyles","lastIdealVelocities","someDirty","destStyles","shouldStopAnimationAll","newLastIdealStyles","newLastIdealVelocities","newCurrentStyles","newCurrentVelocities","defaultStyles","_mergeDiff2","rehydrateStyles","mergedPropsStyles","plainStyles","cUnreadPropStyles","mergedPropsStyle","mergeAndSync","willEnter","willLeave","didLeave","oldMergedPropsStyles","oldCurrentStyles","oldCurrentVelocities","oldLastIdealStyles","oldLastIdealVelocities","newMergedPropsStyles","oldIndex","oldMergedPropsStyle","leavingStyle","newMergedPropsStyleCell","foundOldIndex","plainStyle","velocity","TransitionMotion","unmounting","_mergeAndSync","propStyles","_mergeAndSync2","newMergedPropsStyle","styleThatEntered","defaultStyleCell","_mergeAndSync3","hydratedStyles","onRemove","prevKeyIndex","nextKeyIndex","sort","nextOrderA","nextOrderB","prevOrderA","prevOrderB","pivot","noWobble","gentle","wobbly","stiff","_interopRequire","_Motion","_spring","_presets","_presets2","secondPerFrame","destX","newV","newX","reusedTuple","getNanoSeconds","hrtime","loadTime","hr","newObj","_interopRequireWildcard","_addClass","_removeClass","_react","_Transition","addClass","removeClass","CSSTransition","appearing","getClassNames","removeClasses","onEntering","activeClassName","reflowAndAddClass","onEntered","appearClassName","doneClassName","enterClassName","onExit","onExiting","isStringClassNames","_this$getClassNames6","_reactDom","_TransitionGroup","ReplaceTransition","_args","handleEnter","handleLifecycle","handleEntering","handleEntered","handleExit","_len5","_key5","handleExiting","_len6","_key6","_len7","_key7","handler","originalArgs","_child$props","findDOMNode","_React$Children$toArr","EXITING","ENTERED","ENTERING","EXITED","UNMOUNTED","_reactLifecyclesCompat","Transition","initialStatus","parentGroup","transitionGroup","appearStatus","unmountOnExit","mountOnEnter","nextCallback","getChildContext","prevState","updateStatus","componentDidUpdate","prevProps","nextStatus","cancelNextCallback","getTimeouts","mounting","performEnter","performExit","timeouts","enterTimeout","safeSetState","onTransitionEnd","nextState","setNextCallback","doesNotHaveTimeoutOrListener","addEndListener","contextTypes","childContextTypes","_propTypes","_ChildMapping","_assertThisInitialized","ReferenceError","appeared","getInitialChildMapping","_CSSTransition","_ReplaceTransition","classNamesShape","timeoutsShape","Events","EE","once","addListener","emitter","evt","_events","_eventsCount","clearEvent","eventNames","listeners","ee","listenerCount","a1","a2","a3","a4","a5","removeListener","removeAllListeners","prefixed","_postcssValueParser2","_parser","_reducer2","_stringifier2","MATCH_CALC","walk","contents","nodes","ast","reducedAst","_cssUnitConverter","_cssUnitConverter2","unit","convertAbsoluteLength","_convert","_convert2","operator","convertMathExpression","_node","flipValue","isValueType","reduceAddSubExpression","reduceDivisionExpression","reduceMultiplicationExpression","reduceMathExpression","calc","_reducer","order","prec","fallback","JisonParserError","msg","stacktrace","ex2","u","rv","trace","yy","hasPartialLrUpgradeOnConflict","errorRecoveryTokenDiscardCount","symbols_","terminals_","TERROR","EOF","originalQuoteName","originalParseError","cleanupAfterParse","constructParseErrorInfo","yyMergeLocationInfo","__reentrant_call_depth","__error_infos","__error_recovery_infos","quoteName","id_str","getSymbolName","describeSymbol","terminal_descriptions_","collect_expected_token_set","do_not_describe","tokenset","check","state_descriptions_","table","productions_","bp","performAction","yystate","yysp","yyvstack","lexer","$","goto","bt","defaultActions","bda","parseError","ExceptionClass","recoverable","destroy","sstack","vstack","sp","NO_ACTION","__lexer__","sharedState_yy","pre_parse","post_parse","pre_lex","post_lex","fastLex","assert","yyGetSharedState","dst","src","shallow_copy_noclobber","resultValue","invoke_post_methods","do_not_nuke_errorinfos","cleanupAfterLex","ex","expected","pei","errStr","yytext","token_id","yylineno","new_state","newState","symbol_stack","state_stack","value_stack","stack_pointer","rec","yyrulelen","this_production","lex","yyval","_$","retval","setInput","canIUse","errSymbolDescr","showPosition","ntsymbol","JisonLexerError","ERROR","__currentRuleSet__","__decompressed","_backtrack","_input","_more","_signaled_error_token","conditionStack","matched","yyleng","yylloc","constructLexErrorInfo","show_input_position","prettyPrintRange","pos_str","yyerror","lineno_msg","lexerErrorsAreRecoverable","extra_error_attributes","clear","col","last_column","first_line","first_column","last_line","range","rule_re","conditions","spec","rule_ids","rule_regexes","rule_new_ids","__rule_regexes","__rule_count","editRemainingInput","cpsArg","ch","slice_len","lines","ch2","unput","pre","pre_lines","more","backtrack_lexer","less","pastInput","maxSize","maxLines","past","upcomingInput","maxPrefix","maxPostfix","deriveLocationInfo","actual","preceding","following","context_loc","context_loc2","l0","l1","lineno_display_width","log10","ws_prefix","nonempty_line_indexes","lno","errpfx","clip_start","MINIMUM_VISIBLE_NONEMPTY_LINE_COUNT","clip_end","intermediate_line","describeYYLLOC","display_range_too","l2","c1","c2","r1","r2","test_match","indexed_rule","backup","match_str","match_str_len","tempMatch","_currentRules","trackPosition","topState","regexes","flex","pendingInput","activeCondition","conditionStackDepth","begin","condition","pushState","popState","stateStackSize","yyrulenumber","YY_START","simpleCaseActionClusters","inclusive","Parser","ValueParser","bubble","openParentheses","closeParentheses","singleQuote","doubleQuote","backslash","slash","comma","colon","star","quote","escapePos","whitespacePos","pos","balanced","before","after","sourceIndex","unclosed","stringifyNode","custom","customResult","EXP","dotted","sciPos","containsNumber","objA","objB","compareContext","keysB","bHasOwnProperty","valueA","valueB","engine","storages","plugins","createStore","rx_one","rx_two","rx_three","rx_four","rx_escapable","rx_dangerous","gap","indent","rep","this_value","holder","partial","mind","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","Boolean","replacer","space","reviver","eval","SyntaxError","util","pluck","each","isList","_createStore","storeAPI","enabled","optionalDefaultValue","storage","_namespacePrefix","_deserialize","_serialize","namespacedKey","_namespaceRegexp","clearAll","hasNamespace","addPlugin","_addPlugin","_namespace","namespacePrefix","namespaceRegexp","_privateStoreProps","_testStorage","testStr","_assignPluginFnProp","pluginFnProp","oldFn","super_fn","newFnArgs","strVal","defaultVal","_addStorage","seenPlugin","pluginProperties","addStorage","_warn","props1","props2","etc","assignProps1","assignProps2","assignArgsList","F","make_create","Global","_has","_","kvp","localStorage","getItem","setItem","removeItem","memoryStorage","globalStorage","unfixedKey","disable","fixedKey","fixKey","_withStorageEl","storageEl","save","storageName","XMLDocument","addBehavior","storageOwner","storageContainer","scriptTag","close","frames","storeFunction","_makeIEStorageElFunction","forbiddenCharsRegex","sessionStorage","W","M","C","K","I","B","J","G","N","ca","A","H","X","D","da","ea","fa","L","Y","E","ha","Q","ia","Z","ja","ka","aa","ba","la","ma","R","oa","S","U","use","T","animationIterationCount","borderImageOutset","borderImageSlice","borderImageWidth","boxFlex","boxFlexGroup","boxOrdinalGroup","columnCount","columns","flexGrow","flexPositive","flexNegative","flexOrder","gridRow","gridRowEnd","gridRowSpan","gridRowStart","gridColumn","gridColumnEnd","gridColumnSpan","gridColumnStart","msGridRow","msGridRowSpan","msGridColumn","msGridColumnSpan","lineHeight","orphans","tabSize","widows","zoom","WebkitLineClamp","fillOpacity","floodOpacity","stopOpacity","strokeMiterlimit","strokeOpacity","reactPropsRegex","freeze","styledComponentId","REACT_APP_SC_ATTR","SC_ATTR","SC_DISABLE_SPEEDY","REACT_APP_SC_DISABLE_SPEEDY","groupSizes","Uint32Array","indexOfGroup","insertRules","insertRule","clearGroup","deleteRule","getGroup","V","registerName","textContent","getTag","nextSibling","sheet","styleSheets","ownerNode","cssRules","cssText","isServer","useCSSOMInjection","gs","server","registerId","reconstructWithOptions","allocateGSInstance","hasNameForId","clearNames","clearRules","clearTag","te","ne","re","oe","se","staticRulesId","isStatic","componentId","baseHash","baseStyle","generateAndInjectStyles","Ne","ie","ae","ce","lastIndexOf","ue","de","Consumer","he","pe","fe","me","ye","stylisPlugins","disableCSSOMInjection","disableVendorPrefixes","Provider","ve","inject","getName","ge","Se","we","Ee","be","isReactComponent","isCss","Ae","Ce","Re","De","je","Te","ke","Ve","Be","ze","Me","Ge","Ye","qe","parentComponentId","shouldForwardProp","componentStyle","foldedComponentIds","$as","as","withComponent","_foldedDefaultProps","He","withConfig","$e","createStyles","removeStyles","renderStyles","We","Ue","_emitSheetCSS","getStyleTags","sealed","getStyleElement","dangerouslySetInnerHTML","__html","nonce","seal","collectStyles","interleaveWithNodeStream","_tmcClient","_tmcClient2","_api","_api2","_userStore","TmcClient","clientId","clientSecret","oAuthSite","post","user","accessToken","access_token","details","setUser","removeUser","getUser","_fetchPonyfill2","_fetchPonyfill","Api","oauthSite","authorization","_store2","_store","win","localStorageName","isLocalStorageNameSupported","transact","transactionFn","deserialize","withIEStorage","ieKeyFix","testKey","getRandomValues","randomUUID","crypto","rnds8","rng","byteToHex","unsafeStringify","rnds","it","cof","UNSCOPABLES","ArrayProto","at","forbiddenField","toObject","toAbsoluteIndex","toLength","copyWithin","to","inc","aLen","endPos","forOf","ITERATOR","toIObject","IS_INCLUDES","$this","fromIndex","ctx","IObject","asc","TYPE","$create","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","callbackfn","that","aFunction","memo","isRight","SPECIES","original","speciesConstructor","arraySlice","factories","construct","partArgs","bound","TAG","ARG","tryGet","callee","dP","redefineAll","anInstance","$iterDefine","step","setSpecies","DESCRIPTORS","fastKey","validate","getEntry","_f","getConstructor","wrapper","NAME","ADDER","_t","_l","def","setStrong","iterated","kind","_k","classof","getWeak","anObject","createArrayMethod","$has","arrayFind","arrayFindIndex","uncaughtFrozenStore","UncaughtFrozenStore","findUncaughtFrozen","ufstore","$export","redefine","fails","$iterDetect","setToStringTag","inheritIfRequired","IS_WEAK","Base","proto","fixMethod","KEY","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","BUGGY_ZERO","$instance","NEED","core","__e","$defineProperty","createDesc","$toISOString","lz","num","NaN","getUTCMilliseconds","NUMBER","is","getKeys","gOPS","pIE","getSymbols","isEnum","hide","PROTOTYPE","own","out","IS_FORCED","IS_GLOBAL","IS_STATIC","IS_PROTO","IS_BIND","expProto","MATCH","wks","regexpExec","REPLACE_SUPPORTS_NAMED_GROUPS","groups","SPLIT_WORKS_WITH_OVERWRITTEN_EXEC","originalExec","SYMBOL","DELEGATES_TO_SYMBOL","DELEGATES_TO_EXEC","execCalled","nativeRegExpMethod","nativeMethod","forceStringMethod","strfn","rxfn","IS_CONCAT_SPREADABLE","flattenIntoArray","sourceLen","depth","spreadable","targetIndex","isArrayIter","getIterFn","BREAK","RETURN","iterFn","__g","un","Iterators","LIBRARY","$iterCreate","BUGGY","KEYS","VALUES","returnThis","DEFAULT","IS_SET","FORCED","getMethod","DEF_VALUES","VALUES_BUG","$native","$default","$entries","$anyNative","SAFE_CLOSING","riter","skipClosing","safe","$expm1","expm1","EPSILON","EPSILON32","MAX32","MIN32","fround","$abs","$sign","Infinity","log1p","scale","inLow","inHigh","outLow","outHigh","META","setDesc","isExtensible","FREEZE","preventExtensions","setMeta","onFreeze","shared","getOrCreateMetadataMap","targetMetadata","keyMetadata","MetadataKey","metadataMap","MetadataValue","macrotask","Observer","WebKitMutationObserver","isNode","last","notify","flush","nextTick","standalone","toggle","task","PromiseCapability","$$resolve","$$reject","$assign","dPs","enumBugKeys","IE_PROTO","createDict","iframeDocument","iframe","contentWindow","Properties","IE8_DOM_DEFINE","Attributes","__defineSetter__","gOPD","gOPN","windowNames","getWindowNames","$keys","hiddenKeys","ObjectProto","arrayIndexOf","isEntries","Reflect","$parseFloat","$trim","$parseInt","hex","radix","newPromiseCapability","promiseCapability","bitmap","SRC","$toString","TO_STRING","TPL","builtinExec","re1","re2","regexpFlags","nativeExec","nativeReplace","patchedExec","LAST_INDEX","UPDATES_LAST_INDEX_WRONG","NPCG_INCLUDED","reCopy","COLLECTION","nextItem","of","buggy","stat","uid","SHARED","copyright","quot","createHTML","attribute","repeat","maxLength","fillString","stringLength","fillStr","intMaxLength","fillLen","stringFiller","spaces","ltrim","rtrim","exporter","ALIAS","FORCE","channel","cel","setTask","setImmediate","clearTask","clearImmediate","MessageChannel","Dispatch","ONREADYSTATECHANGE","run","port2","port1","onmessage","postMessage","importScripts","$typed","$buffer","propertyDesc","toIndex","createArrayIncludes","ArrayIterators","arrayFill","arrayCopyWithin","$DP","$GOPD","ARRAY_BUFFER","SHARED_BUFFER","BYTES_PER_ELEMENT","$ArrayBuffer","$DataView","arrayForEach","arrayFilter","arraySome","arrayEvery","arrayIncludes","arrayValues","arrayKeys","arrayEntries","arrayLastIndexOf","arrayReduce","arrayReduceRight","reduceRight","arrayJoin","arraySort","arrayToString","arrayToLocaleString","toLocaleString","TYPED_CONSTRUCTOR","DEF_CONSTRUCTOR","ALL_CONSTRUCTORS","CONSTR","TYPED_ARRAY","TYPED","VIEW","WRONG_LENGTH","$map","allocate","LITTLE_ENDIAN","Uint16Array","FORCED_SET","toOffset","BYTES","speciesFromList","fromList","addGetter","internal","$from","mapfn","$of","TO_LOCALE_BUG","$toLocaleString","predicate","findIndex","searchElement","separator","comparefn","subarray","$begin","$slice","$set","arrayLike","$iterators","isTAIndex","$getDesc","$setDesc","$TypedArrayPrototype$","CLAMPED","GETTER","SETTER","TAC","ABV","TypedArrayPrototype","addElement","getter","setter","$offset","$length","klass","$len","$nativeIterator","CORRECT_ITER_NAME","$iterator","DATA_VIEW","WRONG_INDEX","BaseBuffer","LN2","BUFFER","BYTE_LENGTH","BYTE_OFFSET","$BUFFER","$LENGTH","$OFFSET","packIEEE754","mLen","nBytes","eLen","eMax","eBias","rt","unpackIEEE754","nBits","unpackI32","packI8","packI16","packI32","packF64","packF32","isLittleEndian","intIndex","_b","conversion","ArrayBufferProto","$setInt8","setInt8","getInt8","setUint8","bufferLength","getUint8","getInt16","getUint16","getInt32","getUint32","getFloat32","getFloat64","setInt16","setUint16","setInt32","setUint32","setFloat32","setFloat64","Typed","TypedArrayConstructors","px","wksExt","USE_SYMBOL","$re","$every","$filter","$find","forced","$forEach","STRICT","createProperty","$indexOf","NEGATIVE_ZERO","addToUnscopables","Arguments","$reduce","upTo","$some","$sort","pv","TO_PRIMITIVE","DateProto","INVALID_DATE","HAS_INSTANCE","FunctionProto","FProto","nameRE","strong","MAP","$acosh","acosh","MAX_VALUE","$asinh","asinh","$atanh","atanh","cbrt","clz32","LOG2E","cosh","hypot","value1","value2","larg","$imul","imul","UINT16","xn","xl","yl","LOG10E","log2","sinh","tanh","trunc","$Number","BROKEN_COF","TRIM","argument","third","maxCode","digits","_isFinite","isSafeInteger","MIN_SAFE_INTEGER","aNumberValue","$toFixed","ZERO","multiply","numToString","fractionDigits","$fails","$toPrecision","$freeze","$getOwnPropertyDescriptor","$getPrototypeOf","$isExtensible","$isFrozen","$isSealed","$preventExtensions","$seal","Internal","newGenericPromiseCapability","OwnPromiseCapability","Wrapper","microtask","newPromiseCapabilityModule","promiseResolve","PROMISE","versions","v8","$Promise","empty","USE_NATIVE","FakePromise","PromiseRejectionEvent","isThenable","isReject","_c","_v","reaction","fail","_h","onHandleUnhandled","onUnhandled","unhandled","isUnhandled","onunhandledrejection","_a","onrejectionhandled","$reject","_w","$resolve","capability","$index","alreadyCalled","race","rApply","fApply","thisArgument","argumentsList","rConstruct","NEW_TARGET_BUG","ARGS_BUG","Target","newTarget","$args","propertyKey","deleteProperty","Enumerate","enumerate","receiver","setProto","existingDescriptor","ownDesc","$flags","$RegExp","CORRECT_NEW","tiRE","piRE","fiU","proxy","flags","advanceStringIndex","regExpExec","$match","maybeCallNative","rx","fullUnicode","matchStr","SUBSTITUTION_SYMBOLS","SUBSTITUTION_SYMBOLS_NO_NAMED","REPLACE","$replace","searchValue","replaceValue","functionalReplace","results","accumulatedResult","nextSourcePosition","captures","namedCaptures","replacerArgs","replacement","getSubstitution","tailPos","capture","sameValue","SEARCH","$search","previousLastIndex","callRegExpExec","$min","$push","$SPLIT","LENGTH","MAX_UINT32","SUPPORTS_Y","SPLIT","$split","internalSplit","limit","lastLength","lastLastIndex","splitLimit","separatorCopy","splitter","unicodeMatching","lim","$at","codePointAt","ENDS_WITH","$endsWith","endPosition","$fromCodePoint","fromCodePoint","INCLUDES","point","callSite","tpl","STARTS_WITH","$startsWith","wksDefine","enumKeys","_create","gOPNExt","$GOPS","$JSON","_stringify","HIDDEN","SymbolRegistry","AllSymbols","OPSymbols","QObject","findChild","setSymbolDesc","protoDesc","isSymbol","$defineProperties","$propertyIsEnumerable","$getOwnPropertyNames","$getOwnPropertySymbols","IS_OP","es6Symbols","wellKnownSymbols","keyFor","useSetter","useSimple","FAILS_ON_PRIMITIVES","$replacer","$isView","fin","viewS","viewT","InternalMap","weak","NATIVE_WEAK_MAP","IS_IE11","WEAK_MAP","$WeakMap","WEAK_SET","arraySpeciesCreate","flatMap","flatten","depthArg","$includes","asap","isError","clamp","lower","upper","DEG_PER_RAD","RAD_PER_DEG","degrees","radians","fscale","iaddh","x0","x1","y0","y1","$x0","$y0","imulh","$u","$v","u0","v0","u1","v1","isubh","signbit","umulh","__defineGetter__","getDesc","__lookupGetter__","__lookupSetter__","$values","OBSERVABLE","cleanupSubscription","subscription","cleanup","subscriptionClosed","_o","closeSubscription","Subscription","subscriber","SubscriptionObserver","$Observable","observable","Observable","onFinally","metadata","toMetaKey","ordinaryDefineOwnMetadata","defineMetadata","metadataKey","metadataValue","deleteMetadata","ordinaryOwnMetadataKeys","ordinaryMetadataKeys","oKeys","pKeys","getMetadataKeys","ordinaryHasOwnMetadata","ordinaryGetOwnMetadata","ordinaryGetMetadata","getMetadata","getOwnMetadataKeys","getOwnMetadata","ordinaryHasMetadata","hasMetadata","hasOwnMetadata","$metadata","getFlags","RegExpProto","$RegExpStringIterator","$pad","WEBKIT_BUG","TO_STRING_TAG","ArrayValues","DOMIterables","CSSRuleList","CSSStyleDeclaration","CSSValueList","ClientRectList","DOMRectList","DOMStringList","DOMTokenList","DataTransferItemList","FileList","HTMLAllCollection","HTMLCollection","HTMLFormElement","HTMLSelectElement","MediaList","MimeTypeArray","NamedNodeMap","NodeList","PaintRequestList","Plugin","PluginArray","SVGLengthList","SVGNumberList","SVGPathSegList","SVGPointList","SVGStringList","SVGTransformList","SourceBufferList","StyleSheetList","TextTrackCueList","TextTrackList","TouchList","collections","explicit","Collection","$task","MSIE","boundArgs","GenStateSuspendedStart","GenStateSuspendedYield","GenStateExecuting","GenStateCompleted","return","isConstructor","tryToString","$TypeError","TO_STRING_TAG_SUPPORT","isCallable","classofRaw","wellKnownSymbol","$Object","CORRECT_ARGUMENTS","uncurryThis","aCallable","NATIVE_BIND","isNullOrUndefined","getIteratorMethod","usingIterator","getBuiltIn","ArrayPrototype","inspectSource","constructorRegExp","INCORRECT_TO_STRING","isConstructorModern","isConstructorLegacy","sham","called","isArrayIteratorMethod","lengthOfArrayLike","getIterator","iteratorClose","Result","stopped","ResultPrototype","unboundFunction","AS_ENTRIES","IS_RECORD","IS_ITERATOR","INTERRUPTED","callFn","innerResult","innerError","createPropertyDescriptor","IteratorConstructor","ENUMERABLE_NEXT","PrototypeOfArrayIteratorPrototype","arrayIterator","defineBuiltIn","IS_PURE","BUGGY_SAFARI_ITERATORS","activeXDocument","definePropertiesModule","documentCreateElement","sharedKey","SCRIPT","EmptyConstructor","LT","NullProtoObjectViaActiveX","parentWindow","NullProtoObject","JS","V8_PROTOTYPE_DEFINE_BUG","definePropertyModule","toIndexedObject","objectKeys","CORRECT_PROTOTYPE_GETTER","ObjectPrototype","internalObjectKeys","stickyHelpers","getInternalState","UNSUPPORTED_DOT_ALL","UNSUPPORTED_NCG","stringSlice","UNSUPPORTED_Y","BROKEN_CARET","group","charsAdded","strCopy","hasIndices","dotAll","unicodeSets","regExpFlags","RegExpPrototype","MISSED_STICKY","STATIC","aConstructor","defaultConstructor","toIntegerOrInfinity","requireObjectCoercible","createMethod","CONVERT_TO_STRING","codeAt","$String","iterate","allSettled","createIteratorConstructor","createIterResultObject","getRegExpFlags","InternalStateModule","MATCH_ALL","REGEXP_STRING","REGEXP_STRING_ITERATOR","setInternalState","getterFor","stringIndexOf","nativeMatchAll","WORKS_WITH_NON_GLOBAL_REGEX","$global","$matchAll","siteUrl","githubUrl","subtitle","slug","organizationName","tmcCourse","quizzesId","tmcOrganization","bannerPath","showExerciseDescriptionWhenNotLoggedIn","courseVariants","StyledLink","styled","Link","withSimpleErrorBoundary","Container","LoadingWrapper","heightHint","loading","Fragment","StyledIcon","LoginControls","doSignOut","signOut","loggedIn","getCachedUserDetails","user_field","first_name","last_name","profileIcon","React","contextType","LoginStateContext","withLoginStateContext","LoginStateContextProvider","onLoginStateChanged","BASE_URL","tmcClient","loginStateListeners","authenticate","loginStateChanged","createAccount","uuidv4","origin","CourseSettings","success","userDetails","Authorization","updateUserDetails","extraFields","userField","extra_fields","courseRes","orgRes","getCachedCourseVariants","variants","fetchProgrammingExerciseDetails","exerciseName","accessTokenValue","getCourseVariant","fetchProgrammingExerciseModelSolution","exerciseId","fetchProgrammingProgress","points_by_group","canDoResearch","research","defaultVariant","use_course_variant","course_variant","fetchQuizzesProgress","fetchQuizNames","en","fi","LogoImg","LogoTypography","createGlobalStyle","saveHeight","calculateElementHeightOffScreen","calculateElementHeight","Avatar","alt","childrenProp","imgProps","sizes","srcSet","setLoaded","image","Image","useLoaded","hasImg","hasImgNotFailing","img","Person","system","colorDefault","circular","textAlign","objectFit","textIndent","ChildrenList","ListItem","ListItemLabel","NavigationLink","GatsbyLink","DisabledItem","ItemTitleWrapper","StyledChip","StyledDivider","Centered","TreeViewItem","childrenVisible","childrenVisibleByDefault","childrenListRef","Location","navigate","openRatio","spring","faCaretRight","LinkWrapper","tba","innerRef","StyledUl","TreeView","spy","SMALL_MEDIUM_BREAKPOINT","MEDIUM_LARGE_BREAKPOINT","MEDIUM_SIDEBAR_WIDTH","LARGE_SIDEBAR_WIDTH","SidebarContainer","mobileMenuOpen","LogoContainer","TreeViewContainer","Brand","MenuExpanderWrapper","MobileWrapper","MobileWrapperOrFragment","Sidebar","edges","allMarkdownRemark","frontmatter","hide_in_sidebar","localeCompare","numeric","sensitivity","coursePartEdges","information_page","course_info_page","upcoming","informationPageEdges","sidebar_priority","upcomingPageEdges","separator_after","separatorEdges","edge","middlepoint","toggleMobileMenu","faTimes","faBars","StaticQuery","query","ContentAreaContainer","ContentArea","TopBarContainer","TopBar","pointsIcon","SocialContainer","ContentContainer","GithubContainer","ButtonContainer","FooterWrapper","FooterBackground","BackgroundImage","FooterContent","StyledCard","StyledCardContent","BrandsContainer","pagesContextValue","PagesContext","filePath","rel","faGithub","faTwitter","faFacebook","faYoutube","MoocfiLogo","Fab","extended","minHeight","sizeMedium","StyledFab","zip","arrs","fetchProgress","serviceIdentifiers","progressesCollection","progressByGroup","identifier","progresses","progressEntry","toBeDeleted","serviceEntries","SVGContainerPropKeys","SVGElementPropKeys","EventKeys","filterProps","includeEvents","isSvg","inputProps","adaptEventHandlers","newHandler","adaptEventsOfChild","originalHandler","getEventHandlerOfChild","Surface","others","svgView","layerClass","Layer","setRafTimeout","currTime","shouldUpdate","_toArray","createAnimateManager","handleChange","shouldStop","setStyle","_style","_styles","curr","restStyles","_handleChange","PREFIX_LIST","IN_LINE_PREFIX_LIST","IN_COMPATIBLE_PROPERTY","identity","param","mapObject","translateStyle","isTransition","camelName","styleVal","property","generatePrefixStyle","getTransitionVal","ACCURACY","cubicBezierFactor","multyTime","cubicBezier","derivativeCubicBezier","newParams","configBezier","y2","_easing$1$split$0$spl","_easing$1$split$0$spl2","curveX","curveY","derCurveX","rangeValue","bezier","evalT","derVal","isStepper","configSpring","_config$stiff","_config$damping","_config$dt","dt","stepper","currX","currV","alpha","needContinue","calStepperVals","preVals","steps","nextStepVals","_easing2","preObj","nextObj","preTime","beginTime","interKeys","timingStyle","stepperStyle","cafId","update","currStyle","finalStyle","cancelAnimationFrame","_setPrototypeOf","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","Super","NewTarget","Animate","_PureComponent","_super","isActive","handleStyleChange","changeStyle","_this$props2","canBegin","runAnimation","_this$props3","shouldReAnimate","isTriggered","stopJSAnimation","_newState","unSubscribe","onAnimationEnd","onAnimationStart","startAnimation","configUpdate","configEasing","_steps$","initialStyle","_steps$$duration","initialTime","sequence","_nextItem$easing","nextProperties","properties","preItem","runJSAnimation","newStyle","propsTo","runStepAnimation","_this$props4","onAnimationReStart","stateStyle","cloneContainer","_container$props","_container$props$styl","PureComponent","parseDurationOfSingleTransition","AnimateGroupChild","_Component","isAppearing","appearOptions","enterOptions","handleStyleActive","leaveOptions","parseTimeout","AnimateGroup","leave","mathSign","isPercent","isNumOrStr","idCounter","uniqueId","percent","totalValue","getAnyElementOfObject","interpolateNumber","numberA","numberB","ary","specifiedKey","specifiedValue","defaultFormatter","DefaultTooltipContent","formatter","itemStyle","itemSorter","finalItemStyle","paddingTop","finalFormatter","formatted","wrapperClassName","contentStyle","labelClassName","labelStyle","labelFormatter","finalLabelStyle","hasLabel","finalLabel","wrapperCN","labelCN","renderContent","isSsr","CLS_PREFIX","defaultUniqBy","dataKey","Tooltip","boxWidth","boxHeight","dismissed","dismissedAtCoordinate","wrapperNode","getTranslate","tooltipDimension","viewBoxDimension","allowEscapeViewBox","coordinate","restricted","unrestricted","updateBBox","_this$state","preventScroll","box","_classNames","translateX","translateY","isAnimationActive","animationEasing","filterNull","finalPayload","getUniqPayload","payloadUniqBy","hasPayload","wrapperStyle","outerStyle","_this$state2","useTranslate3d","cursorStyle","trigger","pi","atan2","cos","sin","tau","draw","moveTo","arc","lineTo","closePath","tan30","tan30_2","kr","kx","ky","sqrt3","tauEpsilon","Path","_x0","_y0","_x1","_y1","quadraticCurveTo","bezierCurveTo","arcTo","x21","y21","x01","y01","l01_2","x20","y20","l21_2","l20_2","l21","l01","tan","acos","t01","t21","a0","ccw","dx","dy","cw","symbolFactories","symbolCircle","symbolCross","symbolDiamond","symbolSquare","symbolStar","symbolTriangle","symbolWye","RADIAN","Symbols","sizeType","symbolFactory","getSymbolFactory","angle","calculateAreaSize","registerSymbol","DefaultLegendContent","inactiveColor","halfSize","sixthSize","thirdSize","inactive","legendIcon","iconProps","iconSize","layout","svgStyle","renderIcon","align","renderItems","Legend","chartWidth","hPos","vPos","chartHeight","getBBoxSnapshot","onBBoxUpdate","_box3","getDefaultPosition","otherProps","_point","_context","Basis","BasisClosed","BasisOpen","LinearClosed","Linear","slope3","h0","h1","s0","s1","slope2","t0","t1","MonotoneX","MonotoneY","ReflectContext","Natural","controlPoints","Step","areaStart","_line","areaEnd","lineStart","lineEnd","_x2","_x3","_x4","_y2","_y3","_y4","_t0","_y","py","i0","i1","curve","defined0","area","x0z","y0z","arealine","lineX0","lineY0","lineY1","lineX1","CURVE_FACTORIES","curveBasisClosed","curveBasisOpen","curveBasis","curveLinearClosed","curveLinear","curveMonotoneX","curveMonotoneY","curveNatural","curveStep","curveStepAfter","curveStepBefore","getX","getY","Curve","lineFunction","points","baseLine","connectNulls","curveFactory","getCurveFactory","formatPoints","formatBaseLine","areaPoints","pathRef","realPath","Cross","radianToDegree","angleInRadian","polarToCartesian","radius","getAngleOfPoint","anotherPoint","distanceBetweenPoints","reverseFormatAngleOfSetor","_ref4","startAngle","endAngle","startCnt","endCnt","inRangeOfSector","_ref5","sector","_getAngleOfPoint","innerRadius","outerRadius","inRange","_formatAngleOfSector","formatAngleOfSector","formatAngle","getTangentCircle","isExternal","cornerRadius","cornerIsExternal","centerRadius","theta","asin","centerAngle","lineTangencyAngle","circleTangency","lineTangency","getSectorPath","getDeltaAngle","tempEndAngle","outerStartPoint","outerEndPoint","innerStartPoint","innerEndPoint","Sector","forceCornerRadius","deltaRadius","cr","_getTangentCircle","soct","solt","sot","_getTangentCircle2","eoct","eolt","eot","outerArcAngle","_getTangentCircle3","sict","silt","sit","_getTangentCircle4","eict","eilt","eit","innerArcAngle","getSectorWithCorner","Dot","getRectanglePath","maxRadius","ySign","xSign","clockWise","newRadius","_newRadius","isInRectangle","minX","maxX","minY","maxY","Rectangle","totalLength","getTotalLength","animationBegin","isUpdateAnimationActive","currWidth","currHeight","currY","REACT_BROWSER_EVENT_MAP","click","mousedown","mouseup","mouseover","mousemove","mouseout","mouseenter","mouseleave","touchcancel","touchend","touchmove","touchstart","Comp","lastChildren","lastResult","isFragment","findAllByType","types","childType","findChildByType","validateWidthHeight","_el$props","SVG_TAGS","isSvgElement","isChildrenEqual","nextChildren","prevChildren","isSingleChildEqual","renderByOrder","renderMap","elements","stringCache","widthCache","cacheCount","SPAN_STYLE","STYLE_LIST","MEASUREMENT_SPAN_ID","getStyleString","autoCompleteStyle","getStringSize","cacheKey","measurementSpan","getElementById","measurementSpanStyle","styleKey","BREAKING_SPACES","calculateWordWidths","words","breakAll","wordsWithComputedWidth","word","spaceWidth","getWordsWithoutCalculate","getWordsByLines","needCalculate","scaleToFit","wordWidths","initialWordsWithComputedWith","lineWidth","shouldLimitLines","calculate","currentLine","newLine","originalResult","trimmedResult","checkOverflow","tempText","doesOverflow","findLongestLine","iterations","_checkOverflow2","doesPrevOverflow","doesMiddleOverflow","calculateWordsByLines","Text","textAnchor","verticalAnchor","capHeight","textProps","wordsByLines","startDy","transforms","prevWidth","prevScaleToFit","prevStyle","prevBreakAll","renderRadialLabel","labelProps","labelAngle","direction","deltaAngle","startPoint","endPoint","dominantBaseline","xlinkHref","Label","_props$className","textBreakAll","getLabel","isPolarLabel","isPolar","positionAttrs","midAngle","_polarToCartesian","_polarToCartesian2","getAttrsOfPolarLabel","parentViewBox","verticalSign","verticalOffset","verticalEnd","verticalStart","horizontalSign","horizontalOffset","horizontalEnd","horizontalStart","_attrs2","_attrs3","sizeAttrs","getAttrsOfCartesianLabel","parseViewBox","labelViewBox","parseLabel","renderCallByParent","parentProps","checkPropsLabel","explicitChildren","implicitLabel","CartesianAxis","layerReference","letterSpacing","restProps","viewBoxOld","restPropsOld","htmlLayer","tick","getElementsByClassName","tx","ty","tickSize","mirror","tickMargin","finalTickSize","tickCoord","_this$props5","axisLine","needHeight","needWidth","ticks","_this$props6","tickLine","tickFormatter","finalTicks","getTicks","getTickTextAnchor","getTickVerticalAnchor","axisProps","customTickProps","tickLineProps","_this2$getTickLineCoo","getTickLineCoord","lineCoord","tickProps","visibleTicksCount","renderTickItem","_this$props7","ticksGenerator","_this$props8","noTicksProps","renderAxisLine","renderTicks","minTickGap","getNumberIntervalTicks","getTicksStart","getTicksEnd","preserveEnd","sizeKey","unitSize","tailContent","tailSize","tailGap","isShow","initRange","initInterpolator","_createForOfIteratorHelper","allowArrayLike","normalCompletion","didErr","_e2","implicit","ordinal","unknown","_step","_iterator","band","bandwidth","ordinalRange","r0","paddingInner","paddingOuter","rescale","rangeRound","pointish","PLACE_HOLDER","isPlaceHolder","curry0","_curried","curryN","argsLength","restArgs","newArgs","curry","firstFn","tailsFn","memoize","lastArgs","newA","uninterpolateNumber","diff","uninterpolateTruncation","rangeStep","getDigitCount","getValidInterval","validMin","validMax","getFormatStep","roughStep","allowDecimals","correctionFactor","digitCount","digitCountValue","stepRatio","stepRatioScale","formatStep","getTickOfSingleValue","tickCount","absVal","middleIndex","calculateStep","tickMin","tickMax","belowCount","upCount","scaleCount","getNiceTickValues","_getValidInterval","_getValidInterval2","cormin","cormax","_values","_calculateStep","getTickValuesFixedDomain","_ref6","_getValidInterval3","_getValidInterval4","_ref7","_ref8","_getValidInterval5","_getValidInterval6","e10","e5","e2","tickIncrement","_r2","power","tickStep","step0","step1","delta","lo","hi","mid","ascending","ascendingComparator","_marked","valueof","_iterator2","_step2","ascendingBisect","bisector","bisectRight","Color","_darker","_brighter","reI","reN","reP","reHex","reRgbInteger","reRgbPercent","reRgbaInteger","reRgbaPercent","reHslPercent","reHslaPercent","named","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","color_formatHex","rgb","formatHex","color_formatRgb","formatRgb","rgbn","Rgb","rgba","hsla","rgbConvert","rgb_formatHex","rgb_formatRgb","Hsl","hslConvert","hsl2rgb","m1","m2","v2","v3","t2","t3","channels","displayable","formatHsl","brighter","darker","gamma","nogamma","exponential","rgbGamma","rgbSpline","spline","colors","genericArray","setTime","reA","reB","am","bm","bs","bi","one","zero","bimap","d0","d1","polymap","bisect","transformer","untransform","piecewise","clamper","invert","continuous","prefixExponent","formatSpecifier","specifier","FormatSpecifier","formatDecimalParts","coefficient","_p","formatRounded","formatPrefix","locale","grouping","thousands","currencyPrefix","currency","currencySuffix","decimal","numerals","formatNumerals","nan","newFormat","formatTypes","formatType","maybeSuffix","valuePrefix","valueSuffix","valueNegative","formatTrim","tickFormat","precisionPrefix","precisionRound","precisionFixed","linearish","nice","prestep","maxIter","transformLog","transformExp","transformLogn","transformExpn","pow10","reflect","loggish","logs","pows","logp","powp","transformSymlog","transformSymexp","symlogish","constant","symlog","transformPow","transformSqrt","transformSquare","powish","unsquare","radial","squared","quickselect","newLeft","newRight","swap","quantile","Float64Array","value0","quantileSorted","thresholds","invertExtent","quantiles","quantize","threshold","durationSecond","durationMinute","durationHour","durationDay","durationWeek","durationMonth","durationYear","newInterval","floori","offseti","field","previous","millisecond","getMilliseconds","minute","getSeconds","getMinutes","hour","getHours","day","setHours","setDate","getDate","getTimezoneOffset","weekday","getDay","sunday","monday","tuesday","wednesday","thursday","friday","saturday","setMonth","getMonth","getFullYear","year","setFullYear","utcMinute","setUTCSeconds","utcHour","setUTCMinutes","utcDay","setUTCHours","setUTCDate","utcWeekday","getUTCDay","utcSunday","utcMonday","utcTuesday","utcWednesday","utcThursday","utcFriday","utcSaturday","utcMonth","setUTCMonth","utcYear","setUTCFullYear","ticker","tickIntervals","tickInterval","_tickIntervals","_ticker","_ticker2","utcTicks","utcTickInterval","_ticker3","_ticker4","timeTicks","timeTickInterval","localDate","utcDate","UTC","newDate","timeFormat","utcFormat","pads","numberRe","percentRe","requoteRe","pad","requote","formatRe","formatLookup","parseWeekdayNumberSunday","parseWeekdayNumberMonday","parseWeekNumberSunday","parseWeekNumberISO","parseWeekNumberMonday","parseFullYear","parseYear","parseZone","parseQuarter","parseMonthNumber","parseDayOfMonth","parseDayOfYear","parseHour24","parseMinutes","parseSeconds","parseMilliseconds","parseMicroseconds","parseLiteralPercent","parseUnixTimestamp","parseUnixTimestampSeconds","formatDayOfMonth","formatHour24","formatHour12","formatDayOfYear","formatMilliseconds","formatMicroseconds","formatMonthNumber","formatMinutes","formatSeconds","formatWeekdayNumberMonday","formatWeekNumberSunday","dISO","formatWeekNumberISO","formatWeekdayNumberSunday","formatWeekNumberMonday","formatYear","formatYearISO","formatFullYear","formatFullYearISO","formatZone","formatUTCDayOfMonth","formatUTCHour24","formatUTCHour12","formatUTCDayOfYear","formatUTCMilliseconds","formatUTCMicroseconds","formatUTCMonthNumber","formatUTCMinutes","formatUTCSeconds","formatUTCWeekdayNumberMonday","dow","formatUTCWeekNumberSunday","UTCdISO","formatUTCWeekNumberISO","formatUTCWeekdayNumberSunday","formatUTCWeekNumberMonday","formatUTCYear","formatUTCYearISO","formatUTCFullYear","formatUTCFullYearISO","formatUTCZone","formatLiteralPercent","formatUnixTimestamp","formatUnixTimestampSeconds","calendar","formatMillisecond","formatSecond","formatMinute","formatHour","formatDay","formatWeek","formatMonth","utcTime","k10","sequential","sequentialLog","sequentialSymlog","sequentialPow","sequentialSqrt","sequentialQuantile","k21","diverging","divergingLog","divergingSymlog","divergingPow","divergingSqrt","series","stackValue","stackSeries","getValueByDataKey","getDomainOfDataByKey","filterNil","flattenData","locale_dateTime","dateTime","locale_date","locale_time","locale_periods","periods","locale_weekdays","days","locale_shortWeekdays","shortDays","locale_months","months","locale_shortMonths","shortMonths","periodRe","periodLookup","weekdayRe","weekdayLookup","shortWeekdayRe","shortWeekdayLookup","monthRe","monthLookup","shortMonthRe","shortMonthLookup","formats","utcFormats","parses","parseSpecifier","newParse","utcParse","formatLocale","getMainColorOfGraphicItem","_item$props","getLegendProps","legendData","formattedGraphicalItems","legendWidth","legendContent","legendItem","sectors","iconType","legendType","_item$props2","getWithHeight","getDomainOfErrorBars","axisType","errorBars","errorBarChild","isErrorBarRelevantForAxis","entryValue","mainValue","errorDomain","prevErrorArr","errorValue","lowerValue","upperValue","getDomainOfItemsWithSameAxis","domains","isCategoricalAxis","getCoordinatesOfGrid","hasMin","hasMax","getTicksOfAxis","axis","isGrid","isAll","duplicateDomain","offsetForBand","realScaleType","niceTicks","scaleContent","isCategorical","categoricalDomain","combineEventHandlers","defaultHandler","parentHandler","childHandler","customizedHandler","arg4","STACK_OFFSET_MAP","positive","negative","expand","none","silhouette","wiggle","s2","si","sij0","s3","getStackedData","stackItems","offsetType","dataKeys","oz","sz","originalDomain","scaleType","tickValues","calculateDomainOfTicks","_domain","getCateCoordinateOfBar","bandSize","getDomainOfStackGroups","stackGroups","startIndex","endIndex","stackId","stackedData","MIN_VALUE_REG","MAX_VALUE_REG","parseSpecifiedDomain","specifiedDomain","dataDomain","allowDataOverflow","getBandSizeOfAxis","isBar","bandWidth","orderedTicks","cur","parseDomainOfCategoryAxis","calculatedDomain","axisChild","getTooltipItem","graphicalItem","_graphicalItem$props","tooltipType","chartType","isTouch","changedTouches","Brush","leaveTimer","travellerDragStartHandlers","handleDrag","isTravellerMoving","handleTravellerMove","isSlideMoving","handleSlideDrag","handleDragEnd","detachDragEndListener","handleLeaveWrapper","leaveTimeOut","handleEnterSlideOrTraveller","isTextActive","handleLeaveSlideOrTraveller","handleSlideDragStart","slideMoveStartX","pageX","attachDragEndListener","startX","handleTravellerDragStart","endX","scaleValues","minIndex","getIndexInRange","maxIndex","travellerWidth","onChange","newIndex","getIndex","movingTravellerId","brushMoveStartX","_this$setState","prevValue","chartElement","compact","travellerX","traveller","travellerProps","onMouseEnter","renderTraveller","_this$props9","_this$state3","getTextOfTick","_this$props10","alwaysShowText","_this$state4","isPanoramic","onMouseMove","renderBackground","renderPanorama","renderSlide","renderTravellerLayer","renderText","lineY","renderDefaultTraveller","updateId","prevData","prevUpdateId","prevTravellerWidth","prevX","createScale","ifOverflowMatches","alwaysShow","ifOverflow","rectWithPoints","ScaleHelper","bandAware","_offset","_offset2","EPS","createLabeledScales","scales","coord","isInRange","ReferenceDot","clipPathId","isX","isY","xAxis","yAxis","getCoordinate","dotProps","clipPath","renderDot","isFront","xAxisId","yAxisId","ReferenceLine","fixedX","fixedY","segment","endPoints","isFixedX","isFixedY","isSegment","yCoord","xCoord","_orientation","_coord","_points","_points2","getEndPoints","_endPoints","_endPoints$","_endPoints$2","lineProps","renderLine","rectWithCoords","ReferenceArea","hasX1","hasX2","hasY1","hasY2","xValue1","xValue2","yValue1","yValue2","rangeMin","rangeMax","getRect","renderRect","detectReferenceElementsDomain","axisId","specifiedTicks","areas","idKey","valueKey","finalDomain","key1","key2","eventCenter","setMaxListeners","SYNC_EVENT","ORIENT_MAP","originCoordinate","isFinit","deferClear","getDisplayedData","graphicalItems","dataStartIndex","dataEndIndex","itemsData","itemData","getTooltipContent","chartData","activeIndex","activeLabel","tooltipAxis","displayedData","allowDuplicatedCategory","getTooltipData","rangeObj","rangeData","chartX","chartY","calculateTooltipPos","orderedTooltipTicks","tooltipTicks","_ticks$length","unsortedTicks","sameDirectionCoord","diffInterval","curInRange","afterInRange","sameInterval","calculateActiveTickIndex","activePayload","activeCoordinate","_angle","_radius","getActiveCoordinate","activeTooltipIndex","getAxisMapByAxes","axes","axisIdKey","stackOffset","axisMap","duplicate","hasDuplicate","errorBarsDomain","parseErrorBarsOfAxis","hasStack","axisDomain","getAxisMap","_ref4$axisType","AxisComp","Axis","getAxisMapByItems","createDefaultState","defaultShowTooltip","brushItem","isTooltipActive","getAxisNameByLayout","numericAxisName","cateAxisName","calculateOffset","prevLegendBBox","_ref5$xAxisMap","xAxisMap","_ref5$yAxisMap","yAxisMap","offsetH","offsetV","brushBottom","legendBox","legendProps","newOffset","appendOffsetOfLegend","ErrorBar","dataPointFormatter","svgProps","_dataPointFormatter","errorVal","lowBound","highBound","lineCoordinates","_errorVal","yMid","yMin","yMax","xMin","xMax","_scale","xMid","_xMin","_xMax","_yMin","_yMax","coordinates","Cell","valueAccessor","LabelList","idProps","parseLabelList","ckeckPropsLabel","explicitChilren","implicitLabelList","Bar","isAnimationFinished","handleAnimationEnd","handleAnimationStart","animationId","prevAnimationId","curData","baseProps","renderRectangle","stepData","interpolatorX","interpolatorY","interpolatorWidth","interpolatorHeight","_interpolatorHeight","renderRectanglesStatically","renderRectanglesWithAnimation","backgroundProps","errorBarItems","dataPoint","needClip","renderRectangles","renderErrorBar","minPointSize","getComposedData","barPosition","xAxisTicks","yAxisTicks","findPositionOfBar","numericAxis","stackedDomain","baseValue","_ref9","getBaseValueOfBar","cells","rects","truncateByDomain","tooltipPayload","tooltipPosition","XAxis","reversed","YAxis","BarChart","_class","_temp","chartName","GraphicalChild","_ref6$defaultTooltipE","defaultTooltipEventType","_ref6$validateTooltip","validateTooltipEventTypes","axisComponents","formatAxisMap","getFormatItems","currentState","barSize","barGap","barCategoryGap","globalMaxBarSize","maxBarSize","_getAxisNameByLayout","hasBar","hasGraphicalBarItem","sizeList","globalSize","_ref5$stackGroups","numericAxisIds","sgs","stackIds","sLen","_sgs$stackIds$j","cateAxisId","barItems","selfSize","cateId","stackList","getBarSizeList","formattedItems","childMaxBarSize","numericAxisId","axisObj","_objectSpread6","cateAxis","cateTicks","itemIndex","getStackedDataOfItem","itemIsBar","_getBandSizeOfAxis","barBandSize","_ref6$sizeList","realBarGap","useFull","fullBarSize","newRes","originalSize","getBarPosition","_objectSpread7","composedFn","childIndex","updateStateOfAxisMapsOffsetAndStackGroups","reverseStackOrder","_getAxisNameByLayout2","_items","_item$props3","childGroup","getStackGroupsByAxisId","legendBBox","cateAxisMap","ticksObj","tooltipAxisBandSize","CategoricalChartWrapper","uniqueChartId","legendInstance","deferId","clearDeferId","handleLegendBBoxUpdate","handleReceiveSyncEvent","cId","chartId","syncId","applySyncEvent","handleBrushChange","triggerSyncEvent","handleMouseEnter","mouse","getMouseInfo","_nextState","triggeredAfterMouseMove","handleItemMouseEnter","activeItem","handleItemMouseLeave","handleMouseMove","cancelThrottledTriggerAfterMouseMove","handleOuterEvent","eventName","getReactEventByType","handleClick","_nextState2","verticalCoordinatesGenerator","_ref10","horizontalCoordinatesGenerator","_ref11","axesTicksGenerator","renderCursor","tooltipEventType","getTooltipEventType","cursorComp","getCursorRectangle","_this$getCursorPoints","getCursorPoints","cursorProps","payloadIndex","renderPolarAxis","axisOption","renderXAxis","renderAxis","renderYAxis","renderGrid","renderPolarGrid","_element$props","radialLines","polarAngles","polarRadius","radiusAxisMap","angleAxisMap","radiusAxis","angleAxis","renderLegend","legend","renderTooltip","tooltipItem","_this$state5","renderBrush","_this$state6","renderReferenceElement","_this$state7","_element$props2","renderActivePoints","_ref12","activePoint","basePoint","isRange","_item$item$props","activeDot","renderActiveDot","renderGraphicChild","filterFormatItem","_this$state8","_item$item$props2","hasActive","itemEvents","onCLick","renderCustomized","throttleDelay","eventType","pageY","calculateChartCoordinate","pageYOffset","clientTop","pageXOffset","clientLeft","_this$state9","xScale","yScale","xValue","yValue","toolTipData","_this$state10","_this$state11","_cx","_cy","innerPoint","outerPoint","_this$state12","tooltipEvents","_maxListeners","syncMethod","_this$state13","validateChartX","validateChartY","axisOptions","_this$state$offset","_ref13","_ref14","_ref15","_ref16","_this$state$xAxisMap","_this$state$xAxisMap$","_this$state$yAxisMap","_this$state$yAxisMap$","chartXY","itemDisplayName","activeBarItem","_activeBarItem","CartesianGrid","Line","Area","Radar","RadialBar","Scatter","Pie","Funnel","PolarGrid","PolarAngleAxis","PolarRadiusAxis","Customized","renderClipPath","parseEventsOfWrapper","prevHeight","prevLayout","prevStackOffset","prevMargin","_defaultState","keepFromPrevState","updatesToState","newUpdateId","generateCategoricalChart","ids","leftMirror","rightMirror","topMirror","bottomMirror","calculatedPadding","needSpace","_axis$padding","offsetKey","smallestDistanceBetweenValues","sortedValues","smallestDistanceInPercent","rangeWidth","halfBand","_parseScale","finalAxis","StyledTooltip","n_points","max_points","PartProgressContainer","StyledBarChart","CustomLabel","appliesForStudyRight","BAR_CHART_WIDTH","BAR_CHART_Y_AXIS_WIDTH","allChartData","tool","nPointsSum","maxPointsSum","totalProgress","totalPointsHeader","improveGroupName","currentCourseVariant","StyledModal","Modal","ModalContent","ModalControls","Title","PointsBalloonContent","applies_for_study_right","Loading","PointsBalloonContainer","PointsBalloon","fontAwesomeConfig","SidebarPush","Layout","siteTitle","siteMetadata","Helmet","defaultTitle","titleTemplate","courseMetaData","nthIndex","pat","extractPartNumberFromPath","subpartSeperator","extractSubpartNumberFromPath","capitalizeFirstLetter","stringParts","splitGroupNameToWordAndNumber","removeLeadingZeros","normalizeExerciseId","SimpleErrorBoundary","getDerivedStateFromError","componentDidCatch","getNative","hashClear","hashDelete","hashGet","hashHas","hashSet","Hash","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","ListCache","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","MapCache","setCacheAdd","setCacheHas","SetCache","__data__","stackClear","stackDelete","stackGet","stackHas","stackSet","Stack","WeakMap","resIndex","baseIndexOf","baseTimes","isArguments","isIndex","inherited","isArr","isArg","isBuff","isType","skipIndexes","iteratee","baseForOwn","baseEach","createBaseEach","collection","fromRight","arrayPush","isFlattenable","baseFlatten","isStrict","baseFor","createBaseFor","castPath","toKey","keysFunc","symbolsFunc","getRawTag","objectToString","symToStringTag","baseFindIndex","baseIsNaN","strictIndexOf","baseGetTag","isObjectLike","baseIsEqualDeep","baseIsEqual","bitmask","customizer","equalArrays","equalByTag","equalObjects","argsTag","arrayTag","objectTag","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","matchData","noCustomizer","objValue","srcValue","COMPARE_PARTIAL_FLAG","isMasked","toSource","reIsHostCtor","funcProto","objectProto","funcToString","reIsNative","isLength","typedArrayTags","baseMatches","baseMatchesProperty","isPrototype","nativeKeys","isArrayLike","baseIsMatch","getMatchData","matchesStrictComparable","hasIn","isKey","isStrictComparable","arrayMap","baseGet","baseIteratee","baseMap","baseSortBy","baseUnary","compareMultiple","iteratees","orders","nativeCeil","nativeMax","overRest","setToString","baseSetToString","comparer","symbolProto","symbolToString","baseToString","trimmedEndIndex","reTrimStart","arrayIncludesWith","cacheHas","createSet","setToArray","isCommon","seen","seenIndex","stringToPath","baseSlice","valIsDefined","valIsNull","valIsReflexive","valIsSymbol","othIsDefined","othIsNull","othIsReflexive","othIsSymbol","compareAscending","objCriteria","criteria","othCriteria","ordersLength","coreJsData","eachFunc","castSlice","hasUnicode","stringToArray","strSymbols","trailing","findIndexFunc","baseRange","isIterateeCall","toFinite","isPartial","arrLength","othLength","arrStacked","othStacked","arrValue","othValue","compared","othIndex","mapToArray","symbolValueOf","stacked","getAllKeys","objProps","objLength","objStacked","skipCtor","objCtor","othCtor","freeGlobal","baseGetAllKeys","isKeyable","baseIsNative","getValue","nativeObjectToString","isOwn","unmasked","stubArray","nativeGetSymbols","mapTag","promiseTag","setTag","weakMapTag","dataViewTag","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","ctorString","hasFunc","reHasUnicode","nativeCreate","spreadableSymbol","isConcatSpreadable","reIsUint","reIsDeepProp","reIsPlainProp","maskSrcKey","assocIndexOf","getMapData","overArg","freeExports","freeModule","freeProcess","nodeUtil","require","binding","otherArgs","freeSelf","shortOut","nativeNow","lastCalled","stamp","pairs","LARGE_ARRAY_SIZE","asciiToArray","unicodeToArray","memoizeCapped","rePropName","reEscapeChar","subString","reWhitespace","rsAstralRange","rsAstral","rsCombo","rsFitz","rsNonAstral","rsRegional","rsSurrPair","reOptMod","rsOptVar","rsSeq","rsSymbol","reUnicode","nativeMin","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","invokeFunc","leadingEdge","timerExpired","shouldInvoke","timeSinceLastCall","trailingEdge","timeWaiting","remainingWait","debounced","isInvoking","baseEvery","guard","createFind","baseHasIn","hasPath","baseIsArguments","stubFalse","baseIsTypedArray","nodeIsTypedArray","arrayLikeKeys","baseKeys","baseAssignValue","baseExtremum","baseGt","resolver","memoized","Cache","baseLt","baseProperty","basePropertyDeep","createRange","baseSome","baseOrderBy","baseRest","sortBy","debounce","INFINITY","remainder","baseTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","isBinary","baseUniq","upperFirst","createCaseFirst","_hasClass","baseVal","replaceClassName","origClass","classToRemove"],"mappings":"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","file":"commons-042af59ccee387ac69c9.js","sourcesContent":["function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n}\nmodule.exports = _arrayLikeToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\nmodule.exports = _arrayWithHoles, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nmodule.exports = _classCallCheck, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var toPropertyKey = require(\"./toPropertyKey.js\");\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, toPropertyKey(descriptor.key), descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}\nmodule.exports = _createClass, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var toPropertyKey = require(\"./toPropertyKey.js\");\nfunction _defineProperty(obj, key, value) {\n key = toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nmodule.exports = _defineProperty, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\nexport default function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(undefined);\n });\n };\n}","export default function _taggedTemplateLiteralLoose(strings, raw) {\n if (!raw) {\n raw = strings.slice(0);\n }\n strings.raw = raw;\n return strings;\n}","function _iterableToArrayLimit(arr, i) {\n var _i = null == arr ? null : \"undefined\" != typeof Symbol && arr[Symbol.iterator] || arr[\"@@iterator\"];\n if (null != _i) {\n var _s,\n _e,\n _x,\n _r,\n _arr = [],\n _n = !0,\n _d = !1;\n try {\n if (_x = (_i = _i.call(arr)).next, 0 === i) {\n if (Object(_i) !== _i) return;\n _n = !1;\n } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0) {\n ;\n }\n } catch (err) {\n _d = !0, _e = err;\n } finally {\n try {\n if (!_n && null != _i[\"return\"] && (_r = _i[\"return\"](), Object(_r) !== _r)) return;\n } finally {\n if (_d) throw _e;\n }\n }\n return _arr;\n }\n}\nmodule.exports = _iterableToArrayLimit, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nmodule.exports = _nonIterableRest, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var objectWithoutPropertiesLoose = require(\"./objectWithoutPropertiesLoose.js\");\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nmodule.exports = _objectWithoutProperties, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction _regeneratorRuntime() {\n \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */\n module.exports = _regeneratorRuntime = function _regeneratorRuntime() {\n return exports;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n var exports = {},\n Op = Object.prototype,\n hasOwn = Op.hasOwnProperty,\n defineProperty = Object.defineProperty || function (obj, key, desc) {\n obj[key] = desc.value;\n },\n $Symbol = \"function\" == typeof Symbol ? Symbol : {},\n iteratorSymbol = $Symbol.iterator || \"@@iterator\",\n asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\",\n toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n function define(obj, key, value) {\n return Object.defineProperty(obj, key, {\n value: value,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }), obj[key];\n }\n try {\n define({}, \"\");\n } catch (err) {\n define = function define(obj, key, value) {\n return obj[key] = value;\n };\n }\n function wrap(innerFn, outerFn, self, tryLocsList) {\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator,\n generator = Object.create(protoGenerator.prototype),\n context = new Context(tryLocsList || []);\n return defineProperty(generator, \"_invoke\", {\n value: makeInvokeMethod(innerFn, self, context)\n }), generator;\n }\n function tryCatch(fn, obj, arg) {\n try {\n return {\n type: \"normal\",\n arg: fn.call(obj, arg)\n };\n } catch (err) {\n return {\n type: \"throw\",\n arg: err\n };\n }\n }\n exports.wrap = wrap;\n var ContinueSentinel = {};\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n var IteratorPrototype = {};\n define(IteratorPrototype, iteratorSymbol, function () {\n return this;\n });\n var getProto = Object.getPrototypeOf,\n NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype);\n var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function (method) {\n define(prototype, method, function (arg) {\n return this._invoke(method, arg);\n });\n });\n }\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (\"throw\" !== record.type) {\n var result = record.arg,\n value = result.value;\n return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) {\n invoke(\"next\", value, resolve, reject);\n }, function (err) {\n invoke(\"throw\", err, resolve, reject);\n }) : PromiseImpl.resolve(value).then(function (unwrapped) {\n result.value = unwrapped, resolve(result);\n }, function (error) {\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n reject(record.arg);\n }\n var previousPromise;\n defineProperty(this, \"_invoke\", {\n value: function value(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function (resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();\n }\n });\n }\n function makeInvokeMethod(innerFn, self, context) {\n var state = \"suspendedStart\";\n return function (method, arg) {\n if (\"executing\" === state) throw new Error(\"Generator is already running\");\n if (\"completed\" === state) {\n if (\"throw\" === method) throw arg;\n return doneResult();\n }\n for (context.method = method, context.arg = arg;;) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) {\n if (\"suspendedStart\" === state) throw state = \"completed\", context.arg;\n context.dispatchException(context.arg);\n } else \"return\" === context.method && context.abrupt(\"return\", context.arg);\n state = \"executing\";\n var record = tryCatch(innerFn, self, context);\n if (\"normal\" === record.type) {\n if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue;\n return {\n value: record.arg,\n done: context.done\n };\n }\n \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg);\n }\n };\n }\n function maybeInvokeDelegate(delegate, context) {\n var methodName = context.method,\n method = delegate.iterator[methodName];\n if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel;\n var record = tryCatch(method, delegate.iterator, context.arg);\n if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel;\n var info = record.arg;\n return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel);\n }\n function pushTryEntry(locs) {\n var entry = {\n tryLoc: locs[0]\n };\n 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);\n }\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\", delete record.arg, entry.completion = record;\n }\n function Context(tryLocsList) {\n this.tryEntries = [{\n tryLoc: \"root\"\n }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0);\n }\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) return iteratorMethod.call(iterable);\n if (\"function\" == typeof iterable.next) return iterable;\n if (!isNaN(iterable.length)) {\n var i = -1,\n next = function next() {\n for (; ++i < iterable.length;) {\n if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next;\n }\n return next.value = undefined, next.done = !0, next;\n };\n return next.next = next;\n }\n }\n return {\n next: doneResult\n };\n }\n function doneResult() {\n return {\n value: undefined,\n done: !0\n };\n }\n return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", {\n value: GeneratorFunctionPrototype,\n configurable: !0\n }), defineProperty(GeneratorFunctionPrototype, \"constructor\", {\n value: GeneratorFunction,\n configurable: !0\n }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) {\n var ctor = \"function\" == typeof genFun && genFun.constructor;\n return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name));\n }, exports.mark = function (genFun) {\n return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun;\n }, exports.awrap = function (arg) {\n return {\n __await: arg\n };\n }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n return this;\n }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n void 0 === PromiseImpl && (PromiseImpl = Promise);\n var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);\n return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) {\n return result.done ? result.value : iter.next();\n });\n }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () {\n return this;\n }), define(Gp, \"toString\", function () {\n return \"[object Generator]\";\n }), exports.keys = function (val) {\n var object = Object(val),\n keys = [];\n for (var key in object) {\n keys.push(key);\n }\n return keys.reverse(), function next() {\n for (; keys.length;) {\n var key = keys.pop();\n if (key in object) return next.value = key, next.done = !1, next;\n }\n return next.done = !0, next;\n };\n }, exports.values = values, Context.prototype = {\n constructor: Context,\n reset: function reset(skipTempReset) {\n if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) {\n \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined);\n }\n },\n stop: function stop() {\n this.done = !0;\n var rootRecord = this.tryEntries[0].completion;\n if (\"throw\" === rootRecord.type) throw rootRecord.arg;\n return this.rval;\n },\n dispatchException: function dispatchException(exception) {\n if (this.done) throw exception;\n var context = this;\n function handle(loc, caught) {\n return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught;\n }\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i],\n record = entry.completion;\n if (\"root\" === entry.tryLoc) return handle(\"end\");\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\"),\n hasFinally = hasOwn.call(entry, \"finallyLoc\");\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);\n if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);\n } else {\n if (!hasFinally) throw new Error(\"try statement without catch or finally\");\n if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);\n }\n }\n }\n },\n abrupt: function abrupt(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);\n var record = finallyEntry ? finallyEntry.completion : {};\n return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);\n },\n complete: function complete(record, afterLoc) {\n if (\"throw\" === record.type) throw record.arg;\n return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;\n },\n finish: function finish(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;\n }\n },\n \"catch\": function _catch(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (\"throw\" === record.type) {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n throw new Error(\"illegal catch attempt\");\n },\n delegateYield: function delegateYield(iterable, resultName, nextLoc) {\n return this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel;\n }\n }, exports;\n}\nmodule.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var arrayWithHoles = require(\"./arrayWithHoles.js\");\nvar iterableToArrayLimit = require(\"./iterableToArrayLimit.js\");\nvar unsupportedIterableToArray = require(\"./unsupportedIterableToArray.js\");\nvar nonIterableRest = require(\"./nonIterableRest.js\");\nfunction _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}\nmodule.exports = _slicedToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction _toPrimitive(input, hint) {\n if (_typeof(input) !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (_typeof(res) !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}\nmodule.exports = _toPrimitive, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nvar toPrimitive = require(\"./toPrimitive.js\");\nfunction _toPropertyKey(arg) {\n var key = toPrimitive(arg, \"string\");\n return _typeof(key) === \"symbol\" ? key : String(key);\n}\nmodule.exports = _toPropertyKey, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return (module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports), _typeof(obj);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var arrayLikeToArray = require(\"./arrayLikeToArray.js\");\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}\nmodule.exports = _unsupportedIterableToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","// TODO(Babel 8): Remove this file.\n\nvar runtime = require(\"../helpers/regeneratorRuntime\")();\nmodule.exports = runtime;\n\n// Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736=\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","function ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n enumerableOnly && (symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n })), keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = null != arguments[i] ? arguments[i] : {};\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}\nfunction _wrapRegExp() {\n _wrapRegExp = function _wrapRegExp(re, groups) {\n return new BabelRegExp(re, void 0, groups);\n };\n var _super = RegExp.prototype,\n _groups = new WeakMap();\n function BabelRegExp(re, flags, groups) {\n var _this = new RegExp(re, flags);\n return _groups.set(_this, groups || _groups.get(re)), _setPrototypeOf(_this, BabelRegExp.prototype);\n }\n function buildGroups(result, re) {\n var g = _groups.get(re);\n return Object.keys(g).reduce(function (groups, name) {\n return groups[name] = result[g[name]], groups;\n }, Object.create(null));\n }\n return _inherits(BabelRegExp, RegExp), BabelRegExp.prototype.exec = function (str) {\n var result = _super.exec.call(this, str);\n return result && (result.groups = buildGroups(result, this)), result;\n }, BabelRegExp.prototype[Symbol.replace] = function (str, substitution) {\n if (\"string\" == typeof substitution) {\n var groups = _groups.get(this);\n return _super[Symbol.replace].call(this, str, substitution.replace(/\\$<([^>]+)>/g, function (_, name) {\n return \"$\" + groups[name];\n }));\n }\n if (\"function\" == typeof substitution) {\n var _this = this;\n return _super[Symbol.replace].call(this, str, function () {\n var args = arguments;\n return \"object\" != typeof args[args.length - 1] && (args = [].slice.call(args)).push(buildGroups(args, _this)), substitution.apply(this, args);\n });\n }\n return _super[Symbol.replace].call(this, str, substitution);\n }, _wrapRegExp.apply(this, arguments);\n}\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n Object.defineProperty(subClass, \"prototype\", {\n writable: false\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n}\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction _iterableToArrayLimit(arr, i) {\n var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"];\n if (_i == null) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _s, _e;\n try {\n for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n return _arr;\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nvar noop = function noop() {};\nvar _WINDOW = {};\nvar _DOCUMENT = {};\nvar _MUTATION_OBSERVER = null;\nvar _PERFORMANCE = {\n mark: noop,\n measure: noop\n};\ntry {\n if (typeof window !== 'undefined') _WINDOW = window;\n if (typeof document !== 'undefined') _DOCUMENT = document;\n if (typeof MutationObserver !== 'undefined') _MUTATION_OBSERVER = MutationObserver;\n if (typeof performance !== 'undefined') _PERFORMANCE = performance;\n} catch (e) {}\nvar _ref = _WINDOW.navigator || {},\n _ref$userAgent = _ref.userAgent,\n userAgent = _ref$userAgent === void 0 ? '' : _ref$userAgent;\nvar WINDOW = _WINDOW;\nvar DOCUMENT = _DOCUMENT;\nvar MUTATION_OBSERVER = _MUTATION_OBSERVER;\nvar PERFORMANCE = _PERFORMANCE;\nvar IS_BROWSER = !!WINDOW.document;\nvar IS_DOM = !!DOCUMENT.documentElement && !!DOCUMENT.head && typeof DOCUMENT.addEventListener === 'function' && typeof DOCUMENT.createElement === 'function';\nvar IS_IE = ~userAgent.indexOf('MSIE') || ~userAgent.indexOf('Trident/');\nvar _familyProxy, _familyProxy2, _familyProxy3, _familyProxy4, _familyProxy5;\nvar NAMESPACE_IDENTIFIER = '___FONT_AWESOME___';\nvar UNITS_IN_GRID = 16;\nvar DEFAULT_CSS_PREFIX = 'fa';\nvar DEFAULT_REPLACEMENT_CLASS = 'svg-inline--fa';\nvar DATA_FA_I2SVG = 'data-fa-i2svg';\nvar DATA_FA_PSEUDO_ELEMENT = 'data-fa-pseudo-element';\nvar DATA_FA_PSEUDO_ELEMENT_PENDING = 'data-fa-pseudo-element-pending';\nvar DATA_PREFIX = 'data-prefix';\nvar DATA_ICON = 'data-icon';\nvar HTML_CLASS_I2SVG_BASE_CLASS = 'fontawesome-i2svg';\nvar MUTATION_APPROACH_ASYNC = 'async';\nvar TAGNAMES_TO_SKIP_FOR_PSEUDOELEMENTS = ['HTML', 'HEAD', 'STYLE', 'SCRIPT'];\nvar PRODUCTION = function () {\n try {\n return process.env.NODE_ENV === 'production';\n } catch (e) {\n return false;\n }\n}();\nvar FAMILY_CLASSIC = 'classic';\nvar FAMILY_SHARP = 'sharp';\nvar FAMILIES = [FAMILY_CLASSIC, FAMILY_SHARP];\nfunction familyProxy(obj) {\n // Defaults to the classic family if family is not available\n return new Proxy(obj, {\n get: function get(target, prop) {\n return prop in target ? target[prop] : target[FAMILY_CLASSIC];\n }\n });\n}\nvar PREFIX_TO_STYLE = familyProxy((_familyProxy = {}, _defineProperty(_familyProxy, FAMILY_CLASSIC, {\n 'fa': 'solid',\n 'fas': 'solid',\n 'fa-solid': 'solid',\n 'far': 'regular',\n 'fa-regular': 'regular',\n 'fal': 'light',\n 'fa-light': 'light',\n 'fat': 'thin',\n 'fa-thin': 'thin',\n 'fad': 'duotone',\n 'fa-duotone': 'duotone',\n 'fab': 'brands',\n 'fa-brands': 'brands',\n 'fak': 'kit',\n 'fa-kit': 'kit'\n}), _defineProperty(_familyProxy, FAMILY_SHARP, {\n 'fa': 'solid',\n 'fass': 'solid',\n 'fa-solid': 'solid'\n}), _familyProxy));\nvar STYLE_TO_PREFIX = familyProxy((_familyProxy2 = {}, _defineProperty(_familyProxy2, FAMILY_CLASSIC, {\n 'solid': 'fas',\n 'regular': 'far',\n 'light': 'fal',\n 'thin': 'fat',\n 'duotone': 'fad',\n 'brands': 'fab',\n 'kit': 'fak'\n}), _defineProperty(_familyProxy2, FAMILY_SHARP, {\n 'solid': 'fass'\n}), _familyProxy2));\nvar PREFIX_TO_LONG_STYLE = familyProxy((_familyProxy3 = {}, _defineProperty(_familyProxy3, FAMILY_CLASSIC, {\n 'fab': 'fa-brands',\n 'fad': 'fa-duotone',\n 'fak': 'fa-kit',\n 'fal': 'fa-light',\n 'far': 'fa-regular',\n 'fas': 'fa-solid',\n 'fat': 'fa-thin'\n}), _defineProperty(_familyProxy3, FAMILY_SHARP, {\n 'fass': 'fa-solid'\n}), _familyProxy3));\nvar LONG_STYLE_TO_PREFIX = familyProxy((_familyProxy4 = {}, _defineProperty(_familyProxy4, FAMILY_CLASSIC, {\n 'fa-brands': 'fab',\n 'fa-duotone': 'fad',\n 'fa-kit': 'fak',\n 'fa-light': 'fal',\n 'fa-regular': 'far',\n 'fa-solid': 'fas',\n 'fa-thin': 'fat'\n}), _defineProperty(_familyProxy4, FAMILY_SHARP, {\n 'fa-solid': 'fass'\n}), _familyProxy4));\nvar ICON_SELECTION_SYNTAX_PATTERN = /fa(s|r|l|t|d|b|k|ss)?[\\-\\ ]/; // eslint-disable-line no-useless-escape\n\nvar LAYERS_TEXT_CLASSNAME = 'fa-layers-text';\nvar FONT_FAMILY_PATTERN = /Font ?Awesome ?([56 ]*)(Solid|Regular|Light|Thin|Duotone|Brands|Free|Pro|Sharp|Kit)?.*/i; // TODO: this needs to support fass\n// TODO: do we need to handle font-weight for kit SVG pseudo-elements?\n\nvar FONT_WEIGHT_TO_PREFIX = familyProxy((_familyProxy5 = {}, _defineProperty(_familyProxy5, FAMILY_CLASSIC, {\n '900': 'fas',\n '400': 'far',\n 'normal': 'far',\n '300': 'fal',\n '100': 'fat'\n}), _defineProperty(_familyProxy5, FAMILY_SHARP, {\n '900': 'fass'\n}), _familyProxy5));\nvar oneToTen = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\nvar oneToTwenty = oneToTen.concat([11, 12, 13, 14, 15, 16, 17, 18, 19, 20]);\nvar ATTRIBUTES_WATCHED_FOR_MUTATION = ['class', 'data-prefix', 'data-icon', 'data-fa-transform', 'data-fa-mask'];\nvar DUOTONE_CLASSES = {\n GROUP: 'duotone-group',\n SWAP_OPACITY: 'swap-opacity',\n PRIMARY: 'primary',\n SECONDARY: 'secondary'\n};\nvar prefixes = new Set();\nObject.keys(STYLE_TO_PREFIX[FAMILY_CLASSIC]).map(prefixes.add.bind(prefixes));\nObject.keys(STYLE_TO_PREFIX[FAMILY_SHARP]).map(prefixes.add.bind(prefixes));\nvar RESERVED_CLASSES = [].concat(FAMILIES, _toConsumableArray(prefixes), ['2xs', 'xs', 'sm', 'lg', 'xl', '2xl', 'beat', 'border', 'fade', 'beat-fade', 'bounce', 'flip-both', 'flip-horizontal', 'flip-vertical', 'flip', 'fw', 'inverse', 'layers-counter', 'layers-text', 'layers', 'li', 'pull-left', 'pull-right', 'pulse', 'rotate-180', 'rotate-270', 'rotate-90', 'rotate-by', 'shake', 'spin-pulse', 'spin-reverse', 'spin', 'stack-1x', 'stack-2x', 'stack', 'ul', DUOTONE_CLASSES.GROUP, DUOTONE_CLASSES.SWAP_OPACITY, DUOTONE_CLASSES.PRIMARY, DUOTONE_CLASSES.SECONDARY]).concat(oneToTen.map(function (n) {\n return \"\".concat(n, \"x\");\n})).concat(oneToTwenty.map(function (n) {\n return \"w-\".concat(n);\n}));\nvar initial = WINDOW.FontAwesomeConfig || {};\nfunction getAttrConfig(attr) {\n var element = DOCUMENT.querySelector('script[' + attr + ']');\n if (element) {\n return element.getAttribute(attr);\n }\n}\nfunction coerce(val) {\n // Getting an empty string will occur if the attribute is set on the HTML tag but without a value\n // We'll assume that this is an indication that it should be toggled to true\n if (val === '') return true;\n if (val === 'false') return false;\n if (val === 'true') return true;\n return val;\n}\nif (DOCUMENT && typeof DOCUMENT.querySelector === 'function') {\n var attrs = [['data-family-prefix', 'familyPrefix'], ['data-css-prefix', 'cssPrefix'], ['data-family-default', 'familyDefault'], ['data-style-default', 'styleDefault'], ['data-replacement-class', 'replacementClass'], ['data-auto-replace-svg', 'autoReplaceSvg'], ['data-auto-add-css', 'autoAddCss'], ['data-auto-a11y', 'autoA11y'], ['data-search-pseudo-elements', 'searchPseudoElements'], ['data-observe-mutations', 'observeMutations'], ['data-mutate-approach', 'mutateApproach'], ['data-keep-original-source', 'keepOriginalSource'], ['data-measure-performance', 'measurePerformance'], ['data-show-missing-icons', 'showMissingIcons']];\n attrs.forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n attr = _ref2[0],\n key = _ref2[1];\n var val = coerce(getAttrConfig(attr));\n if (val !== undefined && val !== null) {\n initial[key] = val;\n }\n });\n}\nvar _default = {\n styleDefault: 'solid',\n familyDefault: 'classic',\n cssPrefix: DEFAULT_CSS_PREFIX,\n replacementClass: DEFAULT_REPLACEMENT_CLASS,\n autoReplaceSvg: true,\n autoAddCss: true,\n autoA11y: true,\n searchPseudoElements: false,\n observeMutations: true,\n mutateApproach: 'async',\n keepOriginalSource: true,\n measurePerformance: false,\n showMissingIcons: true\n}; // familyPrefix is deprecated but we must still support it if present\n\nif (initial.familyPrefix) {\n initial.cssPrefix = initial.familyPrefix;\n}\nvar _config = _objectSpread2(_objectSpread2({}, _default), initial);\nif (!_config.autoReplaceSvg) _config.observeMutations = false;\nvar config = {};\nObject.keys(_default).forEach(function (key) {\n Object.defineProperty(config, key, {\n enumerable: true,\n set: function set(val) {\n _config[key] = val;\n _onChangeCb.forEach(function (cb) {\n return cb(config);\n });\n },\n get: function get() {\n return _config[key];\n }\n });\n}); // familyPrefix is deprecated as of 6.2.0 and should be removed in 7.0.0\n\nObject.defineProperty(config, 'familyPrefix', {\n enumerable: true,\n set: function set(val) {\n _config.cssPrefix = val;\n _onChangeCb.forEach(function (cb) {\n return cb(config);\n });\n },\n get: function get() {\n return _config.cssPrefix;\n }\n});\nWINDOW.FontAwesomeConfig = config;\nvar _onChangeCb = [];\nfunction onChange(cb) {\n _onChangeCb.push(cb);\n return function () {\n _onChangeCb.splice(_onChangeCb.indexOf(cb), 1);\n };\n}\nvar d = UNITS_IN_GRID;\nvar meaninglessTransform = {\n size: 16,\n x: 0,\n y: 0,\n rotate: 0,\n flipX: false,\n flipY: false\n};\nfunction insertCss(css) {\n if (!css || !IS_DOM) {\n return;\n }\n var style = DOCUMENT.createElement('style');\n style.setAttribute('type', 'text/css');\n style.innerHTML = css;\n var headChildren = DOCUMENT.head.childNodes;\n var beforeChild = null;\n for (var i = headChildren.length - 1; i > -1; i--) {\n var child = headChildren[i];\n var tagName = (child.tagName || '').toUpperCase();\n if (['STYLE', 'LINK'].indexOf(tagName) > -1) {\n beforeChild = child;\n }\n }\n DOCUMENT.head.insertBefore(style, beforeChild);\n return css;\n}\nvar idPool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\nfunction nextUniqueId() {\n var size = 12;\n var id = '';\n while (size-- > 0) {\n id += idPool[Math.random() * 62 | 0];\n }\n return id;\n}\nfunction toArray(obj) {\n var array = [];\n for (var i = (obj || []).length >>> 0; i--;) {\n array[i] = obj[i];\n }\n return array;\n}\nfunction classArray(node) {\n if (node.classList) {\n return toArray(node.classList);\n } else {\n return (node.getAttribute('class') || '').split(' ').filter(function (i) {\n return i;\n });\n }\n}\nfunction htmlEscape(str) {\n return \"\".concat(str).replace(/&/g, '&').replace(/\"/g, '"').replace(/'/g, ''').replace(//g, '>');\n}\nfunction joinAttributes(attributes) {\n return Object.keys(attributes || {}).reduce(function (acc, attributeName) {\n return acc + \"\".concat(attributeName, \"=\\\"\").concat(htmlEscape(attributes[attributeName]), \"\\\" \");\n }, '').trim();\n}\nfunction joinStyles(styles) {\n return Object.keys(styles || {}).reduce(function (acc, styleName) {\n return acc + \"\".concat(styleName, \": \").concat(styles[styleName].trim(), \";\");\n }, '');\n}\nfunction transformIsMeaningful(transform) {\n return transform.size !== meaninglessTransform.size || transform.x !== meaninglessTransform.x || transform.y !== meaninglessTransform.y || transform.rotate !== meaninglessTransform.rotate || transform.flipX || transform.flipY;\n}\nfunction transformForSvg(_ref) {\n var transform = _ref.transform,\n containerWidth = _ref.containerWidth,\n iconWidth = _ref.iconWidth;\n var outer = {\n transform: \"translate(\".concat(containerWidth / 2, \" 256)\")\n };\n var innerTranslate = \"translate(\".concat(transform.x * 32, \", \").concat(transform.y * 32, \") \");\n var innerScale = \"scale(\".concat(transform.size / 16 * (transform.flipX ? -1 : 1), \", \").concat(transform.size / 16 * (transform.flipY ? -1 : 1), \") \");\n var innerRotate = \"rotate(\".concat(transform.rotate, \" 0 0)\");\n var inner = {\n transform: \"\".concat(innerTranslate, \" \").concat(innerScale, \" \").concat(innerRotate)\n };\n var path = {\n transform: \"translate(\".concat(iconWidth / 2 * -1, \" -256)\")\n };\n return {\n outer: outer,\n inner: inner,\n path: path\n };\n}\nfunction transformForCss(_ref2) {\n var transform = _ref2.transform,\n _ref2$width = _ref2.width,\n width = _ref2$width === void 0 ? UNITS_IN_GRID : _ref2$width,\n _ref2$height = _ref2.height,\n height = _ref2$height === void 0 ? UNITS_IN_GRID : _ref2$height,\n _ref2$startCentered = _ref2.startCentered,\n startCentered = _ref2$startCentered === void 0 ? false : _ref2$startCentered;\n var val = '';\n if (startCentered && IS_IE) {\n val += \"translate(\".concat(transform.x / d - width / 2, \"em, \").concat(transform.y / d - height / 2, \"em) \");\n } else if (startCentered) {\n val += \"translate(calc(-50% + \".concat(transform.x / d, \"em), calc(-50% + \").concat(transform.y / d, \"em)) \");\n } else {\n val += \"translate(\".concat(transform.x / d, \"em, \").concat(transform.y / d, \"em) \");\n }\n val += \"scale(\".concat(transform.size / d * (transform.flipX ? -1 : 1), \", \").concat(transform.size / d * (transform.flipY ? -1 : 1), \") \");\n val += \"rotate(\".concat(transform.rotate, \"deg) \");\n return val;\n}\nvar baseStyles = \":root, :host {\\n --fa-font-solid: normal 900 1em/1 \\\"Font Awesome 6 Solid\\\";\\n --fa-font-regular: normal 400 1em/1 \\\"Font Awesome 6 Regular\\\";\\n --fa-font-light: normal 300 1em/1 \\\"Font Awesome 6 Light\\\";\\n --fa-font-thin: normal 100 1em/1 \\\"Font Awesome 6 Thin\\\";\\n --fa-font-duotone: normal 900 1em/1 \\\"Font Awesome 6 Duotone\\\";\\n --fa-font-sharp-solid: normal 900 1em/1 \\\"Font Awesome 6 Sharp\\\";\\n --fa-font-brands: normal 400 1em/1 \\\"Font Awesome 6 Brands\\\";\\n}\\n\\nsvg:not(:root).svg-inline--fa, svg:not(:host).svg-inline--fa {\\n overflow: visible;\\n box-sizing: content-box;\\n}\\n\\n.svg-inline--fa {\\n display: var(--fa-display, inline-block);\\n height: 1em;\\n overflow: visible;\\n vertical-align: -0.125em;\\n}\\n.svg-inline--fa.fa-2xs {\\n vertical-align: 0.1em;\\n}\\n.svg-inline--fa.fa-xs {\\n vertical-align: 0em;\\n}\\n.svg-inline--fa.fa-sm {\\n vertical-align: -0.0714285705em;\\n}\\n.svg-inline--fa.fa-lg {\\n vertical-align: -0.2em;\\n}\\n.svg-inline--fa.fa-xl {\\n vertical-align: -0.25em;\\n}\\n.svg-inline--fa.fa-2xl {\\n vertical-align: -0.3125em;\\n}\\n.svg-inline--fa.fa-pull-left {\\n margin-right: var(--fa-pull-margin, 0.3em);\\n width: auto;\\n}\\n.svg-inline--fa.fa-pull-right {\\n margin-left: var(--fa-pull-margin, 0.3em);\\n width: auto;\\n}\\n.svg-inline--fa.fa-li {\\n width: var(--fa-li-width, 2em);\\n top: 0.25em;\\n}\\n.svg-inline--fa.fa-fw {\\n width: var(--fa-fw-width, 1.25em);\\n}\\n\\n.fa-layers svg.svg-inline--fa {\\n bottom: 0;\\n left: 0;\\n margin: auto;\\n position: absolute;\\n right: 0;\\n top: 0;\\n}\\n\\n.fa-layers-counter, .fa-layers-text {\\n display: inline-block;\\n position: absolute;\\n text-align: center;\\n}\\n\\n.fa-layers {\\n display: inline-block;\\n height: 1em;\\n position: relative;\\n text-align: center;\\n vertical-align: -0.125em;\\n width: 1em;\\n}\\n.fa-layers svg.svg-inline--fa {\\n -webkit-transform-origin: center center;\\n transform-origin: center center;\\n}\\n\\n.fa-layers-text {\\n left: 50%;\\n top: 50%;\\n -webkit-transform: translate(-50%, -50%);\\n transform: translate(-50%, -50%);\\n -webkit-transform-origin: center center;\\n transform-origin: center center;\\n}\\n\\n.fa-layers-counter {\\n background-color: var(--fa-counter-background-color, #ff253a);\\n border-radius: var(--fa-counter-border-radius, 1em);\\n box-sizing: border-box;\\n color: var(--fa-inverse, #fff);\\n line-height: var(--fa-counter-line-height, 1);\\n max-width: var(--fa-counter-max-width, 5em);\\n min-width: var(--fa-counter-min-width, 1.5em);\\n overflow: hidden;\\n padding: var(--fa-counter-padding, 0.25em 0.5em);\\n right: var(--fa-right, 0);\\n text-overflow: ellipsis;\\n top: var(--fa-top, 0);\\n -webkit-transform: scale(var(--fa-counter-scale, 0.25));\\n transform: scale(var(--fa-counter-scale, 0.25));\\n -webkit-transform-origin: top right;\\n transform-origin: top right;\\n}\\n\\n.fa-layers-bottom-right {\\n bottom: var(--fa-bottom, 0);\\n right: var(--fa-right, 0);\\n top: auto;\\n -webkit-transform: scale(var(--fa-layers-scale, 0.25));\\n transform: scale(var(--fa-layers-scale, 0.25));\\n -webkit-transform-origin: bottom right;\\n transform-origin: bottom right;\\n}\\n\\n.fa-layers-bottom-left {\\n bottom: var(--fa-bottom, 0);\\n left: var(--fa-left, 0);\\n right: auto;\\n top: auto;\\n -webkit-transform: scale(var(--fa-layers-scale, 0.25));\\n transform: scale(var(--fa-layers-scale, 0.25));\\n -webkit-transform-origin: bottom left;\\n transform-origin: bottom left;\\n}\\n\\n.fa-layers-top-right {\\n top: var(--fa-top, 0);\\n right: var(--fa-right, 0);\\n -webkit-transform: scale(var(--fa-layers-scale, 0.25));\\n transform: scale(var(--fa-layers-scale, 0.25));\\n -webkit-transform-origin: top right;\\n transform-origin: top right;\\n}\\n\\n.fa-layers-top-left {\\n left: var(--fa-left, 0);\\n right: auto;\\n top: var(--fa-top, 0);\\n -webkit-transform: scale(var(--fa-layers-scale, 0.25));\\n transform: scale(var(--fa-layers-scale, 0.25));\\n -webkit-transform-origin: top left;\\n transform-origin: top left;\\n}\\n\\n.fa-1x {\\n font-size: 1em;\\n}\\n\\n.fa-2x {\\n font-size: 2em;\\n}\\n\\n.fa-3x {\\n font-size: 3em;\\n}\\n\\n.fa-4x {\\n font-size: 4em;\\n}\\n\\n.fa-5x {\\n font-size: 5em;\\n}\\n\\n.fa-6x {\\n font-size: 6em;\\n}\\n\\n.fa-7x {\\n font-size: 7em;\\n}\\n\\n.fa-8x {\\n font-size: 8em;\\n}\\n\\n.fa-9x {\\n font-size: 9em;\\n}\\n\\n.fa-10x {\\n font-size: 10em;\\n}\\n\\n.fa-2xs {\\n font-size: 0.625em;\\n line-height: 0.1em;\\n vertical-align: 0.225em;\\n}\\n\\n.fa-xs {\\n font-size: 0.75em;\\n line-height: 0.0833333337em;\\n vertical-align: 0.125em;\\n}\\n\\n.fa-sm {\\n font-size: 0.875em;\\n line-height: 0.0714285718em;\\n vertical-align: 0.0535714295em;\\n}\\n\\n.fa-lg {\\n font-size: 1.25em;\\n line-height: 0.05em;\\n vertical-align: -0.075em;\\n}\\n\\n.fa-xl {\\n font-size: 1.5em;\\n line-height: 0.0416666682em;\\n vertical-align: -0.125em;\\n}\\n\\n.fa-2xl {\\n font-size: 2em;\\n line-height: 0.03125em;\\n vertical-align: -0.1875em;\\n}\\n\\n.fa-fw {\\n text-align: center;\\n width: 1.25em;\\n}\\n\\n.fa-ul {\\n list-style-type: none;\\n margin-left: var(--fa-li-margin, 2.5em);\\n padding-left: 0;\\n}\\n.fa-ul > li {\\n position: relative;\\n}\\n\\n.fa-li {\\n left: calc(var(--fa-li-width, 2em) * -1);\\n position: absolute;\\n text-align: center;\\n width: var(--fa-li-width, 2em);\\n line-height: inherit;\\n}\\n\\n.fa-border {\\n border-color: var(--fa-border-color, #eee);\\n border-radius: var(--fa-border-radius, 0.1em);\\n border-style: var(--fa-border-style, solid);\\n border-width: var(--fa-border-width, 0.08em);\\n padding: var(--fa-border-padding, 0.2em 0.25em 0.15em);\\n}\\n\\n.fa-pull-left {\\n float: left;\\n margin-right: var(--fa-pull-margin, 0.3em);\\n}\\n\\n.fa-pull-right {\\n float: right;\\n margin-left: var(--fa-pull-margin, 0.3em);\\n}\\n\\n.fa-beat {\\n -webkit-animation-name: fa-beat;\\n animation-name: fa-beat;\\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\\n animation-delay: var(--fa-animation-delay, 0s);\\n -webkit-animation-direction: var(--fa-animation-direction, normal);\\n animation-direction: var(--fa-animation-direction, normal);\\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n animation-duration: var(--fa-animation-duration, 1s);\\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);\\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\\n}\\n\\n.fa-bounce {\\n -webkit-animation-name: fa-bounce;\\n animation-name: fa-bounce;\\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\\n animation-delay: var(--fa-animation-delay, 0s);\\n -webkit-animation-direction: var(--fa-animation-direction, normal);\\n animation-direction: var(--fa-animation-direction, normal);\\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n animation-duration: var(--fa-animation-duration, 1s);\\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));\\n animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));\\n}\\n\\n.fa-fade {\\n -webkit-animation-name: fa-fade;\\n animation-name: fa-fade;\\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\\n animation-delay: var(--fa-animation-delay, 0s);\\n -webkit-animation-direction: var(--fa-animation-direction, normal);\\n animation-direction: var(--fa-animation-direction, normal);\\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n animation-duration: var(--fa-animation-duration, 1s);\\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\\n animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\\n}\\n\\n.fa-beat-fade {\\n -webkit-animation-name: fa-beat-fade;\\n animation-name: fa-beat-fade;\\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\\n animation-delay: var(--fa-animation-delay, 0s);\\n -webkit-animation-direction: var(--fa-animation-direction, normal);\\n animation-direction: var(--fa-animation-direction, normal);\\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n animation-duration: var(--fa-animation-duration, 1s);\\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\\n animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\\n}\\n\\n.fa-flip {\\n -webkit-animation-name: fa-flip;\\n animation-name: fa-flip;\\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\\n animation-delay: var(--fa-animation-delay, 0s);\\n -webkit-animation-direction: var(--fa-animation-direction, normal);\\n animation-direction: var(--fa-animation-direction, normal);\\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n animation-duration: var(--fa-animation-duration, 1s);\\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);\\n animation-timing-function: var(--fa-animation-timing, ease-in-out);\\n}\\n\\n.fa-shake {\\n -webkit-animation-name: fa-shake;\\n animation-name: fa-shake;\\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\\n animation-delay: var(--fa-animation-delay, 0s);\\n -webkit-animation-direction: var(--fa-animation-direction, normal);\\n animation-direction: var(--fa-animation-direction, normal);\\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n animation-duration: var(--fa-animation-duration, 1s);\\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n -webkit-animation-timing-function: var(--fa-animation-timing, linear);\\n animation-timing-function: var(--fa-animation-timing, linear);\\n}\\n\\n.fa-spin {\\n -webkit-animation-name: fa-spin;\\n animation-name: fa-spin;\\n -webkit-animation-delay: var(--fa-animation-delay, 0s);\\n animation-delay: var(--fa-animation-delay, 0s);\\n -webkit-animation-direction: var(--fa-animation-direction, normal);\\n animation-direction: var(--fa-animation-direction, normal);\\n -webkit-animation-duration: var(--fa-animation-duration, 2s);\\n animation-duration: var(--fa-animation-duration, 2s);\\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n -webkit-animation-timing-function: var(--fa-animation-timing, linear);\\n animation-timing-function: var(--fa-animation-timing, linear);\\n}\\n\\n.fa-spin-reverse {\\n --fa-animation-direction: reverse;\\n}\\n\\n.fa-pulse,\\n.fa-spin-pulse {\\n -webkit-animation-name: fa-spin;\\n animation-name: fa-spin;\\n -webkit-animation-direction: var(--fa-animation-direction, normal);\\n animation-direction: var(--fa-animation-direction, normal);\\n -webkit-animation-duration: var(--fa-animation-duration, 1s);\\n animation-duration: var(--fa-animation-duration, 1s);\\n -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n -webkit-animation-timing-function: var(--fa-animation-timing, steps(8));\\n animation-timing-function: var(--fa-animation-timing, steps(8));\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n .fa-beat,\\n.fa-bounce,\\n.fa-fade,\\n.fa-beat-fade,\\n.fa-flip,\\n.fa-pulse,\\n.fa-shake,\\n.fa-spin,\\n.fa-spin-pulse {\\n -webkit-animation-delay: -1ms;\\n animation-delay: -1ms;\\n -webkit-animation-duration: 1ms;\\n animation-duration: 1ms;\\n -webkit-animation-iteration-count: 1;\\n animation-iteration-count: 1;\\n transition-delay: 0s;\\n transition-duration: 0s;\\n }\\n}\\n@-webkit-keyframes fa-beat {\\n 0%, 90% {\\n -webkit-transform: scale(1);\\n transform: scale(1);\\n }\\n 45% {\\n -webkit-transform: scale(var(--fa-beat-scale, 1.25));\\n transform: scale(var(--fa-beat-scale, 1.25));\\n }\\n}\\n@keyframes fa-beat {\\n 0%, 90% {\\n -webkit-transform: scale(1);\\n transform: scale(1);\\n }\\n 45% {\\n -webkit-transform: scale(var(--fa-beat-scale, 1.25));\\n transform: scale(var(--fa-beat-scale, 1.25));\\n }\\n}\\n@-webkit-keyframes fa-bounce {\\n 0% {\\n -webkit-transform: scale(1, 1) translateY(0);\\n transform: scale(1, 1) translateY(0);\\n }\\n 10% {\\n -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);\\n transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);\\n }\\n 30% {\\n -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));\\n transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));\\n }\\n 50% {\\n -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);\\n transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);\\n }\\n 57% {\\n -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));\\n transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));\\n }\\n 64% {\\n -webkit-transform: scale(1, 1) translateY(0);\\n transform: scale(1, 1) translateY(0);\\n }\\n 100% {\\n -webkit-transform: scale(1, 1) translateY(0);\\n transform: scale(1, 1) translateY(0);\\n }\\n}\\n@keyframes fa-bounce {\\n 0% {\\n -webkit-transform: scale(1, 1) translateY(0);\\n transform: scale(1, 1) translateY(0);\\n }\\n 10% {\\n -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);\\n transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);\\n }\\n 30% {\\n -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));\\n transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));\\n }\\n 50% {\\n -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);\\n transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);\\n }\\n 57% {\\n -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));\\n transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));\\n }\\n 64% {\\n -webkit-transform: scale(1, 1) translateY(0);\\n transform: scale(1, 1) translateY(0);\\n }\\n 100% {\\n -webkit-transform: scale(1, 1) translateY(0);\\n transform: scale(1, 1) translateY(0);\\n }\\n}\\n@-webkit-keyframes fa-fade {\\n 50% {\\n opacity: var(--fa-fade-opacity, 0.4);\\n }\\n}\\n@keyframes fa-fade {\\n 50% {\\n opacity: var(--fa-fade-opacity, 0.4);\\n }\\n}\\n@-webkit-keyframes fa-beat-fade {\\n 0%, 100% {\\n opacity: var(--fa-beat-fade-opacity, 0.4);\\n -webkit-transform: scale(1);\\n transform: scale(1);\\n }\\n 50% {\\n opacity: 1;\\n -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));\\n transform: scale(var(--fa-beat-fade-scale, 1.125));\\n }\\n}\\n@keyframes fa-beat-fade {\\n 0%, 100% {\\n opacity: var(--fa-beat-fade-opacity, 0.4);\\n -webkit-transform: scale(1);\\n transform: scale(1);\\n }\\n 50% {\\n opacity: 1;\\n -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));\\n transform: scale(var(--fa-beat-fade-scale, 1.125));\\n }\\n}\\n@-webkit-keyframes fa-flip {\\n 50% {\\n -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));\\n transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));\\n }\\n}\\n@keyframes fa-flip {\\n 50% {\\n -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));\\n transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));\\n }\\n}\\n@-webkit-keyframes fa-shake {\\n 0% {\\n -webkit-transform: rotate(-15deg);\\n transform: rotate(-15deg);\\n }\\n 4% {\\n -webkit-transform: rotate(15deg);\\n transform: rotate(15deg);\\n }\\n 8%, 24% {\\n -webkit-transform: rotate(-18deg);\\n transform: rotate(-18deg);\\n }\\n 12%, 28% {\\n -webkit-transform: rotate(18deg);\\n transform: rotate(18deg);\\n }\\n 16% {\\n -webkit-transform: rotate(-22deg);\\n transform: rotate(-22deg);\\n }\\n 20% {\\n -webkit-transform: rotate(22deg);\\n transform: rotate(22deg);\\n }\\n 32% {\\n -webkit-transform: rotate(-12deg);\\n transform: rotate(-12deg);\\n }\\n 36% {\\n -webkit-transform: rotate(12deg);\\n transform: rotate(12deg);\\n }\\n 40%, 100% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg);\\n }\\n}\\n@keyframes fa-shake {\\n 0% {\\n -webkit-transform: rotate(-15deg);\\n transform: rotate(-15deg);\\n }\\n 4% {\\n -webkit-transform: rotate(15deg);\\n transform: rotate(15deg);\\n }\\n 8%, 24% {\\n -webkit-transform: rotate(-18deg);\\n transform: rotate(-18deg);\\n }\\n 12%, 28% {\\n -webkit-transform: rotate(18deg);\\n transform: rotate(18deg);\\n }\\n 16% {\\n -webkit-transform: rotate(-22deg);\\n transform: rotate(-22deg);\\n }\\n 20% {\\n -webkit-transform: rotate(22deg);\\n transform: rotate(22deg);\\n }\\n 32% {\\n -webkit-transform: rotate(-12deg);\\n transform: rotate(-12deg);\\n }\\n 36% {\\n -webkit-transform: rotate(12deg);\\n transform: rotate(12deg);\\n }\\n 40%, 100% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg);\\n }\\n}\\n@-webkit-keyframes fa-spin {\\n 0% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg);\\n }\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg);\\n }\\n}\\n@keyframes fa-spin {\\n 0% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg);\\n }\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg);\\n }\\n}\\n.fa-rotate-90 {\\n -webkit-transform: rotate(90deg);\\n transform: rotate(90deg);\\n}\\n\\n.fa-rotate-180 {\\n -webkit-transform: rotate(180deg);\\n transform: rotate(180deg);\\n}\\n\\n.fa-rotate-270 {\\n -webkit-transform: rotate(270deg);\\n transform: rotate(270deg);\\n}\\n\\n.fa-flip-horizontal {\\n -webkit-transform: scale(-1, 1);\\n transform: scale(-1, 1);\\n}\\n\\n.fa-flip-vertical {\\n -webkit-transform: scale(1, -1);\\n transform: scale(1, -1);\\n}\\n\\n.fa-flip-both,\\n.fa-flip-horizontal.fa-flip-vertical {\\n -webkit-transform: scale(-1, -1);\\n transform: scale(-1, -1);\\n}\\n\\n.fa-rotate-by {\\n -webkit-transform: rotate(var(--fa-rotate-angle, none));\\n transform: rotate(var(--fa-rotate-angle, none));\\n}\\n\\n.fa-stack {\\n display: inline-block;\\n vertical-align: middle;\\n height: 2em;\\n position: relative;\\n width: 2.5em;\\n}\\n\\n.fa-stack-1x,\\n.fa-stack-2x {\\n bottom: 0;\\n left: 0;\\n margin: auto;\\n position: absolute;\\n right: 0;\\n top: 0;\\n z-index: var(--fa-stack-z-index, auto);\\n}\\n\\n.svg-inline--fa.fa-stack-1x {\\n height: 1em;\\n width: 1.25em;\\n}\\n.svg-inline--fa.fa-stack-2x {\\n height: 2em;\\n width: 2.5em;\\n}\\n\\n.fa-inverse {\\n color: var(--fa-inverse, #fff);\\n}\\n\\n.sr-only,\\n.fa-sr-only {\\n position: absolute;\\n width: 1px;\\n height: 1px;\\n padding: 0;\\n margin: -1px;\\n overflow: hidden;\\n clip: rect(0, 0, 0, 0);\\n white-space: nowrap;\\n border-width: 0;\\n}\\n\\n.sr-only-focusable:not(:focus),\\n.fa-sr-only-focusable:not(:focus) {\\n position: absolute;\\n width: 1px;\\n height: 1px;\\n padding: 0;\\n margin: -1px;\\n overflow: hidden;\\n clip: rect(0, 0, 0, 0);\\n white-space: nowrap;\\n border-width: 0;\\n}\\n\\n.svg-inline--fa .fa-primary {\\n fill: var(--fa-primary-color, currentColor);\\n opacity: var(--fa-primary-opacity, 1);\\n}\\n\\n.svg-inline--fa .fa-secondary {\\n fill: var(--fa-secondary-color, currentColor);\\n opacity: var(--fa-secondary-opacity, 0.4);\\n}\\n\\n.svg-inline--fa.fa-swap-opacity .fa-primary {\\n opacity: var(--fa-secondary-opacity, 0.4);\\n}\\n\\n.svg-inline--fa.fa-swap-opacity .fa-secondary {\\n opacity: var(--fa-primary-opacity, 1);\\n}\\n\\n.svg-inline--fa mask .fa-primary,\\n.svg-inline--fa mask .fa-secondary {\\n fill: black;\\n}\\n\\n.fad.fa-inverse,\\n.fa-duotone.fa-inverse {\\n color: var(--fa-inverse, #fff);\\n}\";\nfunction css() {\n var dcp = DEFAULT_CSS_PREFIX;\n var drc = DEFAULT_REPLACEMENT_CLASS;\n var fp = config.cssPrefix;\n var rc = config.replacementClass;\n var s = baseStyles;\n if (fp !== dcp || rc !== drc) {\n var dPatt = new RegExp(\"\\\\.\".concat(dcp, \"\\\\-\"), 'g');\n var customPropPatt = new RegExp(\"\\\\--\".concat(dcp, \"\\\\-\"), 'g');\n var rPatt = new RegExp(\"\\\\.\".concat(drc), 'g');\n s = s.replace(dPatt, \".\".concat(fp, \"-\")).replace(customPropPatt, \"--\".concat(fp, \"-\")).replace(rPatt, \".\".concat(rc));\n }\n return s;\n}\nvar _cssInserted = false;\nfunction ensureCss() {\n if (config.autoAddCss && !_cssInserted) {\n insertCss(css());\n _cssInserted = true;\n }\n}\nvar InjectCSS = {\n mixout: function mixout() {\n return {\n dom: {\n css: css,\n insertCss: ensureCss\n }\n };\n },\n hooks: function hooks() {\n return {\n beforeDOMElementCreation: function beforeDOMElementCreation() {\n ensureCss();\n },\n beforeI2svg: function beforeI2svg() {\n ensureCss();\n }\n };\n }\n};\nvar w = WINDOW || {};\nif (!w[NAMESPACE_IDENTIFIER]) w[NAMESPACE_IDENTIFIER] = {};\nif (!w[NAMESPACE_IDENTIFIER].styles) w[NAMESPACE_IDENTIFIER].styles = {};\nif (!w[NAMESPACE_IDENTIFIER].hooks) w[NAMESPACE_IDENTIFIER].hooks = {};\nif (!w[NAMESPACE_IDENTIFIER].shims) w[NAMESPACE_IDENTIFIER].shims = [];\nvar namespace = w[NAMESPACE_IDENTIFIER];\nvar functions = [];\nvar listener = function listener() {\n DOCUMENT.removeEventListener('DOMContentLoaded', listener);\n loaded = 1;\n functions.map(function (fn) {\n return fn();\n });\n};\nvar loaded = false;\nif (IS_DOM) {\n loaded = (DOCUMENT.documentElement.doScroll ? /^loaded|^c/ : /^loaded|^i|^c/).test(DOCUMENT.readyState);\n if (!loaded) DOCUMENT.addEventListener('DOMContentLoaded', listener);\n}\nfunction domready(fn) {\n if (!IS_DOM) return;\n loaded ? setTimeout(fn, 0) : functions.push(fn);\n}\nfunction toHtml(abstractNodes) {\n var tag = abstractNodes.tag,\n _abstractNodes$attrib = abstractNodes.attributes,\n attributes = _abstractNodes$attrib === void 0 ? {} : _abstractNodes$attrib,\n _abstractNodes$childr = abstractNodes.children,\n children = _abstractNodes$childr === void 0 ? [] : _abstractNodes$childr;\n if (typeof abstractNodes === 'string') {\n return htmlEscape(abstractNodes);\n } else {\n return \"<\".concat(tag, \" \").concat(joinAttributes(attributes), \">\").concat(children.map(toHtml).join(''), \"\");\n }\n}\nfunction iconFromMapping(mapping, prefix, iconName) {\n if (mapping && mapping[prefix] && mapping[prefix][iconName]) {\n return {\n prefix: prefix,\n iconName: iconName,\n icon: mapping[prefix][iconName]\n };\n }\n}\n\n/**\n * Internal helper to bind a function known to have 4 arguments\n * to a given context.\n */\n\nvar bindInternal4 = function bindInternal4(func, thisContext) {\n return function (a, b, c, d) {\n return func.call(thisContext, a, b, c, d);\n };\n};\n\n/**\n * # Reduce\n *\n * A fast object `.reduce()` implementation.\n *\n * @param {Object} subject The object to reduce over.\n * @param {Function} fn The reducer function.\n * @param {mixed} initialValue The initial value for the reducer, defaults to subject[0].\n * @param {Object} thisContext The context for the reducer.\n * @return {mixed} The final result.\n */\n\nvar reduce = function fastReduceObject(subject, fn, initialValue, thisContext) {\n var keys = Object.keys(subject),\n length = keys.length,\n iterator = thisContext !== undefined ? bindInternal4(fn, thisContext) : fn,\n i,\n key,\n result;\n if (initialValue === undefined) {\n i = 1;\n result = subject[keys[0]];\n } else {\n i = 0;\n result = initialValue;\n }\n for (; i < length; i++) {\n key = keys[i];\n result = iterator(result, subject[key], key, subject);\n }\n return result;\n};\n\n/**\n * ucs2decode() and codePointAt() are both works of Mathias Bynens and licensed under MIT\n *\n * Copyright Mathias Bynens \n\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\nfunction ucs2decode(string) {\n var output = [];\n var counter = 0;\n var length = string.length;\n while (counter < length) {\n var value = string.charCodeAt(counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n var extra = string.charCodeAt(counter++);\n if ((extra & 0xFC00) == 0xDC00) {\n // eslint-disable-line eqeqeq\n output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n}\nfunction toHex(unicode) {\n var decoded = ucs2decode(unicode);\n return decoded.length === 1 ? decoded[0].toString(16) : null;\n}\nfunction codePointAt(string, index) {\n var size = string.length;\n var first = string.charCodeAt(index);\n var second;\n if (first >= 0xD800 && first <= 0xDBFF && size > index + 1) {\n second = string.charCodeAt(index + 1);\n if (second >= 0xDC00 && second <= 0xDFFF) {\n return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n }\n }\n return first;\n}\nfunction normalizeIcons(icons) {\n return Object.keys(icons).reduce(function (acc, iconName) {\n var icon = icons[iconName];\n var expanded = !!icon.icon;\n if (expanded) {\n acc[icon.iconName] = icon.icon;\n } else {\n acc[iconName] = icon;\n }\n return acc;\n }, {});\n}\nfunction defineIcons(prefix, icons) {\n var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var _params$skipHooks = params.skipHooks,\n skipHooks = _params$skipHooks === void 0 ? false : _params$skipHooks;\n var normalized = normalizeIcons(icons);\n if (typeof namespace.hooks.addPack === 'function' && !skipHooks) {\n namespace.hooks.addPack(prefix, normalizeIcons(icons));\n } else {\n namespace.styles[prefix] = _objectSpread2(_objectSpread2({}, namespace.styles[prefix] || {}), normalized);\n }\n /**\n * Font Awesome 4 used the prefix of `fa` for all icons. With the introduction\n * of new styles we needed to differentiate between them. Prefix `fa` is now an alias\n * for `fas` so we'll ease the upgrade process for our users by automatically defining\n * this as well.\n */\n\n if (prefix === 'fas') {\n defineIcons('fa', icons);\n }\n}\nvar duotonePathRe = [/*#__PURE__*/_wrapRegExp(/path d=\"((?:(?!\")[\\s\\S])+)\".*path d=\"((?:(?!\")[\\s\\S])+)\"/, {\n d1: 1,\n d2: 2\n}), /*#__PURE__*/_wrapRegExp(/path class=\"((?:(?!\")[\\s\\S])+)\".*d=\"((?:(?!\")[\\s\\S])+)\".*path class=\"((?:(?!\")[\\s\\S])+)\".*d=\"((?:(?!\")[\\s\\S])+)\"/, {\n cls1: 1,\n d1: 2,\n cls2: 3,\n d2: 4\n}), /*#__PURE__*/_wrapRegExp(/path class=\"((?:(?!\")[\\s\\S])+)\".*d=\"((?:(?!\")[\\s\\S])+)\"/, {\n cls1: 1,\n d1: 2\n})];\nvar _LONG_STYLE, _PREFIXES, _PREFIXES_FOR_FAMILY;\nvar styles = namespace.styles,\n shims = namespace.shims;\nvar LONG_STYLE = (_LONG_STYLE = {}, _defineProperty(_LONG_STYLE, FAMILY_CLASSIC, Object.values(PREFIX_TO_LONG_STYLE[FAMILY_CLASSIC])), _defineProperty(_LONG_STYLE, FAMILY_SHARP, Object.values(PREFIX_TO_LONG_STYLE[FAMILY_SHARP])), _LONG_STYLE);\nvar _defaultUsablePrefix = null;\nvar _byUnicode = {};\nvar _byLigature = {};\nvar _byOldName = {};\nvar _byOldUnicode = {};\nvar _byAlias = {};\nvar PREFIXES = (_PREFIXES = {}, _defineProperty(_PREFIXES, FAMILY_CLASSIC, Object.keys(PREFIX_TO_STYLE[FAMILY_CLASSIC])), _defineProperty(_PREFIXES, FAMILY_SHARP, Object.keys(PREFIX_TO_STYLE[FAMILY_SHARP])), _PREFIXES);\nfunction isReserved(name) {\n return ~RESERVED_CLASSES.indexOf(name);\n}\nfunction getIconName(cssPrefix, cls) {\n var parts = cls.split('-');\n var prefix = parts[0];\n var iconName = parts.slice(1).join('-');\n if (prefix === cssPrefix && iconName !== '' && !isReserved(iconName)) {\n return iconName;\n } else {\n return null;\n }\n}\nvar build = function build() {\n var lookup = function lookup(reducer) {\n return reduce(styles, function (o, style, prefix) {\n o[prefix] = reduce(style, reducer, {});\n return o;\n }, {});\n };\n _byUnicode = lookup(function (acc, icon, iconName) {\n if (icon[3]) {\n acc[icon[3]] = iconName;\n }\n if (icon[2]) {\n var aliases = icon[2].filter(function (a) {\n return typeof a === 'number';\n });\n aliases.forEach(function (alias) {\n acc[alias.toString(16)] = iconName;\n });\n }\n return acc;\n });\n _byLigature = lookup(function (acc, icon, iconName) {\n acc[iconName] = iconName;\n if (icon[2]) {\n var aliases = icon[2].filter(function (a) {\n return typeof a === 'string';\n });\n aliases.forEach(function (alias) {\n acc[alias] = iconName;\n });\n }\n return acc;\n });\n _byAlias = lookup(function (acc, icon, iconName) {\n var aliases = icon[2];\n acc[iconName] = iconName;\n aliases.forEach(function (alias) {\n acc[alias] = iconName;\n });\n return acc;\n }); // If we have a Kit, we can't determine if regular is available since we\n // could be auto-fetching it. We'll have to assume that it is available.\n\n var hasRegular = 'far' in styles || config.autoFetchSvg;\n var shimLookups = reduce(shims, function (acc, shim) {\n var maybeNameMaybeUnicode = shim[0];\n var prefix = shim[1];\n var iconName = shim[2];\n if (prefix === 'far' && !hasRegular) {\n prefix = 'fas';\n }\n if (typeof maybeNameMaybeUnicode === 'string') {\n acc.names[maybeNameMaybeUnicode] = {\n prefix: prefix,\n iconName: iconName\n };\n }\n if (typeof maybeNameMaybeUnicode === 'number') {\n acc.unicodes[maybeNameMaybeUnicode.toString(16)] = {\n prefix: prefix,\n iconName: iconName\n };\n }\n return acc;\n }, {\n names: {},\n unicodes: {}\n });\n _byOldName = shimLookups.names;\n _byOldUnicode = shimLookups.unicodes;\n _defaultUsablePrefix = getCanonicalPrefix(config.styleDefault, {\n family: config.familyDefault\n });\n};\nonChange(function (c) {\n _defaultUsablePrefix = getCanonicalPrefix(c.styleDefault, {\n family: config.familyDefault\n });\n});\nbuild();\nfunction byUnicode(prefix, unicode) {\n return (_byUnicode[prefix] || {})[unicode];\n}\nfunction byLigature(prefix, ligature) {\n return (_byLigature[prefix] || {})[ligature];\n}\nfunction byAlias(prefix, alias) {\n return (_byAlias[prefix] || {})[alias];\n}\nfunction byOldName(name) {\n return _byOldName[name] || {\n prefix: null,\n iconName: null\n };\n}\nfunction byOldUnicode(unicode) {\n var oldUnicode = _byOldUnicode[unicode];\n var newUnicode = byUnicode('fas', unicode);\n return oldUnicode || (newUnicode ? {\n prefix: 'fas',\n iconName: newUnicode\n } : null) || {\n prefix: null,\n iconName: null\n };\n}\nfunction getDefaultUsablePrefix() {\n return _defaultUsablePrefix;\n}\nvar emptyCanonicalIcon = function emptyCanonicalIcon() {\n return {\n prefix: null,\n iconName: null,\n rest: []\n };\n};\nfunction getCanonicalPrefix(styleOrPrefix) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$family = params.family,\n family = _params$family === void 0 ? FAMILY_CLASSIC : _params$family;\n var style = PREFIX_TO_STYLE[family][styleOrPrefix];\n var prefix = STYLE_TO_PREFIX[family][styleOrPrefix] || STYLE_TO_PREFIX[family][style];\n var defined = styleOrPrefix in namespace.styles ? styleOrPrefix : null;\n return prefix || defined || null;\n}\nvar PREFIXES_FOR_FAMILY = (_PREFIXES_FOR_FAMILY = {}, _defineProperty(_PREFIXES_FOR_FAMILY, FAMILY_CLASSIC, Object.keys(PREFIX_TO_LONG_STYLE[FAMILY_CLASSIC])), _defineProperty(_PREFIXES_FOR_FAMILY, FAMILY_SHARP, Object.keys(PREFIX_TO_LONG_STYLE[FAMILY_SHARP])), _PREFIXES_FOR_FAMILY);\nfunction getCanonicalIcon(values) {\n var _famProps;\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$skipLookups = params.skipLookups,\n skipLookups = _params$skipLookups === void 0 ? false : _params$skipLookups;\n var famProps = (_famProps = {}, _defineProperty(_famProps, FAMILY_CLASSIC, \"\".concat(config.cssPrefix, \"-\").concat(FAMILY_CLASSIC)), _defineProperty(_famProps, FAMILY_SHARP, \"\".concat(config.cssPrefix, \"-\").concat(FAMILY_SHARP)), _famProps);\n var givenPrefix = null;\n var family = FAMILY_CLASSIC;\n if (values.includes(famProps[FAMILY_CLASSIC]) || values.some(function (v) {\n return PREFIXES_FOR_FAMILY[FAMILY_CLASSIC].includes(v);\n })) {\n family = FAMILY_CLASSIC;\n }\n if (values.includes(famProps[FAMILY_SHARP]) || values.some(function (v) {\n return PREFIXES_FOR_FAMILY[FAMILY_SHARP].includes(v);\n })) {\n family = FAMILY_SHARP;\n }\n var canonical = values.reduce(function (acc, cls) {\n var iconName = getIconName(config.cssPrefix, cls);\n if (styles[cls]) {\n cls = LONG_STYLE[family].includes(cls) ? LONG_STYLE_TO_PREFIX[family][cls] : cls;\n givenPrefix = cls;\n acc.prefix = cls;\n } else if (PREFIXES[family].indexOf(cls) > -1) {\n givenPrefix = cls;\n acc.prefix = getCanonicalPrefix(cls, {\n family: family\n });\n } else if (iconName) {\n acc.iconName = iconName;\n } else if (cls !== config.replacementClass && cls !== famProps[FAMILY_CLASSIC] && cls !== famProps[FAMILY_SHARP]) {\n acc.rest.push(cls);\n }\n if (!skipLookups && acc.prefix && acc.iconName) {\n var shim = givenPrefix === 'fa' ? byOldName(acc.iconName) : {};\n var aliasIconName = byAlias(acc.prefix, acc.iconName);\n if (shim.prefix) {\n givenPrefix = null;\n }\n acc.iconName = shim.iconName || aliasIconName || acc.iconName;\n acc.prefix = shim.prefix || acc.prefix;\n if (acc.prefix === 'far' && !styles['far'] && styles['fas'] && !config.autoFetchSvg) {\n // Allow a fallback from the regular style to solid if regular is not available\n // but only if we aren't auto-fetching SVGs\n acc.prefix = 'fas';\n }\n }\n return acc;\n }, emptyCanonicalIcon());\n if (values.includes('fa-brands') || values.includes('fab')) {\n canonical.prefix = 'fab';\n }\n if (values.includes('fa-duotone') || values.includes('fad')) {\n canonical.prefix = 'fad';\n }\n if (!canonical.prefix && family === FAMILY_SHARP && (styles['fass'] || config.autoFetchSvg)) {\n canonical.prefix = 'fass';\n canonical.iconName = byAlias(canonical.prefix, canonical.iconName) || canonical.iconName;\n }\n if (canonical.prefix === 'fa' || givenPrefix === 'fa') {\n // The fa prefix is not canonical. So if it has made it through until this point\n // we will shift it to the correct prefix.\n canonical.prefix = getDefaultUsablePrefix() || 'fas';\n }\n return canonical;\n}\nvar Library = /*#__PURE__*/function () {\n function Library() {\n _classCallCheck(this, Library);\n this.definitions = {};\n }\n _createClass(Library, [{\n key: \"add\",\n value: function add() {\n var _this = this;\n for (var _len = arguments.length, definitions = new Array(_len), _key = 0; _key < _len; _key++) {\n definitions[_key] = arguments[_key];\n }\n var additions = definitions.reduce(this._pullDefinitions, {});\n Object.keys(additions).forEach(function (key) {\n _this.definitions[key] = _objectSpread2(_objectSpread2({}, _this.definitions[key] || {}), additions[key]);\n defineIcons(key, additions[key]); // TODO can we stop doing this? We can't get the icons by 'fa-solid' any longer so this probably needs to change\n\n var longPrefix = PREFIX_TO_LONG_STYLE[FAMILY_CLASSIC][key];\n if (longPrefix) defineIcons(longPrefix, additions[key]);\n build();\n });\n }\n }, {\n key: \"reset\",\n value: function reset() {\n this.definitions = {};\n }\n }, {\n key: \"_pullDefinitions\",\n value: function _pullDefinitions(additions, definition) {\n var normalized = definition.prefix && definition.iconName && definition.icon ? {\n 0: definition\n } : definition;\n Object.keys(normalized).map(function (key) {\n var _normalized$key = normalized[key],\n prefix = _normalized$key.prefix,\n iconName = _normalized$key.iconName,\n icon = _normalized$key.icon;\n var aliases = icon[2];\n if (!additions[prefix]) additions[prefix] = {};\n if (aliases.length > 0) {\n aliases.forEach(function (alias) {\n if (typeof alias === 'string') {\n additions[prefix][alias] = icon;\n }\n });\n }\n additions[prefix][iconName] = icon;\n });\n return additions;\n }\n }]);\n return Library;\n}();\nvar _plugins = [];\nvar _hooks = {};\nvar providers = {};\nvar defaultProviderKeys = Object.keys(providers);\nfunction registerPlugins(nextPlugins, _ref) {\n var obj = _ref.mixoutsTo;\n _plugins = nextPlugins;\n _hooks = {};\n Object.keys(providers).forEach(function (k) {\n if (defaultProviderKeys.indexOf(k) === -1) {\n delete providers[k];\n }\n });\n _plugins.forEach(function (plugin) {\n var mixout = plugin.mixout ? plugin.mixout() : {};\n Object.keys(mixout).forEach(function (tk) {\n if (typeof mixout[tk] === 'function') {\n obj[tk] = mixout[tk];\n }\n if (_typeof(mixout[tk]) === 'object') {\n Object.keys(mixout[tk]).forEach(function (sk) {\n if (!obj[tk]) {\n obj[tk] = {};\n }\n obj[tk][sk] = mixout[tk][sk];\n });\n }\n });\n if (plugin.hooks) {\n var hooks = plugin.hooks();\n Object.keys(hooks).forEach(function (hook) {\n if (!_hooks[hook]) {\n _hooks[hook] = [];\n }\n _hooks[hook].push(hooks[hook]);\n });\n }\n if (plugin.provides) {\n plugin.provides(providers);\n }\n });\n return obj;\n}\nfunction chainHooks(hook, accumulator) {\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n var hookFns = _hooks[hook] || [];\n hookFns.forEach(function (hookFn) {\n accumulator = hookFn.apply(null, [accumulator].concat(args)); // eslint-disable-line no-useless-call\n });\n\n return accumulator;\n}\nfunction callHooks(hook) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n var hookFns = _hooks[hook] || [];\n hookFns.forEach(function (hookFn) {\n hookFn.apply(null, args);\n });\n return undefined;\n}\nfunction callProvided() {\n var hook = arguments[0];\n var args = Array.prototype.slice.call(arguments, 1);\n return providers[hook] ? providers[hook].apply(null, args) : undefined;\n}\nfunction findIconDefinition(iconLookup) {\n if (iconLookup.prefix === 'fa') {\n iconLookup.prefix = 'fas';\n }\n var iconName = iconLookup.iconName;\n var prefix = iconLookup.prefix || getDefaultUsablePrefix();\n if (!iconName) return;\n iconName = byAlias(prefix, iconName) || iconName;\n return iconFromMapping(library.definitions, prefix, iconName) || iconFromMapping(namespace.styles, prefix, iconName);\n}\nvar library = new Library();\nvar noAuto = function noAuto() {\n config.autoReplaceSvg = false;\n config.observeMutations = false;\n callHooks('noAuto');\n};\nvar dom = {\n i2svg: function i2svg() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n if (IS_DOM) {\n callHooks('beforeI2svg', params);\n callProvided('pseudoElements2svg', params);\n return callProvided('i2svg', params);\n } else {\n return Promise.reject('Operation requires a DOM of some kind.');\n }\n },\n watch: function watch() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var autoReplaceSvgRoot = params.autoReplaceSvgRoot;\n if (config.autoReplaceSvg === false) {\n config.autoReplaceSvg = true;\n }\n config.observeMutations = true;\n domready(function () {\n autoReplace({\n autoReplaceSvgRoot: autoReplaceSvgRoot\n });\n callHooks('watch', params);\n });\n }\n};\nvar parse = {\n icon: function icon(_icon) {\n if (_icon === null) {\n return null;\n }\n if (_typeof(_icon) === 'object' && _icon.prefix && _icon.iconName) {\n return {\n prefix: _icon.prefix,\n iconName: byAlias(_icon.prefix, _icon.iconName) || _icon.iconName\n };\n }\n if (Array.isArray(_icon) && _icon.length === 2) {\n var iconName = _icon[1].indexOf('fa-') === 0 ? _icon[1].slice(3) : _icon[1];\n var prefix = getCanonicalPrefix(_icon[0]);\n return {\n prefix: prefix,\n iconName: byAlias(prefix, iconName) || iconName\n };\n }\n if (typeof _icon === 'string' && (_icon.indexOf(\"\".concat(config.cssPrefix, \"-\")) > -1 || _icon.match(ICON_SELECTION_SYNTAX_PATTERN))) {\n var canonicalIcon = getCanonicalIcon(_icon.split(' '), {\n skipLookups: true\n });\n return {\n prefix: canonicalIcon.prefix || getDefaultUsablePrefix(),\n iconName: byAlias(canonicalIcon.prefix, canonicalIcon.iconName) || canonicalIcon.iconName\n };\n }\n if (typeof _icon === 'string') {\n var _prefix = getDefaultUsablePrefix();\n return {\n prefix: _prefix,\n iconName: byAlias(_prefix, _icon) || _icon\n };\n }\n }\n};\nvar api = {\n noAuto: noAuto,\n config: config,\n dom: dom,\n parse: parse,\n library: library,\n findIconDefinition: findIconDefinition,\n toHtml: toHtml\n};\nvar autoReplace = function autoReplace() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var _params$autoReplaceSv = params.autoReplaceSvgRoot,\n autoReplaceSvgRoot = _params$autoReplaceSv === void 0 ? DOCUMENT : _params$autoReplaceSv;\n if ((Object.keys(namespace.styles).length > 0 || config.autoFetchSvg) && IS_DOM && config.autoReplaceSvg) api.dom.i2svg({\n node: autoReplaceSvgRoot\n });\n};\nfunction domVariants(val, abstractCreator) {\n Object.defineProperty(val, 'abstract', {\n get: abstractCreator\n });\n Object.defineProperty(val, 'html', {\n get: function get() {\n return val.abstract.map(function (a) {\n return toHtml(a);\n });\n }\n });\n Object.defineProperty(val, 'node', {\n get: function get() {\n if (!IS_DOM) return;\n var container = DOCUMENT.createElement('div');\n container.innerHTML = val.html;\n return container.children;\n }\n });\n return val;\n}\nfunction asIcon(_ref) {\n var children = _ref.children,\n main = _ref.main,\n mask = _ref.mask,\n attributes = _ref.attributes,\n styles = _ref.styles,\n transform = _ref.transform;\n if (transformIsMeaningful(transform) && main.found && !mask.found) {\n var width = main.width,\n height = main.height;\n var offset = {\n x: width / height / 2,\n y: 0.5\n };\n attributes['style'] = joinStyles(_objectSpread2(_objectSpread2({}, styles), {}, {\n 'transform-origin': \"\".concat(offset.x + transform.x / 16, \"em \").concat(offset.y + transform.y / 16, \"em\")\n }));\n }\n return [{\n tag: 'svg',\n attributes: attributes,\n children: children\n }];\n}\nfunction asSymbol(_ref) {\n var prefix = _ref.prefix,\n iconName = _ref.iconName,\n children = _ref.children,\n attributes = _ref.attributes,\n symbol = _ref.symbol;\n var id = symbol === true ? \"\".concat(prefix, \"-\").concat(config.cssPrefix, \"-\").concat(iconName) : symbol;\n return [{\n tag: 'svg',\n attributes: {\n style: 'display: none;'\n },\n children: [{\n tag: 'symbol',\n attributes: _objectSpread2(_objectSpread2({}, attributes), {}, {\n id: id\n }),\n children: children\n }]\n }];\n}\nfunction makeInlineSvgAbstract(params) {\n var _params$icons = params.icons,\n main = _params$icons.main,\n mask = _params$icons.mask,\n prefix = params.prefix,\n iconName = params.iconName,\n transform = params.transform,\n symbol = params.symbol,\n title = params.title,\n maskId = params.maskId,\n titleId = params.titleId,\n extra = params.extra,\n _params$watchable = params.watchable,\n watchable = _params$watchable === void 0 ? false : _params$watchable;\n var _ref = mask.found ? mask : main,\n width = _ref.width,\n height = _ref.height;\n var isUploadedIcon = prefix === 'fak';\n var attrClass = [config.replacementClass, iconName ? \"\".concat(config.cssPrefix, \"-\").concat(iconName) : ''].filter(function (c) {\n return extra.classes.indexOf(c) === -1;\n }).filter(function (c) {\n return c !== '' || !!c;\n }).concat(extra.classes).join(' ');\n var content = {\n children: [],\n attributes: _objectSpread2(_objectSpread2({}, extra.attributes), {}, {\n 'data-prefix': prefix,\n 'data-icon': iconName,\n 'class': attrClass,\n 'role': extra.attributes.role || 'img',\n 'xmlns': 'http://www.w3.org/2000/svg',\n 'viewBox': \"0 0 \".concat(width, \" \").concat(height)\n })\n };\n var uploadedIconWidthStyle = isUploadedIcon && !~extra.classes.indexOf('fa-fw') ? {\n width: \"\".concat(width / height * 16 * 0.0625, \"em\")\n } : {};\n if (watchable) {\n content.attributes[DATA_FA_I2SVG] = '';\n }\n if (title) {\n content.children.push({\n tag: 'title',\n attributes: {\n id: content.attributes['aria-labelledby'] || \"title-\".concat(titleId || nextUniqueId())\n },\n children: [title]\n });\n delete content.attributes.title;\n }\n var args = _objectSpread2(_objectSpread2({}, content), {}, {\n prefix: prefix,\n iconName: iconName,\n main: main,\n mask: mask,\n maskId: maskId,\n transform: transform,\n symbol: symbol,\n styles: _objectSpread2(_objectSpread2({}, uploadedIconWidthStyle), extra.styles)\n });\n var _ref2 = mask.found && main.found ? callProvided('generateAbstractMask', args) || {\n children: [],\n attributes: {}\n } : callProvided('generateAbstractIcon', args) || {\n children: [],\n attributes: {}\n },\n children = _ref2.children,\n attributes = _ref2.attributes;\n args.children = children;\n args.attributes = attributes;\n if (symbol) {\n return asSymbol(args);\n } else {\n return asIcon(args);\n }\n}\nfunction makeLayersTextAbstract(params) {\n var content = params.content,\n width = params.width,\n height = params.height,\n transform = params.transform,\n title = params.title,\n extra = params.extra,\n _params$watchable2 = params.watchable,\n watchable = _params$watchable2 === void 0 ? false : _params$watchable2;\n var attributes = _objectSpread2(_objectSpread2(_objectSpread2({}, extra.attributes), title ? {\n 'title': title\n } : {}), {}, {\n 'class': extra.classes.join(' ')\n });\n if (watchable) {\n attributes[DATA_FA_I2SVG] = '';\n }\n var styles = _objectSpread2({}, extra.styles);\n if (transformIsMeaningful(transform)) {\n styles['transform'] = transformForCss({\n transform: transform,\n startCentered: true,\n width: width,\n height: height\n });\n styles['-webkit-transform'] = styles['transform'];\n }\n var styleString = joinStyles(styles);\n if (styleString.length > 0) {\n attributes['style'] = styleString;\n }\n var val = [];\n val.push({\n tag: 'span',\n attributes: attributes,\n children: [content]\n });\n if (title) {\n val.push({\n tag: 'span',\n attributes: {\n class: 'sr-only'\n },\n children: [title]\n });\n }\n return val;\n}\nfunction makeLayersCounterAbstract(params) {\n var content = params.content,\n title = params.title,\n extra = params.extra;\n var attributes = _objectSpread2(_objectSpread2(_objectSpread2({}, extra.attributes), title ? {\n 'title': title\n } : {}), {}, {\n 'class': extra.classes.join(' ')\n });\n var styleString = joinStyles(extra.styles);\n if (styleString.length > 0) {\n attributes['style'] = styleString;\n }\n var val = [];\n val.push({\n tag: 'span',\n attributes: attributes,\n children: [content]\n });\n if (title) {\n val.push({\n tag: 'span',\n attributes: {\n class: 'sr-only'\n },\n children: [title]\n });\n }\n return val;\n}\nvar styles$1 = namespace.styles;\nfunction asFoundIcon(icon) {\n var width = icon[0];\n var height = icon[1];\n var _icon$slice = icon.slice(4),\n _icon$slice2 = _slicedToArray(_icon$slice, 1),\n vectorData = _icon$slice2[0];\n var element = null;\n if (Array.isArray(vectorData)) {\n element = {\n tag: 'g',\n attributes: {\n class: \"\".concat(config.cssPrefix, \"-\").concat(DUOTONE_CLASSES.GROUP)\n },\n children: [{\n tag: 'path',\n attributes: {\n class: \"\".concat(config.cssPrefix, \"-\").concat(DUOTONE_CLASSES.SECONDARY),\n fill: 'currentColor',\n d: vectorData[0]\n }\n }, {\n tag: 'path',\n attributes: {\n class: \"\".concat(config.cssPrefix, \"-\").concat(DUOTONE_CLASSES.PRIMARY),\n fill: 'currentColor',\n d: vectorData[1]\n }\n }]\n };\n } else {\n element = {\n tag: 'path',\n attributes: {\n fill: 'currentColor',\n d: vectorData\n }\n };\n }\n return {\n found: true,\n width: width,\n height: height,\n icon: element\n };\n}\nvar missingIconResolutionMixin = {\n found: false,\n width: 512,\n height: 512\n};\nfunction maybeNotifyMissing(iconName, prefix) {\n if (!PRODUCTION && !config.showMissingIcons && iconName) {\n console.error(\"Icon with name \\\"\".concat(iconName, \"\\\" and prefix \\\"\").concat(prefix, \"\\\" is missing.\"));\n }\n}\nfunction findIcon(iconName, prefix) {\n var givenPrefix = prefix;\n if (prefix === 'fa' && config.styleDefault !== null) {\n prefix = getDefaultUsablePrefix();\n }\n return new Promise(function (resolve, reject) {\n var val = {\n found: false,\n width: 512,\n height: 512,\n icon: callProvided('missingIconAbstract') || {}\n };\n if (givenPrefix === 'fa') {\n var shim = byOldName(iconName) || {};\n iconName = shim.iconName || iconName;\n prefix = shim.prefix || prefix;\n }\n if (iconName && prefix && styles$1[prefix] && styles$1[prefix][iconName]) {\n var icon = styles$1[prefix][iconName];\n return resolve(asFoundIcon(icon));\n }\n maybeNotifyMissing(iconName, prefix);\n resolve(_objectSpread2(_objectSpread2({}, missingIconResolutionMixin), {}, {\n icon: config.showMissingIcons && iconName ? callProvided('missingIconAbstract') || {} : {}\n }));\n });\n}\nvar noop$1 = function noop() {};\nvar p = config.measurePerformance && PERFORMANCE && PERFORMANCE.mark && PERFORMANCE.measure ? PERFORMANCE : {\n mark: noop$1,\n measure: noop$1\n};\nvar preamble = \"FA \\\"6.2.1\\\"\";\nvar begin = function begin(name) {\n p.mark(\"\".concat(preamble, \" \").concat(name, \" begins\"));\n return function () {\n return end(name);\n };\n};\nvar end = function end(name) {\n p.mark(\"\".concat(preamble, \" \").concat(name, \" ends\"));\n p.measure(\"\".concat(preamble, \" \").concat(name), \"\".concat(preamble, \" \").concat(name, \" begins\"), \"\".concat(preamble, \" \").concat(name, \" ends\"));\n};\nvar perf = {\n begin: begin,\n end: end\n};\nvar noop$2 = function noop() {};\nfunction isWatched(node) {\n var i2svg = node.getAttribute ? node.getAttribute(DATA_FA_I2SVG) : null;\n return typeof i2svg === 'string';\n}\nfunction hasPrefixAndIcon(node) {\n var prefix = node.getAttribute ? node.getAttribute(DATA_PREFIX) : null;\n var icon = node.getAttribute ? node.getAttribute(DATA_ICON) : null;\n return prefix && icon;\n}\nfunction hasBeenReplaced(node) {\n return node && node.classList && node.classList.contains && node.classList.contains(config.replacementClass);\n}\nfunction getMutator() {\n if (config.autoReplaceSvg === true) {\n return mutators.replace;\n }\n var mutator = mutators[config.autoReplaceSvg];\n return mutator || mutators.replace;\n}\nfunction createElementNS(tag) {\n return DOCUMENT.createElementNS('http://www.w3.org/2000/svg', tag);\n}\nfunction createElement(tag) {\n return DOCUMENT.createElement(tag);\n}\nfunction convertSVG(abstractObj) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$ceFn = params.ceFn,\n ceFn = _params$ceFn === void 0 ? abstractObj.tag === 'svg' ? createElementNS : createElement : _params$ceFn;\n if (typeof abstractObj === 'string') {\n return DOCUMENT.createTextNode(abstractObj);\n }\n var tag = ceFn(abstractObj.tag);\n Object.keys(abstractObj.attributes || []).forEach(function (key) {\n tag.setAttribute(key, abstractObj.attributes[key]);\n });\n var children = abstractObj.children || [];\n children.forEach(function (child) {\n tag.appendChild(convertSVG(child, {\n ceFn: ceFn\n }));\n });\n return tag;\n}\nfunction nodeAsComment(node) {\n var comment = \" \".concat(node.outerHTML, \" \");\n /* BEGIN.ATTRIBUTION */\n\n comment = \"\".concat(comment, \"Font Awesome fontawesome.com \");\n /* END.ATTRIBUTION */\n\n return comment;\n}\nvar mutators = {\n replace: function replace(mutation) {\n var node = mutation[0];\n if (node.parentNode) {\n mutation[1].forEach(function (abstract) {\n node.parentNode.insertBefore(convertSVG(abstract), node);\n });\n if (node.getAttribute(DATA_FA_I2SVG) === null && config.keepOriginalSource) {\n var comment = DOCUMENT.createComment(nodeAsComment(node));\n node.parentNode.replaceChild(comment, node);\n } else {\n node.remove();\n }\n }\n },\n nest: function nest(mutation) {\n var node = mutation[0];\n var abstract = mutation[1]; // If we already have a replaced node we do not want to continue nesting within it.\n // Short-circuit to the standard replacement\n\n if (~classArray(node).indexOf(config.replacementClass)) {\n return mutators.replace(mutation);\n }\n var forSvg = new RegExp(\"\".concat(config.cssPrefix, \"-.*\"));\n delete abstract[0].attributes.id;\n if (abstract[0].attributes.class) {\n var splitClasses = abstract[0].attributes.class.split(' ').reduce(function (acc, cls) {\n if (cls === config.replacementClass || cls.match(forSvg)) {\n acc.toSvg.push(cls);\n } else {\n acc.toNode.push(cls);\n }\n return acc;\n }, {\n toNode: [],\n toSvg: []\n });\n abstract[0].attributes.class = splitClasses.toSvg.join(' ');\n if (splitClasses.toNode.length === 0) {\n node.removeAttribute('class');\n } else {\n node.setAttribute('class', splitClasses.toNode.join(' '));\n }\n }\n var newInnerHTML = abstract.map(function (a) {\n return toHtml(a);\n }).join('\\n');\n node.setAttribute(DATA_FA_I2SVG, '');\n node.innerHTML = newInnerHTML;\n }\n};\nfunction performOperationSync(op) {\n op();\n}\nfunction perform(mutations, callback) {\n var callbackFunction = typeof callback === 'function' ? callback : noop$2;\n if (mutations.length === 0) {\n callbackFunction();\n } else {\n var frame = performOperationSync;\n if (config.mutateApproach === MUTATION_APPROACH_ASYNC) {\n frame = WINDOW.requestAnimationFrame || performOperationSync;\n }\n frame(function () {\n var mutator = getMutator();\n var mark = perf.begin('mutate');\n mutations.map(mutator);\n mark();\n callbackFunction();\n });\n }\n}\nvar disabled = false;\nfunction disableObservation() {\n disabled = true;\n}\nfunction enableObservation() {\n disabled = false;\n}\nvar mo = null;\nfunction observe(options) {\n if (!MUTATION_OBSERVER) {\n return;\n }\n if (!config.observeMutations) {\n return;\n }\n var _options$treeCallback = options.treeCallback,\n treeCallback = _options$treeCallback === void 0 ? noop$2 : _options$treeCallback,\n _options$nodeCallback = options.nodeCallback,\n nodeCallback = _options$nodeCallback === void 0 ? noop$2 : _options$nodeCallback,\n _options$pseudoElemen = options.pseudoElementsCallback,\n pseudoElementsCallback = _options$pseudoElemen === void 0 ? noop$2 : _options$pseudoElemen,\n _options$observeMutat = options.observeMutationsRoot,\n observeMutationsRoot = _options$observeMutat === void 0 ? DOCUMENT : _options$observeMutat;\n mo = new MUTATION_OBSERVER(function (objects) {\n if (disabled) return;\n var defaultPrefix = getDefaultUsablePrefix();\n toArray(objects).forEach(function (mutationRecord) {\n if (mutationRecord.type === 'childList' && mutationRecord.addedNodes.length > 0 && !isWatched(mutationRecord.addedNodes[0])) {\n if (config.searchPseudoElements) {\n pseudoElementsCallback(mutationRecord.target);\n }\n treeCallback(mutationRecord.target);\n }\n if (mutationRecord.type === 'attributes' && mutationRecord.target.parentNode && config.searchPseudoElements) {\n pseudoElementsCallback(mutationRecord.target.parentNode);\n }\n if (mutationRecord.type === 'attributes' && isWatched(mutationRecord.target) && ~ATTRIBUTES_WATCHED_FOR_MUTATION.indexOf(mutationRecord.attributeName)) {\n if (mutationRecord.attributeName === 'class' && hasPrefixAndIcon(mutationRecord.target)) {\n var _getCanonicalIcon = getCanonicalIcon(classArray(mutationRecord.target)),\n prefix = _getCanonicalIcon.prefix,\n iconName = _getCanonicalIcon.iconName;\n mutationRecord.target.setAttribute(DATA_PREFIX, prefix || defaultPrefix);\n if (iconName) mutationRecord.target.setAttribute(DATA_ICON, iconName);\n } else if (hasBeenReplaced(mutationRecord.target)) {\n nodeCallback(mutationRecord.target);\n }\n }\n });\n });\n if (!IS_DOM) return;\n mo.observe(observeMutationsRoot, {\n childList: true,\n attributes: true,\n characterData: true,\n subtree: true\n });\n}\nfunction disconnect() {\n if (!mo) return;\n mo.disconnect();\n}\nfunction styleParser(node) {\n var style = node.getAttribute('style');\n var val = [];\n if (style) {\n val = style.split(';').reduce(function (acc, style) {\n var styles = style.split(':');\n var prop = styles[0];\n var value = styles.slice(1);\n if (prop && value.length > 0) {\n acc[prop] = value.join(':').trim();\n }\n return acc;\n }, {});\n }\n return val;\n}\nfunction classParser(node) {\n var existingPrefix = node.getAttribute('data-prefix');\n var existingIconName = node.getAttribute('data-icon');\n var innerText = node.innerText !== undefined ? node.innerText.trim() : '';\n var val = getCanonicalIcon(classArray(node));\n if (!val.prefix) {\n val.prefix = getDefaultUsablePrefix();\n }\n if (existingPrefix && existingIconName) {\n val.prefix = existingPrefix;\n val.iconName = existingIconName;\n }\n if (val.iconName && val.prefix) {\n return val;\n }\n if (val.prefix && innerText.length > 0) {\n val.iconName = byLigature(val.prefix, node.innerText) || byUnicode(val.prefix, toHex(node.innerText));\n }\n if (!val.iconName && config.autoFetchSvg && node.firstChild && node.firstChild.nodeType === Node.TEXT_NODE) {\n val.iconName = node.firstChild.data;\n }\n return val;\n}\nfunction attributesParser(node) {\n var extraAttributes = toArray(node.attributes).reduce(function (acc, attr) {\n if (acc.name !== 'class' && acc.name !== 'style') {\n acc[attr.name] = attr.value;\n }\n return acc;\n }, {});\n var title = node.getAttribute('title');\n var titleId = node.getAttribute('data-fa-title-id');\n if (config.autoA11y) {\n if (title) {\n extraAttributes['aria-labelledby'] = \"\".concat(config.replacementClass, \"-title-\").concat(titleId || nextUniqueId());\n } else {\n extraAttributes['aria-hidden'] = 'true';\n extraAttributes['focusable'] = 'false';\n }\n }\n return extraAttributes;\n}\nfunction blankMeta() {\n return {\n iconName: null,\n title: null,\n titleId: null,\n prefix: null,\n transform: meaninglessTransform,\n symbol: false,\n mask: {\n iconName: null,\n prefix: null,\n rest: []\n },\n maskId: null,\n extra: {\n classes: [],\n styles: {},\n attributes: {}\n }\n };\n}\nfunction parseMeta(node) {\n var parser = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n styleParser: true\n };\n var _classParser = classParser(node),\n iconName = _classParser.iconName,\n prefix = _classParser.prefix,\n extraClasses = _classParser.rest;\n var extraAttributes = attributesParser(node);\n var pluginMeta = chainHooks('parseNodeAttributes', {}, node);\n var extraStyles = parser.styleParser ? styleParser(node) : [];\n return _objectSpread2({\n iconName: iconName,\n title: node.getAttribute('title'),\n titleId: node.getAttribute('data-fa-title-id'),\n prefix: prefix,\n transform: meaninglessTransform,\n mask: {\n iconName: null,\n prefix: null,\n rest: []\n },\n maskId: null,\n symbol: false,\n extra: {\n classes: extraClasses,\n styles: extraStyles,\n attributes: extraAttributes\n }\n }, pluginMeta);\n}\nvar styles$2 = namespace.styles;\nfunction generateMutation(node) {\n var nodeMeta = config.autoReplaceSvg === 'nest' ? parseMeta(node, {\n styleParser: false\n }) : parseMeta(node);\n if (~nodeMeta.extra.classes.indexOf(LAYERS_TEXT_CLASSNAME)) {\n return callProvided('generateLayersText', node, nodeMeta);\n } else {\n return callProvided('generateSvgReplacementMutation', node, nodeMeta);\n }\n}\nvar knownPrefixes = new Set();\nFAMILIES.map(function (family) {\n knownPrefixes.add(\"fa-\".concat(family));\n});\nObject.keys(PREFIX_TO_STYLE[FAMILY_CLASSIC]).map(knownPrefixes.add.bind(knownPrefixes));\nObject.keys(PREFIX_TO_STYLE[FAMILY_SHARP]).map(knownPrefixes.add.bind(knownPrefixes));\nknownPrefixes = _toConsumableArray(knownPrefixes);\nfunction onTree(root) {\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n if (!IS_DOM) return Promise.resolve();\n var htmlClassList = DOCUMENT.documentElement.classList;\n var hclAdd = function hclAdd(suffix) {\n return htmlClassList.add(\"\".concat(HTML_CLASS_I2SVG_BASE_CLASS, \"-\").concat(suffix));\n };\n var hclRemove = function hclRemove(suffix) {\n return htmlClassList.remove(\"\".concat(HTML_CLASS_I2SVG_BASE_CLASS, \"-\").concat(suffix));\n };\n var prefixes = config.autoFetchSvg ? knownPrefixes : FAMILIES.map(function (f) {\n return \"fa-\".concat(f);\n }).concat(Object.keys(styles$2));\n if (!prefixes.includes('fa')) {\n prefixes.push('fa');\n }\n var prefixesDomQuery = [\".\".concat(LAYERS_TEXT_CLASSNAME, \":not([\").concat(DATA_FA_I2SVG, \"])\")].concat(prefixes.map(function (p) {\n return \".\".concat(p, \":not([\").concat(DATA_FA_I2SVG, \"])\");\n })).join(', ');\n if (prefixesDomQuery.length === 0) {\n return Promise.resolve();\n }\n var candidates = [];\n try {\n candidates = toArray(root.querySelectorAll(prefixesDomQuery));\n } catch (e) {// noop\n }\n if (candidates.length > 0) {\n hclAdd('pending');\n hclRemove('complete');\n } else {\n return Promise.resolve();\n }\n var mark = perf.begin('onTree');\n var mutations = candidates.reduce(function (acc, node) {\n try {\n var mutation = generateMutation(node);\n if (mutation) {\n acc.push(mutation);\n }\n } catch (e) {\n if (!PRODUCTION) {\n if (e.name === 'MissingIcon') {\n console.error(e);\n }\n }\n }\n return acc;\n }, []);\n return new Promise(function (resolve, reject) {\n Promise.all(mutations).then(function (resolvedMutations) {\n perform(resolvedMutations, function () {\n hclAdd('active');\n hclAdd('complete');\n hclRemove('pending');\n if (typeof callback === 'function') callback();\n mark();\n resolve();\n });\n }).catch(function (e) {\n mark();\n reject(e);\n });\n });\n}\nfunction onNode(node) {\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n generateMutation(node).then(function (mutation) {\n if (mutation) {\n perform([mutation], callback);\n }\n });\n}\nfunction resolveIcons(next) {\n return function (maybeIconDefinition) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var iconDefinition = (maybeIconDefinition || {}).icon ? maybeIconDefinition : findIconDefinition(maybeIconDefinition || {});\n var mask = params.mask;\n if (mask) {\n mask = (mask || {}).icon ? mask : findIconDefinition(mask || {});\n }\n return next(iconDefinition, _objectSpread2(_objectSpread2({}, params), {}, {\n mask: mask\n }));\n };\n}\nvar render = function render(iconDefinition) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$transform = params.transform,\n transform = _params$transform === void 0 ? meaninglessTransform : _params$transform,\n _params$symbol = params.symbol,\n symbol = _params$symbol === void 0 ? false : _params$symbol,\n _params$mask = params.mask,\n mask = _params$mask === void 0 ? null : _params$mask,\n _params$maskId = params.maskId,\n maskId = _params$maskId === void 0 ? null : _params$maskId,\n _params$title = params.title,\n title = _params$title === void 0 ? null : _params$title,\n _params$titleId = params.titleId,\n titleId = _params$titleId === void 0 ? null : _params$titleId,\n _params$classes = params.classes,\n classes = _params$classes === void 0 ? [] : _params$classes,\n _params$attributes = params.attributes,\n attributes = _params$attributes === void 0 ? {} : _params$attributes,\n _params$styles = params.styles,\n styles = _params$styles === void 0 ? {} : _params$styles;\n if (!iconDefinition) return;\n var prefix = iconDefinition.prefix,\n iconName = iconDefinition.iconName,\n icon = iconDefinition.icon;\n return domVariants(_objectSpread2({\n type: 'icon'\n }, iconDefinition), function () {\n callHooks('beforeDOMElementCreation', {\n iconDefinition: iconDefinition,\n params: params\n });\n if (config.autoA11y) {\n if (title) {\n attributes['aria-labelledby'] = \"\".concat(config.replacementClass, \"-title-\").concat(titleId || nextUniqueId());\n } else {\n attributes['aria-hidden'] = 'true';\n attributes['focusable'] = 'false';\n }\n }\n return makeInlineSvgAbstract({\n icons: {\n main: asFoundIcon(icon),\n mask: mask ? asFoundIcon(mask.icon) : {\n found: false,\n width: null,\n height: null,\n icon: {}\n }\n },\n prefix: prefix,\n iconName: iconName,\n transform: _objectSpread2(_objectSpread2({}, meaninglessTransform), transform),\n symbol: symbol,\n title: title,\n maskId: maskId,\n titleId: titleId,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: classes\n }\n });\n });\n};\nvar ReplaceElements = {\n mixout: function mixout() {\n return {\n icon: resolveIcons(render)\n };\n },\n hooks: function hooks() {\n return {\n mutationObserverCallbacks: function mutationObserverCallbacks(accumulator) {\n accumulator.treeCallback = onTree;\n accumulator.nodeCallback = onNode;\n return accumulator;\n }\n };\n },\n provides: function provides(providers$$1) {\n providers$$1.i2svg = function (params) {\n var _params$node = params.node,\n node = _params$node === void 0 ? DOCUMENT : _params$node,\n _params$callback = params.callback,\n callback = _params$callback === void 0 ? function () {} : _params$callback;\n return onTree(node, callback);\n };\n providers$$1.generateSvgReplacementMutation = function (node, nodeMeta) {\n var iconName = nodeMeta.iconName,\n title = nodeMeta.title,\n titleId = nodeMeta.titleId,\n prefix = nodeMeta.prefix,\n transform = nodeMeta.transform,\n symbol = nodeMeta.symbol,\n mask = nodeMeta.mask,\n maskId = nodeMeta.maskId,\n extra = nodeMeta.extra;\n return new Promise(function (resolve, reject) {\n Promise.all([findIcon(iconName, prefix), mask.iconName ? findIcon(mask.iconName, mask.prefix) : Promise.resolve({\n found: false,\n width: 512,\n height: 512,\n icon: {}\n })]).then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n main = _ref2[0],\n mask = _ref2[1];\n resolve([node, makeInlineSvgAbstract({\n icons: {\n main: main,\n mask: mask\n },\n prefix: prefix,\n iconName: iconName,\n transform: transform,\n symbol: symbol,\n maskId: maskId,\n title: title,\n titleId: titleId,\n extra: extra,\n watchable: true\n })]);\n }).catch(reject);\n });\n };\n providers$$1.generateAbstractIcon = function (_ref3) {\n var children = _ref3.children,\n attributes = _ref3.attributes,\n main = _ref3.main,\n transform = _ref3.transform,\n styles = _ref3.styles;\n var styleString = joinStyles(styles);\n if (styleString.length > 0) {\n attributes['style'] = styleString;\n }\n var nextChild;\n if (transformIsMeaningful(transform)) {\n nextChild = callProvided('generateAbstractTransformGrouping', {\n main: main,\n transform: transform,\n containerWidth: main.width,\n iconWidth: main.width\n });\n }\n children.push(nextChild || main.icon);\n return {\n children: children,\n attributes: attributes\n };\n };\n }\n};\nvar Layers = {\n mixout: function mixout() {\n return {\n layer: function layer(assembler) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$classes = params.classes,\n classes = _params$classes === void 0 ? [] : _params$classes;\n return domVariants({\n type: 'layer'\n }, function () {\n callHooks('beforeDOMElementCreation', {\n assembler: assembler,\n params: params\n });\n var children = [];\n assembler(function (args) {\n Array.isArray(args) ? args.map(function (a) {\n children = children.concat(a.abstract);\n }) : children = children.concat(args.abstract);\n });\n return [{\n tag: 'span',\n attributes: {\n class: [\"\".concat(config.cssPrefix, \"-layers\")].concat(_toConsumableArray(classes)).join(' ')\n },\n children: children\n }];\n });\n }\n };\n }\n};\nvar LayersCounter = {\n mixout: function mixout() {\n return {\n counter: function counter(content) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$title = params.title,\n title = _params$title === void 0 ? null : _params$title,\n _params$classes = params.classes,\n classes = _params$classes === void 0 ? [] : _params$classes,\n _params$attributes = params.attributes,\n attributes = _params$attributes === void 0 ? {} : _params$attributes,\n _params$styles = params.styles,\n styles = _params$styles === void 0 ? {} : _params$styles;\n return domVariants({\n type: 'counter',\n content: content\n }, function () {\n callHooks('beforeDOMElementCreation', {\n content: content,\n params: params\n });\n return makeLayersCounterAbstract({\n content: content.toString(),\n title: title,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: [\"\".concat(config.cssPrefix, \"-layers-counter\")].concat(_toConsumableArray(classes))\n }\n });\n });\n }\n };\n }\n};\nvar LayersText = {\n mixout: function mixout() {\n return {\n text: function text(content) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$transform = params.transform,\n transform = _params$transform === void 0 ? meaninglessTransform : _params$transform,\n _params$title = params.title,\n title = _params$title === void 0 ? null : _params$title,\n _params$classes = params.classes,\n classes = _params$classes === void 0 ? [] : _params$classes,\n _params$attributes = params.attributes,\n attributes = _params$attributes === void 0 ? {} : _params$attributes,\n _params$styles = params.styles,\n styles = _params$styles === void 0 ? {} : _params$styles;\n return domVariants({\n type: 'text',\n content: content\n }, function () {\n callHooks('beforeDOMElementCreation', {\n content: content,\n params: params\n });\n return makeLayersTextAbstract({\n content: content,\n transform: _objectSpread2(_objectSpread2({}, meaninglessTransform), transform),\n title: title,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: [\"\".concat(config.cssPrefix, \"-layers-text\")].concat(_toConsumableArray(classes))\n }\n });\n });\n }\n };\n },\n provides: function provides(providers$$1) {\n providers$$1.generateLayersText = function (node, nodeMeta) {\n var title = nodeMeta.title,\n transform = nodeMeta.transform,\n extra = nodeMeta.extra;\n var width = null;\n var height = null;\n if (IS_IE) {\n var computedFontSize = parseInt(getComputedStyle(node).fontSize, 10);\n var boundingClientRect = node.getBoundingClientRect();\n width = boundingClientRect.width / computedFontSize;\n height = boundingClientRect.height / computedFontSize;\n }\n if (config.autoA11y && !title) {\n extra.attributes['aria-hidden'] = 'true';\n }\n return Promise.resolve([node, makeLayersTextAbstract({\n content: node.innerHTML,\n width: width,\n height: height,\n transform: transform,\n title: title,\n extra: extra,\n watchable: true\n })]);\n };\n }\n};\nvar CLEAN_CONTENT_PATTERN = new RegExp(\"\\\"\", 'ug');\nvar SECONDARY_UNICODE_RANGE = [1105920, 1112319];\nfunction hexValueFromContent(content) {\n var cleaned = content.replace(CLEAN_CONTENT_PATTERN, '');\n var codePoint = codePointAt(cleaned, 0);\n var isPrependTen = codePoint >= SECONDARY_UNICODE_RANGE[0] && codePoint <= SECONDARY_UNICODE_RANGE[1];\n var isDoubled = cleaned.length === 2 ? cleaned[0] === cleaned[1] : false;\n return {\n value: isDoubled ? toHex(cleaned[0]) : toHex(cleaned),\n isSecondary: isPrependTen || isDoubled\n };\n}\nfunction replaceForPosition(node, position) {\n var pendingAttribute = \"\".concat(DATA_FA_PSEUDO_ELEMENT_PENDING).concat(position.replace(':', '-'));\n return new Promise(function (resolve, reject) {\n if (node.getAttribute(pendingAttribute) !== null) {\n // This node is already being processed\n return resolve();\n }\n var children = toArray(node.children);\n var alreadyProcessedPseudoElement = children.filter(function (c) {\n return c.getAttribute(DATA_FA_PSEUDO_ELEMENT) === position;\n })[0];\n var styles = WINDOW.getComputedStyle(node, position);\n var fontFamily = styles.getPropertyValue('font-family').match(FONT_FAMILY_PATTERN);\n var fontWeight = styles.getPropertyValue('font-weight');\n var content = styles.getPropertyValue('content');\n if (alreadyProcessedPseudoElement && !fontFamily) {\n // If we've already processed it but the current computed style does not result in a font-family,\n // that probably means that a class name that was previously present to make the icon has been\n // removed. So we now should delete the icon.\n node.removeChild(alreadyProcessedPseudoElement);\n return resolve();\n } else if (fontFamily && content !== 'none' && content !== '') {\n var _content = styles.getPropertyValue('content');\n var family = ~['Sharp'].indexOf(fontFamily[2]) ? FAMILY_SHARP : FAMILY_CLASSIC;\n var prefix = ~['Solid', 'Regular', 'Light', 'Thin', 'Duotone', 'Brands', 'Kit'].indexOf(fontFamily[2]) ? STYLE_TO_PREFIX[family][fontFamily[2].toLowerCase()] : FONT_WEIGHT_TO_PREFIX[family][fontWeight];\n var _hexValueFromContent = hexValueFromContent(_content),\n hexValue = _hexValueFromContent.value,\n isSecondary = _hexValueFromContent.isSecondary;\n var isV4 = fontFamily[0].startsWith('FontAwesome');\n var iconName = byUnicode(prefix, hexValue);\n var iconIdentifier = iconName;\n if (isV4) {\n var iconName4 = byOldUnicode(hexValue);\n if (iconName4.iconName && iconName4.prefix) {\n iconName = iconName4.iconName;\n prefix = iconName4.prefix;\n }\n } // Only convert the pseudo element in this ::before/::after position into an icon if we haven't\n // already done so with the same prefix and iconName\n\n if (iconName && !isSecondary && (!alreadyProcessedPseudoElement || alreadyProcessedPseudoElement.getAttribute(DATA_PREFIX) !== prefix || alreadyProcessedPseudoElement.getAttribute(DATA_ICON) !== iconIdentifier)) {\n node.setAttribute(pendingAttribute, iconIdentifier);\n if (alreadyProcessedPseudoElement) {\n // Delete the old one, since we're replacing it with a new one\n node.removeChild(alreadyProcessedPseudoElement);\n }\n var meta = blankMeta();\n var extra = meta.extra;\n extra.attributes[DATA_FA_PSEUDO_ELEMENT] = position;\n findIcon(iconName, prefix).then(function (main) {\n var abstract = makeInlineSvgAbstract(_objectSpread2(_objectSpread2({}, meta), {}, {\n icons: {\n main: main,\n mask: emptyCanonicalIcon()\n },\n prefix: prefix,\n iconName: iconIdentifier,\n extra: extra,\n watchable: true\n }));\n var element = DOCUMENT.createElement('svg');\n if (position === '::before') {\n node.insertBefore(element, node.firstChild);\n } else {\n node.appendChild(element);\n }\n element.outerHTML = abstract.map(function (a) {\n return toHtml(a);\n }).join('\\n');\n node.removeAttribute(pendingAttribute);\n resolve();\n }).catch(reject);\n } else {\n resolve();\n }\n } else {\n resolve();\n }\n });\n}\nfunction replace(node) {\n return Promise.all([replaceForPosition(node, '::before'), replaceForPosition(node, '::after')]);\n}\nfunction processable(node) {\n return node.parentNode !== document.head && !~TAGNAMES_TO_SKIP_FOR_PSEUDOELEMENTS.indexOf(node.tagName.toUpperCase()) && !node.getAttribute(DATA_FA_PSEUDO_ELEMENT) && (!node.parentNode || node.parentNode.tagName !== 'svg');\n}\nfunction searchPseudoElements(root) {\n if (!IS_DOM) return;\n return new Promise(function (resolve, reject) {\n var operations = toArray(root.querySelectorAll('*')).filter(processable).map(replace);\n var end = perf.begin('searchPseudoElements');\n disableObservation();\n Promise.all(operations).then(function () {\n end();\n enableObservation();\n resolve();\n }).catch(function () {\n end();\n enableObservation();\n reject();\n });\n });\n}\nvar PseudoElements = {\n hooks: function hooks() {\n return {\n mutationObserverCallbacks: function mutationObserverCallbacks(accumulator) {\n accumulator.pseudoElementsCallback = searchPseudoElements;\n return accumulator;\n }\n };\n },\n provides: function provides(providers$$1) {\n providers$$1.pseudoElements2svg = function (params) {\n var _params$node = params.node,\n node = _params$node === void 0 ? DOCUMENT : _params$node;\n if (config.searchPseudoElements) {\n searchPseudoElements(node);\n }\n };\n }\n};\nvar _unwatched = false;\nvar MutationObserver$1 = {\n mixout: function mixout() {\n return {\n dom: {\n unwatch: function unwatch() {\n disableObservation();\n _unwatched = true;\n }\n }\n };\n },\n hooks: function hooks() {\n return {\n bootstrap: function bootstrap() {\n observe(chainHooks('mutationObserverCallbacks', {}));\n },\n noAuto: function noAuto() {\n disconnect();\n },\n watch: function watch(params) {\n var observeMutationsRoot = params.observeMutationsRoot;\n if (_unwatched) {\n enableObservation();\n } else {\n observe(chainHooks('mutationObserverCallbacks', {\n observeMutationsRoot: observeMutationsRoot\n }));\n }\n }\n };\n }\n};\nvar parseTransformString = function parseTransformString(transformString) {\n var transform = {\n size: 16,\n x: 0,\n y: 0,\n flipX: false,\n flipY: false,\n rotate: 0\n };\n return transformString.toLowerCase().split(' ').reduce(function (acc, n) {\n var parts = n.toLowerCase().split('-');\n var first = parts[0];\n var rest = parts.slice(1).join('-');\n if (first && rest === 'h') {\n acc.flipX = true;\n return acc;\n }\n if (first && rest === 'v') {\n acc.flipY = true;\n return acc;\n }\n rest = parseFloat(rest);\n if (isNaN(rest)) {\n return acc;\n }\n switch (first) {\n case 'grow':\n acc.size = acc.size + rest;\n break;\n case 'shrink':\n acc.size = acc.size - rest;\n break;\n case 'left':\n acc.x = acc.x - rest;\n break;\n case 'right':\n acc.x = acc.x + rest;\n break;\n case 'up':\n acc.y = acc.y - rest;\n break;\n case 'down':\n acc.y = acc.y + rest;\n break;\n case 'rotate':\n acc.rotate = acc.rotate + rest;\n break;\n }\n return acc;\n }, transform);\n};\nvar PowerTransforms = {\n mixout: function mixout() {\n return {\n parse: {\n transform: function transform(transformString) {\n return parseTransformString(transformString);\n }\n }\n };\n },\n hooks: function hooks() {\n return {\n parseNodeAttributes: function parseNodeAttributes(accumulator, node) {\n var transformString = node.getAttribute('data-fa-transform');\n if (transformString) {\n accumulator.transform = parseTransformString(transformString);\n }\n return accumulator;\n }\n };\n },\n provides: function provides(providers) {\n providers.generateAbstractTransformGrouping = function (_ref) {\n var main = _ref.main,\n transform = _ref.transform,\n containerWidth = _ref.containerWidth,\n iconWidth = _ref.iconWidth;\n var outer = {\n transform: \"translate(\".concat(containerWidth / 2, \" 256)\")\n };\n var innerTranslate = \"translate(\".concat(transform.x * 32, \", \").concat(transform.y * 32, \") \");\n var innerScale = \"scale(\".concat(transform.size / 16 * (transform.flipX ? -1 : 1), \", \").concat(transform.size / 16 * (transform.flipY ? -1 : 1), \") \");\n var innerRotate = \"rotate(\".concat(transform.rotate, \" 0 0)\");\n var inner = {\n transform: \"\".concat(innerTranslate, \" \").concat(innerScale, \" \").concat(innerRotate)\n };\n var path = {\n transform: \"translate(\".concat(iconWidth / 2 * -1, \" -256)\")\n };\n var operations = {\n outer: outer,\n inner: inner,\n path: path\n };\n return {\n tag: 'g',\n attributes: _objectSpread2({}, operations.outer),\n children: [{\n tag: 'g',\n attributes: _objectSpread2({}, operations.inner),\n children: [{\n tag: main.icon.tag,\n children: main.icon.children,\n attributes: _objectSpread2(_objectSpread2({}, main.icon.attributes), operations.path)\n }]\n }]\n };\n };\n }\n};\nvar ALL_SPACE = {\n x: 0,\n y: 0,\n width: '100%',\n height: '100%'\n};\nfunction fillBlack(abstract) {\n var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n if (abstract.attributes && (abstract.attributes.fill || force)) {\n abstract.attributes.fill = 'black';\n }\n return abstract;\n}\nfunction deGroup(abstract) {\n if (abstract.tag === 'g') {\n return abstract.children;\n } else {\n return [abstract];\n }\n}\nvar Masks = {\n hooks: function hooks() {\n return {\n parseNodeAttributes: function parseNodeAttributes(accumulator, node) {\n var maskData = node.getAttribute('data-fa-mask');\n var mask = !maskData ? emptyCanonicalIcon() : getCanonicalIcon(maskData.split(' ').map(function (i) {\n return i.trim();\n }));\n if (!mask.prefix) {\n mask.prefix = getDefaultUsablePrefix();\n }\n accumulator.mask = mask;\n accumulator.maskId = node.getAttribute('data-fa-mask-id');\n return accumulator;\n }\n };\n },\n provides: function provides(providers) {\n providers.generateAbstractMask = function (_ref) {\n var children = _ref.children,\n attributes = _ref.attributes,\n main = _ref.main,\n mask = _ref.mask,\n explicitMaskId = _ref.maskId,\n transform = _ref.transform;\n var mainWidth = main.width,\n mainPath = main.icon;\n var maskWidth = mask.width,\n maskPath = mask.icon;\n var trans = transformForSvg({\n transform: transform,\n containerWidth: maskWidth,\n iconWidth: mainWidth\n });\n var maskRect = {\n tag: 'rect',\n attributes: _objectSpread2(_objectSpread2({}, ALL_SPACE), {}, {\n fill: 'white'\n })\n };\n var maskInnerGroupChildrenMixin = mainPath.children ? {\n children: mainPath.children.map(fillBlack)\n } : {};\n var maskInnerGroup = {\n tag: 'g',\n attributes: _objectSpread2({}, trans.inner),\n children: [fillBlack(_objectSpread2({\n tag: mainPath.tag,\n attributes: _objectSpread2(_objectSpread2({}, mainPath.attributes), trans.path)\n }, maskInnerGroupChildrenMixin))]\n };\n var maskOuterGroup = {\n tag: 'g',\n attributes: _objectSpread2({}, trans.outer),\n children: [maskInnerGroup]\n };\n var maskId = \"mask-\".concat(explicitMaskId || nextUniqueId());\n var clipId = \"clip-\".concat(explicitMaskId || nextUniqueId());\n var maskTag = {\n tag: 'mask',\n attributes: _objectSpread2(_objectSpread2({}, ALL_SPACE), {}, {\n id: maskId,\n maskUnits: 'userSpaceOnUse',\n maskContentUnits: 'userSpaceOnUse'\n }),\n children: [maskRect, maskOuterGroup]\n };\n var defs = {\n tag: 'defs',\n children: [{\n tag: 'clipPath',\n attributes: {\n id: clipId\n },\n children: deGroup(maskPath)\n }, maskTag]\n };\n children.push(defs, {\n tag: 'rect',\n attributes: _objectSpread2({\n fill: 'currentColor',\n 'clip-path': \"url(#\".concat(clipId, \")\"),\n mask: \"url(#\".concat(maskId, \")\")\n }, ALL_SPACE)\n });\n return {\n children: children,\n attributes: attributes\n };\n };\n }\n};\nvar MissingIconIndicator = {\n provides: function provides(providers) {\n var reduceMotion = false;\n if (WINDOW.matchMedia) {\n reduceMotion = WINDOW.matchMedia('(prefers-reduced-motion: reduce)').matches;\n }\n providers.missingIconAbstract = function () {\n var gChildren = [];\n var FILL = {\n fill: 'currentColor'\n };\n var ANIMATION_BASE = {\n attributeType: 'XML',\n repeatCount: 'indefinite',\n dur: '2s'\n }; // Ring\n\n gChildren.push({\n tag: 'path',\n attributes: _objectSpread2(_objectSpread2({}, FILL), {}, {\n d: 'M156.5,447.7l-12.6,29.5c-18.7-9.5-35.9-21.2-51.5-34.9l22.7-22.7C127.6,430.5,141.5,440,156.5,447.7z M40.6,272H8.5 c1.4,21.2,5.4,41.7,11.7,61.1L50,321.2C45.1,305.5,41.8,289,40.6,272z M40.6,240c1.4-18.8,5.2-37,11.1-54.1l-29.5-12.6 C14.7,194.3,10,216.7,8.5,240H40.6z M64.3,156.5c7.8-14.9,17.2-28.8,28.1-41.5L69.7,92.3c-13.7,15.6-25.5,32.8-34.9,51.5 L64.3,156.5z M397,419.6c-13.9,12-29.4,22.3-46.1,30.4l11.9,29.8c20.7-9.9,39.8-22.6,56.9-37.6L397,419.6z M115,92.4 c13.9-12,29.4-22.3,46.1-30.4l-11.9-29.8c-20.7,9.9-39.8,22.6-56.8,37.6L115,92.4z M447.7,355.5c-7.8,14.9-17.2,28.8-28.1,41.5 l22.7,22.7c13.7-15.6,25.5-32.9,34.9-51.5L447.7,355.5z M471.4,272c-1.4,18.8-5.2,37-11.1,54.1l29.5,12.6 c7.5-21.1,12.2-43.5,13.6-66.8H471.4z M321.2,462c-15.7,5-32.2,8.2-49.2,9.4v32.1c21.2-1.4,41.7-5.4,61.1-11.7L321.2,462z M240,471.4c-18.8-1.4-37-5.2-54.1-11.1l-12.6,29.5c21.1,7.5,43.5,12.2,66.8,13.6V471.4z M462,190.8c5,15.7,8.2,32.2,9.4,49.2h32.1 c-1.4-21.2-5.4-41.7-11.7-61.1L462,190.8z M92.4,397c-12-13.9-22.3-29.4-30.4-46.1l-29.8,11.9c9.9,20.7,22.6,39.8,37.6,56.9 L92.4,397z M272,40.6c18.8,1.4,36.9,5.2,54.1,11.1l12.6-29.5C317.7,14.7,295.3,10,272,8.5V40.6z M190.8,50 c15.7-5,32.2-8.2,49.2-9.4V8.5c-21.2,1.4-41.7,5.4-61.1,11.7L190.8,50z M442.3,92.3L419.6,115c12,13.9,22.3,29.4,30.5,46.1 l29.8-11.9C470,128.5,457.3,109.4,442.3,92.3z M397,92.4l22.7-22.7c-15.6-13.7-32.8-25.5-51.5-34.9l-12.6,29.5 C370.4,72.1,384.4,81.5,397,92.4z'\n })\n });\n var OPACITY_ANIMATE = _objectSpread2(_objectSpread2({}, ANIMATION_BASE), {}, {\n attributeName: 'opacity'\n });\n var dot = {\n tag: 'circle',\n attributes: _objectSpread2(_objectSpread2({}, FILL), {}, {\n cx: '256',\n cy: '364',\n r: '28'\n }),\n children: []\n };\n if (!reduceMotion) {\n dot.children.push({\n tag: 'animate',\n attributes: _objectSpread2(_objectSpread2({}, ANIMATION_BASE), {}, {\n attributeName: 'r',\n values: '28;14;28;28;14;28;'\n })\n }, {\n tag: 'animate',\n attributes: _objectSpread2(_objectSpread2({}, OPACITY_ANIMATE), {}, {\n values: '1;0;1;1;0;1;'\n })\n });\n }\n gChildren.push(dot);\n gChildren.push({\n tag: 'path',\n attributes: _objectSpread2(_objectSpread2({}, FILL), {}, {\n opacity: '1',\n d: 'M263.7,312h-16c-6.6,0-12-5.4-12-12c0-71,77.4-63.9,77.4-107.8c0-20-17.8-40.2-57.4-40.2c-29.1,0-44.3,9.6-59.2,28.7 c-3.9,5-11.1,6-16.2,2.4l-13.1-9.2c-5.6-3.9-6.9-11.8-2.6-17.2c21.2-27.2,46.4-44.7,91.2-44.7c52.3,0,97.4,29.8,97.4,80.2 c0,67.6-77.4,63.5-77.4,107.8C275.7,306.6,270.3,312,263.7,312z'\n }),\n children: reduceMotion ? [] : [{\n tag: 'animate',\n attributes: _objectSpread2(_objectSpread2({}, OPACITY_ANIMATE), {}, {\n values: '1;0;0;0;0;1;'\n })\n }]\n });\n if (!reduceMotion) {\n // Exclamation\n gChildren.push({\n tag: 'path',\n attributes: _objectSpread2(_objectSpread2({}, FILL), {}, {\n opacity: '0',\n d: 'M232.5,134.5l7,168c0.3,6.4,5.6,11.5,12,11.5h9c6.4,0,11.7-5.1,12-11.5l7-168c0.3-6.8-5.2-12.5-12-12.5h-23 C237.7,122,232.2,127.7,232.5,134.5z'\n }),\n children: [{\n tag: 'animate',\n attributes: _objectSpread2(_objectSpread2({}, OPACITY_ANIMATE), {}, {\n values: '0;0;1;1;0;0;'\n })\n }]\n });\n }\n return {\n tag: 'g',\n attributes: {\n 'class': 'missing'\n },\n children: gChildren\n };\n };\n }\n};\nvar SvgSymbols = {\n hooks: function hooks() {\n return {\n parseNodeAttributes: function parseNodeAttributes(accumulator, node) {\n var symbolData = node.getAttribute('data-fa-symbol');\n var symbol = symbolData === null ? false : symbolData === '' ? true : symbolData;\n accumulator['symbol'] = symbol;\n return accumulator;\n }\n };\n }\n};\nvar plugins = [InjectCSS, ReplaceElements, Layers, LayersCounter, LayersText, PseudoElements, MutationObserver$1, PowerTransforms, Masks, MissingIconIndicator, SvgSymbols];\nregisterPlugins(plugins, {\n mixoutsTo: api\n});\nvar noAuto$1 = api.noAuto;\nvar config$1 = api.config;\nvar library$1 = api.library;\nvar dom$1 = api.dom;\nvar parse$1 = api.parse;\nvar findIconDefinition$1 = api.findIconDefinition;\nvar toHtml$1 = api.toHtml;\nvar icon = api.icon;\nvar layer = api.layer;\nvar text = api.text;\nvar counter = api.counter;\nexport { noAuto$1 as noAuto, config$1 as config, library$1 as library, dom$1 as dom, parse$1 as parse, findIconDefinition$1 as findIconDefinition, toHtml$1 as toHtml, icon, layer, text, counter, api };","import { parse, icon } from '@fortawesome/fontawesome-svg-core';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n enumerableOnly && (symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n })), keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = null != arguments[i] ? arguments[i] : {};\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\n// Get CSS class list from a props object\nfunction classList(props) {\n var _classes;\n var beat = props.beat,\n fade = props.fade,\n beatFade = props.beatFade,\n bounce = props.bounce,\n shake = props.shake,\n flash = props.flash,\n spin = props.spin,\n spinPulse = props.spinPulse,\n spinReverse = props.spinReverse,\n pulse = props.pulse,\n fixedWidth = props.fixedWidth,\n inverse = props.inverse,\n border = props.border,\n listItem = props.listItem,\n flip = props.flip,\n size = props.size,\n rotation = props.rotation,\n pull = props.pull; // map of CSS class names to properties\n\n var classes = (_classes = {\n 'fa-beat': beat,\n 'fa-fade': fade,\n 'fa-beat-fade': beatFade,\n 'fa-bounce': bounce,\n 'fa-shake': shake,\n 'fa-flash': flash,\n 'fa-spin': spin,\n 'fa-spin-reverse': spinReverse,\n 'fa-spin-pulse': spinPulse,\n 'fa-pulse': pulse,\n 'fa-fw': fixedWidth,\n 'fa-inverse': inverse,\n 'fa-border': border,\n 'fa-li': listItem,\n 'fa-flip': flip === true,\n 'fa-flip-horizontal': flip === 'horizontal' || flip === 'both',\n 'fa-flip-vertical': flip === 'vertical' || flip === 'both'\n }, _defineProperty(_classes, \"fa-\".concat(size), typeof size !== 'undefined' && size !== null), _defineProperty(_classes, \"fa-rotate-\".concat(rotation), typeof rotation !== 'undefined' && rotation !== null && rotation !== 0), _defineProperty(_classes, \"fa-pull-\".concat(pull), typeof pull !== 'undefined' && pull !== null), _defineProperty(_classes, 'fa-swap-opacity', props.swapOpacity), _classes); // map over all the keys in the classes object\n // return an array of the keys where the value for the key is not null\n\n return Object.keys(classes).map(function (key) {\n return classes[key] ? key : null;\n }).filter(function (key) {\n return key;\n });\n}\n\n// Camelize taken from humps\n// humps is copyright © 2012+ Dom Christie\n// Released under the MIT license.\n// Performant way to determine if object coerces to a number\nfunction _isNumerical(obj) {\n obj = obj - 0; // eslint-disable-next-line no-self-compare\n\n return obj === obj;\n}\nfunction camelize(string) {\n if (_isNumerical(string)) {\n return string;\n } // eslint-disable-next-line no-useless-escape\n\n string = string.replace(/[\\-_\\s]+(.)?/g, function (match, chr) {\n return chr ? chr.toUpperCase() : '';\n }); // Ensure 1st char is always lowercase\n\n return string.substr(0, 1).toLowerCase() + string.substr(1);\n}\nvar _excluded = [\"style\"];\nfunction capitalize(val) {\n return val.charAt(0).toUpperCase() + val.slice(1);\n}\nfunction styleToObject(style) {\n return style.split(';').map(function (s) {\n return s.trim();\n }).filter(function (s) {\n return s;\n }).reduce(function (acc, pair) {\n var i = pair.indexOf(':');\n var prop = camelize(pair.slice(0, i));\n var value = pair.slice(i + 1).trim();\n prop.startsWith('webkit') ? acc[capitalize(prop)] = value : acc[prop] = value;\n return acc;\n }, {});\n}\nfunction convert(createElement, element) {\n var extraProps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n if (typeof element === 'string') {\n return element;\n }\n var children = (element.children || []).map(function (child) {\n return convert(createElement, child);\n });\n /* eslint-disable dot-notation */\n\n var mixins = Object.keys(element.attributes || {}).reduce(function (acc, key) {\n var val = element.attributes[key];\n switch (key) {\n case 'class':\n acc.attrs['className'] = val;\n delete element.attributes['class'];\n break;\n case 'style':\n acc.attrs['style'] = styleToObject(val);\n break;\n default:\n if (key.indexOf('aria-') === 0 || key.indexOf('data-') === 0) {\n acc.attrs[key.toLowerCase()] = val;\n } else {\n acc.attrs[camelize(key)] = val;\n }\n }\n return acc;\n }, {\n attrs: {}\n });\n var _extraProps$style = extraProps.style,\n existingStyle = _extraProps$style === void 0 ? {} : _extraProps$style,\n remaining = _objectWithoutProperties(extraProps, _excluded);\n mixins.attrs['style'] = _objectSpread2(_objectSpread2({}, mixins.attrs['style']), existingStyle);\n /* eslint-enable */\n\n return createElement.apply(void 0, [element.tag, _objectSpread2(_objectSpread2({}, mixins.attrs), remaining)].concat(_toConsumableArray(children)));\n}\nvar PRODUCTION = false;\ntry {\n PRODUCTION = process.env.NODE_ENV === 'production';\n} catch (e) {}\nfunction log() {\n if (!PRODUCTION && console && typeof console.error === 'function') {\n var _console;\n (_console = console).error.apply(_console, arguments);\n }\n}\nfunction normalizeIconArgs(icon) {\n // this has everything that it needs to be rendered which means it was probably imported\n // directly from an icon svg package\n if (icon && _typeof(icon) === 'object' && icon.prefix && icon.iconName && icon.icon) {\n return icon;\n }\n if (parse.icon) {\n return parse.icon(icon);\n } // if the icon is null, there's nothing to do\n\n if (icon === null) {\n return null;\n } // if the icon is an object and has a prefix and an icon name, return it\n\n if (icon && _typeof(icon) === 'object' && icon.prefix && icon.iconName) {\n return icon;\n } // if it's an array with length of two\n\n if (Array.isArray(icon) && icon.length === 2) {\n // use the first item as prefix, second as icon name\n return {\n prefix: icon[0],\n iconName: icon[1]\n };\n } // if it's a string, use it as the icon name\n\n if (typeof icon === 'string') {\n return {\n prefix: 'fas',\n iconName: icon\n };\n }\n}\n\n// creates an object with a key of key\n// and a value of value\n// if certain conditions are met\nfunction objectWithKey(key, value) {\n // if the value is a non-empty array\n // or it's not an array but it is truthy\n // then create the object with the key and the value\n // if not, return an empty array\n return Array.isArray(value) && value.length > 0 || !Array.isArray(value) && value ? _defineProperty({}, key, value) : {};\n}\nvar FontAwesomeIcon = /*#__PURE__*/React.forwardRef(function (props, ref) {\n var iconArgs = props.icon,\n maskArgs = props.mask,\n symbol = props.symbol,\n className = props.className,\n title = props.title,\n titleId = props.titleId,\n maskId = props.maskId;\n var iconLookup = normalizeIconArgs(iconArgs);\n var classes = objectWithKey('classes', [].concat(_toConsumableArray(classList(props)), _toConsumableArray(className.split(' '))));\n var transform = objectWithKey('transform', typeof props.transform === 'string' ? parse.transform(props.transform) : props.transform);\n var mask = objectWithKey('mask', normalizeIconArgs(maskArgs));\n var renderedIcon = icon(iconLookup, _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({}, classes), transform), mask), {}, {\n symbol: symbol,\n title: title,\n titleId: titleId,\n maskId: maskId\n }));\n if (!renderedIcon) {\n log('Could not find icon', iconLookup);\n return null;\n }\n var abstract = renderedIcon.abstract;\n var extraProps = {\n ref: ref\n };\n Object.keys(props).forEach(function (key) {\n // eslint-disable-next-line no-prototype-builtins\n if (!FontAwesomeIcon.defaultProps.hasOwnProperty(key)) {\n extraProps[key] = props[key];\n }\n });\n return convertCurry(abstract[0], extraProps);\n});\nFontAwesomeIcon.displayName = 'FontAwesomeIcon';\nFontAwesomeIcon.propTypes = {\n beat: PropTypes.bool,\n border: PropTypes.bool,\n beatFade: PropTypes.bool,\n bounce: PropTypes.bool,\n className: PropTypes.string,\n fade: PropTypes.bool,\n flash: PropTypes.bool,\n mask: PropTypes.oneOfType([PropTypes.object, PropTypes.array, PropTypes.string]),\n maskId: PropTypes.string,\n fixedWidth: PropTypes.bool,\n inverse: PropTypes.bool,\n flip: PropTypes.oneOf([true, false, 'horizontal', 'vertical', 'both']),\n icon: PropTypes.oneOfType([PropTypes.object, PropTypes.array, PropTypes.string]),\n listItem: PropTypes.bool,\n pull: PropTypes.oneOf(['right', 'left']),\n pulse: PropTypes.bool,\n rotation: PropTypes.oneOf([0, 90, 180, 270]),\n shake: PropTypes.bool,\n size: PropTypes.oneOf(['2xs', 'xs', 'sm', 'lg', 'xl', '2xl', '1x', '2x', '3x', '4x', '5x', '6x', '7x', '8x', '9x', '10x']),\n spin: PropTypes.bool,\n spinPulse: PropTypes.bool,\n spinReverse: PropTypes.bool,\n symbol: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),\n title: PropTypes.string,\n titleId: PropTypes.string,\n transform: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n swapOpacity: PropTypes.bool\n};\nFontAwesomeIcon.defaultProps = {\n border: false,\n className: '',\n mask: null,\n maskId: null,\n fixedWidth: false,\n inverse: false,\n flip: false,\n icon: null,\n listItem: false,\n pull: null,\n pulse: false,\n rotation: null,\n size: null,\n spin: false,\n spinPulse: false,\n spinReverse: false,\n beat: false,\n fade: false,\n beatFade: false,\n bounce: false,\n shake: false,\n symbol: false,\n title: '',\n titleId: null,\n transform: null,\n swapOpacity: false\n};\nvar convertCurry = convert.bind(null, React.createElement);\nexport { FontAwesomeIcon };","import _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nimport * as React from 'react';\nimport clsx from 'clsx';\nimport withStyles from '../styles/withStyles';\nimport { alpha } from '../styles/colorManipulator';\nimport ButtonBase from '../ButtonBase';\nimport capitalize from '../utils/capitalize';\nexport var styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: _extends({}, theme.typography.button, {\n boxSizing: 'border-box',\n minWidth: 64,\n padding: '6px 16px',\n borderRadius: theme.shape.borderRadius,\n color: theme.palette.text.primary,\n transition: theme.transitions.create(['background-color', 'box-shadow', 'border'], {\n duration: theme.transitions.duration.short\n }),\n '&:hover': {\n textDecoration: 'none',\n backgroundColor: alpha(theme.palette.text.primary, theme.palette.action.hoverOpacity),\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n },\n '&$disabled': {\n backgroundColor: 'transparent'\n }\n },\n '&$disabled': {\n color: theme.palette.action.disabled\n }\n }),\n /* Styles applied to the span element that wraps the children. */\n label: {\n width: '100%',\n // Ensure the correct width for iOS Safari\n display: 'inherit',\n alignItems: 'inherit',\n justifyContent: 'inherit'\n },\n /* Styles applied to the root element if `variant=\"text\"`. */\n text: {\n padding: '6px 8px'\n },\n /* Styles applied to the root element if `variant=\"text\"` and `color=\"primary\"`. */\n textPrimary: {\n color: theme.palette.primary.main,\n '&:hover': {\n backgroundColor: alpha(theme.palette.primary.main, theme.palette.action.hoverOpacity),\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n }\n }\n },\n /* Styles applied to the root element if `variant=\"text\"` and `color=\"secondary\"`. */\n textSecondary: {\n color: theme.palette.secondary.main,\n '&:hover': {\n backgroundColor: alpha(theme.palette.secondary.main, theme.palette.action.hoverOpacity),\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n }\n }\n },\n /* Styles applied to the root element if `variant=\"outlined\"`. */\n outlined: {\n padding: '5px 15px',\n border: \"1px solid \".concat(theme.palette.type === 'light' ? 'rgba(0, 0, 0, 0.23)' : 'rgba(255, 255, 255, 0.23)'),\n '&$disabled': {\n border: \"1px solid \".concat(theme.palette.action.disabledBackground)\n }\n },\n /* Styles applied to the root element if `variant=\"outlined\"` and `color=\"primary\"`. */\n outlinedPrimary: {\n color: theme.palette.primary.main,\n border: \"1px solid \".concat(alpha(theme.palette.primary.main, 0.5)),\n '&:hover': {\n border: \"1px solid \".concat(theme.palette.primary.main),\n backgroundColor: alpha(theme.palette.primary.main, theme.palette.action.hoverOpacity),\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n }\n }\n },\n /* Styles applied to the root element if `variant=\"outlined\"` and `color=\"secondary\"`. */\n outlinedSecondary: {\n color: theme.palette.secondary.main,\n border: \"1px solid \".concat(alpha(theme.palette.secondary.main, 0.5)),\n '&:hover': {\n border: \"1px solid \".concat(theme.palette.secondary.main),\n backgroundColor: alpha(theme.palette.secondary.main, theme.palette.action.hoverOpacity),\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: 'transparent'\n }\n },\n '&$disabled': {\n border: \"1px solid \".concat(theme.palette.action.disabled)\n }\n },\n /* Styles applied to the root element if `variant=\"contained\"`. */\n contained: {\n color: theme.palette.getContrastText(theme.palette.grey[300]),\n backgroundColor: theme.palette.grey[300],\n boxShadow: theme.shadows[2],\n '&:hover': {\n backgroundColor: theme.palette.grey.A100,\n boxShadow: theme.shadows[4],\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n boxShadow: theme.shadows[2],\n backgroundColor: theme.palette.grey[300]\n },\n '&$disabled': {\n backgroundColor: theme.palette.action.disabledBackground\n }\n },\n '&$focusVisible': {\n boxShadow: theme.shadows[6]\n },\n '&:active': {\n boxShadow: theme.shadows[8]\n },\n '&$disabled': {\n color: theme.palette.action.disabled,\n boxShadow: theme.shadows[0],\n backgroundColor: theme.palette.action.disabledBackground\n }\n },\n /* Styles applied to the root element if `variant=\"contained\"` and `color=\"primary\"`. */\n containedPrimary: {\n color: theme.palette.primary.contrastText,\n backgroundColor: theme.palette.primary.main,\n '&:hover': {\n backgroundColor: theme.palette.primary.dark,\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: theme.palette.primary.main\n }\n }\n },\n /* Styles applied to the root element if `variant=\"contained\"` and `color=\"secondary\"`. */\n containedSecondary: {\n color: theme.palette.secondary.contrastText,\n backgroundColor: theme.palette.secondary.main,\n '&:hover': {\n backgroundColor: theme.palette.secondary.dark,\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: theme.palette.secondary.main\n }\n }\n },\n /* Styles applied to the root element if `disableElevation={true}`. */\n disableElevation: {\n boxShadow: 'none',\n '&:hover': {\n boxShadow: 'none'\n },\n '&$focusVisible': {\n boxShadow: 'none'\n },\n '&:active': {\n boxShadow: 'none'\n },\n '&$disabled': {\n boxShadow: 'none'\n }\n },\n /* Pseudo-class applied to the ButtonBase root element if the button is keyboard focused. */\n focusVisible: {},\n /* Pseudo-class applied to the root element if `disabled={true}`. */\n disabled: {},\n /* Styles applied to the root element if `color=\"inherit\"`. */\n colorInherit: {\n color: 'inherit',\n borderColor: 'currentColor'\n },\n /* Styles applied to the root element if `size=\"small\"` and `variant=\"text\"`. */\n textSizeSmall: {\n padding: '4px 5px',\n fontSize: theme.typography.pxToRem(13)\n },\n /* Styles applied to the root element if `size=\"large\"` and `variant=\"text\"`. */\n textSizeLarge: {\n padding: '8px 11px',\n fontSize: theme.typography.pxToRem(15)\n },\n /* Styles applied to the root element if `size=\"small\"` and `variant=\"outlined\"`. */\n outlinedSizeSmall: {\n padding: '3px 9px',\n fontSize: theme.typography.pxToRem(13)\n },\n /* Styles applied to the root element if `size=\"large\"` and `variant=\"outlined\"`. */\n outlinedSizeLarge: {\n padding: '7px 21px',\n fontSize: theme.typography.pxToRem(15)\n },\n /* Styles applied to the root element if `size=\"small\"` and `variant=\"contained\"`. */\n containedSizeSmall: {\n padding: '4px 10px',\n fontSize: theme.typography.pxToRem(13)\n },\n /* Styles applied to the root element if `size=\"large\"` and `variant=\"contained\"`. */\n containedSizeLarge: {\n padding: '8px 22px',\n fontSize: theme.typography.pxToRem(15)\n },\n /* Styles applied to the root element if `size=\"small\"`. */\n sizeSmall: {},\n /* Styles applied to the root element if `size=\"large\"`. */\n sizeLarge: {},\n /* Styles applied to the root element if `fullWidth={true}`. */\n fullWidth: {\n width: '100%'\n },\n /* Styles applied to the startIcon element if supplied. */\n startIcon: {\n display: 'inherit',\n marginRight: 8,\n marginLeft: -4,\n '&$iconSizeSmall': {\n marginLeft: -2\n }\n },\n /* Styles applied to the endIcon element if supplied. */\n endIcon: {\n display: 'inherit',\n marginRight: -4,\n marginLeft: 8,\n '&$iconSizeSmall': {\n marginRight: -2\n }\n },\n /* Styles applied to the icon element if supplied and `size=\"small\"`. */\n iconSizeSmall: {\n '& > *:first-child': {\n fontSize: 18\n }\n },\n /* Styles applied to the icon element if supplied and `size=\"medium\"`. */\n iconSizeMedium: {\n '& > *:first-child': {\n fontSize: 20\n }\n },\n /* Styles applied to the icon element if supplied and `size=\"large\"`. */\n iconSizeLarge: {\n '& > *:first-child': {\n fontSize: 22\n }\n }\n };\n};\nvar Button = /*#__PURE__*/React.forwardRef(function Button(props, ref) {\n var children = props.children,\n classes = props.classes,\n className = props.className,\n _props$color = props.color,\n color = _props$color === void 0 ? 'default' : _props$color,\n _props$component = props.component,\n component = _props$component === void 0 ? 'button' : _props$component,\n _props$disabled = props.disabled,\n disabled = _props$disabled === void 0 ? false : _props$disabled,\n _props$disableElevati = props.disableElevation,\n disableElevation = _props$disableElevati === void 0 ? false : _props$disableElevati,\n _props$disableFocusRi = props.disableFocusRipple,\n disableFocusRipple = _props$disableFocusRi === void 0 ? false : _props$disableFocusRi,\n endIconProp = props.endIcon,\n focusVisibleClassName = props.focusVisibleClassName,\n _props$fullWidth = props.fullWidth,\n fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth,\n _props$size = props.size,\n size = _props$size === void 0 ? 'medium' : _props$size,\n startIconProp = props.startIcon,\n _props$type = props.type,\n type = _props$type === void 0 ? 'button' : _props$type,\n _props$variant = props.variant,\n variant = _props$variant === void 0 ? 'text' : _props$variant,\n other = _objectWithoutProperties(props, [\"children\", \"classes\", \"className\", \"color\", \"component\", \"disabled\", \"disableElevation\", \"disableFocusRipple\", \"endIcon\", \"focusVisibleClassName\", \"fullWidth\", \"size\", \"startIcon\", \"type\", \"variant\"]);\n var startIcon = startIconProp && /*#__PURE__*/React.createElement(\"span\", {\n className: clsx(classes.startIcon, classes[\"iconSize\".concat(capitalize(size))])\n }, startIconProp);\n var endIcon = endIconProp && /*#__PURE__*/React.createElement(\"span\", {\n className: clsx(classes.endIcon, classes[\"iconSize\".concat(capitalize(size))])\n }, endIconProp);\n return /*#__PURE__*/React.createElement(ButtonBase, _extends({\n className: clsx(classes.root, classes[variant], className, color === 'inherit' ? classes.colorInherit : color !== 'default' && classes[\"\".concat(variant).concat(capitalize(color))], size !== 'medium' && [classes[\"\".concat(variant, \"Size\").concat(capitalize(size))], classes[\"size\".concat(capitalize(size))]], disableElevation && classes.disableElevation, disabled && classes.disabled, fullWidth && classes.fullWidth),\n component: component,\n disabled: disabled,\n focusRipple: !disableFocusRipple,\n focusVisibleClassName: clsx(classes.focusVisible, focusVisibleClassName),\n ref: ref,\n type: type\n }, other), /*#__PURE__*/React.createElement(\"span\", {\n className: classes.label\n }, startIcon, children, endIcon));\n});\nprocess.env.NODE_ENV !== \"production\" ? void 0 : void 0;\nexport default withStyles(styles, {\n name: 'MuiButton'\n})(Button);","import { Children, cloneElement, isValidElement } from 'react';\n/**\n * Given `this.props.children`, return an object mapping key to child.\n *\n * @param {*} children `this.props.children`\n * @return {object} Mapping of key to child\n */\n\nexport function getChildMapping(children, mapFn) {\n var mapper = function mapper(child) {\n return mapFn && isValidElement(child) ? mapFn(child) : child;\n };\n var result = Object.create(null);\n if (children) Children.map(children, function (c) {\n return c;\n }).forEach(function (child) {\n // run the map function here instead so that the key is the computed one\n result[child.key] = mapper(child);\n });\n return result;\n}\n/**\n * When you're adding or removing children some may be added or removed in the\n * same render pass. We want to show *both* since we want to simultaneously\n * animate elements in and out. This function takes a previous set of keys\n * and a new set of keys and merges them with its best guess of the correct\n * ordering. In the future we may expose some of the utilities in\n * ReactMultiChild to make this easy, but for now React itself does not\n * directly have this concept of the union of prevChildren and nextChildren\n * so we implement it here.\n *\n * @param {object} prev prev children as returned from\n * `ReactTransitionChildMapping.getChildMapping()`.\n * @param {object} next next children as returned from\n * `ReactTransitionChildMapping.getChildMapping()`.\n * @return {object} a key set that contains all keys in `prev` and all keys\n * in `next` in a reasonable order.\n */\n\nexport function mergeChildMappings(prev, next) {\n prev = prev || {};\n next = next || {};\n function getValueForKey(key) {\n return key in next ? next[key] : prev[key];\n } // For each key of `next`, the list of keys to insert before that key in\n // the combined list\n\n var nextKeysPending = Object.create(null);\n var pendingKeys = [];\n for (var prevKey in prev) {\n if (prevKey in next) {\n if (pendingKeys.length) {\n nextKeysPending[prevKey] = pendingKeys;\n pendingKeys = [];\n }\n } else {\n pendingKeys.push(prevKey);\n }\n }\n var i;\n var childMapping = {};\n for (var nextKey in next) {\n if (nextKeysPending[nextKey]) {\n for (i = 0; i < nextKeysPending[nextKey].length; i++) {\n var pendingNextKey = nextKeysPending[nextKey][i];\n childMapping[nextKeysPending[nextKey][i]] = getValueForKey(pendingNextKey);\n }\n }\n childMapping[nextKey] = getValueForKey(nextKey);\n } // Finally, add the keys which didn't appear before any key in `next`\n\n for (i = 0; i < pendingKeys.length; i++) {\n childMapping[pendingKeys[i]] = getValueForKey(pendingKeys[i]);\n }\n return childMapping;\n}\nfunction getProp(child, prop, props) {\n return props[prop] != null ? props[prop] : child.props[prop];\n}\nexport function getInitialChildMapping(props, onExited) {\n return getChildMapping(props.children, function (child) {\n return cloneElement(child, {\n onExited: onExited.bind(null, child),\n in: true,\n appear: getProp(child, 'appear', props),\n enter: getProp(child, 'enter', props),\n exit: getProp(child, 'exit', props)\n });\n });\n}\nexport function getNextChildMapping(nextProps, prevChildMapping, onExited) {\n var nextChildMapping = getChildMapping(nextProps.children);\n var children = mergeChildMappings(prevChildMapping, nextChildMapping);\n Object.keys(children).forEach(function (key) {\n var child = children[key];\n if (!isValidElement(child)) return;\n var hasPrev = (key in prevChildMapping);\n var hasNext = (key in nextChildMapping);\n var prevChild = prevChildMapping[key];\n var isLeaving = isValidElement(prevChild) && !prevChild.props.in; // item is new (entering)\n\n if (hasNext && (!hasPrev || isLeaving)) {\n // console.log('entering', key)\n children[key] = cloneElement(child, {\n onExited: onExited.bind(null, child),\n in: true,\n exit: getProp(child, 'exit', nextProps),\n enter: getProp(child, 'enter', nextProps)\n });\n } else if (!hasNext && hasPrev && !isLeaving) {\n // item is old (exiting)\n // console.log('leaving', key)\n children[key] = cloneElement(child, {\n in: false\n });\n } else if (hasNext && hasPrev && isValidElement(prevChild)) {\n // item hasn't changed transition states\n // copy over the last transition props;\n // console.log('unchanged', key)\n children[key] = cloneElement(child, {\n onExited: onExited.bind(null, child),\n in: prevChild.props.in,\n exit: getProp(child, 'exit', nextProps),\n enter: getProp(child, 'enter', nextProps)\n });\n }\n });\n return children;\n}","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _assertThisInitialized from \"@babel/runtime/helpers/esm/assertThisInitialized\";\nimport _inheritsLoose from \"@babel/runtime/helpers/esm/inheritsLoose\";\nimport React from 'react';\nimport TransitionGroupContext from './TransitionGroupContext';\nimport { getChildMapping, getInitialChildMapping, getNextChildMapping } from './utils/ChildMapping';\nvar values = Object.values || function (obj) {\n return Object.keys(obj).map(function (k) {\n return obj[k];\n });\n};\nvar defaultProps = {\n component: 'div',\n childFactory: function childFactory(child) {\n return child;\n }\n};\n/**\n * The `` component manages a set of transition components\n * (`` and ``) in a list. Like with the transition\n * components, `` is a state machine for managing the mounting\n * and unmounting of components over time.\n *\n * Consider the example below. As items are removed or added to the TodoList the\n * `in` prop is toggled automatically by the ``.\n *\n * Note that `` does not define any animation behavior!\n * Exactly _how_ a list item animates is up to the individual transition\n * component. This means you can mix and match animations across different list\n * items.\n */\n\nvar TransitionGroup = /*#__PURE__*/function (_React$Component) {\n _inheritsLoose(TransitionGroup, _React$Component);\n function TransitionGroup(props, context) {\n var _this;\n _this = _React$Component.call(this, props, context) || this;\n var handleExited = _this.handleExited.bind(_assertThisInitialized(_this)); // Initial children should all be entering, dependent on appear\n\n _this.state = {\n contextValue: {\n isMounting: true\n },\n handleExited: handleExited,\n firstRender: true\n };\n return _this;\n }\n var _proto = TransitionGroup.prototype;\n _proto.componentDidMount = function componentDidMount() {\n this.mounted = true;\n this.setState({\n contextValue: {\n isMounting: false\n }\n });\n };\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.mounted = false;\n };\n TransitionGroup.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, _ref) {\n var prevChildMapping = _ref.children,\n handleExited = _ref.handleExited,\n firstRender = _ref.firstRender;\n return {\n children: firstRender ? getInitialChildMapping(nextProps, handleExited) : getNextChildMapping(nextProps, prevChildMapping, handleExited),\n firstRender: false\n };\n } // node is `undefined` when user provided `nodeRef` prop\n ;\n\n _proto.handleExited = function handleExited(child, node) {\n var currentChildMapping = getChildMapping(this.props.children);\n if (child.key in currentChildMapping) return;\n if (child.props.onExited) {\n child.props.onExited(node);\n }\n if (this.mounted) {\n this.setState(function (state) {\n var children = _extends({}, state.children);\n delete children[child.key];\n return {\n children: children\n };\n });\n }\n };\n _proto.render = function render() {\n var _this$props = this.props,\n Component = _this$props.component,\n childFactory = _this$props.childFactory,\n props = _objectWithoutPropertiesLoose(_this$props, [\"component\", \"childFactory\"]);\n var contextValue = this.state.contextValue;\n var children = values(this.state.children).map(childFactory);\n delete props.appear;\n delete props.enter;\n delete props.exit;\n if (Component === null) {\n return /*#__PURE__*/React.createElement(TransitionGroupContext.Provider, {\n value: contextValue\n }, children);\n }\n return /*#__PURE__*/React.createElement(TransitionGroupContext.Provider, {\n value: contextValue\n }, /*#__PURE__*/React.createElement(Component, props, children));\n };\n return TransitionGroup;\n}(React.Component);\nTransitionGroup.defaultProps = defaultProps;\nexport default TransitionGroup;","import * as React from 'react';\nimport clsx from 'clsx';\nimport useEventCallback from '../utils/useEventCallback';\nvar useEnhancedEffect = typeof window === 'undefined' ? React.useEffect : React.useLayoutEffect;\n/**\n * @ignore - internal component.\n */\n\nfunction Ripple(props) {\n var classes = props.classes,\n _props$pulsate = props.pulsate,\n pulsate = _props$pulsate === void 0 ? false : _props$pulsate,\n rippleX = props.rippleX,\n rippleY = props.rippleY,\n rippleSize = props.rippleSize,\n inProp = props.in,\n _props$onExited = props.onExited,\n onExited = _props$onExited === void 0 ? function () {} : _props$onExited,\n timeout = props.timeout;\n var _React$useState = React.useState(false),\n leaving = _React$useState[0],\n setLeaving = _React$useState[1];\n var rippleClassName = clsx(classes.ripple, classes.rippleVisible, pulsate && classes.ripplePulsate);\n var rippleStyles = {\n width: rippleSize,\n height: rippleSize,\n top: -(rippleSize / 2) + rippleY,\n left: -(rippleSize / 2) + rippleX\n };\n var childClassName = clsx(classes.child, leaving && classes.childLeaving, pulsate && classes.childPulsate);\n var handleExited = useEventCallback(onExited); // Ripple is used for user feedback (e.g. click or press) so we want to apply styles with the highest priority\n\n useEnhancedEffect(function () {\n if (!inProp) {\n // react-transition-group#onExit\n setLeaving(true); // react-transition-group#onExited\n\n var timeoutId = setTimeout(handleExited, timeout);\n return function () {\n clearTimeout(timeoutId);\n };\n }\n return undefined;\n }, [handleExited, inProp, timeout]);\n return /*#__PURE__*/React.createElement(\"span\", {\n className: rippleClassName,\n style: rippleStyles\n }, /*#__PURE__*/React.createElement(\"span\", {\n className: childClassName\n }));\n}\nprocess.env.NODE_ENV !== \"production\" ? void 0 : void 0;\nexport default Ripple;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _toConsumableArray from \"@babel/runtime/helpers/esm/toConsumableArray\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport * as React from 'react';\nimport { TransitionGroup } from 'react-transition-group';\nimport clsx from 'clsx';\nimport withStyles from '../styles/withStyles';\nimport Ripple from './Ripple';\nvar DURATION = 550;\nexport var DELAY_RIPPLE = 80;\nexport var styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n overflow: 'hidden',\n pointerEvents: 'none',\n position: 'absolute',\n zIndex: 0,\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n borderRadius: 'inherit'\n },\n /* Styles applied to the internal `Ripple` components `ripple` class. */\n ripple: {\n opacity: 0,\n position: 'absolute'\n },\n /* Styles applied to the internal `Ripple` components `rippleVisible` class. */\n rippleVisible: {\n opacity: 0.3,\n transform: 'scale(1)',\n animation: \"$enter \".concat(DURATION, \"ms \").concat(theme.transitions.easing.easeInOut)\n },\n /* Styles applied to the internal `Ripple` components `ripplePulsate` class. */\n ripplePulsate: {\n animationDuration: \"\".concat(theme.transitions.duration.shorter, \"ms\")\n },\n /* Styles applied to the internal `Ripple` components `child` class. */\n child: {\n opacity: 1,\n display: 'block',\n width: '100%',\n height: '100%',\n borderRadius: '50%',\n backgroundColor: 'currentColor'\n },\n /* Styles applied to the internal `Ripple` components `childLeaving` class. */\n childLeaving: {\n opacity: 0,\n animation: \"$exit \".concat(DURATION, \"ms \").concat(theme.transitions.easing.easeInOut)\n },\n /* Styles applied to the internal `Ripple` components `childPulsate` class. */\n childPulsate: {\n position: 'absolute',\n left: 0,\n top: 0,\n animation: \"$pulsate 2500ms \".concat(theme.transitions.easing.easeInOut, \" 200ms infinite\")\n },\n '@keyframes enter': {\n '0%': {\n transform: 'scale(0)',\n opacity: 0.1\n },\n '100%': {\n transform: 'scale(1)',\n opacity: 0.3\n }\n },\n '@keyframes exit': {\n '0%': {\n opacity: 1\n },\n '100%': {\n opacity: 0\n }\n },\n '@keyframes pulsate': {\n '0%': {\n transform: 'scale(1)'\n },\n '50%': {\n transform: 'scale(0.92)'\n },\n '100%': {\n transform: 'scale(1)'\n }\n }\n };\n};\n/**\n * @ignore - internal component.\n *\n * TODO v5: Make private\n */\n\nvar TouchRipple = /*#__PURE__*/React.forwardRef(function TouchRipple(props, ref) {\n var _props$center = props.center,\n centerProp = _props$center === void 0 ? false : _props$center,\n classes = props.classes,\n className = props.className,\n other = _objectWithoutProperties(props, [\"center\", \"classes\", \"className\"]);\n var _React$useState = React.useState([]),\n ripples = _React$useState[0],\n setRipples = _React$useState[1];\n var nextKey = React.useRef(0);\n var rippleCallback = React.useRef(null);\n React.useEffect(function () {\n if (rippleCallback.current) {\n rippleCallback.current();\n rippleCallback.current = null;\n }\n }, [ripples]); // Used to filter out mouse emulated events on mobile.\n\n var ignoringMouseDown = React.useRef(false); // We use a timer in order to only show the ripples for touch \"click\" like events.\n // We don't want to display the ripple for touch scroll events.\n\n var startTimer = React.useRef(null); // This is the hook called once the previous timeout is ready.\n\n var startTimerCommit = React.useRef(null);\n var container = React.useRef(null);\n React.useEffect(function () {\n return function () {\n clearTimeout(startTimer.current);\n };\n }, []);\n var startCommit = React.useCallback(function (params) {\n var pulsate = params.pulsate,\n rippleX = params.rippleX,\n rippleY = params.rippleY,\n rippleSize = params.rippleSize,\n cb = params.cb;\n setRipples(function (oldRipples) {\n return [].concat(_toConsumableArray(oldRipples), [/*#__PURE__*/React.createElement(Ripple, {\n key: nextKey.current,\n classes: classes,\n timeout: DURATION,\n pulsate: pulsate,\n rippleX: rippleX,\n rippleY: rippleY,\n rippleSize: rippleSize\n })]);\n });\n nextKey.current += 1;\n rippleCallback.current = cb;\n }, [classes]);\n var start = React.useCallback(function () {\n var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var cb = arguments.length > 2 ? arguments[2] : undefined;\n var _options$pulsate = options.pulsate,\n pulsate = _options$pulsate === void 0 ? false : _options$pulsate,\n _options$center = options.center,\n center = _options$center === void 0 ? centerProp || options.pulsate : _options$center,\n _options$fakeElement = options.fakeElement,\n fakeElement = _options$fakeElement === void 0 ? false : _options$fakeElement;\n if (event.type === 'mousedown' && ignoringMouseDown.current) {\n ignoringMouseDown.current = false;\n return;\n }\n if (event.type === 'touchstart') {\n ignoringMouseDown.current = true;\n }\n var element = fakeElement ? null : container.current;\n var rect = element ? element.getBoundingClientRect() : {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }; // Get the size of the ripple\n\n var rippleX;\n var rippleY;\n var rippleSize;\n if (center || event.clientX === 0 && event.clientY === 0 || !event.clientX && !event.touches) {\n rippleX = Math.round(rect.width / 2);\n rippleY = Math.round(rect.height / 2);\n } else {\n var _ref = event.touches ? event.touches[0] : event,\n clientX = _ref.clientX,\n clientY = _ref.clientY;\n rippleX = Math.round(clientX - rect.left);\n rippleY = Math.round(clientY - rect.top);\n }\n if (center) {\n rippleSize = Math.sqrt((2 * Math.pow(rect.width, 2) + Math.pow(rect.height, 2)) / 3); // For some reason the animation is broken on Mobile Chrome if the size if even.\n\n if (rippleSize % 2 === 0) {\n rippleSize += 1;\n }\n } else {\n var sizeX = Math.max(Math.abs((element ? element.clientWidth : 0) - rippleX), rippleX) * 2 + 2;\n var sizeY = Math.max(Math.abs((element ? element.clientHeight : 0) - rippleY), rippleY) * 2 + 2;\n rippleSize = Math.sqrt(Math.pow(sizeX, 2) + Math.pow(sizeY, 2));\n } // Touche devices\n\n if (event.touches) {\n // check that this isn't another touchstart due to multitouch\n // otherwise we will only clear a single timer when unmounting while two\n // are running\n if (startTimerCommit.current === null) {\n // Prepare the ripple effect.\n startTimerCommit.current = function () {\n startCommit({\n pulsate: pulsate,\n rippleX: rippleX,\n rippleY: rippleY,\n rippleSize: rippleSize,\n cb: cb\n });\n }; // Delay the execution of the ripple effect.\n\n startTimer.current = setTimeout(function () {\n if (startTimerCommit.current) {\n startTimerCommit.current();\n startTimerCommit.current = null;\n }\n }, DELAY_RIPPLE); // We have to make a tradeoff with this value.\n }\n } else {\n startCommit({\n pulsate: pulsate,\n rippleX: rippleX,\n rippleY: rippleY,\n rippleSize: rippleSize,\n cb: cb\n });\n }\n }, [centerProp, startCommit]);\n var pulsate = React.useCallback(function () {\n start({}, {\n pulsate: true\n });\n }, [start]);\n var stop = React.useCallback(function (event, cb) {\n clearTimeout(startTimer.current); // The touch interaction occurs too quickly.\n // We still want to show ripple effect.\n\n if (event.type === 'touchend' && startTimerCommit.current) {\n event.persist();\n startTimerCommit.current();\n startTimerCommit.current = null;\n startTimer.current = setTimeout(function () {\n stop(event, cb);\n });\n return;\n }\n startTimerCommit.current = null;\n setRipples(function (oldRipples) {\n if (oldRipples.length > 0) {\n return oldRipples.slice(1);\n }\n return oldRipples;\n });\n rippleCallback.current = cb;\n }, []);\n React.useImperativeHandle(ref, function () {\n return {\n pulsate: pulsate,\n start: start,\n stop: stop\n };\n }, [pulsate, start, stop]);\n return /*#__PURE__*/React.createElement(\"span\", _extends({\n className: clsx(classes.root, className),\n ref: container\n }, other), /*#__PURE__*/React.createElement(TransitionGroup, {\n component: null,\n exit: true\n }, ripples));\n});\nprocess.env.NODE_ENV !== \"production\" ? void 0 : void 0;\nexport default withStyles(styles, {\n flip: false,\n name: 'MuiTouchRipple'\n})( /*#__PURE__*/React.memo(TouchRipple));","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport clsx from 'clsx';\nimport { elementTypeAcceptingRef, refType } from '@material-ui/utils';\nimport useForkRef from '../utils/useForkRef';\nimport useEventCallback from '../utils/useEventCallback';\nimport deprecatedPropType from '../utils/deprecatedPropType';\nimport withStyles from '../styles/withStyles';\nimport useIsFocusVisible from '../utils/useIsFocusVisible';\nimport TouchRipple from './TouchRipple';\nexport var styles = {\n /* Styles applied to the root element. */\n root: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n position: 'relative',\n WebkitTapHighlightColor: 'transparent',\n backgroundColor: 'transparent',\n // Reset default value\n // We disable the focus ring for mouse, touch and keyboard users.\n outline: 0,\n border: 0,\n margin: 0,\n // Remove the margin in Safari\n borderRadius: 0,\n padding: 0,\n // Remove the padding in Firefox\n cursor: 'pointer',\n userSelect: 'none',\n verticalAlign: 'middle',\n '-moz-appearance': 'none',\n // Reset\n '-webkit-appearance': 'none',\n // Reset\n textDecoration: 'none',\n // So we take precedent over the style of a native element.\n color: 'inherit',\n '&::-moz-focus-inner': {\n borderStyle: 'none' // Remove Firefox dotted outline.\n },\n\n '&$disabled': {\n pointerEvents: 'none',\n // Disable link interactions\n cursor: 'default'\n },\n '@media print': {\n colorAdjust: 'exact'\n }\n },\n /* Pseudo-class applied to the root element if `disabled={true}`. */\n disabled: {},\n /* Pseudo-class applied to the root element if keyboard focused. */\n focusVisible: {}\n};\n/**\n * `ButtonBase` contains as few styles as possible.\n * It aims to be a simple building block for creating a button.\n * It contains a load of style reset and some focus/ripple logic.\n */\n\nvar ButtonBase = /*#__PURE__*/React.forwardRef(function ButtonBase(props, ref) {\n var action = props.action,\n buttonRefProp = props.buttonRef,\n _props$centerRipple = props.centerRipple,\n centerRipple = _props$centerRipple === void 0 ? false : _props$centerRipple,\n children = props.children,\n classes = props.classes,\n className = props.className,\n _props$component = props.component,\n component = _props$component === void 0 ? 'button' : _props$component,\n _props$disabled = props.disabled,\n disabled = _props$disabled === void 0 ? false : _props$disabled,\n _props$disableRipple = props.disableRipple,\n disableRipple = _props$disableRipple === void 0 ? false : _props$disableRipple,\n _props$disableTouchRi = props.disableTouchRipple,\n disableTouchRipple = _props$disableTouchRi === void 0 ? false : _props$disableTouchRi,\n _props$focusRipple = props.focusRipple,\n focusRipple = _props$focusRipple === void 0 ? false : _props$focusRipple,\n focusVisibleClassName = props.focusVisibleClassName,\n onBlur = props.onBlur,\n onClick = props.onClick,\n onFocus = props.onFocus,\n onFocusVisible = props.onFocusVisible,\n onKeyDown = props.onKeyDown,\n onKeyUp = props.onKeyUp,\n onMouseDown = props.onMouseDown,\n onMouseLeave = props.onMouseLeave,\n onMouseUp = props.onMouseUp,\n onTouchEnd = props.onTouchEnd,\n onTouchMove = props.onTouchMove,\n onTouchStart = props.onTouchStart,\n onDragLeave = props.onDragLeave,\n _props$tabIndex = props.tabIndex,\n tabIndex = _props$tabIndex === void 0 ? 0 : _props$tabIndex,\n TouchRippleProps = props.TouchRippleProps,\n _props$type = props.type,\n type = _props$type === void 0 ? 'button' : _props$type,\n other = _objectWithoutProperties(props, [\"action\", \"buttonRef\", \"centerRipple\", \"children\", \"classes\", \"className\", \"component\", \"disabled\", \"disableRipple\", \"disableTouchRipple\", \"focusRipple\", \"focusVisibleClassName\", \"onBlur\", \"onClick\", \"onFocus\", \"onFocusVisible\", \"onKeyDown\", \"onKeyUp\", \"onMouseDown\", \"onMouseLeave\", \"onMouseUp\", \"onTouchEnd\", \"onTouchMove\", \"onTouchStart\", \"onDragLeave\", \"tabIndex\", \"TouchRippleProps\", \"type\"]);\n var buttonRef = React.useRef(null);\n function getButtonNode() {\n // #StrictMode ready\n return ReactDOM.findDOMNode(buttonRef.current);\n }\n var rippleRef = React.useRef(null);\n var _React$useState = React.useState(false),\n focusVisible = _React$useState[0],\n setFocusVisible = _React$useState[1];\n if (disabled && focusVisible) {\n setFocusVisible(false);\n }\n var _useIsFocusVisible = useIsFocusVisible(),\n isFocusVisible = _useIsFocusVisible.isFocusVisible,\n onBlurVisible = _useIsFocusVisible.onBlurVisible,\n focusVisibleRef = _useIsFocusVisible.ref;\n React.useImperativeHandle(action, function () {\n return {\n focusVisible: function focusVisible() {\n setFocusVisible(true);\n buttonRef.current.focus();\n }\n };\n }, []);\n React.useEffect(function () {\n if (focusVisible && focusRipple && !disableRipple) {\n rippleRef.current.pulsate();\n }\n }, [disableRipple, focusRipple, focusVisible]);\n function useRippleHandler(rippleAction, eventCallback) {\n var skipRippleAction = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : disableTouchRipple;\n return useEventCallback(function (event) {\n if (eventCallback) {\n eventCallback(event);\n }\n var ignore = skipRippleAction;\n if (!ignore && rippleRef.current) {\n rippleRef.current[rippleAction](event);\n }\n return true;\n });\n }\n var handleMouseDown = useRippleHandler('start', onMouseDown);\n var handleDragLeave = useRippleHandler('stop', onDragLeave);\n var handleMouseUp = useRippleHandler('stop', onMouseUp);\n var handleMouseLeave = useRippleHandler('stop', function (event) {\n if (focusVisible) {\n event.preventDefault();\n }\n if (onMouseLeave) {\n onMouseLeave(event);\n }\n });\n var handleTouchStart = useRippleHandler('start', onTouchStart);\n var handleTouchEnd = useRippleHandler('stop', onTouchEnd);\n var handleTouchMove = useRippleHandler('stop', onTouchMove);\n var handleBlur = useRippleHandler('stop', function (event) {\n if (focusVisible) {\n onBlurVisible(event);\n setFocusVisible(false);\n }\n if (onBlur) {\n onBlur(event);\n }\n }, false);\n var handleFocus = useEventCallback(function (event) {\n // Fix for https://github.com/facebook/react/issues/7769\n if (!buttonRef.current) {\n buttonRef.current = event.currentTarget;\n }\n if (isFocusVisible(event)) {\n setFocusVisible(true);\n if (onFocusVisible) {\n onFocusVisible(event);\n }\n }\n if (onFocus) {\n onFocus(event);\n }\n });\n var isNonNativeButton = function isNonNativeButton() {\n var button = getButtonNode();\n return component && component !== 'button' && !(button.tagName === 'A' && button.href);\n };\n /**\n * IE 11 shim for https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/repeat\n */\n\n var keydownRef = React.useRef(false);\n var handleKeyDown = useEventCallback(function (event) {\n // Check if key is already down to avoid repeats being counted as multiple activations\n if (focusRipple && !keydownRef.current && focusVisible && rippleRef.current && event.key === ' ') {\n keydownRef.current = true;\n event.persist();\n rippleRef.current.stop(event, function () {\n rippleRef.current.start(event);\n });\n }\n if (event.target === event.currentTarget && isNonNativeButton() && event.key === ' ') {\n event.preventDefault();\n }\n if (onKeyDown) {\n onKeyDown(event);\n } // Keyboard accessibility for non interactive elements\n\n if (event.target === event.currentTarget && isNonNativeButton() && event.key === 'Enter' && !disabled) {\n event.preventDefault();\n if (onClick) {\n onClick(event);\n }\n }\n });\n var handleKeyUp = useEventCallback(function (event) {\n // calling preventDefault in keyUp on a \n * \n * );\n * }\n * ```\n *\n * When the `in` prop is set to `true`, the child component will first receive\n * the class `example-enter`, then the `example-enter-active` will be added in\n * the next tick. `CSSTransition` [forces a\n * reflow](https://github.com/reactjs/react-transition-group/blob/5007303e729a74be66a21c3e2205e4916821524b/src/CSSTransition.js#L208-L215)\n * between before adding the `example-enter-active`. This is an important trick\n * because it allows us to transition between `example-enter` and\n * `example-enter-active` even though they were added immediately one after\n * another. Most notably, this is what makes it possible for us to animate\n * _appearance_.\n *\n * ```css\n * .my-node-enter {\n * opacity: 0;\n * }\n * .my-node-enter-active {\n * opacity: 1;\n * transition: opacity 200ms;\n * }\n * .my-node-exit {\n * opacity: 1;\n * }\n * .my-node-exit-active {\n * opacity: 0;\n * transition: opacity: 200ms;\n * }\n * ```\n *\n * `*-active` classes represent which styles you want to animate **to**.\n */\n\nvar CSSTransition = /*#__PURE__*/\nfunction (_React$Component) {\n _inheritsLoose(CSSTransition, _React$Component);\n function CSSTransition() {\n var _this;\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n _this.onEnter = function (node, appearing) {\n var _this$getClassNames = _this.getClassNames(appearing ? 'appear' : 'enter'),\n className = _this$getClassNames.className;\n _this.removeClasses(node, 'exit');\n addClass(node, className);\n if (_this.props.onEnter) {\n _this.props.onEnter(node, appearing);\n }\n };\n _this.onEntering = function (node, appearing) {\n var _this$getClassNames2 = _this.getClassNames(appearing ? 'appear' : 'enter'),\n activeClassName = _this$getClassNames2.activeClassName;\n _this.reflowAndAddClass(node, activeClassName);\n if (_this.props.onEntering) {\n _this.props.onEntering(node, appearing);\n }\n };\n _this.onEntered = function (node, appearing) {\n var appearClassName = _this.getClassNames('appear').doneClassName;\n var enterClassName = _this.getClassNames('enter').doneClassName;\n var doneClassName = appearing ? appearClassName + \" \" + enterClassName : enterClassName;\n _this.removeClasses(node, appearing ? 'appear' : 'enter');\n addClass(node, doneClassName);\n if (_this.props.onEntered) {\n _this.props.onEntered(node, appearing);\n }\n };\n _this.onExit = function (node) {\n var _this$getClassNames3 = _this.getClassNames('exit'),\n className = _this$getClassNames3.className;\n _this.removeClasses(node, 'appear');\n _this.removeClasses(node, 'enter');\n addClass(node, className);\n if (_this.props.onExit) {\n _this.props.onExit(node);\n }\n };\n _this.onExiting = function (node) {\n var _this$getClassNames4 = _this.getClassNames('exit'),\n activeClassName = _this$getClassNames4.activeClassName;\n _this.reflowAndAddClass(node, activeClassName);\n if (_this.props.onExiting) {\n _this.props.onExiting(node);\n }\n };\n _this.onExited = function (node) {\n var _this$getClassNames5 = _this.getClassNames('exit'),\n doneClassName = _this$getClassNames5.doneClassName;\n _this.removeClasses(node, 'exit');\n addClass(node, doneClassName);\n if (_this.props.onExited) {\n _this.props.onExited(node);\n }\n };\n _this.getClassNames = function (type) {\n var classNames = _this.props.classNames;\n var isStringClassNames = typeof classNames === 'string';\n var prefix = isStringClassNames && classNames ? classNames + '-' : '';\n var className = isStringClassNames ? prefix + type : classNames[type];\n var activeClassName = isStringClassNames ? className + '-active' : classNames[type + 'Active'];\n var doneClassName = isStringClassNames ? className + '-done' : classNames[type + 'Done'];\n return {\n className: className,\n activeClassName: activeClassName,\n doneClassName: doneClassName\n };\n };\n return _this;\n }\n var _proto = CSSTransition.prototype;\n _proto.removeClasses = function removeClasses(node, type) {\n var _this$getClassNames6 = this.getClassNames(type),\n className = _this$getClassNames6.className,\n activeClassName = _this$getClassNames6.activeClassName,\n doneClassName = _this$getClassNames6.doneClassName;\n className && removeClass(node, className);\n activeClassName && removeClass(node, activeClassName);\n doneClassName && removeClass(node, doneClassName);\n };\n _proto.reflowAndAddClass = function reflowAndAddClass(node, className) {\n // This is for to force a repaint,\n // which is necessary in order to transition styles when adding a class name.\n if (className) {\n /* eslint-disable no-unused-expressions */\n node && node.scrollTop;\n /* eslint-enable no-unused-expressions */\n\n addClass(node, className);\n }\n };\n _proto.render = function render() {\n var props = _extends({}, this.props);\n delete props.classNames;\n return _react.default.createElement(_Transition.default, _extends({}, props, {\n onEnter: this.onEnter,\n onEntered: this.onEntered,\n onEntering: this.onEntering,\n onExit: this.onExit,\n onExiting: this.onExiting,\n onExited: this.onExited\n }));\n };\n return CSSTransition;\n}(_react.default.Component);\nCSSTransition.defaultProps = {\n classNames: ''\n};\nCSSTransition.propTypes = process.env.NODE_ENV !== \"production\" ? _extends({}, _Transition.default.propTypes, {\n /**\n * The animation classNames applied to the component as it enters, exits or\n * has finished the transition. A single name can be provided and it will be\n * suffixed for each stage: e.g.\n *\n * `classNames=\"fade\"` applies `fade-enter`, `fade-enter-active`,\n * `fade-enter-done`, `fade-exit`, `fade-exit-active`, `fade-exit-done`,\n * `fade-appear`, `fade-appear-active`, and `fade-appear-done`.\n *\n * **Note**: `fade-appear-done` and `fade-enter-done` will _both_ be applied.\n * This allows you to define different behavior for when appearing is done and\n * when regular entering is done, using selectors like\n * `.fade-enter-done:not(.fade-appear-done)`. For example, you could apply an\n * epic entrance animation when element first appears in the DOM using\n * [Animate.css](https://daneden.github.io/animate.css/). Otherwise you can\n * simply use `fade-enter-done` for defining both cases.\n *\n * Each individual classNames can also be specified independently like:\n *\n * ```js\n * classNames={{\n * appear: 'my-appear',\n * appearActive: 'my-active-appear',\n * appearDone: 'my-done-appear',\n * enter: 'my-enter',\n * enterActive: 'my-active-enter',\n * enterDone: 'my-done-enter',\n * exit: 'my-exit',\n * exitActive: 'my-active-exit',\n * exitDone: 'my-done-exit',\n * }}\n * ```\n *\n * If you want to set these classes using CSS Modules:\n *\n * ```js\n * import styles from './styles.css';\n * ```\n *\n * you might want to use camelCase in your CSS file, that way could simply\n * spread them instead of listing them one by one:\n *\n * ```js\n * classNames={{ ...styles }}\n * ```\n *\n * @type {string | {\n * appear?: string,\n * appearActive?: string,\n * appearDone?: string,\n * enter?: string,\n * enterActive?: string,\n * enterDone?: string,\n * exit?: string,\n * exitActive?: string,\n * exitDone?: string,\n * }}\n */\n classNames: _PropTypes.classNamesShape,\n /**\n * A `` callback fired immediately after the 'enter' or 'appear' class is\n * applied.\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEnter: PropTypes.func,\n /**\n * A `` callback fired immediately after the 'enter-active' or\n * 'appear-active' class is applied.\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntering: PropTypes.func,\n /**\n * A `` callback fired immediately after the 'enter' or\n * 'appear' classes are **removed** and the `done` class is added to the DOM node.\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntered: PropTypes.func,\n /**\n * A `` callback fired immediately after the 'exit' class is\n * applied.\n *\n * @type Function(node: HtmlElement)\n */\n onExit: PropTypes.func,\n /**\n * A `` callback fired immediately after the 'exit-active' is applied.\n *\n * @type Function(node: HtmlElement)\n */\n onExiting: PropTypes.func,\n /**\n * A `` callback fired immediately after the 'exit' classes\n * are **removed** and the `exit-done` class is added to the DOM node.\n *\n * @type Function(node: HtmlElement)\n */\n onExited: PropTypes.func\n}) : {};\nvar _default = CSSTransition;\nexports.default = _default;\nmodule.exports = exports[\"default\"];","\"use strict\";\n\nexports.__esModule = true;\nexports.default = void 0;\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\nvar _react = _interopRequireDefault(require(\"react\"));\nvar _reactDom = require(\"react-dom\");\nvar _TransitionGroup = _interopRequireDefault(require(\"./TransitionGroup\"));\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}\n\n/**\n * The `` component is a specialized `Transition` component\n * that animates between two children.\n *\n * ```jsx\n * \n *
I appear first
\n *
I replace the above
\n *
\n * ```\n */\nvar ReplaceTransition = /*#__PURE__*/\nfunction (_React$Component) {\n _inheritsLoose(ReplaceTransition, _React$Component);\n function ReplaceTransition() {\n var _this;\n for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {\n _args[_key] = arguments[_key];\n }\n _this = _React$Component.call.apply(_React$Component, [this].concat(_args)) || this;\n _this.handleEnter = function () {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n return _this.handleLifecycle('onEnter', 0, args);\n };\n _this.handleEntering = function () {\n for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n return _this.handleLifecycle('onEntering', 0, args);\n };\n _this.handleEntered = function () {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n return _this.handleLifecycle('onEntered', 0, args);\n };\n _this.handleExit = function () {\n for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n args[_key5] = arguments[_key5];\n }\n return _this.handleLifecycle('onExit', 1, args);\n };\n _this.handleExiting = function () {\n for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {\n args[_key6] = arguments[_key6];\n }\n return _this.handleLifecycle('onExiting', 1, args);\n };\n _this.handleExited = function () {\n for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {\n args[_key7] = arguments[_key7];\n }\n return _this.handleLifecycle('onExited', 1, args);\n };\n return _this;\n }\n var _proto = ReplaceTransition.prototype;\n _proto.handleLifecycle = function handleLifecycle(handler, idx, originalArgs) {\n var _child$props;\n var children = this.props.children;\n var child = _react.default.Children.toArray(children)[idx];\n if (child.props[handler]) (_child$props = child.props)[handler].apply(_child$props, originalArgs);\n if (this.props[handler]) this.props[handler]((0, _reactDom.findDOMNode)(this));\n };\n _proto.render = function render() {\n var _this$props = this.props,\n children = _this$props.children,\n inProp = _this$props.in,\n props = _objectWithoutPropertiesLoose(_this$props, [\"children\", \"in\"]);\n var _React$Children$toArr = _react.default.Children.toArray(children),\n first = _React$Children$toArr[0],\n second = _React$Children$toArr[1];\n delete props.onEnter;\n delete props.onEntering;\n delete props.onEntered;\n delete props.onExit;\n delete props.onExiting;\n delete props.onExited;\n return _react.default.createElement(_TransitionGroup.default, props, inProp ? _react.default.cloneElement(first, {\n key: 'first',\n onEnter: this.handleEnter,\n onEntering: this.handleEntering,\n onEntered: this.handleEntered\n }) : _react.default.cloneElement(second, {\n key: 'second',\n onEnter: this.handleExit,\n onEntering: this.handleExiting,\n onEntered: this.handleExited\n }));\n };\n return ReplaceTransition;\n}(_react.default.Component);\nReplaceTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n in: _propTypes.default.bool.isRequired,\n children: function children(props, propName) {\n if (_react.default.Children.count(props[propName]) !== 2) return new Error(\"\\\"\" + propName + \"\\\" must be exactly two transition components.\");\n return null;\n }\n} : {};\nvar _default = ReplaceTransition;\nexports.default = _default;\nmodule.exports = exports[\"default\"];","\"use strict\";\n\nexports.__esModule = true;\nexports.default = exports.EXITING = exports.ENTERED = exports.ENTERING = exports.EXITED = exports.UNMOUNTED = void 0;\nvar PropTypes = _interopRequireWildcard(require(\"prop-types\"));\nvar _react = _interopRequireDefault(require(\"react\"));\nvar _reactDom = _interopRequireDefault(require(\"react-dom\"));\nvar _reactLifecyclesCompat = require(\"react-lifecycles-compat\");\nvar _PropTypes = require(\"./utils/PropTypes\");\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n}\nfunction _interopRequireWildcard(obj) {\n if (obj && obj.__esModule) {\n return obj;\n } else {\n var newObj = {};\n if (obj != null) {\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {};\n if (desc.get || desc.set) {\n Object.defineProperty(newObj, key, desc);\n } else {\n newObj[key] = obj[key];\n }\n }\n }\n }\n newObj.default = obj;\n return newObj;\n }\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}\nvar UNMOUNTED = 'unmounted';\nexports.UNMOUNTED = UNMOUNTED;\nvar EXITED = 'exited';\nexports.EXITED = EXITED;\nvar ENTERING = 'entering';\nexports.ENTERING = ENTERING;\nvar ENTERED = 'entered';\nexports.ENTERED = ENTERED;\nvar EXITING = 'exiting';\n/**\n * The Transition component lets you describe a transition from one component\n * state to another _over time_ with a simple declarative API. Most commonly\n * it's used to animate the mounting and unmounting of a component, but can also\n * be used to describe in-place transition states as well.\n *\n * ---\n *\n * **Note**: `Transition` is a platform-agnostic base component. If you're using\n * transitions in CSS, you'll probably want to use\n * [`CSSTransition`](https://reactcommunity.org/react-transition-group/css-transition)\n * instead. It inherits all the features of `Transition`, but contains\n * additional features necessary to play nice with CSS transitions (hence the\n * name of the component).\n *\n * ---\n *\n * By default the `Transition` component does not alter the behavior of the\n * component it renders, it only tracks \"enter\" and \"exit\" states for the\n * components. It's up to you to give meaning and effect to those states. For\n * example we can add styles to a component when it enters or exits:\n *\n * ```jsx\n * import { Transition } from 'react-transition-group';\n *\n * const duration = 300;\n *\n * const defaultStyle = {\n * transition: `opacity ${duration}ms ease-in-out`,\n * opacity: 0,\n * }\n *\n * const transitionStyles = {\n * entering: { opacity: 0 },\n * entered: { opacity: 1 },\n * };\n *\n * const Fade = ({ in: inProp }) => (\n * \n * {state => (\n *
\n * I'm a fade Transition!\n *
\n * )}\n *
\n * );\n * ```\n *\n * There are 4 main states a Transition can be in:\n * - `'entering'`\n * - `'entered'`\n * - `'exiting'`\n * - `'exited'`\n *\n * Transition state is toggled via the `in` prop. When `true` the component\n * begins the \"Enter\" stage. During this stage, the component will shift from\n * its current transition state, to `'entering'` for the duration of the\n * transition and then to the `'entered'` stage once it's complete. Let's take\n * the following example (we'll use the\n * [useState](https://reactjs.org/docs/hooks-reference.html#usestate) hook):\n *\n * ```jsx\n * function App() {\n * const [inProp, setInProp] = useState(false);\n * return (\n *
\n * \n * {state => (\n * // ...\n * )}\n * \n * \n *
\n * );\n * }\n * ```\n *\n * When the button is clicked the component will shift to the `'entering'` state\n * and stay there for 500ms (the value of `timeout`) before it finally switches\n * to `'entered'`.\n *\n * When `in` is `false` the same thing happens except the state moves from\n * `'exiting'` to `'exited'`.\n */\n\nexports.EXITING = EXITING;\nvar Transition = /*#__PURE__*/\nfunction (_React$Component) {\n _inheritsLoose(Transition, _React$Component);\n function Transition(props, context) {\n var _this;\n _this = _React$Component.call(this, props, context) || this;\n var parentGroup = context.transitionGroup; // In the context of a TransitionGroup all enters are really appears\n\n var appear = parentGroup && !parentGroup.isMounting ? props.enter : props.appear;\n var initialStatus;\n _this.appearStatus = null;\n if (props.in) {\n if (appear) {\n initialStatus = EXITED;\n _this.appearStatus = ENTERING;\n } else {\n initialStatus = ENTERED;\n }\n } else {\n if (props.unmountOnExit || props.mountOnEnter) {\n initialStatus = UNMOUNTED;\n } else {\n initialStatus = EXITED;\n }\n }\n _this.state = {\n status: initialStatus\n };\n _this.nextCallback = null;\n return _this;\n }\n var _proto = Transition.prototype;\n _proto.getChildContext = function getChildContext() {\n return {\n transitionGroup: null // allows for nested Transitions\n };\n };\n\n Transition.getDerivedStateFromProps = function getDerivedStateFromProps(_ref, prevState) {\n var nextIn = _ref.in;\n if (nextIn && prevState.status === UNMOUNTED) {\n return {\n status: EXITED\n };\n }\n return null;\n }; // getSnapshotBeforeUpdate(prevProps) {\n // let nextStatus = null\n // if (prevProps !== this.props) {\n // const { status } = this.state\n // if (this.props.in) {\n // if (status !== ENTERING && status !== ENTERED) {\n // nextStatus = ENTERING\n // }\n // } else {\n // if (status === ENTERING || status === ENTERED) {\n // nextStatus = EXITING\n // }\n // }\n // }\n // return { nextStatus }\n // }\n\n _proto.componentDidMount = function componentDidMount() {\n this.updateStatus(true, this.appearStatus);\n };\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n var nextStatus = null;\n if (prevProps !== this.props) {\n var status = this.state.status;\n if (this.props.in) {\n if (status !== ENTERING && status !== ENTERED) {\n nextStatus = ENTERING;\n }\n } else {\n if (status === ENTERING || status === ENTERED) {\n nextStatus = EXITING;\n }\n }\n }\n this.updateStatus(false, nextStatus);\n };\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.cancelNextCallback();\n };\n _proto.getTimeouts = function getTimeouts() {\n var timeout = this.props.timeout;\n var exit, enter, appear;\n exit = enter = appear = timeout;\n if (timeout != null && typeof timeout !== 'number') {\n exit = timeout.exit;\n enter = timeout.enter; // TODO: remove fallback for next major\n\n appear = timeout.appear !== undefined ? timeout.appear : enter;\n }\n return {\n exit: exit,\n enter: enter,\n appear: appear\n };\n };\n _proto.updateStatus = function updateStatus(mounting, nextStatus) {\n if (mounting === void 0) {\n mounting = false;\n }\n if (nextStatus !== null) {\n // nextStatus will always be ENTERING or EXITING.\n this.cancelNextCallback();\n var node = _reactDom.default.findDOMNode(this);\n if (nextStatus === ENTERING) {\n this.performEnter(node, mounting);\n } else {\n this.performExit(node);\n }\n } else if (this.props.unmountOnExit && this.state.status === EXITED) {\n this.setState({\n status: UNMOUNTED\n });\n }\n };\n _proto.performEnter = function performEnter(node, mounting) {\n var _this2 = this;\n var enter = this.props.enter;\n var appearing = this.context.transitionGroup ? this.context.transitionGroup.isMounting : mounting;\n var timeouts = this.getTimeouts();\n var enterTimeout = appearing ? timeouts.appear : timeouts.enter; // no enter animation skip right to ENTERED\n // if we are mounting and running this it means appear _must_ be set\n\n if (!mounting && !enter) {\n this.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(node);\n });\n return;\n }\n this.props.onEnter(node, appearing);\n this.safeSetState({\n status: ENTERING\n }, function () {\n _this2.props.onEntering(node, appearing);\n _this2.onTransitionEnd(node, enterTimeout, function () {\n _this2.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(node, appearing);\n });\n });\n });\n };\n _proto.performExit = function performExit(node) {\n var _this3 = this;\n var exit = this.props.exit;\n var timeouts = this.getTimeouts(); // no exit animation skip right to EXITED\n\n if (!exit) {\n this.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(node);\n });\n return;\n }\n this.props.onExit(node);\n this.safeSetState({\n status: EXITING\n }, function () {\n _this3.props.onExiting(node);\n _this3.onTransitionEnd(node, timeouts.exit, function () {\n _this3.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(node);\n });\n });\n });\n };\n _proto.cancelNextCallback = function cancelNextCallback() {\n if (this.nextCallback !== null) {\n this.nextCallback.cancel();\n this.nextCallback = null;\n }\n };\n _proto.safeSetState = function safeSetState(nextState, callback) {\n // This shouldn't be necessary, but there are weird race conditions with\n // setState callbacks and unmounting in testing, so always make sure that\n // we can cancel any pending setState callbacks after we unmount.\n callback = this.setNextCallback(callback);\n this.setState(nextState, callback);\n };\n _proto.setNextCallback = function setNextCallback(callback) {\n var _this4 = this;\n var active = true;\n this.nextCallback = function (event) {\n if (active) {\n active = false;\n _this4.nextCallback = null;\n callback(event);\n }\n };\n this.nextCallback.cancel = function () {\n active = false;\n };\n return this.nextCallback;\n };\n _proto.onTransitionEnd = function onTransitionEnd(node, timeout, handler) {\n this.setNextCallback(handler);\n var doesNotHaveTimeoutOrListener = timeout == null && !this.props.addEndListener;\n if (!node || doesNotHaveTimeoutOrListener) {\n setTimeout(this.nextCallback, 0);\n return;\n }\n if (this.props.addEndListener) {\n this.props.addEndListener(node, this.nextCallback);\n }\n if (timeout != null) {\n setTimeout(this.nextCallback, timeout);\n }\n };\n _proto.render = function render() {\n var status = this.state.status;\n if (status === UNMOUNTED) {\n return null;\n }\n var _this$props = this.props,\n children = _this$props.children,\n childProps = _objectWithoutPropertiesLoose(_this$props, [\"children\"]); // filter props for Transtition\n\n delete childProps.in;\n delete childProps.mountOnEnter;\n delete childProps.unmountOnExit;\n delete childProps.appear;\n delete childProps.enter;\n delete childProps.exit;\n delete childProps.timeout;\n delete childProps.addEndListener;\n delete childProps.onEnter;\n delete childProps.onEntering;\n delete childProps.onEntered;\n delete childProps.onExit;\n delete childProps.onExiting;\n delete childProps.onExited;\n if (typeof children === 'function') {\n return children(status, childProps);\n }\n var child = _react.default.Children.only(children);\n return _react.default.cloneElement(child, childProps);\n };\n return Transition;\n}(_react.default.Component);\nTransition.contextTypes = {\n transitionGroup: PropTypes.object\n};\nTransition.childContextTypes = {\n transitionGroup: function transitionGroup() {}\n};\nTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n /**\n * A `function` child can be used instead of a React element. This function is\n * called with the current transition status (`'entering'`, `'entered'`,\n * `'exiting'`, `'exited'`, `'unmounted'`), which can be used to apply context\n * specific props to a component.\n *\n * ```jsx\n * \n * {state => (\n * \n * )}\n * \n * ```\n */\n children: PropTypes.oneOfType([PropTypes.func.isRequired, PropTypes.element.isRequired]).isRequired,\n /**\n * Show the component; triggers the enter or exit states\n */\n in: PropTypes.bool,\n /**\n * By default the child component is mounted immediately along with\n * the parent `Transition` component. If you want to \"lazy mount\" the component on the\n * first `in={true}` you can set `mountOnEnter`. After the first enter transition the component will stay\n * mounted, even on \"exited\", unless you also specify `unmountOnExit`.\n */\n mountOnEnter: PropTypes.bool,\n /**\n * By default the child component stays mounted after it reaches the `'exited'` state.\n * Set `unmountOnExit` if you'd prefer to unmount the component after it finishes exiting.\n */\n unmountOnExit: PropTypes.bool,\n /**\n * Normally a component is not transitioned if it is shown when the `` component mounts.\n * If you want to transition on the first mount set `appear` to `true`, and the\n * component will transition in as soon as the `` mounts.\n *\n * > Note: there are no specific \"appear\" states. `appear` only adds an additional `enter` transition.\n */\n appear: PropTypes.bool,\n /**\n * Enable or disable enter transitions.\n */\n enter: PropTypes.bool,\n /**\n * Enable or disable exit transitions.\n */\n exit: PropTypes.bool,\n /**\n * The duration of the transition, in milliseconds.\n * Required unless `addEndListener` is provided.\n *\n * You may specify a single timeout for all transitions:\n *\n * ```jsx\n * timeout={500}\n * ```\n *\n * or individually:\n *\n * ```jsx\n * timeout={{\n * appear: 500,\n * enter: 300,\n * exit: 500,\n * }}\n * ```\n *\n * - `appear` defaults to the value of `enter`\n * - `enter` defaults to `0`\n * - `exit` defaults to `0`\n *\n * @type {number | { enter?: number, exit?: number, appear?: number }}\n */\n timeout: function timeout(props) {\n var pt = _PropTypes.timeoutsShape;\n if (!props.addEndListener) pt = pt.isRequired;\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return pt.apply(void 0, [props].concat(args));\n },\n /**\n * Add a custom transition end trigger. Called with the transitioning\n * DOM node and a `done` callback. Allows for more fine grained transition end\n * logic. **Note:** Timeouts are still used as a fallback if provided.\n *\n * ```jsx\n * addEndListener={(node, done) => {\n * // use the css transitionend event to mark the finish of a transition\n * node.addEventListener('transitionend', done, false);\n * }}\n * ```\n */\n addEndListener: PropTypes.func,\n /**\n * Callback fired before the \"entering\" status is applied. An extra parameter\n * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEnter: PropTypes.func,\n /**\n * Callback fired after the \"entering\" status is applied. An extra parameter\n * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntering: PropTypes.func,\n /**\n * Callback fired after the \"entered\" status is applied. An extra parameter\n * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEntered: PropTypes.func,\n /**\n * Callback fired before the \"exiting\" status is applied.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExit: PropTypes.func,\n /**\n * Callback fired after the \"exiting\" status is applied.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExiting: PropTypes.func,\n /**\n * Callback fired after the \"exited\" status is applied.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExited: PropTypes.func // Name the function so it is clearer in the documentation\n} : {};\nfunction noop() {}\nTransition.defaultProps = {\n in: false,\n mountOnEnter: false,\n unmountOnExit: false,\n appear: false,\n enter: true,\n exit: true,\n onEnter: noop,\n onEntering: noop,\n onEntered: noop,\n onExit: noop,\n onExiting: noop,\n onExited: noop\n};\nTransition.UNMOUNTED = 0;\nTransition.EXITED = 1;\nTransition.ENTERING = 2;\nTransition.ENTERED = 3;\nTransition.EXITING = 4;\nvar _default = (0, _reactLifecyclesCompat.polyfill)(Transition);\nexports.default = _default;","\"use strict\";\n\nexports.__esModule = true;\nexports.default = void 0;\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\nvar _react = _interopRequireDefault(require(\"react\"));\nvar _reactLifecyclesCompat = require(\"react-lifecycles-compat\");\nvar _ChildMapping = require(\"./utils/ChildMapping\");\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}\nvar values = Object.values || function (obj) {\n return Object.keys(obj).map(function (k) {\n return obj[k];\n });\n};\nvar defaultProps = {\n component: 'div',\n childFactory: function childFactory(child) {\n return child;\n }\n /**\n * The `` component manages a set of transition components\n * (`` and ``) in a list. Like with the transition\n * components, `` is a state machine for managing the mounting\n * and unmounting of components over time.\n *\n * Consider the example below. As items are removed or added to the TodoList the\n * `in` prop is toggled automatically by the ``.\n *\n * Note that `` does not define any animation behavior!\n * Exactly _how_ a list item animates is up to the individual transition\n * component. This means you can mix and match animations across different list\n * items.\n */\n};\n\nvar TransitionGroup = /*#__PURE__*/\nfunction (_React$Component) {\n _inheritsLoose(TransitionGroup, _React$Component);\n function TransitionGroup(props, context) {\n var _this;\n _this = _React$Component.call(this, props, context) || this;\n var handleExited = _this.handleExited.bind(_assertThisInitialized(_assertThisInitialized(_this))); // Initial children should all be entering, dependent on appear\n\n _this.state = {\n handleExited: handleExited,\n firstRender: true\n };\n return _this;\n }\n var _proto = TransitionGroup.prototype;\n _proto.getChildContext = function getChildContext() {\n return {\n transitionGroup: {\n isMounting: !this.appeared\n }\n };\n };\n _proto.componentDidMount = function componentDidMount() {\n this.appeared = true;\n this.mounted = true;\n };\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.mounted = false;\n };\n TransitionGroup.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, _ref) {\n var prevChildMapping = _ref.children,\n handleExited = _ref.handleExited,\n firstRender = _ref.firstRender;\n return {\n children: firstRender ? (0, _ChildMapping.getInitialChildMapping)(nextProps, handleExited) : (0, _ChildMapping.getNextChildMapping)(nextProps, prevChildMapping, handleExited),\n firstRender: false\n };\n };\n _proto.handleExited = function handleExited(child, node) {\n var currentChildMapping = (0, _ChildMapping.getChildMapping)(this.props.children);\n if (child.key in currentChildMapping) return;\n if (child.props.onExited) {\n child.props.onExited(node);\n }\n if (this.mounted) {\n this.setState(function (state) {\n var children = _extends({}, state.children);\n delete children[child.key];\n return {\n children: children\n };\n });\n }\n };\n _proto.render = function render() {\n var _this$props = this.props,\n Component = _this$props.component,\n childFactory = _this$props.childFactory,\n props = _objectWithoutPropertiesLoose(_this$props, [\"component\", \"childFactory\"]);\n var children = values(this.state.children).map(childFactory);\n delete props.appear;\n delete props.enter;\n delete props.exit;\n if (Component === null) {\n return children;\n }\n return _react.default.createElement(Component, props, children);\n };\n return TransitionGroup;\n}(_react.default.Component);\nTransitionGroup.childContextTypes = {\n transitionGroup: _propTypes.default.object.isRequired\n};\nTransitionGroup.propTypes = process.env.NODE_ENV !== \"production\" ? {\n /**\n * `` renders a `
` by default. You can change this\n * behavior by providing a `component` prop.\n * If you use React v16+ and would like to avoid a wrapping `
` element\n * you can pass in `component={null}`. This is useful if the wrapping div\n * borks your css styles.\n */\n component: _propTypes.default.any,\n /**\n * A set of `` components, that are toggled `in` and out as they\n * leave. the `` will inject specific transition props, so\n * remember to spread them through if you are wrapping the `` as\n * with our `` example.\n *\n * While this component is meant for multiple `Transition` or `CSSTransition`\n * children, sometimes you may want to have a single transition child with\n * content that you want to be transitioned out and in when you change it\n * (e.g. routes, images etc.) In that case you can change the `key` prop of\n * the transition child as you change its content, this will cause\n * `TransitionGroup` to transition the child out and back in.\n */\n children: _propTypes.default.node,\n /**\n * A convenience prop that enables or disables appear animations\n * for all children. Note that specifying this will override any defaults set\n * on individual children Transitions.\n */\n appear: _propTypes.default.bool,\n /**\n * A convenience prop that enables or disables enter animations\n * for all children. Note that specifying this will override any defaults set\n * on individual children Transitions.\n */\n enter: _propTypes.default.bool,\n /**\n * A convenience prop that enables or disables exit animations\n * for all children. Note that specifying this will override any defaults set\n * on individual children Transitions.\n */\n exit: _propTypes.default.bool,\n /**\n * You may need to apply reactive updates to a child as it is exiting.\n * This is generally done by using `cloneElement` however in the case of an exiting\n * child the element has already been removed and not accessible to the consumer.\n *\n * If you do need to update a child as it leaves you can provide a `childFactory`\n * to wrap every child, even the ones that are leaving.\n *\n * @type Function(child: ReactElement) -> ReactElement\n */\n childFactory: _propTypes.default.func\n} : {};\nTransitionGroup.defaultProps = defaultProps;\nvar _default = (0, _reactLifecyclesCompat.polyfill)(TransitionGroup);\nexports.default = _default;\nmodule.exports = exports[\"default\"];","\"use strict\";\n\nvar _CSSTransition = _interopRequireDefault(require(\"./CSSTransition\"));\nvar _ReplaceTransition = _interopRequireDefault(require(\"./ReplaceTransition\"));\nvar _TransitionGroup = _interopRequireDefault(require(\"./TransitionGroup\"));\nvar _Transition = _interopRequireDefault(require(\"./Transition\"));\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n}\nmodule.exports = {\n Transition: _Transition.default,\n TransitionGroup: _TransitionGroup.default,\n ReplaceTransition: _ReplaceTransition.default,\n CSSTransition: _CSSTransition.default\n};","\"use strict\";\n\nexports.__esModule = true;\nexports.getChildMapping = getChildMapping;\nexports.mergeChildMappings = mergeChildMappings;\nexports.getInitialChildMapping = getInitialChildMapping;\nexports.getNextChildMapping = getNextChildMapping;\nvar _react = require(\"react\");\n\n/**\n * Given `this.props.children`, return an object mapping key to child.\n *\n * @param {*} children `this.props.children`\n * @return {object} Mapping of key to child\n */\nfunction getChildMapping(children, mapFn) {\n var mapper = function mapper(child) {\n return mapFn && (0, _react.isValidElement)(child) ? mapFn(child) : child;\n };\n var result = Object.create(null);\n if (children) _react.Children.map(children, function (c) {\n return c;\n }).forEach(function (child) {\n // run the map function here instead so that the key is the computed one\n result[child.key] = mapper(child);\n });\n return result;\n}\n/**\n * When you're adding or removing children some may be added or removed in the\n * same render pass. We want to show *both* since we want to simultaneously\n * animate elements in and out. This function takes a previous set of keys\n * and a new set of keys and merges them with its best guess of the correct\n * ordering. In the future we may expose some of the utilities in\n * ReactMultiChild to make this easy, but for now React itself does not\n * directly have this concept of the union of prevChildren and nextChildren\n * so we implement it here.\n *\n * @param {object} prev prev children as returned from\n * `ReactTransitionChildMapping.getChildMapping()`.\n * @param {object} next next children as returned from\n * `ReactTransitionChildMapping.getChildMapping()`.\n * @return {object} a key set that contains all keys in `prev` and all keys\n * in `next` in a reasonable order.\n */\n\nfunction mergeChildMappings(prev, next) {\n prev = prev || {};\n next = next || {};\n function getValueForKey(key) {\n return key in next ? next[key] : prev[key];\n } // For each key of `next`, the list of keys to insert before that key in\n // the combined list\n\n var nextKeysPending = Object.create(null);\n var pendingKeys = [];\n for (var prevKey in prev) {\n if (prevKey in next) {\n if (pendingKeys.length) {\n nextKeysPending[prevKey] = pendingKeys;\n pendingKeys = [];\n }\n } else {\n pendingKeys.push(prevKey);\n }\n }\n var i;\n var childMapping = {};\n for (var nextKey in next) {\n if (nextKeysPending[nextKey]) {\n for (i = 0; i < nextKeysPending[nextKey].length; i++) {\n var pendingNextKey = nextKeysPending[nextKey][i];\n childMapping[nextKeysPending[nextKey][i]] = getValueForKey(pendingNextKey);\n }\n }\n childMapping[nextKey] = getValueForKey(nextKey);\n } // Finally, add the keys which didn't appear before any key in `next`\n\n for (i = 0; i < pendingKeys.length; i++) {\n childMapping[pendingKeys[i]] = getValueForKey(pendingKeys[i]);\n }\n return childMapping;\n}\nfunction getProp(child, prop, props) {\n return props[prop] != null ? props[prop] : child.props[prop];\n}\nfunction getInitialChildMapping(props, onExited) {\n return getChildMapping(props.children, function (child) {\n return (0, _react.cloneElement)(child, {\n onExited: onExited.bind(null, child),\n in: true,\n appear: getProp(child, 'appear', props),\n enter: getProp(child, 'enter', props),\n exit: getProp(child, 'exit', props)\n });\n });\n}\nfunction getNextChildMapping(nextProps, prevChildMapping, onExited) {\n var nextChildMapping = getChildMapping(nextProps.children);\n var children = mergeChildMappings(prevChildMapping, nextChildMapping);\n Object.keys(children).forEach(function (key) {\n var child = children[key];\n if (!(0, _react.isValidElement)(child)) return;\n var hasPrev = (key in prevChildMapping);\n var hasNext = (key in nextChildMapping);\n var prevChild = prevChildMapping[key];\n var isLeaving = (0, _react.isValidElement)(prevChild) && !prevChild.props.in; // item is new (entering)\n\n if (hasNext && (!hasPrev || isLeaving)) {\n // console.log('entering', key)\n children[key] = (0, _react.cloneElement)(child, {\n onExited: onExited.bind(null, child),\n in: true,\n exit: getProp(child, 'exit', nextProps),\n enter: getProp(child, 'enter', nextProps)\n });\n } else if (!hasNext && hasPrev && !isLeaving) {\n // item is old (exiting)\n // console.log('leaving', key)\n children[key] = (0, _react.cloneElement)(child, {\n in: false\n });\n } else if (hasNext && hasPrev && (0, _react.isValidElement)(prevChild)) {\n // item hasn't changed transition states\n // copy over the last transition props;\n // console.log('unchanged', key)\n children[key] = (0, _react.cloneElement)(child, {\n onExited: onExited.bind(null, child),\n in: prevChild.props.in,\n exit: getProp(child, 'exit', nextProps),\n enter: getProp(child, 'enter', nextProps)\n });\n }\n });\n return children;\n}","\"use strict\";\n\nexports.__esModule = true;\nexports.classNamesShape = exports.timeoutsShape = void 0;\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n}\nvar timeoutsShape = process.env.NODE_ENV !== 'production' ? _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.shape({\n enter: _propTypes.default.number,\n exit: _propTypes.default.number,\n appear: _propTypes.default.number\n}).isRequired]) : null;\nexports.timeoutsShape = timeoutsShape;\nvar classNamesShape = process.env.NODE_ENV !== 'production' ? _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.shape({\n enter: _propTypes.default.string,\n exit: _propTypes.default.string,\n active: _propTypes.default.string\n}), _propTypes.default.shape({\n enter: _propTypes.default.string,\n enterDone: _propTypes.default.string,\n enterActive: _propTypes.default.string,\n exit: _propTypes.default.string,\n exitDone: _propTypes.default.string,\n exitActive: _propTypes.default.string\n})]) : null;\nexports.classNamesShape = classNamesShape;","import React from 'react';\nexport default React.createContext(null);","'use strict';\n\nvar has = Object.prototype.hasOwnProperty,\n prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n var listener = new EE(fn, context || emitter, once),\n evt = prefix ? prefix + event : event;\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);else emitter._events[evt] = [emitter._events[evt], listener];\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = [],\n events,\n name;\n if (this._eventsCount === 0) return names;\n for (name in events = this._events) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event,\n handlers = this._events[evt];\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event,\n listeners = this._events[evt];\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n if (!this._events[evt]) return false;\n var listeners = this._events[evt],\n len = arguments.length,\n args,\n i;\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n switch (len) {\n case 1:\n return listeners.fn.call(listeners.context), true;\n case 2:\n return listeners.fn.call(listeners.context, a1), true;\n case 3:\n return listeners.fn.call(listeners.context, a1, a2), true;\n case 4:\n return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5:\n return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6:\n return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n for (i = 1, args = new Array(len - 1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length,\n j;\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n switch (len) {\n case 1:\n listeners[i].fn.call(listeners[i].context);\n break;\n case 2:\n listeners[i].fn.call(listeners[i].context, a1);\n break;\n case 3:\n listeners[i].fn.call(listeners[i].context, a1, a2);\n break;\n case 4:\n listeners[i].fn.call(listeners[i].context, a1, a2, a3);\n break;\n default:\n if (!args) for (j = 1, args = new Array(len - 1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n var listeners = this._events[evt];\n if (listeners.fn) {\n if (listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context)) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (listeners[i].fn !== fn || once && !listeners[i].once || context && listeners[i].context !== context) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;else clearEvent(this, evt);\n }\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar _postcssValueParser = require('postcss-value-parser');\nvar _postcssValueParser2 = _interopRequireDefault(_postcssValueParser);\nvar _parser = require('./parser');\nvar _reducer = require('./lib/reducer');\nvar _reducer2 = _interopRequireDefault(_reducer);\nvar _stringifier = require('./lib/stringifier');\nvar _stringifier2 = _interopRequireDefault(_stringifier);\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n}\n\n// eslint-disable-line\nvar MATCH_CALC = /((?:\\-[a-z]+\\-)?calc)/;\nexports.default = function (value) {\n var precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5;\n return (0, _postcssValueParser2.default)(value).walk(function (node) {\n // skip anything which isn't a calc() function\n if (node.type !== 'function' || !MATCH_CALC.test(node.value)) return;\n\n // stringify calc expression and produce an AST\n var contents = _postcssValueParser2.default.stringify(node.nodes);\n\n // skip constant() and env()\n if (contents.indexOf('constant') >= 0 || contents.indexOf('env') >= 0) return;\n var ast = _parser.parser.parse(contents);\n\n // reduce AST to its simplest form, that is, either to a single value\n // or a simplified calc expression\n var reducedAst = (0, _reducer2.default)(ast, precision);\n\n // stringify AST and write it back\n node.type = 'word';\n node.value = (0, _stringifier2.default)(node.value, reducedAst, precision);\n }, true).toString();\n};\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar _cssUnitConverter = require('css-unit-converter');\nvar _cssUnitConverter2 = _interopRequireDefault(_cssUnitConverter);\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n}\nfunction convertNodes(left, right, precision) {\n switch (left.type) {\n case 'LengthValue':\n case 'AngleValue':\n case 'TimeValue':\n case 'FrequencyValue':\n case 'ResolutionValue':\n return convertAbsoluteLength(left, right, precision);\n default:\n return {\n left: left,\n right: right\n };\n }\n}\nfunction convertAbsoluteLength(left, right, precision) {\n if (right.type === left.type) {\n right = {\n type: left.type,\n value: (0, _cssUnitConverter2.default)(right.value, right.unit, left.unit, precision),\n unit: left.unit\n };\n }\n return {\n left: left,\n right: right\n };\n}\nexports.default = convertNodes;\nmodule.exports = exports['default'];","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.flip = flip;\nvar _convert = require(\"./convert\");\nvar _convert2 = _interopRequireDefault(_convert);\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n}\nfunction reduce(node, precision) {\n if (node.type === \"MathExpression\") return reduceMathExpression(node, precision);\n if (node.type === \"Calc\") return reduce(node.value, precision);\n return node;\n}\nfunction isEqual(left, right) {\n return left.type === right.type && left.value === right.value;\n}\nfunction isValueType(type) {\n switch (type) {\n case 'LengthValue':\n case 'AngleValue':\n case 'TimeValue':\n case 'FrequencyValue':\n case 'ResolutionValue':\n case 'EmValue':\n case 'ExValue':\n case 'ChValue':\n case 'RemValue':\n case 'VhValue':\n case 'VwValue':\n case 'VminValue':\n case 'VmaxValue':\n case 'PercentageValue':\n case 'Value':\n return true;\n }\n return false;\n}\nfunction convertMathExpression(node, precision) {\n var nodes = (0, _convert2.default)(node.left, node.right, precision);\n var left = reduce(nodes.left, precision);\n var right = reduce(nodes.right, precision);\n if (left.type === \"MathExpression\" && right.type === \"MathExpression\") {\n if (left.operator === '/' && right.operator === '*' || left.operator === '-' && right.operator === '+' || left.operator === '*' && right.operator === '/' || left.operator === '+' && right.operator === '-') {\n if (isEqual(left.right, right.right)) nodes = (0, _convert2.default)(left.left, right.left, precision);else if (isEqual(left.right, right.left)) nodes = (0, _convert2.default)(left.left, right.right, precision);\n left = reduce(nodes.left, precision);\n right = reduce(nodes.right, precision);\n }\n }\n node.left = left;\n node.right = right;\n return node;\n}\nfunction flip(operator) {\n return operator === '+' ? '-' : '+';\n}\nfunction flipValue(node) {\n if (isValueType(node.type)) node.value = -node.value;else if (node.type == 'MathExpression') {\n node.left = flipValue(node.left);\n node.right = flipValue(node.right);\n }\n return node;\n}\nfunction reduceAddSubExpression(node, precision) {\n var _node = node,\n left = _node.left,\n right = _node.right,\n op = _node.operator;\n if (left.type === 'CssVariable' || right.type === 'CssVariable') return node;\n\n // something + 0 => something\n // something - 0 => something\n if (right.value === 0) return left;\n\n // 0 + something => something\n if (left.value === 0 && op === \"+\") return right;\n\n // 0 - something => -something\n if (left.value === 0 && op === \"-\") return flipValue(right);\n\n // value + value\n // value - value\n if (left.type === right.type && isValueType(left.type)) {\n node = Object.assign({}, left);\n if (op === \"+\") node.value = left.value + right.value;else node.value = left.value - right.value;\n }\n\n // value (expr)\n if (isValueType(left.type) && (right.operator === '+' || right.operator === '-') && right.type === 'MathExpression') {\n // value + (value + something) => (value + value) + something\n // value + (value - something) => (value + value) - something\n // value - (value + something) => (value - value) - something\n // value - (value - something) => (value - value) + something\n if (left.type === right.left.type) {\n node = Object.assign({}, node);\n node.left = reduce({\n type: 'MathExpression',\n operator: op,\n left: left,\n right: right.left\n }, precision);\n node.right = right.right;\n node.operator = op === '-' ? flip(right.operator) : right.operator;\n return reduce(node, precision);\n }\n // value + (something + value) => (value + value) + something\n // value + (something - value) => (value - value) + something\n // value - (something + value) => (value - value) - something\n // value - (something - value) => (value + value) - something\n else if (left.type === right.right.type) {\n node = Object.assign({}, node);\n node.left = reduce({\n type: 'MathExpression',\n operator: op === '-' ? flip(right.operator) : right.operator,\n left: left,\n right: right.right\n }, precision);\n node.right = right.left;\n return reduce(node, precision);\n }\n }\n\n // (expr) value\n if (left.type === 'MathExpression' && (left.operator === '+' || left.operator === '-') && isValueType(right.type)) {\n // (value + something) + value => (value + value) + something\n // (value - something) + value => (value + value) - something\n // (value + something) - value => (value - value) + something\n // (value - something) - value => (value - value) - something\n if (right.type === left.left.type) {\n node = Object.assign({}, left);\n node.left = reduce({\n type: 'MathExpression',\n operator: op,\n left: left.left,\n right: right\n }, precision);\n return reduce(node, precision);\n }\n // (something + value) + value => something + (value + value)\n // (something - value1) + value2 => something - (value2 - value1)\n // (something + value) - value => something + (value - value)\n // (something - value) - value => something - (value + value)\n else if (right.type === left.right.type) {\n node = Object.assign({}, left);\n if (left.operator === '-') {\n node.right = reduce({\n type: 'MathExpression',\n operator: op === '-' ? '+' : '-',\n left: right,\n right: left.right\n }, precision);\n node.operator = op === '-' ? '-' : '+';\n } else {\n node.right = reduce({\n type: 'MathExpression',\n operator: op,\n left: left.right,\n right: right\n }, precision);\n }\n if (node.right.value < 0) {\n node.right.value *= -1;\n node.operator = node.operator === '-' ? '+' : '-';\n }\n return reduce(node, precision);\n }\n }\n return node;\n}\nfunction reduceDivisionExpression(node, precision) {\n if (!isValueType(node.right.type)) return node;\n if (node.right.type !== 'Value') throw new Error(\"Cannot divide by \\\"\" + node.right.unit + \"\\\", number expected\");\n if (node.right.value === 0) throw new Error('Cannot divide by zero');\n\n // (expr) / value\n if (node.left.type === 'MathExpression') {\n if (isValueType(node.left.left.type) && isValueType(node.left.right.type)) {\n node.left.left.value /= node.right.value;\n node.left.right.value /= node.right.value;\n return reduce(node.left, precision);\n }\n return node;\n }\n // something / value\n else if (isValueType(node.left.type)) {\n node.left.value /= node.right.value;\n return node.left;\n }\n return node;\n}\nfunction reduceMultiplicationExpression(node) {\n // (expr) * value\n if (node.left.type === 'MathExpression' && node.right.type === 'Value') {\n if (isValueType(node.left.left.type) && isValueType(node.left.right.type)) {\n node.left.left.value *= node.right.value;\n node.left.right.value *= node.right.value;\n return node.left;\n }\n }\n // something * value\n else if (isValueType(node.left.type) && node.right.type === 'Value') {\n node.left.value *= node.right.value;\n return node.left;\n }\n // value * (expr)\n else if (node.left.type === 'Value' && node.right.type === 'MathExpression') {\n if (isValueType(node.right.left.type) && isValueType(node.right.right.type)) {\n node.right.left.value *= node.left.value;\n node.right.right.value *= node.left.value;\n return node.right;\n }\n }\n // value * something\n else if (node.left.type === 'Value' && isValueType(node.right.type)) {\n node.right.value *= node.left.value;\n return node.right;\n }\n return node;\n}\nfunction reduceMathExpression(node, precision) {\n node = convertMathExpression(node, precision);\n switch (node.operator) {\n case \"+\":\n case \"-\":\n return reduceAddSubExpression(node, precision);\n case \"/\":\n return reduceDivisionExpression(node, precision);\n case \"*\":\n return reduceMultiplicationExpression(node);\n }\n return node;\n}\nexports.default = reduce;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = function (calc, node, precision) {\n var str = stringify(node, precision);\n if (node.type === \"MathExpression\") {\n // if calc expression couldn't be resolved to a single value, re-wrap it as\n // a calc()\n str = calc + \"(\" + str + \")\";\n }\n return str;\n};\nvar _reducer = require(\"./reducer\");\nvar order = {\n \"*\": 0,\n \"/\": 0,\n \"+\": 1,\n \"-\": 1\n};\nfunction round(value, prec) {\n if (prec !== false) {\n var precision = Math.pow(10, prec);\n return Math.round(value * precision) / precision;\n }\n return value;\n}\nfunction stringify(node, prec) {\n switch (node.type) {\n case \"MathExpression\":\n {\n var left = node.left,\n right = node.right,\n op = node.operator;\n var str = \"\";\n if (left.type === 'MathExpression' && order[op] < order[left.operator]) str += \"(\" + stringify(left, prec) + \")\";else str += stringify(left, prec);\n str += \" \" + node.operator + \" \";\n if (right.type === 'MathExpression' && order[op] < order[right.operator]) {\n str += \"(\" + stringify(right, prec) + \")\";\n } else if (right.type === 'MathExpression' && op === \"-\" && [\"+\", \"-\"].includes(right.operator)) {\n // fix #52 : a-(b+c) = a-b-c\n right.operator = (0, _reducer.flip)(right.operator);\n str += stringify(right, prec);\n } else {\n str += stringify(right, prec);\n }\n return str;\n }\n case \"Value\":\n return round(node.value, prec);\n case 'CssVariable':\n if (node.fallback) {\n return \"var(\" + node.value + \", \" + stringify(node.fallback, prec, true) + \")\";\n }\n return \"var(\" + node.value + \")\";\n case 'Calc':\n if (node.prefix) {\n return \"-\" + node.prefix + \"-calc(\" + stringify(node.value, prec) + \")\";\n }\n return \"calc(\" + stringify(node.value, prec) + \")\";\n default:\n return round(node.value, prec) + node.unit;\n }\n}\nmodule.exports = exports[\"default\"];","/* parser generated by jison 0.6.1-215 */\n\n/*\n * Returns a Parser object of the following structure:\n *\n * Parser: {\n * yy: {} The so-called \"shared state\" or rather the *source* of it;\n * the real \"shared state\" `yy` passed around to\n * the rule actions, etc. is a derivative/copy of this one,\n * not a direct reference!\n * }\n *\n * Parser.prototype: {\n * yy: {},\n * EOF: 1,\n * TERROR: 2,\n *\n * trace: function(errorMessage, ...),\n *\n * JisonParserError: function(msg, hash),\n *\n * quoteName: function(name),\n * Helper function which can be overridden by user code later on: put suitable\n * quotes around literal IDs in a description string.\n *\n * originalQuoteName: function(name),\n * The basic quoteName handler provided by JISON.\n * `cleanupAfterParse()` will clean up and reset `quoteName()` to reference this function\n * at the end of the `parse()`.\n *\n * describeSymbol: function(symbol),\n * Return a more-or-less human-readable description of the given symbol, when\n * available, or the symbol itself, serving as its own 'description' for lack\n * of something better to serve up.\n *\n * Return NULL when the symbol is unknown to the parser.\n *\n * symbols_: {associative list: name ==> number},\n * terminals_: {associative list: number ==> name},\n * nonterminals: {associative list: rule-name ==> {associative list: number ==> rule-alt}},\n * terminal_descriptions_: (if there are any) {associative list: number ==> description},\n * productions_: [...],\n *\n * performAction: function parser__performAction(yytext, yyleng, yylineno, yyloc, yystate, yysp, yyvstack, yylstack, yystack, yysstack),\n *\n * The function parameters and `this` have the following value/meaning:\n * - `this` : reference to the `yyval` internal object, which has members (`$` and `_$`)\n * to store/reference the rule value `$$` and location info `@$`.\n *\n * One important thing to note about `this` a.k.a. `yyval`: every *reduce* action gets\n * to see the same object via the `this` reference, i.e. if you wish to carry custom\n * data from one reduce action through to the next within a single parse run, then you\n * may get nasty and use `yyval` a.k.a. `this` for storing you own semi-permanent data.\n *\n * `this.yy` is a direct reference to the `yy` shared state object.\n *\n * `%parse-param`-specified additional `parse()` arguments have been added to this `yy`\n * object at `parse()` start and are therefore available to the action code via the\n * same named `yy.xxxx` attributes (where `xxxx` represents a identifier name from\n * the %parse-param` list.\n *\n * - `yytext` : reference to the lexer value which belongs to the last lexer token used\n * to match this rule. This is *not* the look-ahead token, but the last token\n * that's actually part of this rule.\n *\n * Formulated another way, `yytext` is the value of the token immediately preceeding\n * the current look-ahead token.\n * Caveats apply for rules which don't require look-ahead, such as epsilon rules.\n *\n * - `yyleng` : ditto as `yytext`, only now for the lexer.yyleng value.\n *\n * - `yylineno`: ditto as `yytext`, only now for the lexer.yylineno value.\n *\n * - `yyloc` : ditto as `yytext`, only now for the lexer.yylloc lexer token location info.\n *\n * WARNING: since jison 0.4.18-186 this entry may be NULL/UNDEFINED instead\n * of an empty object when no suitable location info can be provided.\n *\n * - `yystate` : the current parser state number, used internally for dispatching and\n * executing the action code chunk matching the rule currently being reduced.\n *\n * - `yysp` : the current state stack position (a.k.a. 'stack pointer')\n *\n * This one comes in handy when you are going to do advanced things to the parser\n * stacks, all of which are accessible from your action code (see the next entries below).\n *\n * Also note that you can access this and other stack index values using the new double-hash\n * syntax, i.e. `##$ === ##0 === yysp`, while `##1` is the stack index for all things\n * related to the first rule term, just like you have `$1`, `@1` and `#1`.\n * This is made available to write very advanced grammar action rules, e.g. when you want\n * to investigate the parse state stack in your action code, which would, for example,\n * be relevant when you wish to implement error diagnostics and reporting schemes similar\n * to the work described here:\n *\n * + Pottier, F., 2016. Reachability and error diagnosis in LR(1) automata.\n * In Journées Francophones des Languages Applicatifs.\n *\n * + Jeffery, C.L., 2003. Generating LR syntax error messages from examples.\n * ACM Transactions on Programming Languages and Systems (TOPLAS), 25(5), pp.631–640.\n *\n * - `yyrulelength`: the current rule's term count, i.e. the number of entries occupied on the stack.\n *\n * This one comes in handy when you are going to do advanced things to the parser\n * stacks, all of which are accessible from your action code (see the next entries below).\n *\n * - `yyvstack`: reference to the parser value stack. Also accessed via the `$1` etc.\n * constructs.\n *\n * - `yylstack`: reference to the parser token location stack. Also accessed via\n * the `@1` etc. constructs.\n *\n * WARNING: since jison 0.4.18-186 this array MAY contain slots which are\n * UNDEFINED rather than an empty (location) object, when the lexer/parser\n * action code did not provide a suitable location info object when such a\n * slot was filled!\n *\n * - `yystack` : reference to the parser token id stack. Also accessed via the\n * `#1` etc. constructs.\n *\n * Note: this is a bit of a **white lie** as we can statically decode any `#n` reference to\n * its numeric token id value, hence that code wouldn't need the `yystack` but *you* might\n * want access this array for your own purposes, such as error analysis as mentioned above!\n *\n * Note that this stack stores the current stack of *tokens*, that is the sequence of\n * already parsed=reduced *nonterminals* (tokens representing rules) and *terminals*\n * (lexer tokens *shifted* onto the stack until the rule they belong to is found and\n * *reduced*.\n *\n * - `yysstack`: reference to the parser state stack. This one carries the internal parser\n * *states* such as the one in `yystate`, which are used to represent\n * the parser state machine in the *parse table*. *Very* *internal* stuff,\n * what can I say? If you access this one, you're clearly doing wicked things\n *\n * - `...` : the extra arguments you specified in the `%parse-param` statement in your\n * grammar definition file.\n *\n * table: [...],\n * State transition table\n * ----------------------\n *\n * index levels are:\n * - `state` --> hash table\n * - `symbol` --> action (number or array)\n *\n * If the `action` is an array, these are the elements' meaning:\n * - index [0]: 1 = shift, 2 = reduce, 3 = accept\n * - index [1]: GOTO `state`\n *\n * If the `action` is a number, it is the GOTO `state`\n *\n * defaultActions: {...},\n *\n * parseError: function(str, hash, ExceptionClass),\n * yyError: function(str, ...),\n * yyRecovering: function(),\n * yyErrOk: function(),\n * yyClearIn: function(),\n *\n * constructParseErrorInfo: function(error_message, exception_object, expected_token_set, is_recoverable),\n * Helper function **which will be set up during the first invocation of the `parse()` method**.\n * Produces a new errorInfo 'hash object' which can be passed into `parseError()`.\n * See it's use in this parser kernel in many places; example usage:\n *\n * var infoObj = parser.constructParseErrorInfo('fail!', null,\n * parser.collect_expected_token_set(state), true);\n * var retVal = parser.parseError(infoObj.errStr, infoObj, parser.JisonParserError);\n *\n * originalParseError: function(str, hash, ExceptionClass),\n * The basic `parseError` handler provided by JISON.\n * `cleanupAfterParse()` will clean up and reset `parseError()` to reference this function\n * at the end of the `parse()`.\n *\n * options: { ... parser %options ... },\n *\n * parse: function(input[, args...]),\n * Parse the given `input` and return the parsed value (or `true` when none was provided by\n * the root action, in which case the parser is acting as a *matcher*).\n * You MAY use the additional `args...` parameters as per `%parse-param` spec of this grammar:\n * these extra `args...` are added verbatim to the `yy` object reference as member variables.\n *\n * WARNING:\n * Parser's additional `args...` parameters (via `%parse-param`) MAY conflict with\n * any attributes already added to `yy` by the jison run-time;\n * when such a collision is detected an exception is thrown to prevent the generated run-time\n * from silently accepting this confusing and potentially hazardous situation!\n *\n * The lexer MAY add its own set of additional parameters (via the `%parse-param` line in\n * the lexer section of the grammar spec): these will be inserted in the `yy` shared state\n * object and any collision with those will be reported by the lexer via a thrown exception.\n *\n * cleanupAfterParse: function(resultValue, invoke_post_methods, do_not_nuke_errorinfos),\n * Helper function **which will be set up during the first invocation of the `parse()` method**.\n * This helper API is invoked at the end of the `parse()` call, unless an exception was thrown\n * and `%options no-try-catch` has been defined for this grammar: in that case this helper MAY\n * be invoked by calling user code to ensure the `post_parse` callbacks are invoked and\n * the internal parser gets properly garbage collected under these particular circumstances.\n *\n * yyMergeLocationInfo: function(first_index, last_index, first_yylloc, last_yylloc, dont_look_back),\n * Helper function **which will be set up during the first invocation of the `parse()` method**.\n * This helper API can be invoked to calculate a spanning `yylloc` location info object.\n *\n * Note: %epsilon rules MAY specify no `first_index` and `first_yylloc`, in which case\n * this function will attempt to obtain a suitable location marker by inspecting the location stack\n * backwards.\n *\n * For more info see the documentation comment further below, immediately above this function's\n * implementation.\n *\n * lexer: {\n * yy: {...}, A reference to the so-called \"shared state\" `yy` once\n * received via a call to the `.setInput(input, yy)` lexer API.\n * EOF: 1,\n * ERROR: 2,\n * JisonLexerError: function(msg, hash),\n * parseError: function(str, hash, ExceptionClass),\n * setInput: function(input, [yy]),\n * input: function(),\n * unput: function(str),\n * more: function(),\n * reject: function(),\n * less: function(n),\n * pastInput: function(n),\n * upcomingInput: function(n),\n * showPosition: function(),\n * test_match: function(regex_match_array, rule_index, ...),\n * next: function(...),\n * lex: function(...),\n * begin: function(condition),\n * pushState: function(condition),\n * popState: function(),\n * topState: function(),\n * _currentRules: function(),\n * stateStackSize: function(),\n * cleanupAfterLex: function()\n *\n * options: { ... lexer %options ... },\n *\n * performAction: function(yy, yy_, $avoiding_name_collisions, YY_START, ...),\n * rules: [...],\n * conditions: {associative list: name ==> set},\n * }\n * }\n *\n *\n * token location info (@$, _$, etc.): {\n * first_line: n,\n * last_line: n,\n * first_column: n,\n * last_column: n,\n * range: [start_number, end_number]\n * (where the numbers are indexes into the input string, zero-based)\n * }\n *\n * ---\n *\n * The `parseError` function receives a 'hash' object with these members for lexer and\n * parser errors:\n *\n * {\n * text: (matched text)\n * token: (the produced terminal token, if any)\n * token_id: (the produced terminal token numeric ID, if any)\n * line: (yylineno)\n * loc: (yylloc)\n * }\n *\n * parser (grammar) errors will also provide these additional members:\n *\n * {\n * expected: (array describing the set of expected tokens;\n * may be UNDEFINED when we cannot easily produce such a set)\n * state: (integer (or array when the table includes grammar collisions);\n * represents the current internal state of the parser kernel.\n * can, for example, be used to pass to the `collect_expected_token_set()`\n * API to obtain the expected token set)\n * action: (integer; represents the current internal action which will be executed)\n * new_state: (integer; represents the next/planned internal state, once the current\n * action has executed)\n * recoverable: (boolean: TRUE when the parser MAY have an error recovery rule\n * available for this particular error)\n * state_stack: (array: the current parser LALR/LR internal state stack; this can be used,\n * for instance, for advanced error analysis and reporting)\n * value_stack: (array: the current parser LALR/LR internal `$$` value stack; this can be used,\n * for instance, for advanced error analysis and reporting)\n * location_stack: (array: the current parser LALR/LR internal location stack; this can be used,\n * for instance, for advanced error analysis and reporting)\n * yy: (object: the current parser internal \"shared state\" `yy`\n * as is also available in the rule actions; this can be used,\n * for instance, for advanced error analysis and reporting)\n * lexer: (reference to the current lexer instance used by the parser)\n * parser: (reference to the current parser instance)\n * }\n *\n * while `this` will reference the current parser instance.\n *\n * When `parseError` is invoked by the lexer, `this` will still reference the related *parser*\n * instance, while these additional `hash` fields will also be provided:\n *\n * {\n * lexer: (reference to the current lexer instance which reported the error)\n * }\n *\n * When `parseError` is invoked by the parser due to a **JavaScript exception** being fired\n * from either the parser or lexer, `this` will still reference the related *parser*\n * instance, while these additional `hash` fields will also be provided:\n *\n * {\n * exception: (reference to the exception thrown)\n * }\n *\n * Please do note that in the latter situation, the `expected` field will be omitted as\n * this type of failure is assumed not to be due to *parse errors* but rather due to user\n * action code in either parser or lexer failing unexpectedly.\n *\n * ---\n *\n * You can specify parser options by setting / modifying the `.yy` object of your Parser instance.\n * These options are available:\n *\n * ### options which are global for all parser instances\n *\n * Parser.pre_parse: function(yy)\n * optional: you can specify a pre_parse() function in the chunk following\n * the grammar, i.e. after the last `%%`.\n * Parser.post_parse: function(yy, retval, parseInfo) { return retval; }\n * optional: you can specify a post_parse() function in the chunk following\n * the grammar, i.e. after the last `%%`. When it does not return any value,\n * the parser will return the original `retval`.\n *\n * ### options which can be set up per parser instance\n *\n * yy: {\n * pre_parse: function(yy)\n * optional: is invoked before the parse cycle starts (and before the first\n * invocation of `lex()`) but immediately after the invocation of\n * `parser.pre_parse()`).\n * post_parse: function(yy, retval, parseInfo) { return retval; }\n * optional: is invoked when the parse terminates due to success ('accept')\n * or failure (even when exceptions are thrown).\n * `retval` contains the return value to be produced by `Parser.parse()`;\n * this function can override the return value by returning another.\n * When it does not return any value, the parser will return the original\n * `retval`.\n * This function is invoked immediately before `parser.post_parse()`.\n *\n * parseError: function(str, hash, ExceptionClass)\n * optional: overrides the default `parseError` function.\n * quoteName: function(name),\n * optional: overrides the default `quoteName` function.\n * }\n *\n * parser.lexer.options: {\n * pre_lex: function()\n * optional: is invoked before the lexer is invoked to produce another token.\n * `this` refers to the Lexer object.\n * post_lex: function(token) { return token; }\n * optional: is invoked when the lexer has produced a token `token`;\n * this function can override the returned token value by returning another.\n * When it does not return any (truthy) value, the lexer will return\n * the original `token`.\n * `this` refers to the Lexer object.\n *\n * ranges: boolean\n * optional: `true` ==> token location info will include a .range[] member.\n * flex: boolean\n * optional: `true` ==> flex-like lexing behaviour where the rules are tested\n * exhaustively to find the longest match.\n * backtrack_lexer: boolean\n * optional: `true` ==> lexer regexes are tested in order and for invoked;\n * the lexer terminates the scan when a token is returned by the action code.\n * xregexp: boolean\n * optional: `true` ==> lexer rule regexes are \"extended regex format\" requiring the\n * `XRegExp` library. When this `%option` has not been specified at compile time, all lexer\n * rule regexes have been written as standard JavaScript RegExp expressions.\n * }\n */\n\nvar parser = function () {\n // See also:\n // http://stackoverflow.com/questions/1382107/whats-a-good-way-to-extend-error-in-javascript/#35881508\n // but we keep the prototype.constructor and prototype.name assignment lines too for compatibility\n // with userland code which might access the derived class in a 'classic' way.\n function JisonParserError(msg, hash) {\n Object.defineProperty(this, 'name', {\n enumerable: false,\n writable: false,\n value: 'JisonParserError'\n });\n if (msg == null) msg = '???';\n Object.defineProperty(this, 'message', {\n enumerable: false,\n writable: true,\n value: msg\n });\n this.hash = hash;\n var stacktrace;\n if (hash && hash.exception instanceof Error) {\n var ex2 = hash.exception;\n this.message = ex2.message || msg;\n stacktrace = ex2.stack;\n }\n if (!stacktrace) {\n if (Error.hasOwnProperty('captureStackTrace')) {\n // V8/Chrome engine\n Error.captureStackTrace(this, this.constructor);\n } else {\n stacktrace = new Error(msg).stack;\n }\n }\n if (stacktrace) {\n Object.defineProperty(this, 'stack', {\n enumerable: false,\n writable: false,\n value: stacktrace\n });\n }\n }\n if (typeof Object.setPrototypeOf === 'function') {\n Object.setPrototypeOf(JisonParserError.prototype, Error.prototype);\n } else {\n JisonParserError.prototype = Object.create(Error.prototype);\n }\n JisonParserError.prototype.constructor = JisonParserError;\n JisonParserError.prototype.name = 'JisonParserError';\n\n // helper: reconstruct the productions[] table\n function bp(s) {\n var rv = [];\n var p = s.pop;\n var r = s.rule;\n for (var i = 0, l = p.length; i < l; i++) {\n rv.push([p[i], r[i]]);\n }\n return rv;\n }\n\n // helper: reconstruct the defaultActions[] table\n function bda(s) {\n var rv = {};\n var d = s.idx;\n var g = s.goto;\n for (var i = 0, l = d.length; i < l; i++) {\n var j = d[i];\n rv[j] = g[i];\n }\n return rv;\n }\n\n // helper: reconstruct the 'goto' table\n function bt(s) {\n var rv = [];\n var d = s.len;\n var y = s.symbol;\n var t = s.type;\n var a = s.state;\n var m = s.mode;\n var g = s.goto;\n for (var i = 0, l = d.length; i < l; i++) {\n var n = d[i];\n var q = {};\n for (var j = 0; j < n; j++) {\n var z = y.shift();\n switch (t.shift()) {\n case 2:\n q[z] = [m.shift(), g.shift()];\n break;\n case 0:\n q[z] = a.shift();\n break;\n default:\n // type === 1: accept\n q[z] = [3];\n }\n }\n rv.push(q);\n }\n return rv;\n }\n\n // helper: runlength encoding with increment step: code, length: step (default step = 0)\n // `this` references an array\n function s(c, l, a) {\n a = a || 0;\n for (var i = 0; i < l; i++) {\n this.push(c);\n c += a;\n }\n }\n\n // helper: duplicate sequence from *relative* offset and length.\n // `this` references an array\n function c(i, l) {\n i = this.length - i;\n for (l += i; i < l; i++) {\n this.push(this[i]);\n }\n }\n\n // helper: unpack an array using helpers and data, all passed in an array argument 'a'.\n function u(a) {\n var rv = [];\n for (var i = 0, l = a.length; i < l; i++) {\n var e = a[i];\n // Is this entry a helper function?\n if (typeof e === 'function') {\n i++;\n e.apply(rv, a[i]);\n } else {\n rv.push(e);\n }\n }\n return rv;\n }\n var parser = {\n // Code Generator Information Report\n // ---------------------------------\n //\n // Options:\n //\n // default action mode: ............. [\"classic\",\"merge\"]\n // test-compile action mode: ........ \"parser:*,lexer:*\"\n // try..catch: ...................... true\n // default resolve on conflict: ..... true\n // on-demand look-ahead: ............ false\n // error recovery token skip maximum: 3\n // yyerror in parse actions is: ..... NOT recoverable,\n // yyerror in lexer actions and other non-fatal lexer are:\n // .................................. NOT recoverable,\n // debug grammar/output: ............ false\n // has partial LR conflict upgrade: true\n // rudimentary token-stack support: false\n // parser table compression mode: ... 2\n // export debug tables: ............. false\n // export *all* tables: ............. false\n // module type: ..................... commonjs\n // parser engine type: .............. lalr\n // output main() in the module: ..... true\n // has user-specified main(): ....... false\n // has user-specified require()/import modules for main():\n // .................................. false\n // number of expected conflicts: .... 0\n //\n //\n // Parser Analysis flags:\n //\n // no significant actions (parser is a language matcher only):\n // .................................. false\n // uses yyleng: ..................... false\n // uses yylineno: ................... false\n // uses yytext: ..................... false\n // uses yylloc: ..................... false\n // uses ParseError API: ............. false\n // uses YYERROR: .................... false\n // uses YYRECOVERING: ............... false\n // uses YYERROK: .................... false\n // uses YYCLEARIN: .................. false\n // tracks rule values: .............. true\n // assigns rule values: ............. true\n // uses location tracking: .......... false\n // assigns location: ................ false\n // uses yystack: .................... false\n // uses yysstack: ................... false\n // uses yysp: ....................... true\n // uses yyrulelength: ............... false\n // uses yyMergeLocationInfo API: .... false\n // has error recovery: .............. false\n // has error reporting: ............. false\n //\n // --------- END OF REPORT -----------\n\n trace: function no_op_trace() {},\n JisonParserError: JisonParserError,\n yy: {},\n options: {\n type: \"lalr\",\n hasPartialLrUpgradeOnConflict: true,\n errorRecoveryTokenDiscardCount: 3\n },\n symbols_: {\n \"$accept\": 0,\n \"$end\": 1,\n \"ADD\": 3,\n \"ANGLE\": 16,\n \"CHS\": 22,\n \"COMMA\": 14,\n \"CSS_CPROP\": 13,\n \"CSS_VAR\": 12,\n \"DIV\": 6,\n \"EMS\": 20,\n \"EOF\": 1,\n \"EXS\": 21,\n \"FREQ\": 18,\n \"LENGTH\": 15,\n \"LPAREN\": 7,\n \"MUL\": 5,\n \"NESTED_CALC\": 9,\n \"NUMBER\": 11,\n \"PERCENTAGE\": 28,\n \"PREFIX\": 10,\n \"REMS\": 23,\n \"RES\": 19,\n \"RPAREN\": 8,\n \"SUB\": 4,\n \"TIME\": 17,\n \"VHS\": 24,\n \"VMAXS\": 27,\n \"VMINS\": 26,\n \"VWS\": 25,\n \"css_value\": 33,\n \"css_variable\": 32,\n \"error\": 2,\n \"expression\": 29,\n \"math_expression\": 30,\n \"value\": 31\n },\n terminals_: {\n 1: \"EOF\",\n 2: \"error\",\n 3: \"ADD\",\n 4: \"SUB\",\n 5: \"MUL\",\n 6: \"DIV\",\n 7: \"LPAREN\",\n 8: \"RPAREN\",\n 9: \"NESTED_CALC\",\n 10: \"PREFIX\",\n 11: \"NUMBER\",\n 12: \"CSS_VAR\",\n 13: \"CSS_CPROP\",\n 14: \"COMMA\",\n 15: \"LENGTH\",\n 16: \"ANGLE\",\n 17: \"TIME\",\n 18: \"FREQ\",\n 19: \"RES\",\n 20: \"EMS\",\n 21: \"EXS\",\n 22: \"CHS\",\n 23: \"REMS\",\n 24: \"VHS\",\n 25: \"VWS\",\n 26: \"VMINS\",\n 27: \"VMAXS\",\n 28: \"PERCENTAGE\"\n },\n TERROR: 2,\n EOF: 1,\n // internals: defined here so the object *structure* doesn't get modified by parse() et al,\n // thus helping JIT compilers like Chrome V8.\n originalQuoteName: null,\n originalParseError: null,\n cleanupAfterParse: null,\n constructParseErrorInfo: null,\n yyMergeLocationInfo: null,\n __reentrant_call_depth: 0,\n // INTERNAL USE ONLY\n __error_infos: [],\n // INTERNAL USE ONLY: the set of parseErrorInfo objects created since the last cleanup\n __error_recovery_infos: [],\n // INTERNAL USE ONLY: the set of parseErrorInfo objects created since the last cleanup\n\n // APIs which will be set up depending on user action code analysis:\n //yyRecovering: 0,\n //yyErrOk: 0,\n //yyClearIn: 0,\n\n // Helper APIs\n // -----------\n\n // Helper function which can be overridden by user code later on: put suitable quotes around\n // literal IDs in a description string.\n quoteName: function parser_quoteName(id_str) {\n return '\"' + id_str + '\"';\n },\n // Return the name of the given symbol (terminal or non-terminal) as a string, when available.\n //\n // Return NULL when the symbol is unknown to the parser.\n getSymbolName: function parser_getSymbolName(symbol) {\n if (this.terminals_[symbol]) {\n return this.terminals_[symbol];\n }\n\n // Otherwise... this might refer to a RULE token i.e. a non-terminal: see if we can dig that one up.\n //\n // An example of this may be where a rule's action code contains a call like this:\n //\n // parser.getSymbolName(#$)\n //\n // to obtain a human-readable name of the current grammar rule.\n var s = this.symbols_;\n for (var key in s) {\n if (s[key] === symbol) {\n return key;\n }\n }\n return null;\n },\n // Return a more-or-less human-readable description of the given symbol, when available,\n // or the symbol itself, serving as its own 'description' for lack of something better to serve up.\n //\n // Return NULL when the symbol is unknown to the parser.\n describeSymbol: function parser_describeSymbol(symbol) {\n if (symbol !== this.EOF && this.terminal_descriptions_ && this.terminal_descriptions_[symbol]) {\n return this.terminal_descriptions_[symbol];\n } else if (symbol === this.EOF) {\n return 'end of input';\n }\n var id = this.getSymbolName(symbol);\n if (id) {\n return this.quoteName(id);\n }\n return null;\n },\n // Produce a (more or less) human-readable list of expected tokens at the point of failure.\n //\n // The produced list may contain token or token set descriptions instead of the tokens\n // themselves to help turning this output into something that easier to read by humans\n // unless `do_not_describe` parameter is set, in which case a list of the raw, *numeric*,\n // expected terminals and nonterminals is produced.\n //\n // The returned list (array) will not contain any duplicate entries.\n collect_expected_token_set: function parser_collect_expected_token_set(state, do_not_describe) {\n var TERROR = this.TERROR;\n var tokenset = [];\n var check = {};\n // Has this (error?) state been outfitted with a custom expectations description text for human consumption?\n // If so, use that one instead of the less palatable token set.\n if (!do_not_describe && this.state_descriptions_ && this.state_descriptions_[state]) {\n return [this.state_descriptions_[state]];\n }\n for (var p in this.table[state]) {\n p = +p;\n if (p !== TERROR) {\n var d = do_not_describe ? p : this.describeSymbol(p);\n if (d && !check[d]) {\n tokenset.push(d);\n check[d] = true; // Mark this token description as already mentioned to prevent outputting duplicate entries.\n }\n }\n }\n\n return tokenset;\n },\n productions_: bp({\n pop: u([29, s, [30, 10], 31, 31, 32, 32, s, [33, 15]]),\n rule: u([2, s, [3, 5], 4, 7, s, [1, 4], 2, 4, 6, s, [1, 14], 2])\n }),\n performAction: function parser__PerformAction(yystate /* action[1] */, yysp, yyvstack) {\n /* this == yyval */\n\n // the JS engine itself can go and remove these statements when `yy` turns out to be unused in any action code!\n var yy = this.yy;\n var yyparser = yy.parser;\n var yylexer = yy.lexer;\n switch (yystate) {\n case 0:\n /*! Production:: $accept : expression $end */\n\n // default action (generated by JISON mode classic/merge :: 1,VT,VA,-,-,-,-,-,-):\n this.$ = yyvstack[yysp - 1];\n // END of default action (generated by JISON mode classic/merge :: 1,VT,VA,-,-,-,-,-,-)\n break;\n case 1:\n /*! Production:: expression : math_expression EOF */\n\n // default action (generated by JISON mode classic/merge :: 2,VT,VA,-,-,-,-,-,-):\n this.$ = yyvstack[yysp - 1];\n // END of default action (generated by JISON mode classic/merge :: 2,VT,VA,-,-,-,-,-,-)\n\n return yyvstack[yysp - 1];\n break;\n case 2:\n /*! Production:: math_expression : math_expression ADD math_expression */\n case 3:\n /*! Production:: math_expression : math_expression SUB math_expression */\n case 4:\n /*! Production:: math_expression : math_expression MUL math_expression */\n case 5:\n /*! Production:: math_expression : math_expression DIV math_expression */\n\n this.$ = {\n type: 'MathExpression',\n operator: yyvstack[yysp - 1],\n left: yyvstack[yysp - 2],\n right: yyvstack[yysp]\n };\n break;\n case 6:\n /*! Production:: math_expression : LPAREN math_expression RPAREN */\n\n this.$ = yyvstack[yysp - 1];\n break;\n case 7:\n /*! Production:: math_expression : NESTED_CALC LPAREN math_expression RPAREN */\n\n this.$ = {\n type: 'Calc',\n value: yyvstack[yysp - 1]\n };\n break;\n case 8:\n /*! Production:: math_expression : SUB PREFIX SUB NESTED_CALC LPAREN math_expression RPAREN */\n\n this.$ = {\n type: 'Calc',\n value: yyvstack[yysp - 1],\n prefix: yyvstack[yysp - 5]\n };\n break;\n case 9:\n /*! Production:: math_expression : css_variable */\n case 10:\n /*! Production:: math_expression : css_value */\n case 11:\n /*! Production:: math_expression : value */\n\n this.$ = yyvstack[yysp];\n break;\n case 12:\n /*! Production:: value : NUMBER */\n\n this.$ = {\n type: 'Value',\n value: parseFloat(yyvstack[yysp])\n };\n break;\n case 13:\n /*! Production:: value : SUB NUMBER */\n\n this.$ = {\n type: 'Value',\n value: parseFloat(yyvstack[yysp]) * -1\n };\n break;\n case 14:\n /*! Production:: css_variable : CSS_VAR LPAREN CSS_CPROP RPAREN */\n\n this.$ = {\n type: 'CssVariable',\n value: yyvstack[yysp - 1]\n };\n break;\n case 15:\n /*! Production:: css_variable : CSS_VAR LPAREN CSS_CPROP COMMA math_expression RPAREN */\n\n this.$ = {\n type: 'CssVariable',\n value: yyvstack[yysp - 3],\n fallback: yyvstack[yysp - 1]\n };\n break;\n case 16:\n /*! Production:: css_value : LENGTH */\n\n this.$ = {\n type: 'LengthValue',\n value: parseFloat(yyvstack[yysp]),\n unit: /[a-z]+/.exec(yyvstack[yysp])[0]\n };\n break;\n case 17:\n /*! Production:: css_value : ANGLE */\n\n this.$ = {\n type: 'AngleValue',\n value: parseFloat(yyvstack[yysp]),\n unit: /[a-z]+/.exec(yyvstack[yysp])[0]\n };\n break;\n case 18:\n /*! Production:: css_value : TIME */\n\n this.$ = {\n type: 'TimeValue',\n value: parseFloat(yyvstack[yysp]),\n unit: /[a-z]+/.exec(yyvstack[yysp])[0]\n };\n break;\n case 19:\n /*! Production:: css_value : FREQ */\n\n this.$ = {\n type: 'FrequencyValue',\n value: parseFloat(yyvstack[yysp]),\n unit: /[a-z]+/.exec(yyvstack[yysp])[0]\n };\n break;\n case 20:\n /*! Production:: css_value : RES */\n\n this.$ = {\n type: 'ResolutionValue',\n value: parseFloat(yyvstack[yysp]),\n unit: /[a-z]+/.exec(yyvstack[yysp])[0]\n };\n break;\n case 21:\n /*! Production:: css_value : EMS */\n\n this.$ = {\n type: 'EmValue',\n value: parseFloat(yyvstack[yysp]),\n unit: 'em'\n };\n break;\n case 22:\n /*! Production:: css_value : EXS */\n\n this.$ = {\n type: 'ExValue',\n value: parseFloat(yyvstack[yysp]),\n unit: 'ex'\n };\n break;\n case 23:\n /*! Production:: css_value : CHS */\n\n this.$ = {\n type: 'ChValue',\n value: parseFloat(yyvstack[yysp]),\n unit: 'ch'\n };\n break;\n case 24:\n /*! Production:: css_value : REMS */\n\n this.$ = {\n type: 'RemValue',\n value: parseFloat(yyvstack[yysp]),\n unit: 'rem'\n };\n break;\n case 25:\n /*! Production:: css_value : VHS */\n\n this.$ = {\n type: 'VhValue',\n value: parseFloat(yyvstack[yysp]),\n unit: 'vh'\n };\n break;\n case 26:\n /*! Production:: css_value : VWS */\n\n this.$ = {\n type: 'VwValue',\n value: parseFloat(yyvstack[yysp]),\n unit: 'vw'\n };\n break;\n case 27:\n /*! Production:: css_value : VMINS */\n\n this.$ = {\n type: 'VminValue',\n value: parseFloat(yyvstack[yysp]),\n unit: 'vmin'\n };\n break;\n case 28:\n /*! Production:: css_value : VMAXS */\n\n this.$ = {\n type: 'VmaxValue',\n value: parseFloat(yyvstack[yysp]),\n unit: 'vmax'\n };\n break;\n case 29:\n /*! Production:: css_value : PERCENTAGE */\n\n this.$ = {\n type: 'PercentageValue',\n value: parseFloat(yyvstack[yysp]),\n unit: '%'\n };\n break;\n case 30:\n /*! Production:: css_value : SUB css_value */\n\n var prev = yyvstack[yysp];\n prev.value *= -1;\n this.$ = prev;\n break;\n }\n },\n table: bt({\n len: u([24, 1, 5, 23, 1, 18, s, [0, 3], 1, s, [0, 16], s, [23, 4], c, [28, 3], 0, 0, 16, 1, 6, 6, s, [0, 3], 5, 1, 2, c, [37, 3], c, [20, 3], 5, 0, 0]),\n symbol: u([4, 7, 9, 11, 12, s, [15, 19, 1], 1, 1, s, [3, 4, 1], c, [30, 19], c, [29, 4], 7, 4, 10, 11, c, [22, 14], c, [19, 3], c, [43, 22], c, [23, 69], c, [139, 4], 8, c, [51, 24], 4, c, [138, 15], 13, c, [186, 5], 8, c, [6, 6], c, [5, 5], 9, 8, 14, c, [159, 47], c, [60, 10]]),\n type: u([s, [2, 19], s, [0, 5], 1, s, [2, 24], s, [0, 4], c, [22, 19], c, [43, 42], c, [23, 70], c, [28, 25], c, [45, 25], c, [113, 54]]),\n state: u([1, 2, 8, 6, 7, 30, c, [4, 3], 33, 37, c, [5, 3], 38, c, [4, 3], 39, c, [4, 3], 40, c, [4, 3], 42, c, [21, 4], 50, c, [5, 3], 51, c, [4, 3]]),\n mode: u([s, [1, 179], s, [2, 3], c, [5, 5], c, [6, 4], s, [1, 57]]),\n goto: u([5, 3, 4, 24, s, [9, 15, 1], s, [25, 5, 1], c, [24, 19], 31, 35, 32, 34, c, [18, 14], 36, c, [38, 19], c, [19, 57], c, [118, 4], 41, c, [24, 19], 43, 35, c, [16, 14], 44, s, [2, 3], 28, 29, 2, s, [3, 3], 28, 29, 3, c, [53, 4], s, [45, 5, 1], c, [100, 42], 52, c, [5, 4], 53])\n }),\n defaultActions: bda({\n idx: u([6, 7, 8, s, [10, 16, 1], 33, 34, 39, 40, 41, 45, 47, 52, 53]),\n goto: u([9, 10, 11, s, [16, 14, 1], 12, 1, 30, 13, s, [4, 4, 1], 14, 15, 8])\n }),\n parseError: function parseError(str, hash, ExceptionClass) {\n if (hash.recoverable) {\n if (typeof this.trace === 'function') {\n this.trace(str);\n }\n hash.destroy(); // destroy... well, *almost*!\n } else {\n if (typeof this.trace === 'function') {\n this.trace(str);\n }\n if (!ExceptionClass) {\n ExceptionClass = this.JisonParserError;\n }\n throw new ExceptionClass(str, hash);\n }\n },\n parse: function parse(input) {\n var self = this;\n var stack = new Array(128); // token stack: stores token which leads to state at the same index (column storage)\n var sstack = new Array(128); // state stack: stores states (column storage)\n\n var vstack = new Array(128); // semantic value stack\n\n var table = this.table;\n var sp = 0; // 'stack pointer': index into the stacks\n\n var symbol = 0;\n var TERROR = this.TERROR;\n var EOF = this.EOF;\n var ERROR_RECOVERY_TOKEN_DISCARD_COUNT = this.options.errorRecoveryTokenDiscardCount | 0 || 3;\n var NO_ACTION = [0, 54 /* === table.length :: ensures that anyone using this new state will fail dramatically! */];\n\n var lexer;\n if (this.__lexer__) {\n lexer = this.__lexer__;\n } else {\n lexer = this.__lexer__ = Object.create(this.lexer);\n }\n var sharedState_yy = {\n parseError: undefined,\n quoteName: undefined,\n lexer: undefined,\n parser: undefined,\n pre_parse: undefined,\n post_parse: undefined,\n pre_lex: undefined,\n post_lex: undefined // WARNING: must be written this way for the code expanders to work correctly in both ES5 and ES6 modes!\n };\n\n var ASSERT;\n if (typeof assert !== 'function') {\n ASSERT = function JisonAssert(cond, msg) {\n if (!cond) {\n throw new Error('assertion failed: ' + (msg || '***'));\n }\n };\n } else {\n ASSERT = assert;\n }\n this.yyGetSharedState = function yyGetSharedState() {\n return sharedState_yy;\n };\n function shallow_copy_noclobber(dst, src) {\n for (var k in src) {\n if (typeof dst[k] === 'undefined' && Object.prototype.hasOwnProperty.call(src, k)) {\n dst[k] = src[k];\n }\n }\n }\n\n // copy state\n shallow_copy_noclobber(sharedState_yy, this.yy);\n sharedState_yy.lexer = lexer;\n sharedState_yy.parser = this;\n\n // Does the shared state override the default `parseError` that already comes with this instance?\n if (typeof sharedState_yy.parseError === 'function') {\n this.parseError = function parseErrorAlt(str, hash, ExceptionClass) {\n if (!ExceptionClass) {\n ExceptionClass = this.JisonParserError;\n }\n return sharedState_yy.parseError.call(this, str, hash, ExceptionClass);\n };\n } else {\n this.parseError = this.originalParseError;\n }\n\n // Does the shared state override the default `quoteName` that already comes with this instance?\n if (typeof sharedState_yy.quoteName === 'function') {\n this.quoteName = function quoteNameAlt(id_str) {\n return sharedState_yy.quoteName.call(this, id_str);\n };\n } else {\n this.quoteName = this.originalQuoteName;\n }\n\n // set up the cleanup function; make it an API so that external code can re-use this one in case of\n // calamities or when the `%options no-try-catch` option has been specified for the grammar, in which\n // case this parse() API method doesn't come with a `finally { ... }` block any more!\n //\n // NOTE: as this API uses parse() as a closure, it MUST be set again on every parse() invocation,\n // or else your `sharedState`, etc. references will be *wrong*!\n this.cleanupAfterParse = function parser_cleanupAfterParse(resultValue, invoke_post_methods, do_not_nuke_errorinfos) {\n var rv;\n if (invoke_post_methods) {\n var hash;\n if (sharedState_yy.post_parse || this.post_parse) {\n // create an error hash info instance: we re-use this API in a **non-error situation**\n // as this one delivers all parser internals ready for access by userland code.\n hash = this.constructParseErrorInfo(null /* no error! */, null /* no exception! */, null, false);\n }\n if (sharedState_yy.post_parse) {\n rv = sharedState_yy.post_parse.call(this, sharedState_yy, resultValue, hash);\n if (typeof rv !== 'undefined') resultValue = rv;\n }\n if (this.post_parse) {\n rv = this.post_parse.call(this, sharedState_yy, resultValue, hash);\n if (typeof rv !== 'undefined') resultValue = rv;\n }\n\n // cleanup:\n if (hash && hash.destroy) {\n hash.destroy();\n }\n }\n if (this.__reentrant_call_depth > 1) return resultValue; // do not (yet) kill the sharedState when this is a reentrant run.\n\n // clean up the lingering lexer structures as well:\n if (lexer.cleanupAfterLex) {\n lexer.cleanupAfterLex(do_not_nuke_errorinfos);\n }\n\n // prevent lingering circular references from causing memory leaks:\n if (sharedState_yy) {\n sharedState_yy.lexer = undefined;\n sharedState_yy.parser = undefined;\n if (lexer.yy === sharedState_yy) {\n lexer.yy = undefined;\n }\n }\n sharedState_yy = undefined;\n this.parseError = this.originalParseError;\n this.quoteName = this.originalQuoteName;\n\n // nuke the vstack[] array at least as that one will still reference obsoleted user values.\n // To be safe, we nuke the other internal stack columns as well...\n stack.length = 0; // fastest way to nuke an array without overly bothering the GC\n sstack.length = 0;\n vstack.length = 0;\n sp = 0;\n\n // nuke the error hash info instances created during this run.\n // Userland code must COPY any data/references\n // in the error hash instance(s) it is more permanently interested in.\n if (!do_not_nuke_errorinfos) {\n for (var i = this.__error_infos.length - 1; i >= 0; i--) {\n var el = this.__error_infos[i];\n if (el && typeof el.destroy === 'function') {\n el.destroy();\n }\n }\n this.__error_infos.length = 0;\n }\n return resultValue;\n };\n\n // NOTE: as this API uses parse() as a closure, it MUST be set again on every parse() invocation,\n // or else your `lexer`, `sharedState`, etc. references will be *wrong*!\n this.constructParseErrorInfo = function parser_constructParseErrorInfo(msg, ex, expected, recoverable) {\n var pei = {\n errStr: msg,\n exception: ex,\n text: lexer.match,\n value: lexer.yytext,\n token: this.describeSymbol(symbol) || symbol,\n token_id: symbol,\n line: lexer.yylineno,\n expected: expected,\n recoverable: recoverable,\n state: state,\n action: action,\n new_state: newState,\n symbol_stack: stack,\n state_stack: sstack,\n value_stack: vstack,\n stack_pointer: sp,\n yy: sharedState_yy,\n lexer: lexer,\n parser: this,\n // and make sure the error info doesn't stay due to potential\n // ref cycle via userland code manipulations.\n // These would otherwise all be memory leak opportunities!\n //\n // Note that only array and object references are nuked as those\n // constitute the set of elements which can produce a cyclic ref.\n // The rest of the members is kept intact as they are harmless.\n destroy: function destructParseErrorInfo() {\n // remove cyclic references added to error info:\n // info.yy = null;\n // info.lexer = null;\n // info.value = null;\n // info.value_stack = null;\n // ...\n var rec = !!this.recoverable;\n for (var key in this) {\n if (this.hasOwnProperty(key) && typeof key === 'object') {\n this[key] = undefined;\n }\n }\n this.recoverable = rec;\n }\n };\n // track this instance so we can `destroy()` it once we deem it superfluous and ready for garbage collection!\n this.__error_infos.push(pei);\n return pei;\n };\n function getNonTerminalFromCode(symbol) {\n var tokenName = self.getSymbolName(symbol);\n if (!tokenName) {\n tokenName = symbol;\n }\n return tokenName;\n }\n function stdLex() {\n var token = lexer.lex();\n // if token isn't its numeric value, convert\n if (typeof token !== 'number') {\n token = self.symbols_[token] || token;\n }\n return token || EOF;\n }\n function fastLex() {\n var token = lexer.fastLex();\n // if token isn't its numeric value, convert\n if (typeof token !== 'number') {\n token = self.symbols_[token] || token;\n }\n return token || EOF;\n }\n var lex = stdLex;\n var state, action, r, t;\n var yyval = {\n $: true,\n _$: undefined,\n yy: sharedState_yy\n };\n var p;\n var yyrulelen;\n var this_production;\n var newState;\n var retval = false;\n try {\n this.__reentrant_call_depth++;\n lexer.setInput(input, sharedState_yy);\n\n // NOTE: we *assume* no lexer pre/post handlers are set up *after* \n // this initial `setInput()` call: hence we can now check and decide\n // whether we'll go with the standard, slower, lex() API or the\n // `fast_lex()` one:\n if (typeof lexer.canIUse === 'function') {\n var lexerInfo = lexer.canIUse();\n if (lexerInfo.fastLex && typeof fastLex === 'function') {\n lex = fastLex;\n }\n }\n vstack[sp] = null;\n sstack[sp] = 0;\n stack[sp] = 0;\n ++sp;\n if (this.pre_parse) {\n this.pre_parse.call(this, sharedState_yy);\n }\n if (sharedState_yy.pre_parse) {\n sharedState_yy.pre_parse.call(this, sharedState_yy);\n }\n newState = sstack[sp - 1];\n for (;;) {\n // retrieve state number from top of stack\n state = newState; // sstack[sp - 1];\n\n // use default actions if available\n if (this.defaultActions[state]) {\n action = 2;\n newState = this.defaultActions[state];\n } else {\n // The single `==` condition below covers both these `===` comparisons in a single\n // operation:\n //\n // if (symbol === null || typeof symbol === 'undefined') ...\n if (!symbol) {\n symbol = lex();\n }\n // read action for current state and first input\n t = table[state] && table[state][symbol] || NO_ACTION;\n newState = t[1];\n action = t[0];\n\n // handle parse error\n if (!action) {\n var errStr;\n var errSymbolDescr = this.describeSymbol(symbol) || symbol;\n var expected = this.collect_expected_token_set(state);\n\n // Report error\n if (typeof lexer.yylineno === 'number') {\n errStr = 'Parse error on line ' + (lexer.yylineno + 1) + ': ';\n } else {\n errStr = 'Parse error: ';\n }\n if (typeof lexer.showPosition === 'function') {\n errStr += '\\n' + lexer.showPosition(79 - 10, 10) + '\\n';\n }\n if (expected.length) {\n errStr += 'Expecting ' + expected.join(', ') + ', got unexpected ' + errSymbolDescr;\n } else {\n errStr += 'Unexpected ' + errSymbolDescr;\n }\n // we cannot recover from the error!\n p = this.constructParseErrorInfo(errStr, null, expected, false);\n r = this.parseError(p.errStr, p, this.JisonParserError);\n if (typeof r !== 'undefined') {\n retval = r;\n }\n break;\n }\n }\n switch (action) {\n // catch misc. parse failures:\n default:\n // this shouldn't happen, unless resolve defaults are off\n if (action instanceof Array) {\n p = this.constructParseErrorInfo('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol, null, null, false);\n r = this.parseError(p.errStr, p, this.JisonParserError);\n if (typeof r !== 'undefined') {\n retval = r;\n }\n break;\n }\n // Another case of better safe than sorry: in case state transitions come out of another error recovery process\n // or a buggy LUT (LookUp Table):\n p = this.constructParseErrorInfo('Parsing halted. No viable error recovery approach available due to internal system failure.', null, null, false);\n r = this.parseError(p.errStr, p, this.JisonParserError);\n if (typeof r !== 'undefined') {\n retval = r;\n }\n break;\n\n // shift:\n case 1:\n stack[sp] = symbol;\n vstack[sp] = lexer.yytext;\n sstack[sp] = newState; // push state\n\n ++sp;\n symbol = 0;\n\n // Pick up the lexer details for the current symbol as that one is not 'look-ahead' any more:\n\n continue;\n\n // reduce:\n case 2:\n this_production = this.productions_[newState - 1]; // `this.productions_[]` is zero-based indexed while states start from 1 upwards...\n yyrulelen = this_production[1];\n r = this.performAction.call(yyval, newState, sp - 1, vstack);\n if (typeof r !== 'undefined') {\n retval = r;\n break;\n }\n\n // pop off stack\n sp -= yyrulelen;\n\n // don't overwrite the `symbol` variable: use a local var to speed things up:\n var ntsymbol = this_production[0]; // push nonterminal (reduce)\n stack[sp] = ntsymbol;\n vstack[sp] = yyval.$;\n\n // goto new state = table[STATE][NONTERMINAL]\n newState = table[sstack[sp - 1]][ntsymbol];\n sstack[sp] = newState;\n ++sp;\n continue;\n\n // accept:\n case 3:\n if (sp !== -2) {\n retval = true;\n // Return the `$accept` rule's `$$` result, if available.\n //\n // Also note that JISON always adds this top-most `$accept` rule (with implicit,\n // default, action):\n //\n // $accept: $end\n // %{ $$ = $1; @$ = @1; %}\n //\n // which, combined with the parse kernel's `$accept` state behaviour coded below,\n // will produce the `$$` value output of the rule as the parse result,\n // IFF that result is *not* `undefined`. (See also the parser kernel code.)\n //\n // In code:\n //\n // %{\n // @$ = @1; // if location tracking support is included\n // if (typeof $1 !== 'undefined')\n // return $1;\n // else\n // return true; // the default parse result if the rule actions don't produce anything\n // %}\n sp--;\n if (typeof vstack[sp] !== 'undefined') {\n retval = vstack[sp];\n }\n }\n break;\n }\n\n // break out of loop: we accept or fail with error\n break;\n }\n } catch (ex) {\n // report exceptions through the parseError callback too, but keep the exception intact\n // if it is a known parser or lexer error which has been thrown by parseError() already:\n if (ex instanceof this.JisonParserError) {\n throw ex;\n } else if (lexer && typeof lexer.JisonLexerError === 'function' && ex instanceof lexer.JisonLexerError) {\n throw ex;\n }\n p = this.constructParseErrorInfo('Parsing aborted due to exception.', ex, null, false);\n retval = false;\n r = this.parseError(p.errStr, p, this.JisonParserError);\n if (typeof r !== 'undefined') {\n retval = r;\n }\n } finally {\n retval = this.cleanupAfterParse(retval, true, true);\n this.__reentrant_call_depth--;\n } // /finally\n\n return retval;\n }\n };\n parser.originalParseError = parser.parseError;\n parser.originalQuoteName = parser.quoteName;\n /* lexer generated by jison-lex 0.6.1-215 */\n\n /*\n * Returns a Lexer object of the following structure:\n *\n * Lexer: {\n * yy: {} The so-called \"shared state\" or rather the *source* of it;\n * the real \"shared state\" `yy` passed around to\n * the rule actions, etc. is a direct reference!\n *\n * This \"shared context\" object was passed to the lexer by way of \n * the `lexer.setInput(str, yy)` API before you may use it.\n *\n * This \"shared context\" object is passed to the lexer action code in `performAction()`\n * so userland code in the lexer actions may communicate with the outside world \n * and/or other lexer rules' actions in more or less complex ways.\n *\n * }\n *\n * Lexer.prototype: {\n * EOF: 1,\n * ERROR: 2,\n *\n * yy: The overall \"shared context\" object reference.\n *\n * JisonLexerError: function(msg, hash),\n *\n * performAction: function lexer__performAction(yy, yyrulenumber, YY_START),\n *\n * The function parameters and `this` have the following value/meaning:\n * - `this` : reference to the `lexer` instance. \n * `yy_` is an alias for `this` lexer instance reference used internally.\n *\n * - `yy` : a reference to the `yy` \"shared state\" object which was passed to the lexer\n * by way of the `lexer.setInput(str, yy)` API before.\n *\n * Note:\n * The extra arguments you specified in the `%parse-param` statement in your\n * **parser** grammar definition file are passed to the lexer via this object\n * reference as member variables.\n *\n * - `yyrulenumber` : index of the matched lexer rule (regex), used internally.\n *\n * - `YY_START`: the current lexer \"start condition\" state.\n *\n * parseError: function(str, hash, ExceptionClass),\n *\n * constructLexErrorInfo: function(error_message, is_recoverable),\n * Helper function.\n * Produces a new errorInfo 'hash object' which can be passed into `parseError()`.\n * See it's use in this lexer kernel in many places; example usage:\n *\n * var infoObj = lexer.constructParseErrorInfo('fail!', true);\n * var retVal = lexer.parseError(infoObj.errStr, infoObj, lexer.JisonLexerError);\n *\n * options: { ... lexer %options ... },\n *\n * lex: function(),\n * Produce one token of lexed input, which was passed in earlier via the `lexer.setInput()` API.\n * You MAY use the additional `args...` parameters as per `%parse-param` spec of the **lexer** grammar:\n * these extra `args...` are added verbatim to the `yy` object reference as member variables.\n *\n * WARNING:\n * Lexer's additional `args...` parameters (via lexer's `%parse-param`) MAY conflict with\n * any attributes already added to `yy` by the **parser** or the jison run-time; \n * when such a collision is detected an exception is thrown to prevent the generated run-time \n * from silently accepting this confusing and potentially hazardous situation! \n *\n * cleanupAfterLex: function(do_not_nuke_errorinfos),\n * Helper function.\n *\n * This helper API is invoked when the **parse process** has completed: it is the responsibility\n * of the **parser** (or the calling userland code) to invoke this method once cleanup is desired. \n *\n * This helper may be invoked by user code to ensure the internal lexer gets properly garbage collected.\n *\n * setInput: function(input, [yy]),\n *\n *\n * input: function(),\n *\n *\n * unput: function(str),\n *\n *\n * more: function(),\n *\n *\n * reject: function(),\n *\n *\n * less: function(n),\n *\n *\n * pastInput: function(n),\n *\n *\n * upcomingInput: function(n),\n *\n *\n * showPosition: function(),\n *\n *\n * test_match: function(regex_match_array, rule_index),\n *\n *\n * next: function(),\n *\n *\n * begin: function(condition),\n *\n *\n * pushState: function(condition),\n *\n *\n * popState: function(),\n *\n *\n * topState: function(),\n *\n *\n * _currentRules: function(),\n *\n *\n * stateStackSize: function(),\n *\n *\n * performAction: function(yy, yy_, yyrulenumber, YY_START),\n *\n *\n * rules: [...],\n *\n *\n * conditions: {associative list: name ==> set},\n * }\n *\n *\n * token location info (`yylloc`): {\n * first_line: n,\n * last_line: n,\n * first_column: n,\n * last_column: n,\n * range: [start_number, end_number]\n * (where the numbers are indexes into the input string, zero-based)\n * }\n *\n * ---\n *\n * The `parseError` function receives a 'hash' object with these members for lexer errors:\n *\n * {\n * text: (matched text)\n * token: (the produced terminal token, if any)\n * token_id: (the produced terminal token numeric ID, if any)\n * line: (yylineno)\n * loc: (yylloc)\n * recoverable: (boolean: TRUE when the parser MAY have an error recovery rule\n * available for this particular error)\n * yy: (object: the current parser internal \"shared state\" `yy`\n * as is also available in the rule actions; this can be used,\n * for instance, for advanced error analysis and reporting)\n * lexer: (reference to the current lexer instance used by the parser)\n * }\n *\n * while `this` will reference the current lexer instance.\n *\n * When `parseError` is invoked by the lexer, the default implementation will\n * attempt to invoke `yy.parser.parseError()`; when this callback is not provided\n * it will try to invoke `yy.parseError()` instead. When that callback is also not\n * provided, a `JisonLexerError` exception will be thrown containing the error\n * message and `hash`, as constructed by the `constructLexErrorInfo()` API.\n *\n * Note that the lexer's `JisonLexerError` error class is passed via the\n * `ExceptionClass` argument, which is invoked to construct the exception\n * instance to be thrown, so technically `parseError` will throw the object\n * produced by the `new ExceptionClass(str, hash)` JavaScript expression.\n *\n * ---\n *\n * You can specify lexer options by setting / modifying the `.options` object of your Lexer instance.\n * These options are available:\n *\n * (Options are permanent.)\n * \n * yy: {\n * parseError: function(str, hash, ExceptionClass)\n * optional: overrides the default `parseError` function.\n * }\n *\n * lexer.options: {\n * pre_lex: function()\n * optional: is invoked before the lexer is invoked to produce another token.\n * `this` refers to the Lexer object.\n * post_lex: function(token) { return token; }\n * optional: is invoked when the lexer has produced a token `token`;\n * this function can override the returned token value by returning another.\n * When it does not return any (truthy) value, the lexer will return\n * the original `token`.\n * `this` refers to the Lexer object.\n *\n * WARNING: the next set of options are not meant to be changed. They echo the abilities of\n * the lexer as per when it was compiled!\n *\n * ranges: boolean\n * optional: `true` ==> token location info will include a .range[] member.\n * flex: boolean\n * optional: `true` ==> flex-like lexing behaviour where the rules are tested\n * exhaustively to find the longest match.\n * backtrack_lexer: boolean\n * optional: `true` ==> lexer regexes are tested in order and for invoked;\n * the lexer terminates the scan when a token is returned by the action code.\n * xregexp: boolean\n * optional: `true` ==> lexer rule regexes are \"extended regex format\" requiring the\n * `XRegExp` library. When this %option has not been specified at compile time, all lexer\n * rule regexes have been written as standard JavaScript RegExp expressions.\n * }\n */\n\n var lexer = function () {\n /**\n * See also:\n * http://stackoverflow.com/questions/1382107/whats-a-good-way-to-extend-error-in-javascript/#35881508\n * but we keep the prototype.constructor and prototype.name assignment lines too for compatibility\n * with userland code which might access the derived class in a 'classic' way.\n *\n * @public\n * @constructor\n * @nocollapse\n */\n function JisonLexerError(msg, hash) {\n Object.defineProperty(this, 'name', {\n enumerable: false,\n writable: false,\n value: 'JisonLexerError'\n });\n if (msg == null) msg = '???';\n Object.defineProperty(this, 'message', {\n enumerable: false,\n writable: true,\n value: msg\n });\n this.hash = hash;\n var stacktrace;\n if (hash && hash.exception instanceof Error) {\n var ex2 = hash.exception;\n this.message = ex2.message || msg;\n stacktrace = ex2.stack;\n }\n if (!stacktrace) {\n if (Error.hasOwnProperty('captureStackTrace')) {\n // V8\n Error.captureStackTrace(this, this.constructor);\n } else {\n stacktrace = new Error(msg).stack;\n }\n }\n if (stacktrace) {\n Object.defineProperty(this, 'stack', {\n enumerable: false,\n writable: false,\n value: stacktrace\n });\n }\n }\n if (typeof Object.setPrototypeOf === 'function') {\n Object.setPrototypeOf(JisonLexerError.prototype, Error.prototype);\n } else {\n JisonLexerError.prototype = Object.create(Error.prototype);\n }\n JisonLexerError.prototype.constructor = JisonLexerError;\n JisonLexerError.prototype.name = 'JisonLexerError';\n var lexer = {\n // Code Generator Information Report\n // ---------------------------------\n //\n // Options:\n //\n // backtracking: .................... false\n // location.ranges: ................. false\n // location line+column tracking: ... true\n //\n //\n // Forwarded Parser Analysis flags:\n //\n // uses yyleng: ..................... false\n // uses yylineno: ................... false\n // uses yytext: ..................... false\n // uses yylloc: ..................... false\n // uses lexer values: ............... true / true\n // location tracking: ............... false\n // location assignment: ............. false\n //\n //\n // Lexer Analysis flags:\n //\n // uses yyleng: ..................... ???\n // uses yylineno: ................... ???\n // uses yytext: ..................... ???\n // uses yylloc: ..................... ???\n // uses ParseError API: ............. ???\n // uses yyerror: .................... ???\n // uses location tracking & editing: ???\n // uses more() API: ................. ???\n // uses unput() API: ................ ???\n // uses reject() API: ............... ???\n // uses less() API: ................. ???\n // uses display APIs pastInput(), upcomingInput(), showPosition():\n // ............................. ???\n // uses describeYYLLOC() API: ....... ???\n //\n // --------- END OF REPORT -----------\n\n EOF: 1,\n ERROR: 2,\n // JisonLexerError: JisonLexerError, /// <-- injected by the code generator\n\n // options: {}, /// <-- injected by the code generator\n\n // yy: ..., /// <-- injected by setInput()\n\n __currentRuleSet__: null,\n /// INTERNAL USE ONLY: internal rule set cache for the current lexer state \n\n __error_infos: [],\n /// INTERNAL USE ONLY: the set of lexErrorInfo objects created since the last cleanup \n __decompressed: false,\n /// INTERNAL USE ONLY: mark whether the lexer instance has been 'unfolded' completely and is now ready for use \n done: false,\n /// INTERNAL USE ONLY \n _backtrack: false,\n /// INTERNAL USE ONLY \n _input: '',\n /// INTERNAL USE ONLY \n _more: false,\n /// INTERNAL USE ONLY \n _signaled_error_token: false,\n /// INTERNAL USE ONLY \n conditionStack: [],\n /// INTERNAL USE ONLY; managed via `pushState()`, `popState()`, `topState()` and `stateStackSize()` \n match: '',\n /// READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks input which has been matched so far for the lexer token under construction. `match` is identical to `yytext` except that this one still contains the matched input string after `lexer.performAction()` has been invoked, where userland code MAY have changed/replaced the `yytext` value entirely! \n matched: '',\n /// READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks entire input which has been matched so far \n matches: false,\n /// READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks RE match result for last (successful) match attempt \n yytext: '',\n /// ADVANCED USE ONLY: tracks input which has been matched so far for the lexer token under construction; this value is transferred to the parser as the 'token value' when the parser consumes the lexer token produced through a call to the `lex()` API. \n offset: 0,\n /// READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks the 'cursor position' in the input string, i.e. the number of characters matched so far \n yyleng: 0,\n /// READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: length of matched input for the token under construction (`yytext`) \n yylineno: 0,\n /// READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: 'line number' at which the token under construction is located \n yylloc: null,\n /// READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks location info (lines + columns) for the token under construction \n\n /**\n * INTERNAL USE: construct a suitable error info hash object instance for `parseError`.\n * \n * @public\n * @this {RegExpLexer}\n */\n constructLexErrorInfo: function lexer_constructLexErrorInfo(msg, recoverable, show_input_position) {\n msg = '' + msg;\n\n // heuristic to determine if the error message already contains a (partial) source code dump\n // as produced by either `showPosition()` or `prettyPrintRange()`:\n if (show_input_position == undefined) {\n show_input_position = !(msg.indexOf('\\n') > 0 && msg.indexOf('^') > 0);\n }\n if (this.yylloc && show_input_position) {\n if (typeof this.prettyPrintRange === 'function') {\n var pretty_src = this.prettyPrintRange(this.yylloc);\n if (!/\\n\\s*$/.test(msg)) {\n msg += '\\n';\n }\n msg += '\\n Erroneous area:\\n' + this.prettyPrintRange(this.yylloc);\n } else if (typeof this.showPosition === 'function') {\n var pos_str = this.showPosition();\n if (pos_str) {\n if (msg.length && msg[msg.length - 1] !== '\\n' && pos_str[0] !== '\\n') {\n msg += '\\n' + pos_str;\n } else {\n msg += pos_str;\n }\n }\n }\n }\n\n /** @constructor */\n var pei = {\n errStr: msg,\n recoverable: !!recoverable,\n text: this.match,\n // This one MAY be empty; userland code should use the `upcomingInput` API to obtain more text which follows the 'lexer cursor position'... \n token: null,\n line: this.yylineno,\n loc: this.yylloc,\n yy: this.yy,\n lexer: this,\n /**\n * and make sure the error info doesn't stay due to potential\n * ref cycle via userland code manipulations.\n * These would otherwise all be memory leak opportunities!\n * \n * Note that only array and object references are nuked as those\n * constitute the set of elements which can produce a cyclic ref.\n * The rest of the members is kept intact as they are harmless.\n * \n * @public\n * @this {LexErrorInfo}\n */\n destroy: function destructLexErrorInfo() {\n // remove cyclic references added to error info:\n // info.yy = null;\n // info.lexer = null;\n // ...\n var rec = !!this.recoverable;\n for (var key in this) {\n if (this.hasOwnProperty(key) && typeof key === 'object') {\n this[key] = undefined;\n }\n }\n this.recoverable = rec;\n }\n };\n\n // track this instance so we can `destroy()` it once we deem it superfluous and ready for garbage collection!\n this.__error_infos.push(pei);\n return pei;\n },\n /**\n * handler which is invoked when a lexer error occurs.\n * \n * @public\n * @this {RegExpLexer}\n */\n parseError: function lexer_parseError(str, hash, ExceptionClass) {\n if (!ExceptionClass) {\n ExceptionClass = this.JisonLexerError;\n }\n if (this.yy) {\n if (this.yy.parser && typeof this.yy.parser.parseError === 'function') {\n return this.yy.parser.parseError.call(this, str, hash, ExceptionClass) || this.ERROR;\n } else if (typeof this.yy.parseError === 'function') {\n return this.yy.parseError.call(this, str, hash, ExceptionClass) || this.ERROR;\n }\n }\n throw new ExceptionClass(str, hash);\n },\n /**\n * method which implements `yyerror(str, ...args)` functionality for use inside lexer actions.\n * \n * @public\n * @this {RegExpLexer}\n */\n yyerror: function yyError(str /*, ...args */) {\n var lineno_msg = '';\n if (this.yylloc) {\n lineno_msg = ' on line ' + (this.yylineno + 1);\n }\n var p = this.constructLexErrorInfo('Lexical error' + lineno_msg + ': ' + str, this.options.lexerErrorsAreRecoverable);\n\n // Add any extra args to the hash under the name `extra_error_attributes`:\n var args = Array.prototype.slice.call(arguments, 1);\n if (args.length) {\n p.extra_error_attributes = args;\n }\n return this.parseError(p.errStr, p, this.JisonLexerError) || this.ERROR;\n },\n /**\n * final cleanup function for when we have completed lexing the input;\n * make it an API so that external code can use this one once userland\n * code has decided it's time to destroy any lingering lexer error\n * hash object instances and the like: this function helps to clean\n * up these constructs, which *may* carry cyclic references which would\n * otherwise prevent the instances from being properly and timely\n * garbage-collected, i.e. this function helps prevent memory leaks!\n * \n * @public\n * @this {RegExpLexer}\n */\n cleanupAfterLex: function lexer_cleanupAfterLex(do_not_nuke_errorinfos) {\n // prevent lingering circular references from causing memory leaks:\n this.setInput('', {});\n\n // nuke the error hash info instances created during this run.\n // Userland code must COPY any data/references\n // in the error hash instance(s) it is more permanently interested in.\n if (!do_not_nuke_errorinfos) {\n for (var i = this.__error_infos.length - 1; i >= 0; i--) {\n var el = this.__error_infos[i];\n if (el && typeof el.destroy === 'function') {\n el.destroy();\n }\n }\n this.__error_infos.length = 0;\n }\n return this;\n },\n /**\n * clear the lexer token context; intended for internal use only\n * \n * @public\n * @this {RegExpLexer}\n */\n clear: function lexer_clear() {\n this.yytext = '';\n this.yyleng = 0;\n this.match = '';\n\n // - DO NOT reset `this.matched`\n this.matches = false;\n this._more = false;\n this._backtrack = false;\n var col = this.yylloc ? this.yylloc.last_column : 0;\n this.yylloc = {\n first_line: this.yylineno + 1,\n first_column: col,\n last_line: this.yylineno + 1,\n last_column: col,\n range: [this.offset, this.offset]\n };\n },\n /**\n * resets the lexer, sets new input\n * \n * @public\n * @this {RegExpLexer}\n */\n setInput: function lexer_setInput(input, yy) {\n this.yy = yy || this.yy || {};\n\n // also check if we've fully initialized the lexer instance,\n // including expansion work to be done to go from a loaded\n // lexer to a usable lexer:\n if (!this.__decompressed) {\n // step 1: decompress the regex list:\n var rules = this.rules;\n for (var i = 0, len = rules.length; i < len; i++) {\n var rule_re = rules[i];\n\n // compression: is the RE an xref to another RE slot in the rules[] table?\n if (typeof rule_re === 'number') {\n rules[i] = rules[rule_re];\n }\n }\n\n // step 2: unfold the conditions[] set to make these ready for use:\n var conditions = this.conditions;\n for (var k in conditions) {\n var spec = conditions[k];\n var rule_ids = spec.rules;\n var len = rule_ids.length;\n var rule_regexes = new Array(len + 1); // slot 0 is unused; we use a 1-based index approach here to keep the hottest code in `lexer_next()` fast and simple! \n var rule_new_ids = new Array(len + 1);\n for (var i = 0; i < len; i++) {\n var idx = rule_ids[i];\n var rule_re = rules[idx];\n rule_regexes[i + 1] = rule_re;\n rule_new_ids[i + 1] = idx;\n }\n spec.rules = rule_new_ids;\n spec.__rule_regexes = rule_regexes;\n spec.__rule_count = len;\n }\n this.__decompressed = true;\n }\n this._input = input || '';\n this.clear();\n this._signaled_error_token = false;\n this.done = false;\n this.yylineno = 0;\n this.matched = '';\n this.conditionStack = ['INITIAL'];\n this.__currentRuleSet__ = null;\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0,\n range: [0, 0]\n };\n this.offset = 0;\n return this;\n },\n /**\n * edit the remaining input via user-specified callback.\n * This can be used to forward-adjust the input-to-parse, \n * e.g. inserting macro expansions and alike in the\n * input which has yet to be lexed.\n * The behaviour of this API contrasts the `unput()` et al\n * APIs as those act on the *consumed* input, while this\n * one allows one to manipulate the future, without impacting\n * the current `yyloc` cursor location or any history. \n * \n * Use this API to help implement C-preprocessor-like\n * `#include` statements, etc.\n * \n * The provided callback must be synchronous and is\n * expected to return the edited input (string).\n *\n * The `cpsArg` argument value is passed to the callback\n * as-is.\n *\n * `callback` interface: \n * `function callback(input, cpsArg)`\n * \n * - `input` will carry the remaining-input-to-lex string\n * from the lexer.\n * - `cpsArg` is `cpsArg` passed into this API.\n * \n * The `this` reference for the callback will be set to\n * reference this lexer instance so that userland code\n * in the callback can easily and quickly access any lexer\n * API. \n *\n * When the callback returns a non-string-type falsey value,\n * we assume the callback did not edit the input and we\n * will using the input as-is.\n *\n * When the callback returns a non-string-type value, it\n * is converted to a string for lexing via the `\"\" + retval`\n * operation. (See also why: http://2ality.com/2012/03/converting-to-string.html \n * -- that way any returned object's `toValue()` and `toString()`\n * methods will be invoked in a proper/desirable order.)\n * \n * @public\n * @this {RegExpLexer}\n */\n editRemainingInput: function lexer_editRemainingInput(callback, cpsArg) {\n var rv = callback.call(this, this._input, cpsArg);\n if (typeof rv !== 'string') {\n if (rv) {\n this._input = '' + rv;\n }\n // else: keep `this._input` as is. \n } else {\n this._input = rv;\n }\n return this;\n },\n /**\n * consumes and returns one char from the input\n * \n * @public\n * @this {RegExpLexer}\n */\n input: function lexer_input() {\n if (!this._input) {\n //this.done = true; -- don't set `done` as we want the lex()/next() API to be able to produce one custom EOF token match after this anyhow. (lexer can match special <> tokens and perform user action code for a <> match, but only does so *once*)\n return null;\n }\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n\n // Count the linenumber up when we hit the LF (or a stand-alone CR).\n // On CRLF, the linenumber is incremented when you fetch the CR or the CRLF combo\n // and we advance immediately past the LF as well, returning both together as if\n // it was all a single 'character' only.\n var slice_len = 1;\n var lines = false;\n if (ch === '\\n') {\n lines = true;\n } else if (ch === '\\r') {\n lines = true;\n var ch2 = this._input[1];\n if (ch2 === '\\n') {\n slice_len++;\n ch += ch2;\n this.yytext += ch2;\n this.yyleng++;\n this.offset++;\n this.match += ch2;\n this.matched += ch2;\n this.yylloc.range[1]++;\n }\n }\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n this.yylloc.last_column = 0;\n } else {\n this.yylloc.last_column++;\n }\n this.yylloc.range[1]++;\n this._input = this._input.slice(slice_len);\n return ch;\n },\n /**\n * unshifts one char (or an entire string) into the input\n * \n * @public\n * @this {RegExpLexer}\n */\n unput: function lexer_unput(ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n this.yyleng = this.yytext.length;\n this.offset -= len;\n this.match = this.match.substr(0, this.match.length - len);\n this.matched = this.matched.substr(0, this.matched.length - len);\n if (lines.length > 1) {\n this.yylineno -= lines.length - 1;\n this.yylloc.last_line = this.yylineno + 1;\n\n // Get last entirely matched line into the `pre_lines[]` array's\n // last index slot; we don't mind when other previously \n // matched lines end up in the array too. \n var pre = this.match;\n var pre_lines = pre.split(/(?:\\r\\n?|\\n)/g);\n if (pre_lines.length === 1) {\n pre = this.matched;\n pre_lines = pre.split(/(?:\\r\\n?|\\n)/g);\n }\n this.yylloc.last_column = pre_lines[pre_lines.length - 1].length;\n } else {\n this.yylloc.last_column -= len;\n }\n this.yylloc.range[1] = this.yylloc.range[0] + this.yyleng;\n this.done = false;\n return this;\n },\n /**\n * cache matched text and append it on next action\n * \n * @public\n * @this {RegExpLexer}\n */\n more: function lexer_more() {\n this._more = true;\n return this;\n },\n /**\n * signal the lexer that this rule fails to match the input, so the\n * next matching rule (regex) should be tested instead.\n * \n * @public\n * @this {RegExpLexer}\n */\n reject: function lexer_reject() {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n // when the `parseError()` call returns, we MUST ensure that the error is registered.\n // We accomplish this by signaling an 'error' token to be produced for the current\n // `.lex()` run.\n var lineno_msg = '';\n if (this.yylloc) {\n lineno_msg = ' on line ' + (this.yylineno + 1);\n }\n var p = this.constructLexErrorInfo('Lexical error' + lineno_msg + ': You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).', false);\n this._signaled_error_token = this.parseError(p.errStr, p, this.JisonLexerError) || this.ERROR;\n }\n return this;\n },\n /**\n * retain first n characters of the match\n * \n * @public\n * @this {RegExpLexer}\n */\n less: function lexer_less(n) {\n return this.unput(this.match.slice(n));\n },\n /**\n * return (part of the) already matched input, i.e. for error\n * messages.\n * \n * Limit the returned string length to `maxSize` (default: 20).\n * \n * Limit the returned string to the `maxLines` number of lines of\n * input (default: 1).\n * \n * Negative limit values equal *unlimited*.\n * \n * @public\n * @this {RegExpLexer}\n */\n pastInput: function lexer_pastInput(maxSize, maxLines) {\n var past = this.matched.substring(0, this.matched.length - this.match.length);\n if (maxSize < 0) maxSize = past.length;else if (!maxSize) maxSize = 20;\n if (maxLines < 0) maxLines = past.length; // can't ever have more input lines than this! \n else if (!maxLines) maxLines = 1;\n\n // `substr` anticipation: treat \\r\\n as a single character and take a little\n // more than necessary so that we can still properly check against maxSize\n // after we've transformed and limited the newLines in here:\n past = past.substr(-maxSize * 2 - 2);\n\n // now that we have a significantly reduced string to process, transform the newlines\n // and chop them, then limit them:\n var a = past.replace(/\\r\\n|\\r/g, '\\n').split('\\n');\n a = a.slice(-maxLines);\n past = a.join('\\n');\n\n // When, after limiting to maxLines, we still have too much to return,\n // do add an ellipsis prefix...\n if (past.length > maxSize) {\n past = '...' + past.substr(-maxSize);\n }\n return past;\n },\n /**\n * return (part of the) upcoming input, i.e. for error messages.\n * \n * Limit the returned string length to `maxSize` (default: 20).\n * \n * Limit the returned string to the `maxLines` number of lines of input (default: 1).\n * \n * Negative limit values equal *unlimited*.\n *\n * > ### NOTE ###\n * >\n * > *\"upcoming input\"* is defined as the whole of the both\n * > the *currently lexed* input, together with any remaining input\n * > following that. *\"currently lexed\"* input is the input \n * > already recognized by the lexer but not yet returned with\n * > the lexer token. This happens when you are invoking this API\n * > from inside any lexer rule action code block. \n * >\n * \n * @public\n * @this {RegExpLexer}\n */\n upcomingInput: function lexer_upcomingInput(maxSize, maxLines) {\n var next = this.match;\n if (maxSize < 0) maxSize = next.length + this._input.length;else if (!maxSize) maxSize = 20;\n if (maxLines < 0) maxLines = maxSize; // can't ever have more input lines than this! \n else if (!maxLines) maxLines = 1;\n\n // `substring` anticipation: treat \\r\\n as a single character and take a little\n // more than necessary so that we can still properly check against maxSize\n // after we've transformed and limited the newLines in here:\n if (next.length < maxSize * 2 + 2) {\n next += this._input.substring(0, maxSize * 2 + 2); // substring is faster on Chrome/V8 \n }\n\n // now that we have a significantly reduced string to process, transform the newlines\n // and chop them, then limit them:\n var a = next.replace(/\\r\\n|\\r/g, '\\n').split('\\n');\n a = a.slice(0, maxLines);\n next = a.join('\\n');\n\n // When, after limiting to maxLines, we still have too much to return,\n // do add an ellipsis postfix...\n if (next.length > maxSize) {\n next = next.substring(0, maxSize) + '...';\n }\n return next;\n },\n /**\n * return a string which displays the character position where the\n * lexing error occurred, i.e. for error messages\n * \n * @public\n * @this {RegExpLexer}\n */\n showPosition: function lexer_showPosition(maxPrefix, maxPostfix) {\n var pre = this.pastInput(maxPrefix).replace(/\\s/g, ' ');\n var c = new Array(pre.length + 1).join('-');\n return pre + this.upcomingInput(maxPostfix).replace(/\\s/g, ' ') + '\\n' + c + '^';\n },\n /**\n * return an YYLLOC info object derived off the given context (actual, preceding, following, current).\n * Use this method when the given `actual` location is not guaranteed to exist (i.e. when\n * it MAY be NULL) and you MUST have a valid location info object anyway:\n * then we take the given context of the `preceding` and `following` locations, IFF those are available,\n * and reconstruct the `actual` location info from those.\n * If this fails, the heuristic is to take the `current` location, IFF available.\n * If this fails as well, we assume the sought location is at/around the current lexer position\n * and then produce that one as a response. DO NOTE that these heuristic/derived location info\n * values MAY be inaccurate!\n *\n * NOTE: `deriveLocationInfo()` ALWAYS produces a location info object *copy* of `actual`, not just\n * a *reference* hence all input location objects can be assumed to be 'constant' (function has no side-effects).\n * \n * @public\n * @this {RegExpLexer}\n */\n deriveLocationInfo: function lexer_deriveYYLLOC(actual, preceding, following, current) {\n var loc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0,\n range: [0, 0]\n };\n if (actual) {\n loc.first_line = actual.first_line | 0;\n loc.last_line = actual.last_line | 0;\n loc.first_column = actual.first_column | 0;\n loc.last_column = actual.last_column | 0;\n if (actual.range) {\n loc.range[0] = actual.range[0] | 0;\n loc.range[1] = actual.range[1] | 0;\n }\n }\n if (loc.first_line <= 0 || loc.last_line < loc.first_line) {\n // plan B: heuristic using preceding and following:\n if (loc.first_line <= 0 && preceding) {\n loc.first_line = preceding.last_line | 0;\n loc.first_column = preceding.last_column | 0;\n if (preceding.range) {\n loc.range[0] = actual.range[1] | 0;\n }\n }\n if ((loc.last_line <= 0 || loc.last_line < loc.first_line) && following) {\n loc.last_line = following.first_line | 0;\n loc.last_column = following.first_column | 0;\n if (following.range) {\n loc.range[1] = actual.range[0] | 0;\n }\n }\n\n // plan C?: see if the 'current' location is useful/sane too:\n if (loc.first_line <= 0 && current && (loc.last_line <= 0 || current.last_line <= loc.last_line)) {\n loc.first_line = current.first_line | 0;\n loc.first_column = current.first_column | 0;\n if (current.range) {\n loc.range[0] = current.range[0] | 0;\n }\n }\n if (loc.last_line <= 0 && current && (loc.first_line <= 0 || current.first_line >= loc.first_line)) {\n loc.last_line = current.last_line | 0;\n loc.last_column = current.last_column | 0;\n if (current.range) {\n loc.range[1] = current.range[1] | 0;\n }\n }\n }\n\n // sanitize: fix last_line BEFORE we fix first_line as we use the 'raw' value of the latter\n // or plan D heuristics to produce a 'sensible' last_line value:\n if (loc.last_line <= 0) {\n if (loc.first_line <= 0) {\n loc.first_line = this.yylloc.first_line;\n loc.last_line = this.yylloc.last_line;\n loc.first_column = this.yylloc.first_column;\n loc.last_column = this.yylloc.last_column;\n loc.range[0] = this.yylloc.range[0];\n loc.range[1] = this.yylloc.range[1];\n } else {\n loc.last_line = this.yylloc.last_line;\n loc.last_column = this.yylloc.last_column;\n loc.range[1] = this.yylloc.range[1];\n }\n }\n if (loc.first_line <= 0) {\n loc.first_line = loc.last_line;\n loc.first_column = 0; // loc.last_column; \n loc.range[1] = loc.range[0];\n }\n if (loc.first_column < 0) {\n loc.first_column = 0;\n }\n if (loc.last_column < 0) {\n loc.last_column = loc.first_column > 0 ? loc.first_column : 80;\n }\n return loc;\n },\n /**\n * return a string which displays the lines & columns of input which are referenced \n * by the given location info range, plus a few lines of context.\n * \n * This function pretty-prints the indicated section of the input, with line numbers \n * and everything!\n * \n * This function is very useful to provide highly readable error reports, while\n * the location range may be specified in various flexible ways:\n * \n * - `loc` is the location info object which references the area which should be\n * displayed and 'marked up': these lines & columns of text are marked up by `^`\n * characters below each character in the entire input range.\n * \n * - `context_loc` is the *optional* location info object which instructs this\n * pretty-printer how much *leading* context should be displayed alongside\n * the area referenced by `loc`. This can help provide context for the displayed\n * error, etc.\n * \n * When this location info is not provided, a default context of 3 lines is\n * used.\n * \n * - `context_loc2` is another *optional* location info object, which serves\n * a similar purpose to `context_loc`: it specifies the amount of *trailing*\n * context lines to display in the pretty-print output.\n * \n * When this location info is not provided, a default context of 1 line only is\n * used.\n * \n * Special Notes:\n * \n * - when the `loc`-indicated range is very large (about 5 lines or more), then\n * only the first and last few lines of this block are printed while a\n * `...continued...` message will be printed between them.\n * \n * This serves the purpose of not printing a huge amount of text when the `loc`\n * range happens to be huge: this way a manageable & readable output results\n * for arbitrary large ranges.\n * \n * - this function can display lines of input which whave not yet been lexed.\n * `prettyPrintRange()` can access the entire input!\n * \n * @public\n * @this {RegExpLexer}\n */\n prettyPrintRange: function lexer_prettyPrintRange(loc, context_loc, context_loc2) {\n loc = this.deriveLocationInfo(loc, context_loc, context_loc2);\n var CONTEXT = 3;\n var CONTEXT_TAIL = 1;\n var MINIMUM_VISIBLE_NONEMPTY_LINE_COUNT = 2;\n var input = this.matched + this._input;\n var lines = input.split('\\n');\n var l0 = Math.max(1, context_loc ? context_loc.first_line : loc.first_line - CONTEXT);\n var l1 = Math.max(1, context_loc2 ? context_loc2.last_line : loc.last_line + CONTEXT_TAIL);\n var lineno_display_width = 1 + Math.log10(l1 | 1) | 0;\n var ws_prefix = new Array(lineno_display_width).join(' ');\n var nonempty_line_indexes = [];\n var rv = lines.slice(l0 - 1, l1 + 1).map(function injectLineNumber(line, index) {\n var lno = index + l0;\n var lno_pfx = (ws_prefix + lno).substr(-lineno_display_width);\n var rv = lno_pfx + ': ' + line;\n var errpfx = new Array(lineno_display_width + 1).join('^');\n var offset = 2 + 1;\n var len = 0;\n if (lno === loc.first_line) {\n offset += loc.first_column;\n len = Math.max(2, (lno === loc.last_line ? loc.last_column : line.length) - loc.first_column + 1);\n } else if (lno === loc.last_line) {\n len = Math.max(2, loc.last_column + 1);\n } else if (lno > loc.first_line && lno < loc.last_line) {\n len = Math.max(2, line.length + 1);\n }\n if (len) {\n var lead = new Array(offset).join('.');\n var mark = new Array(len).join('^');\n rv += '\\n' + errpfx + lead + mark;\n if (line.trim().length > 0) {\n nonempty_line_indexes.push(index);\n }\n }\n rv = rv.replace(/\\t/g, ' ');\n return rv;\n });\n\n // now make sure we don't print an overly large amount of error area: limit it \n // to the top and bottom line count:\n if (nonempty_line_indexes.length > 2 * MINIMUM_VISIBLE_NONEMPTY_LINE_COUNT) {\n var clip_start = nonempty_line_indexes[MINIMUM_VISIBLE_NONEMPTY_LINE_COUNT - 1] + 1;\n var clip_end = nonempty_line_indexes[nonempty_line_indexes.length - MINIMUM_VISIBLE_NONEMPTY_LINE_COUNT] - 1;\n var intermediate_line = new Array(lineno_display_width + 1).join(' ') + ' (...continued...)';\n intermediate_line += '\\n' + new Array(lineno_display_width + 1).join('-') + ' (---------------)';\n rv.splice(clip_start, clip_end - clip_start + 1, intermediate_line);\n }\n return rv.join('\\n');\n },\n /**\n * helper function, used to produce a human readable description as a string, given\n * the input `yylloc` location object.\n * \n * Set `display_range_too` to TRUE to include the string character index position(s)\n * in the description if the `yylloc.range` is available.\n * \n * @public\n * @this {RegExpLexer}\n */\n describeYYLLOC: function lexer_describe_yylloc(yylloc, display_range_too) {\n var l1 = yylloc.first_line;\n var l2 = yylloc.last_line;\n var c1 = yylloc.first_column;\n var c2 = yylloc.last_column;\n var dl = l2 - l1;\n var dc = c2 - c1;\n var rv;\n if (dl === 0) {\n rv = 'line ' + l1 + ', ';\n if (dc <= 1) {\n rv += 'column ' + c1;\n } else {\n rv += 'columns ' + c1 + ' .. ' + c2;\n }\n } else {\n rv = 'lines ' + l1 + '(column ' + c1 + ') .. ' + l2 + '(column ' + c2 + ')';\n }\n if (yylloc.range && display_range_too) {\n var r1 = yylloc.range[0];\n var r2 = yylloc.range[1] - 1;\n if (r2 <= r1) {\n rv += ' {String Offset: ' + r1 + '}';\n } else {\n rv += ' {String Offset range: ' + r1 + ' .. ' + r2 + '}';\n }\n }\n return rv;\n },\n /**\n * test the lexed token: return FALSE when not a match, otherwise return token.\n * \n * `match` is supposed to be an array coming out of a regex match, i.e. `match[0]`\n * contains the actually matched text string.\n * \n * Also move the input cursor forward and update the match collectors:\n * \n * - `yytext`\n * - `yyleng`\n * - `match`\n * - `matches`\n * - `yylloc`\n * - `offset`\n * \n * @public\n * @this {RegExpLexer}\n */\n test_match: function lexer_test_match(match, indexed_rule) {\n var token, lines, backup, match_str, match_str_len;\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.yylloc.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column,\n range: this.yylloc.range.slice(0)\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n //_signaled_error_token: this._signaled_error_token,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n }\n match_str = match[0];\n match_str_len = match_str.length;\n\n // if (match_str.indexOf('\\n') !== -1 || match_str.indexOf('\\r') !== -1) {\n lines = match_str.split(/(?:\\r\\n?|\\n)/g);\n if (lines.length > 1) {\n this.yylineno += lines.length - 1;\n this.yylloc.last_line = this.yylineno + 1;\n this.yylloc.last_column = lines[lines.length - 1].length;\n } else {\n this.yylloc.last_column += match_str_len;\n }\n\n // }\n this.yytext += match_str;\n this.match += match_str;\n this.matched += match_str;\n this.matches = match;\n this.yyleng = this.yytext.length;\n this.yylloc.range[1] += match_str_len;\n\n // previous lex rules MAY have invoked the `more()` API rather than producing a token:\n // those rules will already have moved this `offset` forward matching their match lengths,\n // hence we must only add our own match length now:\n this.offset += match_str_len;\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match_str_len);\n\n // calling this method:\n //\n // function lexer__performAction(yy, yyrulenumber, YY_START) {...}\n token = this.performAction.call(this, this.yy, indexed_rule, this.conditionStack[this.conditionStack.length - 1] /* = YY_START */);\n\n // otherwise, when the action codes are all simple return token statements:\n //token = this.simpleCaseActionClusters[indexed_rule];\n\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n this.__currentRuleSet__ = null;\n return false; // rule action called reject() implying the next rule should be tested instead. \n } else if (this._signaled_error_token) {\n // produce one 'error' token as `.parseError()` in `reject()`\n // did not guarantee a failure signal by throwing an exception!\n token = this._signaled_error_token;\n this._signaled_error_token = false;\n return token;\n }\n return false;\n },\n /**\n * return next match in input\n * \n * @public\n * @this {RegExpLexer}\n */\n next: function lexer_next() {\n if (this.done) {\n this.clear();\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n var token, match, tempMatch, index;\n if (!this._more) {\n this.clear();\n }\n var spec = this.__currentRuleSet__;\n if (!spec) {\n // Update the ruleset cache as we apparently encountered a state change or just started lexing.\n // The cache is set up for fast lookup -- we assume a lexer will switch states much less often than it will\n // invoke the `lex()` token-producing API and related APIs, hence caching the set for direct access helps\n // speed up those activities a tiny bit.\n spec = this.__currentRuleSet__ = this._currentRules();\n\n // Check whether a *sane* condition has been pushed before: this makes the lexer robust against\n // user-programmer bugs such as https://github.com/zaach/jison-lex/issues/19\n if (!spec || !spec.rules) {\n var lineno_msg = '';\n if (this.options.trackPosition) {\n lineno_msg = ' on line ' + (this.yylineno + 1);\n }\n var p = this.constructLexErrorInfo('Internal lexer engine error' + lineno_msg + ': The lex grammar programmer pushed a non-existing condition name \"' + this.topState() + '\"; this is a fatal error and should be reported to the application programmer team!', false);\n\n // produce one 'error' token until this situation has been resolved, most probably by parse termination!\n return this.parseError(p.errStr, p, this.JisonLexerError) || this.ERROR;\n }\n }\n var rule_ids = spec.rules;\n var regexes = spec.__rule_regexes;\n var len = spec.__rule_count;\n\n // Note: the arrays are 1-based, while `len` itself is a valid index,\n // hence the non-standard less-or-equal check in the next loop condition!\n for (var i = 1; i <= len; i++) {\n tempMatch = this._input.match(regexes[i]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rule_ids[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = undefined;\n continue; // rule action called reject() implying a rule MISmatch. \n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rule_ids[index]);\n if (token !== false) {\n return token;\n }\n\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (!this._input) {\n this.done = true;\n this.clear();\n return this.EOF;\n } else {\n var lineno_msg = '';\n if (this.options.trackPosition) {\n lineno_msg = ' on line ' + (this.yylineno + 1);\n }\n var p = this.constructLexErrorInfo('Lexical error' + lineno_msg + ': Unrecognized text.', this.options.lexerErrorsAreRecoverable);\n var pendingInput = this._input;\n var activeCondition = this.topState();\n var conditionStackDepth = this.conditionStack.length;\n token = this.parseError(p.errStr, p, this.JisonLexerError) || this.ERROR;\n if (token === this.ERROR) {\n // we can try to recover from a lexer error that `parseError()` did not 'recover' for us\n // by moving forward at least one character at a time IFF the (user-specified?) `parseError()`\n // has not consumed/modified any pending input or changed state in the error handler:\n if (!this.matches &&\n // and make sure the input has been modified/consumed ...\n pendingInput === this._input &&\n // ...or the lexer state has been modified significantly enough\n // to merit a non-consuming error handling action right now.\n activeCondition === this.topState() && conditionStackDepth === this.conditionStack.length) {\n this.input();\n }\n }\n return token;\n }\n },\n /**\n * return next match that has a token\n * \n * @public\n * @this {RegExpLexer}\n */\n lex: function lexer_lex() {\n var r;\n\n // allow the PRE/POST handlers set/modify the return token for maximum flexibility of the generated lexer:\n if (typeof this.pre_lex === 'function') {\n r = this.pre_lex.call(this, 0);\n }\n if (typeof this.options.pre_lex === 'function') {\n // (also account for a userdef function which does not return any value: keep the token as is)\n r = this.options.pre_lex.call(this, r) || r;\n }\n if (this.yy && typeof this.yy.pre_lex === 'function') {\n // (also account for a userdef function which does not return any value: keep the token as is)\n r = this.yy.pre_lex.call(this, r) || r;\n }\n while (!r) {\n r = this.next();\n }\n if (this.yy && typeof this.yy.post_lex === 'function') {\n // (also account for a userdef function which does not return any value: keep the token as is)\n r = this.yy.post_lex.call(this, r) || r;\n }\n if (typeof this.options.post_lex === 'function') {\n // (also account for a userdef function which does not return any value: keep the token as is)\n r = this.options.post_lex.call(this, r) || r;\n }\n if (typeof this.post_lex === 'function') {\n // (also account for a userdef function which does not return any value: keep the token as is)\n r = this.post_lex.call(this, r) || r;\n }\n return r;\n },\n /**\n * return next match that has a token. Identical to the `lex()` API but does not invoke any of the \n * `pre_lex()` nor any of the `post_lex()` callbacks.\n * \n * @public\n * @this {RegExpLexer}\n */\n fastLex: function lexer_fastLex() {\n var r;\n while (!r) {\n r = this.next();\n }\n return r;\n },\n /**\n * return info about the lexer state that can help a parser or other lexer API user to use the\n * most efficient means available. This API is provided to aid run-time performance for larger\n * systems which employ this lexer.\n * \n * @public\n * @this {RegExpLexer}\n */\n canIUse: function lexer_canIUse() {\n var rv = {\n fastLex: !(typeof this.pre_lex === 'function' || typeof this.options.pre_lex === 'function' || this.yy && typeof this.yy.pre_lex === 'function' || this.yy && typeof this.yy.post_lex === 'function' || typeof this.options.post_lex === 'function' || typeof this.post_lex === 'function') && typeof this.fastLex === 'function'\n };\n return rv;\n },\n /**\n * backwards compatible alias for `pushState()`;\n * the latter is symmetrical with `popState()` and we advise to use\n * those APIs in any modern lexer code, rather than `begin()`.\n * \n * @public\n * @this {RegExpLexer}\n */\n begin: function lexer_begin(condition) {\n return this.pushState(condition);\n },\n /**\n * activates a new lexer condition state (pushes the new lexer\n * condition state onto the condition stack)\n * \n * @public\n * @this {RegExpLexer}\n */\n pushState: function lexer_pushState(condition) {\n this.conditionStack.push(condition);\n this.__currentRuleSet__ = null;\n return this;\n },\n /**\n * pop the previously active lexer condition state off the condition\n * stack\n * \n * @public\n * @this {RegExpLexer}\n */\n popState: function lexer_popState() {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n this.__currentRuleSet__ = null;\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n /**\n * return the currently active lexer condition state; when an index\n * argument is provided it produces the N-th previous condition state,\n * if available\n * \n * @public\n * @this {RegExpLexer}\n */\n topState: function lexer_topState(n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return 'INITIAL';\n }\n },\n /**\n * (internal) determine the lexer rule set which is active for the\n * currently active lexer condition state\n * \n * @public\n * @this {RegExpLexer}\n */\n _currentRules: function lexer__currentRules() {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]];\n } else {\n return this.conditions['INITIAL'];\n }\n },\n /**\n * return the number of states currently on the stack\n * \n * @public\n * @this {RegExpLexer}\n */\n stateStackSize: function lexer_stateStackSize() {\n return this.conditionStack.length;\n },\n options: {\n trackPosition: true\n },\n JisonLexerError: JisonLexerError,\n performAction: function lexer__performAction(yy, yyrulenumber, YY_START) {\n var yy_ = this;\n var YYSTATE = YY_START;\n switch (yyrulenumber) {\n case 1:\n /*! Conditions:: INITIAL */\n /*! Rule:: \\s+ */\n /* skip whitespace */\n break;\n default:\n return this.simpleCaseActionClusters[yyrulenumber];\n }\n },\n simpleCaseActionClusters: {\n /*! Conditions:: INITIAL */\n /*! Rule:: (--[0-9a-z-A-Z-]*) */\n 0: 13,\n /*! Conditions:: INITIAL */\n /*! Rule:: \\* */\n 2: 5,\n /*! Conditions:: INITIAL */\n /*! Rule:: \\/ */\n 3: 6,\n /*! Conditions:: INITIAL */\n /*! Rule:: \\+ */\n 4: 3,\n /*! Conditions:: INITIAL */\n /*! Rule:: - */\n 5: 4,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)px\\b */\n 6: 15,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)cm\\b */\n 7: 15,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)mm\\b */\n 8: 15,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)in\\b */\n 9: 15,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)pt\\b */\n 10: 15,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)pc\\b */\n 11: 15,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)deg\\b */\n 12: 16,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)grad\\b */\n 13: 16,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)rad\\b */\n 14: 16,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)turn\\b */\n 15: 16,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)s\\b */\n 16: 17,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)ms\\b */\n 17: 17,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)Hz\\b */\n 18: 18,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)kHz\\b */\n 19: 18,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)dpi\\b */\n 20: 19,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)dpcm\\b */\n 21: 19,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)dppx\\b */\n 22: 19,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)em\\b */\n 23: 20,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)ex\\b */\n 24: 21,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)ch\\b */\n 25: 22,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)rem\\b */\n 26: 23,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)vw\\b */\n 27: 25,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)vh\\b */\n 28: 24,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)vmin\\b */\n 29: 26,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)vmax\\b */\n 30: 27,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)% */\n 31: 28,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([0-9]+(\\.[0-9]*)?|\\.[0-9]+)\\b */\n 32: 11,\n /*! Conditions:: INITIAL */\n /*! Rule:: (calc) */\n 33: 9,\n /*! Conditions:: INITIAL */\n /*! Rule:: (var) */\n 34: 12,\n /*! Conditions:: INITIAL */\n /*! Rule:: ([a-z]+) */\n 35: 10,\n /*! Conditions:: INITIAL */\n /*! Rule:: \\( */\n 36: 7,\n /*! Conditions:: INITIAL */\n /*! Rule:: \\) */\n 37: 8,\n /*! Conditions:: INITIAL */\n /*! Rule:: , */\n 38: 14,\n /*! Conditions:: INITIAL */\n /*! Rule:: $ */\n 39: 1\n },\n rules: [/* 0: */ /^(?:(--[\\d\\-A-Za-z]*))/, /* 1: */ /^(?:\\s+)/, /* 2: */ /^(?:\\*)/, /* 3: */ /^(?:\\/)/, /* 4: */ /^(?:\\+)/, /* 5: */ /^(?:-)/, /* 6: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)px\\b)/, /* 7: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)cm\\b)/, /* 8: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)mm\\b)/, /* 9: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)in\\b)/, /* 10: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)pt\\b)/, /* 11: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)pc\\b)/, /* 12: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)deg\\b)/, /* 13: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)grad\\b)/, /* 14: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)rad\\b)/, /* 15: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)turn\\b)/, /* 16: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)s\\b)/, /* 17: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)ms\\b)/, /* 18: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)Hz\\b)/, /* 19: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)kHz\\b)/, /* 20: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)dpi\\b)/, /* 21: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)dpcm\\b)/, /* 22: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)dppx\\b)/, /* 23: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)em\\b)/, /* 24: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)ex\\b)/, /* 25: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)ch\\b)/, /* 26: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)rem\\b)/, /* 27: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)vw\\b)/, /* 28: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)vh\\b)/, /* 29: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)vmin\\b)/, /* 30: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)vmax\\b)/, /* 31: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)%)/, /* 32: */ /^(?:(\\d+(\\.\\d*)?|\\.\\d+)\\b)/, /* 33: */ /^(?:(calc))/, /* 34: */ /^(?:(var))/, /* 35: */ /^(?:([a-z]+))/, /* 36: */ /^(?:\\()/, /* 37: */ /^(?:\\))/, /* 38: */ /^(?:,)/, /* 39: */ /^(?:$)/],\n conditions: {\n 'INITIAL': {\n rules: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39],\n inclusive: true\n }\n }\n };\n return lexer;\n }();\n parser.lexer = lexer;\n function Parser() {\n this.yy = {};\n }\n Parser.prototype = parser;\n parser.Parser = Parser;\n return new Parser();\n}();\nif (typeof require !== 'undefined' && typeof exports !== 'undefined') {\n exports.parser = parser;\n exports.Parser = parser.Parser;\n exports.parse = function () {\n return parser.parse.apply(parser, arguments);\n };\n}","var parse = require(\"./parse\");\nvar walk = require(\"./walk\");\nvar stringify = require(\"./stringify\");\nfunction ValueParser(value) {\n if (this instanceof ValueParser) {\n this.nodes = parse(value);\n return this;\n }\n return new ValueParser(value);\n}\nValueParser.prototype.toString = function () {\n return Array.isArray(this.nodes) ? stringify(this.nodes) : \"\";\n};\nValueParser.prototype.walk = function (cb, bubble) {\n walk(this.nodes, cb, bubble);\n return this;\n};\nValueParser.unit = require(\"./unit\");\nValueParser.walk = walk;\nValueParser.stringify = stringify;\nmodule.exports = ValueParser;","var openParentheses = \"(\".charCodeAt(0);\nvar closeParentheses = \")\".charCodeAt(0);\nvar singleQuote = \"'\".charCodeAt(0);\nvar doubleQuote = '\"'.charCodeAt(0);\nvar backslash = \"\\\\\".charCodeAt(0);\nvar slash = \"/\".charCodeAt(0);\nvar comma = \",\".charCodeAt(0);\nvar colon = \":\".charCodeAt(0);\nvar star = \"*\".charCodeAt(0);\nmodule.exports = function (input) {\n var tokens = [];\n var value = input;\n var next, quote, prev, token, escape, escapePos, whitespacePos;\n var pos = 0;\n var code = value.charCodeAt(pos);\n var max = value.length;\n var stack = [{\n nodes: tokens\n }];\n var balanced = 0;\n var parent;\n var name = \"\";\n var before = \"\";\n var after = \"\";\n while (pos < max) {\n // Whitespaces\n if (code <= 32) {\n next = pos;\n do {\n next += 1;\n code = value.charCodeAt(next);\n } while (code <= 32);\n token = value.slice(pos, next);\n prev = tokens[tokens.length - 1];\n if (code === closeParentheses && balanced) {\n after = token;\n } else if (prev && prev.type === \"div\") {\n prev.after = token;\n } else if (code === comma || code === colon || code === slash && value.charCodeAt(next + 1) !== star) {\n before = token;\n } else {\n tokens.push({\n type: \"space\",\n sourceIndex: pos,\n value: token\n });\n }\n pos = next;\n\n // Quotes\n } else if (code === singleQuote || code === doubleQuote) {\n next = pos;\n quote = code === singleQuote ? \"'\" : '\"';\n token = {\n type: \"string\",\n sourceIndex: pos,\n quote: quote\n };\n do {\n escape = false;\n next = value.indexOf(quote, next + 1);\n if (~next) {\n escapePos = next;\n while (value.charCodeAt(escapePos - 1) === backslash) {\n escapePos -= 1;\n escape = !escape;\n }\n } else {\n value += quote;\n next = value.length - 1;\n token.unclosed = true;\n }\n } while (escape);\n token.value = value.slice(pos + 1, next);\n tokens.push(token);\n pos = next + 1;\n code = value.charCodeAt(pos);\n\n // Comments\n } else if (code === slash && value.charCodeAt(pos + 1) === star) {\n token = {\n type: \"comment\",\n sourceIndex: pos\n };\n next = value.indexOf(\"*/\", pos);\n if (next === -1) {\n token.unclosed = true;\n next = value.length;\n }\n token.value = value.slice(pos + 2, next);\n tokens.push(token);\n pos = next + 2;\n code = value.charCodeAt(pos);\n\n // Dividers\n } else if (code === slash || code === comma || code === colon) {\n token = value[pos];\n tokens.push({\n type: \"div\",\n sourceIndex: pos - before.length,\n value: token,\n before: before,\n after: \"\"\n });\n before = \"\";\n pos += 1;\n code = value.charCodeAt(pos);\n\n // Open parentheses\n } else if (openParentheses === code) {\n // Whitespaces after open parentheses\n next = pos;\n do {\n next += 1;\n code = value.charCodeAt(next);\n } while (code <= 32);\n token = {\n type: \"function\",\n sourceIndex: pos - name.length,\n value: name,\n before: value.slice(pos + 1, next)\n };\n pos = next;\n if (name === \"url\" && code !== singleQuote && code !== doubleQuote) {\n next -= 1;\n do {\n escape = false;\n next = value.indexOf(\")\", next + 1);\n if (~next) {\n escapePos = next;\n while (value.charCodeAt(escapePos - 1) === backslash) {\n escapePos -= 1;\n escape = !escape;\n }\n } else {\n value += \")\";\n next = value.length - 1;\n token.unclosed = true;\n }\n } while (escape);\n // Whitespaces before closed\n whitespacePos = next;\n do {\n whitespacePos -= 1;\n code = value.charCodeAt(whitespacePos);\n } while (code <= 32);\n if (pos !== whitespacePos + 1) {\n token.nodes = [{\n type: \"word\",\n sourceIndex: pos,\n value: value.slice(pos, whitespacePos + 1)\n }];\n } else {\n token.nodes = [];\n }\n if (token.unclosed && whitespacePos + 1 !== next) {\n token.after = \"\";\n token.nodes.push({\n type: \"space\",\n sourceIndex: whitespacePos + 1,\n value: value.slice(whitespacePos + 1, next)\n });\n } else {\n token.after = value.slice(whitespacePos + 1, next);\n }\n pos = next + 1;\n code = value.charCodeAt(pos);\n tokens.push(token);\n } else {\n balanced += 1;\n token.after = \"\";\n tokens.push(token);\n stack.push(token);\n tokens = token.nodes = [];\n parent = token;\n }\n name = \"\";\n\n // Close parentheses\n } else if (closeParentheses === code && balanced) {\n pos += 1;\n code = value.charCodeAt(pos);\n parent.after = after;\n after = \"\";\n balanced -= 1;\n stack.pop();\n parent = stack[balanced];\n tokens = parent.nodes;\n\n // Words\n } else {\n next = pos;\n do {\n if (code === backslash) {\n next += 1;\n }\n next += 1;\n code = value.charCodeAt(next);\n } while (next < max && !(code <= 32 || code === singleQuote || code === doubleQuote || code === comma || code === colon || code === slash || code === openParentheses || code === closeParentheses && balanced));\n token = value.slice(pos, next);\n if (openParentheses === code) {\n name = token;\n } else {\n tokens.push({\n type: \"word\",\n sourceIndex: pos,\n value: token\n });\n }\n pos = next;\n }\n }\n for (pos = stack.length - 1; pos; pos -= 1) {\n stack[pos].unclosed = true;\n }\n return stack[0].nodes;\n};","function stringifyNode(node, custom) {\n var type = node.type;\n var value = node.value;\n var buf;\n var customResult;\n if (custom && (customResult = custom(node)) !== undefined) {\n return customResult;\n } else if (type === \"word\" || type === \"space\") {\n return value;\n } else if (type === \"string\") {\n buf = node.quote || \"\";\n return buf + value + (node.unclosed ? \"\" : buf);\n } else if (type === \"comment\") {\n return \"/*\" + value + (node.unclosed ? \"\" : \"*/\");\n } else if (type === \"div\") {\n return (node.before || \"\") + value + (node.after || \"\");\n } else if (Array.isArray(node.nodes)) {\n buf = stringify(node.nodes);\n if (type !== \"function\") {\n return buf;\n }\n return value + \"(\" + (node.before || \"\") + buf + (node.after || \"\") + (node.unclosed ? \"\" : \")\");\n }\n return value;\n}\nfunction stringify(nodes, custom) {\n var result, i;\n if (Array.isArray(nodes)) {\n result = \"\";\n for (i = nodes.length - 1; ~i; i -= 1) {\n result = stringifyNode(nodes[i], custom) + result;\n }\n return result;\n }\n return stringifyNode(nodes, custom);\n}\nmodule.exports = stringify;","var minus = \"-\".charCodeAt(0);\nvar plus = \"+\".charCodeAt(0);\nvar dot = \".\".charCodeAt(0);\nvar exp = \"e\".charCodeAt(0);\nvar EXP = \"E\".charCodeAt(0);\nmodule.exports = function (value) {\n var pos = 0;\n var length = value.length;\n var dotted = false;\n var sciPos = -1;\n var containsNumber = false;\n var code;\n while (pos < length) {\n code = value.charCodeAt(pos);\n if (code >= 48 && code <= 57) {\n containsNumber = true;\n } else if (code === exp || code === EXP) {\n if (sciPos > -1) {\n break;\n }\n sciPos = pos;\n } else if (code === dot) {\n if (dotted) {\n break;\n }\n dotted = true;\n } else if (code === plus || code === minus) {\n if (pos !== 0) {\n break;\n }\n } else {\n break;\n }\n pos += 1;\n }\n if (sciPos + 1 === pos) pos--;\n return containsNumber ? {\n number: value.slice(0, pos),\n unit: value.slice(pos)\n } : false;\n};","module.exports = function walk(nodes, cb, bubble) {\n var i, max, node, result;\n for (i = 0, max = nodes.length; i < max; i += 1) {\n node = nodes[i];\n if (!bubble) {\n result = cb(node, i, nodes);\n }\n if (result !== false && node.type === \"function\" && Array.isArray(node.nodes)) {\n walk(node.nodes, cb, bubble);\n }\n if (bubble) {\n cb(node, i, nodes);\n }\n }\n};","//\n\nmodule.exports = function shallowEqual(objA, objB, compare, compareContext) {\n var ret = compare ? compare.call(compareContext, objA, objB) : void 0;\n if (ret !== void 0) {\n return !!ret;\n }\n if (objA === objB) {\n return true;\n }\n if (typeof objA !== \"object\" || !objA || typeof objB !== \"object\" || !objB) {\n return false;\n }\n var keysA = Object.keys(objA);\n var keysB = Object.keys(objB);\n if (keysA.length !== keysB.length) {\n return false;\n }\n var bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB);\n\n // Test for A's keys different from B.\n for (var idx = 0; idx < keysA.length; idx++) {\n var key = keysA[idx];\n if (!bHasOwnProperty(key)) {\n return false;\n }\n var valueA = objA[key];\n var valueB = objB[key];\n ret = compare ? compare.call(compareContext, valueA, valueB, key) : void 0;\n if (ret === false || ret === void 0 && valueA !== valueB) {\n return false;\n }\n }\n return true;\n};","var engine = require('../src/store-engine');\nvar storages = require('../storages/all');\nvar plugins = [require('../plugins/json2')];\nmodule.exports = engine.createStore(storages, plugins);","module.exports = json2Plugin;\nfunction json2Plugin() {\n require('./lib/json2');\n return {};\n}","/* eslint-disable */\n\n// json2.js\n// 2016-10-28\n// Public Domain.\n// NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n// See http://www.JSON.org/js.html\n// This code should be minified before deployment.\n// See http://javascript.crockford.com/jsmin.html\n\n// USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO\n// NOT CONTROL.\n\n// This file creates a global JSON object containing two methods: stringify\n// and parse. This file provides the ES5 JSON capability to ES3 systems.\n// If a project might run on IE8 or earlier, then this file should be included.\n// This file does nothing on ES5 systems.\n\n// JSON.stringify(value, replacer, space)\n// value any JavaScript value, usually an object or array.\n// replacer an optional parameter that determines how object\n// values are stringified for objects. It can be a\n// function or an array of strings.\n// space an optional parameter that specifies the indentation\n// of nested structures. If it is omitted, the text will\n// be packed without extra whitespace. If it is a number,\n// it will specify the number of spaces to indent at each\n// level. If it is a string (such as \"\\t\" or \" \"),\n// it contains the characters used to indent at each level.\n// This method produces a JSON text from a JavaScript value.\n// When an object value is found, if the object contains a toJSON\n// method, its toJSON method will be called and the result will be\n// stringified. A toJSON method does not serialize: it returns the\n// value represented by the name/value pair that should be serialized,\n// or undefined if nothing should be serialized. The toJSON method\n// will be passed the key associated with the value, and this will be\n// bound to the value.\n\n// For example, this would serialize Dates as ISO strings.\n\n// Date.prototype.toJSON = function (key) {\n// function f(n) {\n// // Format integers to have at least two digits.\n// return (n < 10)\n// ? \"0\" + n\n// : n;\n// }\n// return this.getUTCFullYear() + \"-\" +\n// f(this.getUTCMonth() + 1) + \"-\" +\n// f(this.getUTCDate()) + \"T\" +\n// f(this.getUTCHours()) + \":\" +\n// f(this.getUTCMinutes()) + \":\" +\n// f(this.getUTCSeconds()) + \"Z\";\n// };\n\n// You can provide an optional replacer method. It will be passed the\n// key and value of each member, with this bound to the containing\n// object. The value that is returned from your method will be\n// serialized. If your method returns undefined, then the member will\n// be excluded from the serialization.\n\n// If the replacer parameter is an array of strings, then it will be\n// used to select the members to be serialized. It filters the results\n// such that only members with keys listed in the replacer array are\n// stringified.\n\n// Values that do not have JSON representations, such as undefined or\n// functions, will not be serialized. Such values in objects will be\n// dropped; in arrays they will be replaced with null. You can use\n// a replacer function to replace those with JSON values.\n\n// JSON.stringify(undefined) returns undefined.\n\n// The optional space parameter produces a stringification of the\n// value that is filled with line breaks and indentation to make it\n// easier to read.\n\n// If the space parameter is a non-empty string, then that string will\n// be used for indentation. If the space parameter is a number, then\n// the indentation will be that many spaces.\n\n// Example:\n\n// text = JSON.stringify([\"e\", {pluribus: \"unum\"}]);\n// // text is '[\"e\",{\"pluribus\":\"unum\"}]'\n\n// text = JSON.stringify([\"e\", {pluribus: \"unum\"}], null, \"\\t\");\n// // text is '[\\n\\t\"e\",\\n\\t{\\n\\t\\t\"pluribus\": \"unum\"\\n\\t}\\n]'\n\n// text = JSON.stringify([new Date()], function (key, value) {\n// return this[key] instanceof Date\n// ? \"Date(\" + this[key] + \")\"\n// : value;\n// });\n// // text is '[\"Date(---current time---)\"]'\n\n// JSON.parse(text, reviver)\n// This method parses a JSON text to produce an object or array.\n// It can throw a SyntaxError exception.\n\n// The optional reviver parameter is a function that can filter and\n// transform the results. It receives each of the keys and values,\n// and its return value is used instead of the original value.\n// If it returns what it received, then the structure is not modified.\n// If it returns undefined then the member is deleted.\n\n// Example:\n\n// // Parse the text. Values that look like ISO date strings will\n// // be converted to Date objects.\n\n// myData = JSON.parse(text, function (key, value) {\n// var a;\n// if (typeof value === \"string\") {\n// a =\n// /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2}(?:\\.\\d*)?)Z$/.exec(value);\n// if (a) {\n// return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],\n// +a[5], +a[6]));\n// }\n// }\n// return value;\n// });\n\n// myData = JSON.parse('[\"Date(09/09/2001)\"]', function (key, value) {\n// var d;\n// if (typeof value === \"string\" &&\n// value.slice(0, 5) === \"Date(\" &&\n// value.slice(-1) === \")\") {\n// d = new Date(value.slice(5, -1));\n// if (d) {\n// return d;\n// }\n// }\n// return value;\n// });\n\n// This is a reference implementation. You are free to copy, modify, or\n// redistribute.\n\n/*jslint\n eval, for, this\n*/\n\n/*property\n JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,\n getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,\n lastIndex, length, parse, prototype, push, replace, slice, stringify,\n test, toJSON, toString, valueOf\n*/\n\n// Create a JSON object only if one does not already exist. We create the\n// methods in a closure to avoid creating global variables.\n\nif (typeof JSON !== \"object\") {\n JSON = {};\n}\n(function () {\n \"use strict\";\n\n var rx_one = /^[\\],:{}\\s]*$/;\n var rx_two = /\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g;\n var rx_three = /\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g;\n var rx_four = /(?:^|:|,)(?:\\s*\\[)+/g;\n var rx_escapable = /[\\\\\"\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;\n var rx_dangerous = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;\n function f(n) {\n // Format integers to have at least two digits.\n return n < 10 ? \"0\" + n : n;\n }\n function this_value() {\n return this.valueOf();\n }\n if (typeof Date.prototype.toJSON !== \"function\") {\n Date.prototype.toJSON = function () {\n return isFinite(this.valueOf()) ? this.getUTCFullYear() + \"-\" + f(this.getUTCMonth() + 1) + \"-\" + f(this.getUTCDate()) + \"T\" + f(this.getUTCHours()) + \":\" + f(this.getUTCMinutes()) + \":\" + f(this.getUTCSeconds()) + \"Z\" : null;\n };\n Boolean.prototype.toJSON = this_value;\n Number.prototype.toJSON = this_value;\n String.prototype.toJSON = this_value;\n }\n var gap;\n var indent;\n var meta;\n var rep;\n function quote(string) {\n // If the string contains no control characters, no quote characters, and no\n // backslash characters, then we can safely slap some quotes around it.\n // Otherwise we must also replace the offending characters with safe escape\n // sequences.\n\n rx_escapable.lastIndex = 0;\n return rx_escapable.test(string) ? \"\\\"\" + string.replace(rx_escapable, function (a) {\n var c = meta[a];\n return typeof c === \"string\" ? c : \"\\\\u\" + (\"0000\" + a.charCodeAt(0).toString(16)).slice(-4);\n }) + \"\\\"\" : \"\\\"\" + string + \"\\\"\";\n }\n function str(key, holder) {\n // Produce a string from holder[key].\n\n var i; // The loop counter.\n var k; // The member key.\n var v; // The member value.\n var length;\n var mind = gap;\n var partial;\n var value = holder[key];\n\n // If the value has a toJSON method, call it to obtain a replacement value.\n\n if (value && typeof value === \"object\" && typeof value.toJSON === \"function\") {\n value = value.toJSON(key);\n }\n\n // If we were called with a replacer function, then call the replacer to\n // obtain a replacement value.\n\n if (typeof rep === \"function\") {\n value = rep.call(holder, key, value);\n }\n\n // What happens next depends on the value's type.\n\n switch (typeof value) {\n case \"string\":\n return quote(value);\n case \"number\":\n // JSON numbers must be finite. Encode non-finite numbers as null.\n\n return isFinite(value) ? String(value) : \"null\";\n case \"boolean\":\n case \"null\":\n // If the value is a boolean or null, convert it to a string. Note:\n // typeof null does not produce \"null\". The case is included here in\n // the remote chance that this gets fixed someday.\n\n return String(value);\n\n // If the type is \"object\", we might be dealing with an object or an array or\n // null.\n\n case \"object\":\n // Due to a specification blunder in ECMAScript, typeof null is \"object\",\n // so watch out for that case.\n\n if (!value) {\n return \"null\";\n }\n\n // Make an array to hold the partial results of stringifying this object value.\n\n gap += indent;\n partial = [];\n\n // Is the value an array?\n\n if (Object.prototype.toString.apply(value) === \"[object Array]\") {\n // The value is an array. Stringify every element. Use null as a placeholder\n // for non-JSON values.\n\n length = value.length;\n for (i = 0; i < length; i += 1) {\n partial[i] = str(i, value) || \"null\";\n }\n\n // Join all of the elements together, separated with commas, and wrap them in\n // brackets.\n\n v = partial.length === 0 ? \"[]\" : gap ? \"[\\n\" + gap + partial.join(\",\\n\" + gap) + \"\\n\" + mind + \"]\" : \"[\" + partial.join(\",\") + \"]\";\n gap = mind;\n return v;\n }\n\n // If the replacer is an array, use it to select the members to be stringified.\n\n if (rep && typeof rep === \"object\") {\n length = rep.length;\n for (i = 0; i < length; i += 1) {\n if (typeof rep[i] === \"string\") {\n k = rep[i];\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? \": \" : \":\") + v);\n }\n }\n }\n } else {\n // Otherwise, iterate through all of the keys in the object.\n\n for (k in value) {\n if (Object.prototype.hasOwnProperty.call(value, k)) {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? \": \" : \":\") + v);\n }\n }\n }\n }\n\n // Join all of the member texts together, separated with commas,\n // and wrap them in braces.\n\n v = partial.length === 0 ? \"{}\" : gap ? \"{\\n\" + gap + partial.join(\",\\n\" + gap) + \"\\n\" + mind + \"}\" : \"{\" + partial.join(\",\") + \"}\";\n gap = mind;\n return v;\n }\n }\n\n // If the JSON object does not yet have a stringify method, give it one.\n\n if (typeof JSON.stringify !== \"function\") {\n meta = {\n // table of character substitutions\n \"\\b\": \"\\\\b\",\n \"\\t\": \"\\\\t\",\n \"\\n\": \"\\\\n\",\n \"\\f\": \"\\\\f\",\n \"\\r\": \"\\\\r\",\n \"\\\"\": \"\\\\\\\"\",\n \"\\\\\": \"\\\\\\\\\"\n };\n JSON.stringify = function (value, replacer, space) {\n // The stringify method takes a value and an optional replacer, and an optional\n // space parameter, and returns a JSON text. The replacer can be a function\n // that can replace values, or an array of strings that will select the keys.\n // A default replacer method can be provided. Use of the space parameter can\n // produce text that is more easily readable.\n\n var i;\n gap = \"\";\n indent = \"\";\n\n // If the space parameter is a number, make an indent string containing that\n // many spaces.\n\n if (typeof space === \"number\") {\n for (i = 0; i < space; i += 1) {\n indent += \" \";\n }\n\n // If the space parameter is a string, it will be used as the indent string.\n } else if (typeof space === \"string\") {\n indent = space;\n }\n\n // If there is a replacer, it must be a function or an array.\n // Otherwise, throw an error.\n\n rep = replacer;\n if (replacer && typeof replacer !== \"function\" && (typeof replacer !== \"object\" || typeof replacer.length !== \"number\")) {\n throw new Error(\"JSON.stringify\");\n }\n\n // Make a fake root object containing our value under the key of \"\".\n // Return the result of stringifying the value.\n\n return str(\"\", {\n \"\": value\n });\n };\n }\n\n // If the JSON object does not yet have a parse method, give it one.\n\n if (typeof JSON.parse !== \"function\") {\n JSON.parse = function (text, reviver) {\n // The parse method takes a text and an optional reviver function, and returns\n // a JavaScript value if the text is a valid JSON text.\n\n var j;\n function walk(holder, key) {\n // The walk method is used to recursively walk the resulting structure so\n // that modifications can be made.\n\n var k;\n var v;\n var value = holder[key];\n if (value && typeof value === \"object\") {\n for (k in value) {\n if (Object.prototype.hasOwnProperty.call(value, k)) {\n v = walk(value, k);\n if (v !== undefined) {\n value[k] = v;\n } else {\n delete value[k];\n }\n }\n }\n }\n return reviver.call(holder, key, value);\n }\n\n // Parsing happens in four stages. In the first stage, we replace certain\n // Unicode characters with escape sequences. JavaScript handles many characters\n // incorrectly, either silently deleting them, or treating them as line endings.\n\n text = String(text);\n rx_dangerous.lastIndex = 0;\n if (rx_dangerous.test(text)) {\n text = text.replace(rx_dangerous, function (a) {\n return \"\\\\u\" + (\"0000\" + a.charCodeAt(0).toString(16)).slice(-4);\n });\n }\n\n // In the second stage, we run the text against regular expressions that look\n // for non-JSON patterns. We are especially concerned with \"()\" and \"new\"\n // because they can cause invocation, and \"=\" because it can cause mutation.\n // But just to be safe, we want to reject all unexpected forms.\n\n // We split the second stage into 4 regexp operations in order to work around\n // crippling inefficiencies in IE's and Safari's regexp engines. First we\n // replace the JSON backslash pairs with \"@\" (a non-JSON character). Second, we\n // replace all simple value tokens with \"]\" characters. Third, we delete all\n // open brackets that follow a colon or comma or that begin the text. Finally,\n // we look to see that the remaining characters are only whitespace or \"]\" or\n // \",\" or \":\" or \"{\" or \"}\". If that is so, then the text is safe for eval.\n\n if (rx_one.test(text.replace(rx_two, \"@\").replace(rx_three, \"]\").replace(rx_four, \"\"))) {\n // In the third stage we use the eval function to compile the text into a\n // JavaScript structure. The \"{\" operator is subject to a syntactic ambiguity\n // in JavaScript: it can begin a block or an object literal. We wrap the text\n // in parens to eliminate the ambiguity.\n\n j = eval(\"(\" + text + \")\");\n\n // In the optional fourth stage, we recursively walk the new structure, passing\n // each name/value pair to a reviver function for possible transformation.\n\n return typeof reviver === \"function\" ? walk({\n \"\": j\n }, \"\") : j;\n }\n\n // If the text is not JSON parseable, then a SyntaxError is thrown.\n\n throw new SyntaxError(\"JSON.parse\");\n };\n }\n})();","var util = require('./util');\nvar slice = util.slice;\nvar pluck = util.pluck;\nvar each = util.each;\nvar bind = util.bind;\nvar create = util.create;\nvar isList = util.isList;\nvar isFunction = util.isFunction;\nvar isObject = util.isObject;\nmodule.exports = {\n createStore: _createStore\n};\nvar storeAPI = {\n version: '2.0.12',\n enabled: false,\n // get returns the value of the given key. If that value\n // is undefined, it returns optionalDefaultValue instead.\n get: function get(key, optionalDefaultValue) {\n var data = this.storage.read(this._namespacePrefix + key);\n return this._deserialize(data, optionalDefaultValue);\n },\n // set will store the given value at key and returns value.\n // Calling set with value === undefined is equivalent to calling remove.\n set: function set(key, value) {\n if (value === undefined) {\n return this.remove(key);\n }\n this.storage.write(this._namespacePrefix + key, this._serialize(value));\n return value;\n },\n // remove deletes the key and value stored at the given key.\n remove: function remove(key) {\n this.storage.remove(this._namespacePrefix + key);\n },\n // each will call the given callback once for each key-value pair\n // in this store.\n each: function each(callback) {\n var self = this;\n this.storage.each(function (val, namespacedKey) {\n callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''));\n });\n },\n // clearAll will remove all the stored key-value pairs in this store.\n clearAll: function clearAll() {\n this.storage.clearAll();\n },\n // additional functionality that can't live in plugins\n // ---------------------------------------------------\n\n // hasNamespace returns true if this store instance has the given namespace.\n hasNamespace: function hasNamespace(namespace) {\n return this._namespacePrefix == '__storejs_' + namespace + '_';\n },\n // createStore creates a store.js instance with the first\n // functioning storage in the list of storage candidates,\n // and applies the the given mixins to the instance.\n createStore: function createStore() {\n return _createStore.apply(this, arguments);\n },\n addPlugin: function addPlugin(plugin) {\n this._addPlugin(plugin);\n },\n namespace: function namespace(_namespace) {\n return _createStore(this.storage, this.plugins, _namespace);\n }\n};\nfunction _warn() {\n var _console = typeof console == 'undefined' ? null : console;\n if (!_console) {\n return;\n }\n var fn = _console.warn ? _console.warn : _console.log;\n fn.apply(_console, arguments);\n}\nfunction _createStore(storages, plugins, namespace) {\n if (!namespace) {\n namespace = '';\n }\n if (storages && !isList(storages)) {\n storages = [storages];\n }\n if (plugins && !isList(plugins)) {\n plugins = [plugins];\n }\n var namespacePrefix = namespace ? '__storejs_' + namespace + '_' : '';\n var namespaceRegexp = namespace ? new RegExp('^' + namespacePrefix) : null;\n var legalNamespaces = /^[a-zA-Z0-9_\\-]*$/; // alpha-numeric + underscore and dash\n if (!legalNamespaces.test(namespace)) {\n throw new Error('store.js namespaces can only have alphanumerics + underscores and dashes');\n }\n var _privateStoreProps = {\n _namespacePrefix: namespacePrefix,\n _namespaceRegexp: namespaceRegexp,\n _testStorage: function _testStorage(storage) {\n try {\n var testStr = '__storejs__test__';\n storage.write(testStr, testStr);\n var ok = storage.read(testStr) === testStr;\n storage.remove(testStr);\n return ok;\n } catch (e) {\n return false;\n }\n },\n _assignPluginFnProp: function _assignPluginFnProp(pluginFnProp, propName) {\n var oldFn = this[propName];\n this[propName] = function pluginFn() {\n var args = slice(arguments, 0);\n var self = this;\n\n // super_fn calls the old function which was overwritten by\n // this mixin.\n function super_fn() {\n if (!oldFn) {\n return;\n }\n each(arguments, function (arg, i) {\n args[i] = arg;\n });\n return oldFn.apply(self, args);\n }\n\n // Give mixing function access to super_fn by prefixing all mixin function\n // arguments with super_fn.\n var newFnArgs = [super_fn].concat(args);\n return pluginFnProp.apply(self, newFnArgs);\n };\n },\n _serialize: function _serialize(obj) {\n return JSON.stringify(obj);\n },\n _deserialize: function _deserialize(strVal, defaultVal) {\n if (!strVal) {\n return defaultVal;\n }\n // It is possible that a raw string value has been previously stored\n // in a storage without using store.js, meaning it will be a raw\n // string value instead of a JSON serialized string. By defaulting\n // to the raw string value in case of a JSON parse error, we allow\n // for past stored values to be forwards-compatible with store.js\n var val = '';\n try {\n val = JSON.parse(strVal);\n } catch (e) {\n val = strVal;\n }\n return val !== undefined ? val : defaultVal;\n },\n _addStorage: function _addStorage(storage) {\n if (this.enabled) {\n return;\n }\n if (this._testStorage(storage)) {\n this.storage = storage;\n this.enabled = true;\n }\n },\n _addPlugin: function _addPlugin(plugin) {\n var self = this;\n\n // If the plugin is an array, then add all plugins in the array.\n // This allows for a plugin to depend on other plugins.\n if (isList(plugin)) {\n each(plugin, function (plugin) {\n self._addPlugin(plugin);\n });\n return;\n }\n\n // Keep track of all plugins we've seen so far, so that we\n // don't add any of them twice.\n var seenPlugin = pluck(this.plugins, function (seenPlugin) {\n return plugin === seenPlugin;\n });\n if (seenPlugin) {\n return;\n }\n this.plugins.push(plugin);\n\n // Check that the plugin is properly formed\n if (!isFunction(plugin)) {\n throw new Error('Plugins must be function values that return objects');\n }\n var pluginProperties = plugin.call(this);\n if (!isObject(pluginProperties)) {\n throw new Error('Plugins must return an object of function properties');\n }\n\n // Add the plugin function properties to this store instance.\n each(pluginProperties, function (pluginFnProp, propName) {\n if (!isFunction(pluginFnProp)) {\n throw new Error('Bad plugin property: ' + propName + ' from plugin ' + plugin.name + '. Plugins should only return functions.');\n }\n self._assignPluginFnProp(pluginFnProp, propName);\n });\n },\n // Put deprecated properties in the private API, so as to not expose it to accidential\n // discovery through inspection of the store object.\n\n // Deprecated: addStorage\n addStorage: function addStorage(storage) {\n _warn('store.addStorage(storage) is deprecated. Use createStore([storages])');\n this._addStorage(storage);\n }\n };\n var store = create(_privateStoreProps, storeAPI, {\n plugins: []\n });\n store.raw = {};\n each(store, function (prop, propName) {\n if (isFunction(prop)) {\n store.raw[propName] = bind(store, prop);\n }\n });\n each(storages, function (storage) {\n store._addStorage(storage);\n });\n each(plugins, function (plugin) {\n store._addPlugin(plugin);\n });\n return store;\n}","var assign = make_assign();\nvar create = make_create();\nvar trim = make_trim();\nvar Global = typeof window !== 'undefined' ? window : global;\nmodule.exports = {\n assign: assign,\n create: create,\n trim: trim,\n bind: bind,\n slice: slice,\n each: each,\n map: map,\n pluck: pluck,\n isList: isList,\n isFunction: isFunction,\n isObject: isObject,\n Global: Global\n};\nfunction make_assign() {\n if (Object.assign) {\n return Object.assign;\n } else {\n return function shimAssign(obj, props1, props2, etc) {\n for (var i = 1; i < arguments.length; i++) {\n each(Object(arguments[i]), function (val, key) {\n obj[key] = val;\n });\n }\n return obj;\n };\n }\n}\nfunction make_create() {\n if (Object.create) {\n return function create(obj, assignProps1, assignProps2, etc) {\n var assignArgsList = slice(arguments, 1);\n return assign.apply(this, [Object.create(obj)].concat(assignArgsList));\n };\n } else {\n var F = function F() {}; // eslint-disable-line no-inner-declarations\n return function create(obj, assignProps1, assignProps2, etc) {\n var assignArgsList = slice(arguments, 1);\n F.prototype = obj;\n return assign.apply(this, [new F()].concat(assignArgsList));\n };\n }\n}\nfunction make_trim() {\n if (String.prototype.trim) {\n return function trim(str) {\n return String.prototype.trim.call(str);\n };\n } else {\n return function trim(str) {\n return str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n }\n}\nfunction bind(obj, fn) {\n return function () {\n return fn.apply(obj, Array.prototype.slice.call(arguments, 0));\n };\n}\nfunction slice(arr, index) {\n return Array.prototype.slice.call(arr, index || 0);\n}\nfunction each(obj, fn) {\n pluck(obj, function (val, key) {\n fn(val, key);\n return false;\n });\n}\nfunction map(obj, fn) {\n var res = isList(obj) ? [] : {};\n pluck(obj, function (v, k) {\n res[k] = fn(v, k);\n return false;\n });\n return res;\n}\nfunction pluck(obj, fn) {\n if (isList(obj)) {\n for (var i = 0; i < obj.length; i++) {\n if (fn(obj[i], i)) {\n return obj[i];\n }\n }\n } else {\n for (var key in obj) {\n if (obj.hasOwnProperty(key)) {\n if (fn(obj[key], key)) {\n return obj[key];\n }\n }\n }\n }\n}\nfunction isList(val) {\n return val != null && typeof val != 'function' && typeof val.length == 'number';\n}\nfunction isFunction(val) {\n return val && {}.toString.call(val) === '[object Function]';\n}\nfunction isObject(val) {\n return val && {}.toString.call(val) === '[object Object]';\n}","module.exports = [\n// Listed in order of usage preference\nrequire('./localStorage'), require('./oldFF-globalStorage'), require('./oldIE-userDataStorage'), require('./cookieStorage'), require('./sessionStorage'), require('./memoryStorage')];","// cookieStorage is useful Safari private browser mode, where localStorage\n// doesn't work but cookies do. This implementation is adopted from\n// https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage\n\nvar util = require('../src/util');\nvar Global = util.Global;\nvar trim = util.trim;\nmodule.exports = {\n name: 'cookieStorage',\n read: read,\n write: write,\n each: each,\n remove: remove,\n clearAll: clearAll\n};\nvar doc = Global.document;\nfunction read(key) {\n if (!key || !_has(key)) {\n return null;\n }\n var regexpStr = \"(?:^|.*;\\\\s*)\" + escape(key).replace(/[\\-\\.\\+\\*]/g, \"\\\\$&\") + \"\\\\s*\\\\=\\\\s*((?:[^;](?!;))*[^;]?).*\";\n return unescape(doc.cookie.replace(new RegExp(regexpStr), \"$1\"));\n}\nfunction each(callback) {\n var cookies = doc.cookie.split(/; ?/g);\n for (var i = cookies.length - 1; i >= 0; i--) {\n if (!trim(cookies[i])) {\n continue;\n }\n var kvp = cookies[i].split('=');\n var key = unescape(kvp[0]);\n var val = unescape(kvp[1]);\n callback(val, key);\n }\n}\nfunction write(key, data) {\n if (!key) {\n return;\n }\n doc.cookie = escape(key) + \"=\" + escape(data) + \"; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/\";\n}\nfunction remove(key) {\n if (!key || !_has(key)) {\n return;\n }\n doc.cookie = escape(key) + \"=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/\";\n}\nfunction clearAll() {\n each(function (_, key) {\n remove(key);\n });\n}\nfunction _has(key) {\n return new RegExp(\"(?:^|;\\\\s*)\" + escape(key).replace(/[\\-\\.\\+\\*]/g, \"\\\\$&\") + \"\\\\s*\\\\=\").test(doc.cookie);\n}","var util = require('../src/util');\nvar Global = util.Global;\nmodule.exports = {\n name: 'localStorage',\n read: read,\n write: write,\n each: each,\n remove: remove,\n clearAll: clearAll\n};\nfunction localStorage() {\n return Global.localStorage;\n}\nfunction read(key) {\n return localStorage().getItem(key);\n}\nfunction write(key, data) {\n return localStorage().setItem(key, data);\n}\nfunction each(fn) {\n for (var i = localStorage().length - 1; i >= 0; i--) {\n var key = localStorage().key(i);\n fn(read(key), key);\n }\n}\nfunction remove(key) {\n return localStorage().removeItem(key);\n}\nfunction clearAll() {\n return localStorage().clear();\n}","// memoryStorage is a useful last fallback to ensure that the store\n// is functions (meaning store.get(), store.set(), etc will all function).\n// However, stored values will not persist when the browser navigates to\n// a new page or reloads the current page.\n\nmodule.exports = {\n name: 'memoryStorage',\n read: read,\n write: write,\n each: each,\n remove: remove,\n clearAll: clearAll\n};\nvar memoryStorage = {};\nfunction read(key) {\n return memoryStorage[key];\n}\nfunction write(key, data) {\n memoryStorage[key] = data;\n}\nfunction each(callback) {\n for (var key in memoryStorage) {\n if (memoryStorage.hasOwnProperty(key)) {\n callback(memoryStorage[key], key);\n }\n }\n}\nfunction remove(key) {\n delete memoryStorage[key];\n}\nfunction clearAll(key) {\n memoryStorage = {};\n}","// oldFF-globalStorage provides storage for Firefox\n// versions 6 and 7, where no localStorage, etc\n// is available.\n\nvar util = require('../src/util');\nvar Global = util.Global;\nmodule.exports = {\n name: 'oldFF-globalStorage',\n read: read,\n write: write,\n each: each,\n remove: remove,\n clearAll: clearAll\n};\nvar globalStorage = Global.globalStorage;\nfunction read(key) {\n return globalStorage[key];\n}\nfunction write(key, data) {\n globalStorage[key] = data;\n}\nfunction each(fn) {\n for (var i = globalStorage.length - 1; i >= 0; i--) {\n var key = globalStorage.key(i);\n fn(globalStorage[key], key);\n }\n}\nfunction remove(key) {\n return globalStorage.removeItem(key);\n}\nfunction clearAll() {\n each(function (key, _) {\n delete globalStorage[key];\n });\n}","// oldIE-userDataStorage provides storage for Internet Explorer\n// versions 6 and 7, where no localStorage, sessionStorage, etc\n// is available.\n\nvar util = require('../src/util');\nvar Global = util.Global;\nmodule.exports = {\n name: 'oldIE-userDataStorage',\n write: write,\n read: read,\n each: each,\n remove: remove,\n clearAll: clearAll\n};\nvar storageName = 'storejs';\nvar doc = Global.document;\nvar _withStorageEl = _makeIEStorageElFunction();\nvar disable = (Global.navigator ? Global.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\\./); // MSIE 9.x, MSIE 10.x\n\nfunction write(unfixedKey, data) {\n if (disable) {\n return;\n }\n var fixedKey = fixKey(unfixedKey);\n _withStorageEl(function (storageEl) {\n storageEl.setAttribute(fixedKey, data);\n storageEl.save(storageName);\n });\n}\nfunction read(unfixedKey) {\n if (disable) {\n return;\n }\n var fixedKey = fixKey(unfixedKey);\n var res = null;\n _withStorageEl(function (storageEl) {\n res = storageEl.getAttribute(fixedKey);\n });\n return res;\n}\nfunction each(callback) {\n _withStorageEl(function (storageEl) {\n var attributes = storageEl.XMLDocument.documentElement.attributes;\n for (var i = attributes.length - 1; i >= 0; i--) {\n var attr = attributes[i];\n callback(storageEl.getAttribute(attr.name), attr.name);\n }\n });\n}\nfunction remove(unfixedKey) {\n var fixedKey = fixKey(unfixedKey);\n _withStorageEl(function (storageEl) {\n storageEl.removeAttribute(fixedKey);\n storageEl.save(storageName);\n });\n}\nfunction clearAll() {\n _withStorageEl(function (storageEl) {\n var attributes = storageEl.XMLDocument.documentElement.attributes;\n storageEl.load(storageName);\n for (var i = attributes.length - 1; i >= 0; i--) {\n storageEl.removeAttribute(attributes[i].name);\n }\n storageEl.save(storageName);\n });\n}\n\n// Helpers\n//////////\n\n// In IE7, keys cannot start with a digit or contain certain chars.\n// See https://github.com/marcuswestin/store.js/issues/40\n// See https://github.com/marcuswestin/store.js/issues/83\nvar forbiddenCharsRegex = new RegExp(\"[!\\\"#$%&'()*+,/\\\\\\\\:;<=>?@[\\\\]^`{|}~]\", \"g\");\nfunction fixKey(key) {\n return key.replace(/^\\d/, '___$&').replace(forbiddenCharsRegex, '___');\n}\nfunction _makeIEStorageElFunction() {\n if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {\n return null;\n }\n var scriptTag = 'script',\n storageOwner,\n storageContainer,\n storageEl;\n\n // Since #userData storage applies only to specific paths, we need to\n // somehow link our data to a specific path. We choose /favicon.ico\n // as a pretty safe option, since all browsers already make a request to\n // this URL anyway and being a 404 will not hurt us here. We wrap an\n // iframe pointing to the favicon in an ActiveXObject(htmlfile) object\n // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)\n // since the iframe access rules appear to allow direct access and\n // manipulation of the document element, even for a 404 page. This\n // document can be used instead of the current document (which would\n // have been limited to the current path) to perform #userData storage.\n try {\n /* global ActiveXObject */\n storageContainer = new ActiveXObject('htmlfile');\n storageContainer.open();\n storageContainer.write('<' + scriptTag + '>document.w=window');\n storageContainer.close();\n storageOwner = storageContainer.w.frames[0].document;\n storageEl = storageOwner.createElement('div');\n } catch (e) {\n // somehow ActiveXObject instantiation failed (perhaps some special\n // security settings or otherwse), fall back to per-path storage\n storageEl = doc.createElement('div');\n storageOwner = doc.body;\n }\n return function (storeFunction) {\n var args = [].slice.call(arguments, 0);\n args.unshift(storageEl);\n // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx\n // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx\n storageOwner.appendChild(storageEl);\n storageEl.addBehavior('#default#userData');\n storageEl.load(storageName);\n storeFunction.apply(this, args);\n storageOwner.removeChild(storageEl);\n return;\n };\n}","var util = require('../src/util');\nvar Global = util.Global;\nmodule.exports = {\n name: 'sessionStorage',\n read: read,\n write: write,\n each: each,\n remove: remove,\n clearAll: clearAll\n};\nfunction sessionStorage() {\n return Global.sessionStorage;\n}\nfunction read(key) {\n return sessionStorage().getItem(key);\n}\nfunction write(key, data) {\n return sessionStorage().setItem(key, data);\n}\nfunction each(fn) {\n for (var i = sessionStorage().length - 1; i >= 0; i--) {\n var key = sessionStorage().key(i);\n fn(read(key), key);\n }\n}\nfunction remove(key) {\n return sessionStorage().removeItem(key);\n}\nfunction clearAll() {\n return sessionStorage().clear();\n}","function stylis_min(W) {\n function M(d, c, e, h, a) {\n for (var m = 0, b = 0, v = 0, n = 0, q, g, x = 0, K = 0, k, u = k = q = 0, l = 0, r = 0, I = 0, t = 0, B = e.length, J = B - 1, y, f = '', p = '', F = '', G = '', C; l < B;) {\n g = e.charCodeAt(l);\n l === J && 0 !== b + n + v + m && (0 !== b && (g = 47 === b ? 10 : 47), n = v = m = 0, B++, J++);\n if (0 === b + n + v + m) {\n if (l === J && (0 < r && (f = f.replace(N, '')), 0 < f.trim().length)) {\n switch (g) {\n case 32:\n case 9:\n case 59:\n case 13:\n case 10:\n break;\n default:\n f += e.charAt(l);\n }\n g = 59;\n }\n switch (g) {\n case 123:\n f = f.trim();\n q = f.charCodeAt(0);\n k = 1;\n for (t = ++l; l < B;) {\n switch (g = e.charCodeAt(l)) {\n case 123:\n k++;\n break;\n case 125:\n k--;\n break;\n case 47:\n switch (g = e.charCodeAt(l + 1)) {\n case 42:\n case 47:\n a: {\n for (u = l + 1; u < J; ++u) {\n switch (e.charCodeAt(u)) {\n case 47:\n if (42 === g && 42 === e.charCodeAt(u - 1) && l + 2 !== u) {\n l = u + 1;\n break a;\n }\n break;\n case 10:\n if (47 === g) {\n l = u + 1;\n break a;\n }\n }\n }\n l = u;\n }\n }\n break;\n case 91:\n g++;\n case 40:\n g++;\n case 34:\n case 39:\n for (; l++ < J && e.charCodeAt(l) !== g;) {}\n }\n if (0 === k) break;\n l++;\n }\n k = e.substring(t, l);\n 0 === q && (q = (f = f.replace(ca, '').trim()).charCodeAt(0));\n switch (q) {\n case 64:\n 0 < r && (f = f.replace(N, ''));\n g = f.charCodeAt(1);\n switch (g) {\n case 100:\n case 109:\n case 115:\n case 45:\n r = c;\n break;\n default:\n r = O;\n }\n k = M(c, r, k, g, a + 1);\n t = k.length;\n 0 < A && (r = X(O, f, I), C = H(3, k, r, c, D, z, t, g, a, h), f = r.join(''), void 0 !== C && 0 === (t = (k = C.trim()).length) && (g = 0, k = ''));\n if (0 < t) switch (g) {\n case 115:\n f = f.replace(da, ea);\n case 100:\n case 109:\n case 45:\n k = f + '{' + k + '}';\n break;\n case 107:\n f = f.replace(fa, '$1 $2');\n k = f + '{' + k + '}';\n k = 1 === w || 2 === w && L('@' + k, 3) ? '@-webkit-' + k + '@' + k : '@' + k;\n break;\n default:\n k = f + k, 112 === h && (k = (p += k, ''));\n } else k = '';\n break;\n default:\n k = M(c, X(c, f, I), k, h, a + 1);\n }\n F += k;\n k = I = r = u = q = 0;\n f = '';\n g = e.charCodeAt(++l);\n break;\n case 125:\n case 59:\n f = (0 < r ? f.replace(N, '') : f).trim();\n if (1 < (t = f.length)) switch (0 === u && (q = f.charCodeAt(0), 45 === q || 96 < q && 123 > q) && (t = (f = f.replace(' ', ':')).length), 0 < A && void 0 !== (C = H(1, f, c, d, D, z, p.length, h, a, h)) && 0 === (t = (f = C.trim()).length) && (f = '\\x00\\x00'), q = f.charCodeAt(0), g = f.charCodeAt(1), q) {\n case 0:\n break;\n case 64:\n if (105 === g || 99 === g) {\n G += f + e.charAt(l);\n break;\n }\n default:\n 58 !== f.charCodeAt(t - 1) && (p += P(f, q, g, f.charCodeAt(2)));\n }\n I = r = u = q = 0;\n f = '';\n g = e.charCodeAt(++l);\n }\n }\n switch (g) {\n case 13:\n case 10:\n 47 === b ? b = 0 : 0 === 1 + q && 107 !== h && 0 < f.length && (r = 1, f += '\\x00');\n 0 < A * Y && H(0, f, c, d, D, z, p.length, h, a, h);\n z = 1;\n D++;\n break;\n case 59:\n case 125:\n if (0 === b + n + v + m) {\n z++;\n break;\n }\n default:\n z++;\n y = e.charAt(l);\n switch (g) {\n case 9:\n case 32:\n if (0 === n + m + b) switch (x) {\n case 44:\n case 58:\n case 9:\n case 32:\n y = '';\n break;\n default:\n 32 !== g && (y = ' ');\n }\n break;\n case 0:\n y = '\\\\0';\n break;\n case 12:\n y = '\\\\f';\n break;\n case 11:\n y = '\\\\v';\n break;\n case 38:\n 0 === n + b + m && (r = I = 1, y = '\\f' + y);\n break;\n case 108:\n if (0 === n + b + m + E && 0 < u) switch (l - u) {\n case 2:\n 112 === x && 58 === e.charCodeAt(l - 3) && (E = x);\n case 8:\n 111 === K && (E = K);\n }\n break;\n case 58:\n 0 === n + b + m && (u = l);\n break;\n case 44:\n 0 === b + v + n + m && (r = 1, y += '\\r');\n break;\n case 34:\n case 39:\n 0 === b && (n = n === g ? 0 : 0 === n ? g : n);\n break;\n case 91:\n 0 === n + b + v && m++;\n break;\n case 93:\n 0 === n + b + v && m--;\n break;\n case 41:\n 0 === n + b + m && v--;\n break;\n case 40:\n if (0 === n + b + m) {\n if (0 === q) switch (2 * x + 3 * K) {\n case 533:\n break;\n default:\n q = 1;\n }\n v++;\n }\n break;\n case 64:\n 0 === b + v + n + m + u + k && (k = 1);\n break;\n case 42:\n case 47:\n if (!(0 < n + m + v)) switch (b) {\n case 0:\n switch (2 * g + 3 * e.charCodeAt(l + 1)) {\n case 235:\n b = 47;\n break;\n case 220:\n t = l, b = 42;\n }\n break;\n case 42:\n 47 === g && 42 === x && t + 2 !== l && (33 === e.charCodeAt(t + 2) && (p += e.substring(t, l + 1)), y = '', b = 0);\n }\n }\n 0 === b && (f += y);\n }\n K = x;\n x = g;\n l++;\n }\n t = p.length;\n if (0 < t) {\n r = c;\n if (0 < A && (C = H(2, p, r, d, D, z, t, h, a, h), void 0 !== C && 0 === (p = C).length)) return G + p + F;\n p = r.join(',') + '{' + p + '}';\n if (0 !== w * E) {\n 2 !== w || L(p, 2) || (E = 0);\n switch (E) {\n case 111:\n p = p.replace(ha, ':-moz-$1') + p;\n break;\n case 112:\n p = p.replace(Q, '::-webkit-input-$1') + p.replace(Q, '::-moz-$1') + p.replace(Q, ':-ms-input-$1') + p;\n }\n E = 0;\n }\n }\n return G + p + F;\n }\n function X(d, c, e) {\n var h = c.trim().split(ia);\n c = h;\n var a = h.length,\n m = d.length;\n switch (m) {\n case 0:\n case 1:\n var b = 0;\n for (d = 0 === m ? '' : d[0] + ' '; b < a; ++b) {\n c[b] = Z(d, c[b], e).trim();\n }\n break;\n default:\n var v = b = 0;\n for (c = []; b < a; ++b) {\n for (var n = 0; n < m; ++n) {\n c[v++] = Z(d[n] + ' ', h[b], e).trim();\n }\n }\n }\n return c;\n }\n function Z(d, c, e) {\n var h = c.charCodeAt(0);\n 33 > h && (h = (c = c.trim()).charCodeAt(0));\n switch (h) {\n case 38:\n return c.replace(F, '$1' + d.trim());\n case 58:\n return d.trim() + c.replace(F, '$1' + d.trim());\n default:\n if (0 < 1 * e && 0 < c.indexOf('\\f')) return c.replace(F, (58 === d.charCodeAt(0) ? '' : '$1') + d.trim());\n }\n return d + c;\n }\n function P(d, c, e, h) {\n var a = d + ';',\n m = 2 * c + 3 * e + 4 * h;\n if (944 === m) {\n d = a.indexOf(':', 9) + 1;\n var b = a.substring(d, a.length - 1).trim();\n b = a.substring(0, d).trim() + b + ';';\n return 1 === w || 2 === w && L(b, 1) ? '-webkit-' + b + b : b;\n }\n if (0 === w || 2 === w && !L(a, 1)) return a;\n switch (m) {\n case 1015:\n return 97 === a.charCodeAt(10) ? '-webkit-' + a + a : a;\n case 951:\n return 116 === a.charCodeAt(3) ? '-webkit-' + a + a : a;\n case 963:\n return 110 === a.charCodeAt(5) ? '-webkit-' + a + a : a;\n case 1009:\n if (100 !== a.charCodeAt(4)) break;\n case 969:\n case 942:\n return '-webkit-' + a + a;\n case 978:\n return '-webkit-' + a + '-moz-' + a + a;\n case 1019:\n case 983:\n return '-webkit-' + a + '-moz-' + a + '-ms-' + a + a;\n case 883:\n if (45 === a.charCodeAt(8)) return '-webkit-' + a + a;\n if (0 < a.indexOf('image-set(', 11)) return a.replace(ja, '$1-webkit-$2') + a;\n break;\n case 932:\n if (45 === a.charCodeAt(4)) switch (a.charCodeAt(5)) {\n case 103:\n return '-webkit-box-' + a.replace('-grow', '') + '-webkit-' + a + '-ms-' + a.replace('grow', 'positive') + a;\n case 115:\n return '-webkit-' + a + '-ms-' + a.replace('shrink', 'negative') + a;\n case 98:\n return '-webkit-' + a + '-ms-' + a.replace('basis', 'preferred-size') + a;\n }\n return '-webkit-' + a + '-ms-' + a + a;\n case 964:\n return '-webkit-' + a + '-ms-flex-' + a + a;\n case 1023:\n if (99 !== a.charCodeAt(8)) break;\n b = a.substring(a.indexOf(':', 15)).replace('flex-', '').replace('space-between', 'justify');\n return '-webkit-box-pack' + b + '-webkit-' + a + '-ms-flex-pack' + b + a;\n case 1005:\n return ka.test(a) ? a.replace(aa, ':-webkit-') + a.replace(aa, ':-moz-') + a : a;\n case 1e3:\n b = a.substring(13).trim();\n c = b.indexOf('-') + 1;\n switch (b.charCodeAt(0) + b.charCodeAt(c)) {\n case 226:\n b = a.replace(G, 'tb');\n break;\n case 232:\n b = a.replace(G, 'tb-rl');\n break;\n case 220:\n b = a.replace(G, 'lr');\n break;\n default:\n return a;\n }\n return '-webkit-' + a + '-ms-' + b + a;\n case 1017:\n if (-1 === a.indexOf('sticky', 9)) break;\n case 975:\n c = (a = d).length - 10;\n b = (33 === a.charCodeAt(c) ? a.substring(0, c) : a).substring(d.indexOf(':', 7) + 1).trim();\n switch (m = b.charCodeAt(0) + (b.charCodeAt(7) | 0)) {\n case 203:\n if (111 > b.charCodeAt(8)) break;\n case 115:\n a = a.replace(b, '-webkit-' + b) + ';' + a;\n break;\n case 207:\n case 102:\n a = a.replace(b, '-webkit-' + (102 < m ? 'inline-' : '') + 'box') + ';' + a.replace(b, '-webkit-' + b) + ';' + a.replace(b, '-ms-' + b + 'box') + ';' + a;\n }\n return a + ';';\n case 938:\n if (45 === a.charCodeAt(5)) switch (a.charCodeAt(6)) {\n case 105:\n return b = a.replace('-items', ''), '-webkit-' + a + '-webkit-box-' + b + '-ms-flex-' + b + a;\n case 115:\n return '-webkit-' + a + '-ms-flex-item-' + a.replace(ba, '') + a;\n default:\n return '-webkit-' + a + '-ms-flex-line-pack' + a.replace('align-content', '').replace(ba, '') + a;\n }\n break;\n case 973:\n case 989:\n if (45 !== a.charCodeAt(3) || 122 === a.charCodeAt(4)) break;\n case 931:\n case 953:\n if (!0 === la.test(d)) return 115 === (b = d.substring(d.indexOf(':') + 1)).charCodeAt(0) ? P(d.replace('stretch', 'fill-available'), c, e, h).replace(':fill-available', ':stretch') : a.replace(b, '-webkit-' + b) + a.replace(b, '-moz-' + b.replace('fill-', '')) + a;\n break;\n case 962:\n if (a = '-webkit-' + a + (102 === a.charCodeAt(5) ? '-ms-' + a : '') + a, 211 === e + h && 105 === a.charCodeAt(13) && 0 < a.indexOf('transform', 10)) return a.substring(0, a.indexOf(';', 27) + 1).replace(ma, '$1-webkit-$2') + a;\n }\n return a;\n }\n function L(d, c) {\n var e = d.indexOf(1 === c ? ':' : '{'),\n h = d.substring(0, 3 !== c ? e : 10);\n e = d.substring(e + 1, d.length - 1);\n return R(2 !== c ? h : h.replace(na, '$1'), e, c);\n }\n function ea(d, c) {\n var e = P(c, c.charCodeAt(0), c.charCodeAt(1), c.charCodeAt(2));\n return e !== c + ';' ? e.replace(oa, ' or ($1)').substring(4) : '(' + c + ')';\n }\n function H(d, c, e, h, a, m, b, v, n, q) {\n for (var g = 0, x = c, w; g < A; ++g) {\n switch (w = S[g].call(B, d, x, e, h, a, m, b, v, n, q)) {\n case void 0:\n case !1:\n case !0:\n case null:\n break;\n default:\n x = w;\n }\n }\n if (x !== c) return x;\n }\n function T(d) {\n switch (d) {\n case void 0:\n case null:\n A = S.length = 0;\n break;\n default:\n if ('function' === typeof d) S[A++] = d;else if ('object' === typeof d) for (var c = 0, e = d.length; c < e; ++c) {\n T(d[c]);\n } else Y = !!d | 0;\n }\n return T;\n }\n function U(d) {\n d = d.prefix;\n void 0 !== d && (R = null, d ? 'function' !== typeof d ? w = 1 : (w = 2, R = d) : w = 0);\n return U;\n }\n function B(d, c) {\n var e = d;\n 33 > e.charCodeAt(0) && (e = e.trim());\n V = e;\n e = [V];\n if (0 < A) {\n var h = H(-1, c, e, e, D, z, 0, 0, 0, 0);\n void 0 !== h && 'string' === typeof h && (c = h);\n }\n var a = M(O, e, c, 0, 0);\n 0 < A && (h = H(-2, a, e, e, D, z, a.length, 0, 0, 0), void 0 !== h && (a = h));\n V = '';\n E = 0;\n z = D = 1;\n return a;\n }\n var ca = /^\\0+/g,\n N = /[\\0\\r\\f]/g,\n aa = /: */g,\n ka = /zoo|gra/,\n ma = /([,: ])(transform)/g,\n ia = /,\\r+?/g,\n F = /([\\t\\r\\n ])*\\f?&/g,\n fa = /@(k\\w+)\\s*(\\S*)\\s*/,\n Q = /::(place)/g,\n ha = /:(read-only)/g,\n G = /[svh]\\w+-[tblr]{2}/,\n da = /\\(\\s*(.*)\\s*\\)/g,\n oa = /([\\s\\S]*?);/g,\n ba = /-self|flex-/g,\n na = /[^]*?(:[rp][el]a[\\w-]+)[^]*/,\n la = /stretch|:\\s*\\w+\\-(?:conte|avail)/,\n ja = /([^-])(image-set\\()/,\n z = 1,\n D = 1,\n E = 0,\n w = 1,\n O = [],\n S = [],\n A = 0,\n R = null,\n Y = 0,\n V = '';\n B.use = T;\n B.set = U;\n void 0 !== W && U(W);\n return B;\n}\nexport default stylis_min;","var unitlessKeys = {\n animationIterationCount: 1,\n borderImageOutset: 1,\n borderImageSlice: 1,\n borderImageWidth: 1,\n boxFlex: 1,\n boxFlexGroup: 1,\n boxOrdinalGroup: 1,\n columnCount: 1,\n columns: 1,\n flex: 1,\n flexGrow: 1,\n flexPositive: 1,\n flexShrink: 1,\n flexNegative: 1,\n flexOrder: 1,\n gridRow: 1,\n gridRowEnd: 1,\n gridRowSpan: 1,\n gridRowStart: 1,\n gridColumn: 1,\n gridColumnEnd: 1,\n gridColumnSpan: 1,\n gridColumnStart: 1,\n msGridRow: 1,\n msGridRowSpan: 1,\n msGridColumn: 1,\n msGridColumnSpan: 1,\n fontWeight: 1,\n lineHeight: 1,\n opacity: 1,\n order: 1,\n orphans: 1,\n tabSize: 1,\n widows: 1,\n zIndex: 1,\n zoom: 1,\n WebkitLineClamp: 1,\n // SVG-related properties\n fillOpacity: 1,\n floodOpacity: 1,\n stopOpacity: 1,\n strokeDasharray: 1,\n strokeDashoffset: 1,\n strokeMiterlimit: 1,\n strokeOpacity: 1,\n strokeWidth: 1\n};\nexport default unitlessKeys;","function memoize(fn) {\n var cache = Object.create(null);\n return function (arg) {\n if (cache[arg] === undefined) cache[arg] = fn(arg);\n return cache[arg];\n };\n}\nexport default memoize;","import memoize from '@emotion/memoize';\nvar reactPropsRegex = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|download|draggable|encType|enterKeyHint|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/; // https://esbench.com/bench/5bfee68a4cd7e6009ef61d23\n\nvar isPropValid = /* #__PURE__ */memoize(function (prop) {\n return reactPropsRegex.test(prop) || prop.charCodeAt(0) === 111\n /* o */ && prop.charCodeAt(1) === 110\n /* n */ && prop.charCodeAt(2) < 91;\n}\n/* Z+1 */);\n\nexport default isPropValid;","import { typeOf as e, isElement as t, isValidElementType as n } from \"react-is\";\nimport r, { useState as o, useContext as s, useMemo as i, useEffect as a, useRef as c, createElement as u, useDebugValue as l, useLayoutEffect as d } from \"react\";\nimport h from \"shallowequal\";\nimport p from \"@emotion/stylis\";\nimport f from \"@emotion/unitless\";\nimport m from \"@emotion/is-prop-valid\";\nimport y from \"hoist-non-react-statics\";\nfunction v() {\n return (v = Object.assign || function (e) {\n for (var t = 1; t < arguments.length; t++) {\n var n = arguments[t];\n for (var r in n) {\n Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]);\n }\n }\n return e;\n }).apply(this, arguments);\n}\nvar g = function g(e, t) {\n for (var n = [e[0]], r = 0, o = t.length; r < o; r += 1) {\n n.push(t[r], e[r + 1]);\n }\n return n;\n },\n S = function S(t) {\n return null !== t && \"object\" == typeof t && \"[object Object]\" === (t.toString ? t.toString() : Object.prototype.toString.call(t)) && !e(t);\n },\n w = Object.freeze([]),\n E = Object.freeze({});\nfunction b(e) {\n return \"function\" == typeof e;\n}\nfunction _(e) {\n return \"production\" !== process.env.NODE_ENV && \"string\" == typeof e && e || e.displayName || e.name || \"Component\";\n}\nfunction N(e) {\n return e && \"string\" == typeof e.styledComponentId;\n}\nvar A = \"undefined\" != typeof process && (process.env.REACT_APP_SC_ATTR || process.env.SC_ATTR) || \"data-styled\",\n C = \"5.3.6\",\n I = \"undefined\" != typeof window && \"HTMLElement\" in window,\n P = Boolean(\"boolean\" == typeof SC_DISABLE_SPEEDY ? SC_DISABLE_SPEEDY : \"undefined\" != typeof process && void 0 !== process.env.REACT_APP_SC_DISABLE_SPEEDY && \"\" !== process.env.REACT_APP_SC_DISABLE_SPEEDY ? \"false\" !== process.env.REACT_APP_SC_DISABLE_SPEEDY && process.env.REACT_APP_SC_DISABLE_SPEEDY : \"undefined\" != typeof process && void 0 !== process.env.SC_DISABLE_SPEEDY && \"\" !== process.env.SC_DISABLE_SPEEDY ? \"false\" !== process.env.SC_DISABLE_SPEEDY && process.env.SC_DISABLE_SPEEDY : \"production\" !== process.env.NODE_ENV),\n O = {},\n R = \"production\" !== process.env.NODE_ENV ? {\n 1: \"Cannot create styled-component for component: %s.\\n\\n\",\n 2: \"Can't collect styles once you've consumed a `ServerStyleSheet`'s styles! `ServerStyleSheet` is a one off instance for each server-side render cycle.\\n\\n- Are you trying to reuse it across renders?\\n- Are you accidentally calling collectStyles twice?\\n\\n\",\n 3: \"Streaming SSR is only supported in a Node.js environment; Please do not try to call this method in the browser.\\n\\n\",\n 4: \"The `StyleSheetManager` expects a valid target or sheet prop!\\n\\n- Does this error occur on the client and is your target falsy?\\n- Does this error occur on the server and is the sheet falsy?\\n\\n\",\n 5: \"The clone method cannot be used on the client!\\n\\n- Are you running in a client-like environment on the server?\\n- Are you trying to run SSR on the client?\\n\\n\",\n 6: \"Trying to insert a new style tag, but the given Node is unmounted!\\n\\n- Are you using a custom target that isn't mounted?\\n- Does your document not have a valid head element?\\n- Have you accidentally removed a style tag manually?\\n\\n\",\n 7: 'ThemeProvider: Please return an object from your \"theme\" prop function, e.g.\\n\\n```js\\ntheme={() => ({})}\\n```\\n\\n',\n 8: 'ThemeProvider: Please make your \"theme\" prop an object.\\n\\n',\n 9: \"Missing document ``\\n\\n\",\n 10: \"Cannot find a StyleSheet instance. Usually this happens if there are multiple copies of styled-components loaded at once. Check out this issue for how to troubleshoot and fix the common cases where this situation can happen: https://github.com/styled-components/styled-components/issues/1941#issuecomment-417862021\\n\\n\",\n 11: \"_This error was replaced with a dev-time warning, it will be deleted for v4 final._ [createGlobalStyle] received children which will not be rendered. Please use the component without passing children elements.\\n\\n\",\n 12: \"It seems you are interpolating a keyframe declaration (%s) into an untagged string. This was supported in styled-components v3, but is not longer supported in v4 as keyframes are now injected on-demand. Please wrap your string in the css\\\\`\\\\` helper which ensures the styles are injected correctly. See https://www.styled-components.com/docs/api#css\\n\\n\",\n 13: \"%s is not a styled component and cannot be referred to via component selector. See https://www.styled-components.com/docs/advanced#referring-to-other-components for more details.\\n\\n\",\n 14: 'ThemeProvider: \"theme\" prop is required.\\n\\n',\n 15: \"A stylis plugin has been supplied that is not named. We need a name for each plugin to be able to prevent styling collisions between different stylis configurations within the same app. Before you pass your plugin to ``, please make sure each plugin is uniquely-named, e.g.\\n\\n```js\\nObject.defineProperty(importedPlugin, 'name', { value: 'some-unique-name' });\\n```\\n\\n\",\n 16: \"Reached the limit of how many styled components may be created at group %s.\\nYou may only create up to 1,073,741,824 components. If you're creating components dynamically,\\nas for instance in your render method then you may be running into this limitation.\\n\\n\",\n 17: \"CSSStyleSheet could not be found on HTMLStyleElement.\\nHas styled-components' style tag been unmounted or altered by another script?\\n\"\n } : {};\nfunction D() {\n for (var e = arguments.length <= 0 ? void 0 : arguments[0], t = [], n = 1, r = arguments.length; n < r; n += 1) {\n t.push(n < 0 || arguments.length <= n ? void 0 : arguments[n]);\n }\n return t.forEach(function (t) {\n e = e.replace(/%[a-z]/, t);\n }), e;\n}\nfunction j(e) {\n for (var t = arguments.length, n = new Array(t > 1 ? t - 1 : 0), r = 1; r < t; r++) {\n n[r - 1] = arguments[r];\n }\n throw \"production\" === process.env.NODE_ENV ? new Error(\"An error occurred. See https://git.io/JUIaE#\" + e + \" for more information.\" + (n.length > 0 ? \" Args: \" + n.join(\", \") : \"\")) : new Error(D.apply(void 0, [R[e]].concat(n)).trim());\n}\nvar T = function () {\n function e(e) {\n this.groupSizes = new Uint32Array(512), this.length = 512, this.tag = e;\n }\n var t = e.prototype;\n return t.indexOfGroup = function (e) {\n for (var t = 0, n = 0; n < e; n++) {\n t += this.groupSizes[n];\n }\n return t;\n }, t.insertRules = function (e, t) {\n if (e >= this.groupSizes.length) {\n for (var n = this.groupSizes, r = n.length, o = r; e >= o;) {\n (o <<= 1) < 0 && j(16, \"\" + e);\n }\n this.groupSizes = new Uint32Array(o), this.groupSizes.set(n), this.length = o;\n for (var s = r; s < o; s++) {\n this.groupSizes[s] = 0;\n }\n }\n for (var i = this.indexOfGroup(e + 1), a = 0, c = t.length; a < c; a++) {\n this.tag.insertRule(i, t[a]) && (this.groupSizes[e]++, i++);\n }\n }, t.clearGroup = function (e) {\n if (e < this.length) {\n var t = this.groupSizes[e],\n n = this.indexOfGroup(e),\n r = n + t;\n this.groupSizes[e] = 0;\n for (var o = n; o < r; o++) {\n this.tag.deleteRule(n);\n }\n }\n }, t.getGroup = function (e) {\n var t = \"\";\n if (e >= this.length || 0 === this.groupSizes[e]) return t;\n for (var n = this.groupSizes[e], r = this.indexOfGroup(e), o = r + n, s = r; s < o; s++) {\n t += this.tag.getRule(s) + \"/*!sc*/\\n\";\n }\n return t;\n }, e;\n }(),\n x = new Map(),\n k = new Map(),\n V = 1,\n B = function B(e) {\n if (x.has(e)) return x.get(e);\n for (; k.has(V);) {\n V++;\n }\n var t = V++;\n return \"production\" !== process.env.NODE_ENV && ((0 | t) < 0 || t > 1 << 30) && j(16, \"\" + t), x.set(e, t), k.set(t, e), t;\n },\n z = function z(e) {\n return k.get(e);\n },\n M = function M(e, t) {\n t >= V && (V = t + 1), x.set(e, t), k.set(t, e);\n },\n G = \"style[\" + A + '][data-styled-version=\"5.3.6\"]',\n L = new RegExp(\"^\" + A + '\\\\.g(\\\\d+)\\\\[id=\"([\\\\w\\\\d-]+)\"\\\\].*?\"([^\"]*)'),\n F = function F(e, t, n) {\n for (var r, o = n.split(\",\"), s = 0, i = o.length; s < i; s++) {\n (r = o[s]) && e.registerName(t, r);\n }\n },\n Y = function Y(e, t) {\n for (var n = (t.textContent || \"\").split(\"/*!sc*/\\n\"), r = [], o = 0, s = n.length; o < s; o++) {\n var i = n[o].trim();\n if (i) {\n var a = i.match(L);\n if (a) {\n var c = 0 | parseInt(a[1], 10),\n u = a[2];\n 0 !== c && (M(u, c), F(e, u, a[3]), e.getTag().insertRules(c, r)), r.length = 0;\n } else r.push(i);\n }\n }\n },\n q = function q() {\n return \"undefined\" != typeof __webpack_nonce__ ? __webpack_nonce__ : null;\n },\n H = function H(e) {\n var t = document.head,\n n = e || t,\n r = document.createElement(\"style\"),\n o = function (e) {\n for (var t = e.childNodes, n = t.length; n >= 0; n--) {\n var r = t[n];\n if (r && 1 === r.nodeType && r.hasAttribute(A)) return r;\n }\n }(n),\n s = void 0 !== o ? o.nextSibling : null;\n r.setAttribute(A, \"active\"), r.setAttribute(\"data-styled-version\", \"5.3.6\");\n var i = q();\n return i && r.setAttribute(\"nonce\", i), n.insertBefore(r, s), r;\n },\n $ = function () {\n function e(e) {\n var t = this.element = H(e);\n t.appendChild(document.createTextNode(\"\")), this.sheet = function (e) {\n if (e.sheet) return e.sheet;\n for (var t = document.styleSheets, n = 0, r = t.length; n < r; n++) {\n var o = t[n];\n if (o.ownerNode === e) return o;\n }\n j(17);\n }(t), this.length = 0;\n }\n var t = e.prototype;\n return t.insertRule = function (e, t) {\n try {\n return this.sheet.insertRule(t, e), this.length++, !0;\n } catch (e) {\n return !1;\n }\n }, t.deleteRule = function (e) {\n this.sheet.deleteRule(e), this.length--;\n }, t.getRule = function (e) {\n var t = this.sheet.cssRules[e];\n return void 0 !== t && \"string\" == typeof t.cssText ? t.cssText : \"\";\n }, e;\n }(),\n W = function () {\n function e(e) {\n var t = this.element = H(e);\n this.nodes = t.childNodes, this.length = 0;\n }\n var t = e.prototype;\n return t.insertRule = function (e, t) {\n if (e <= this.length && e >= 0) {\n var n = document.createTextNode(t),\n r = this.nodes[e];\n return this.element.insertBefore(n, r || null), this.length++, !0;\n }\n return !1;\n }, t.deleteRule = function (e) {\n this.element.removeChild(this.nodes[e]), this.length--;\n }, t.getRule = function (e) {\n return e < this.length ? this.nodes[e].textContent : \"\";\n }, e;\n }(),\n U = function () {\n function e(e) {\n this.rules = [], this.length = 0;\n }\n var t = e.prototype;\n return t.insertRule = function (e, t) {\n return e <= this.length && (this.rules.splice(e, 0, t), this.length++, !0);\n }, t.deleteRule = function (e) {\n this.rules.splice(e, 1), this.length--;\n }, t.getRule = function (e) {\n return e < this.length ? this.rules[e] : \"\";\n }, e;\n }(),\n J = I,\n X = {\n isServer: !I,\n useCSSOMInjection: !P\n },\n Z = function () {\n function e(e, t, n) {\n void 0 === e && (e = E), void 0 === t && (t = {}), this.options = v({}, X, {}, e), this.gs = t, this.names = new Map(n), this.server = !!e.isServer, !this.server && I && J && (J = !1, function (e) {\n for (var t = document.querySelectorAll(G), n = 0, r = t.length; n < r; n++) {\n var o = t[n];\n o && \"active\" !== o.getAttribute(A) && (Y(e, o), o.parentNode && o.parentNode.removeChild(o));\n }\n }(this));\n }\n e.registerId = function (e) {\n return B(e);\n };\n var t = e.prototype;\n return t.reconstructWithOptions = function (t, n) {\n return void 0 === n && (n = !0), new e(v({}, this.options, {}, t), this.gs, n && this.names || void 0);\n }, t.allocateGSInstance = function (e) {\n return this.gs[e] = (this.gs[e] || 0) + 1;\n }, t.getTag = function () {\n return this.tag || (this.tag = (n = (t = this.options).isServer, r = t.useCSSOMInjection, o = t.target, e = n ? new U(o) : r ? new $(o) : new W(o), new T(e)));\n var e, t, n, r, o;\n }, t.hasNameForId = function (e, t) {\n return this.names.has(e) && this.names.get(e).has(t);\n }, t.registerName = function (e, t) {\n if (B(e), this.names.has(e)) this.names.get(e).add(t);else {\n var n = new Set();\n n.add(t), this.names.set(e, n);\n }\n }, t.insertRules = function (e, t, n) {\n this.registerName(e, t), this.getTag().insertRules(B(e), n);\n }, t.clearNames = function (e) {\n this.names.has(e) && this.names.get(e).clear();\n }, t.clearRules = function (e) {\n this.getTag().clearGroup(B(e)), this.clearNames(e);\n }, t.clearTag = function () {\n this.tag = void 0;\n }, t.toString = function () {\n return function (e) {\n for (var t = e.getTag(), n = t.length, r = \"\", o = 0; o < n; o++) {\n var s = z(o);\n if (void 0 !== s) {\n var i = e.names.get(s),\n a = t.getGroup(o);\n if (i && a && i.size) {\n var c = A + \".g\" + o + '[id=\"' + s + '\"]',\n u = \"\";\n void 0 !== i && i.forEach(function (e) {\n e.length > 0 && (u += e + \",\");\n }), r += \"\" + a + c + '{content:\"' + u + '\"}/*!sc*/\\n';\n }\n }\n }\n return r;\n }(this);\n }, e;\n }(),\n K = /(a)(d)/gi,\n Q = function Q(e) {\n return String.fromCharCode(e + (e > 25 ? 39 : 97));\n };\nfunction ee(e) {\n var t,\n n = \"\";\n for (t = Math.abs(e); t > 52; t = t / 52 | 0) {\n n = Q(t % 52) + n;\n }\n return (Q(t % 52) + n).replace(K, \"$1-$2\");\n}\nvar te = function te(e, t) {\n for (var n = t.length; n;) {\n e = 33 * e ^ t.charCodeAt(--n);\n }\n return e;\n },\n ne = function ne(e) {\n return te(5381, e);\n };\nfunction re(e) {\n for (var t = 0; t < e.length; t += 1) {\n var n = e[t];\n if (b(n) && !N(n)) return !1;\n }\n return !0;\n}\nvar oe = ne(\"5.3.6\"),\n se = function () {\n function e(e, t, n) {\n this.rules = e, this.staticRulesId = \"\", this.isStatic = \"production\" === process.env.NODE_ENV && (void 0 === n || n.isStatic) && re(e), this.componentId = t, this.baseHash = te(oe, t), this.baseStyle = n, Z.registerId(t);\n }\n return e.prototype.generateAndInjectStyles = function (e, t, n) {\n var r = this.componentId,\n o = [];\n if (this.baseStyle && o.push(this.baseStyle.generateAndInjectStyles(e, t, n)), this.isStatic && !n.hash) {\n if (this.staticRulesId && t.hasNameForId(r, this.staticRulesId)) o.push(this.staticRulesId);else {\n var s = Ne(this.rules, e, t, n).join(\"\"),\n i = ee(te(this.baseHash, s) >>> 0);\n if (!t.hasNameForId(r, i)) {\n var a = n(s, \".\" + i, void 0, r);\n t.insertRules(r, i, a);\n }\n o.push(i), this.staticRulesId = i;\n }\n } else {\n for (var c = this.rules.length, u = te(this.baseHash, n.hash), l = \"\", d = 0; d < c; d++) {\n var h = this.rules[d];\n if (\"string\" == typeof h) l += h, \"production\" !== process.env.NODE_ENV && (u = te(u, h + d));else if (h) {\n var p = Ne(h, e, t, n),\n f = Array.isArray(p) ? p.join(\"\") : p;\n u = te(u, f + d), l += f;\n }\n }\n if (l) {\n var m = ee(u >>> 0);\n if (!t.hasNameForId(r, m)) {\n var y = n(l, \".\" + m, void 0, r);\n t.insertRules(r, m, y);\n }\n o.push(m);\n }\n }\n return o.join(\" \");\n }, e;\n }(),\n ie = /^\\s*\\/\\/.*$/gm,\n ae = [\":\", \"[\", \".\", \"#\"];\nfunction ce(e) {\n var t,\n n,\n r,\n o,\n s = void 0 === e ? E : e,\n i = s.options,\n a = void 0 === i ? E : i,\n c = s.plugins,\n u = void 0 === c ? w : c,\n l = new p(a),\n d = [],\n h = function (e) {\n function t(t) {\n if (t) try {\n e(t + \"}\");\n } catch (e) {}\n }\n return function (n, r, o, s, i, a, c, u, l, d) {\n switch (n) {\n case 1:\n if (0 === l && 64 === r.charCodeAt(0)) return e(r + \";\"), \"\";\n break;\n case 2:\n if (0 === u) return r + \"/*|*/\";\n break;\n case 3:\n switch (u) {\n case 102:\n case 112:\n return e(o[0] + r), \"\";\n default:\n return r + (0 === d ? \"/*|*/\" : \"\");\n }\n case -2:\n r.split(\"/*|*/}\").forEach(t);\n }\n };\n }(function (e) {\n d.push(e);\n }),\n f = function f(e, r, s) {\n return 0 === r && -1 !== ae.indexOf(s[n.length]) || s.match(o) ? e : \".\" + t;\n };\n function m(e, s, i, a) {\n void 0 === a && (a = \"&\");\n var c = e.replace(ie, \"\"),\n u = s && i ? i + \" \" + s + \" { \" + c + \" }\" : c;\n return t = a, n = s, r = new RegExp(\"\\\\\" + n + \"\\\\b\", \"g\"), o = new RegExp(\"(\\\\\" + n + \"\\\\b){2,}\"), l(i || !s ? \"\" : s, u);\n }\n return l.use([].concat(u, [function (e, t, o) {\n 2 === e && o.length && o[0].lastIndexOf(n) > 0 && (o[0] = o[0].replace(r, f));\n }, h, function (e) {\n if (-2 === e) {\n var t = d;\n return d = [], t;\n }\n }])), m.hash = u.length ? u.reduce(function (e, t) {\n return t.name || j(15), te(e, t.name);\n }, 5381).toString() : \"\", m;\n}\nvar ue = r.createContext(),\n le = ue.Consumer,\n de = r.createContext(),\n he = (de.Consumer, new Z()),\n pe = ce();\nfunction fe() {\n return s(ue) || he;\n}\nfunction me() {\n return s(de) || pe;\n}\nfunction ye(e) {\n var t = o(e.stylisPlugins),\n n = t[0],\n s = t[1],\n c = fe(),\n u = i(function () {\n var t = c;\n return e.sheet ? t = e.sheet : e.target && (t = t.reconstructWithOptions({\n target: e.target\n }, !1)), e.disableCSSOMInjection && (t = t.reconstructWithOptions({\n useCSSOMInjection: !1\n })), t;\n }, [e.disableCSSOMInjection, e.sheet, e.target]),\n l = i(function () {\n return ce({\n options: {\n prefix: !e.disableVendorPrefixes\n },\n plugins: n\n });\n }, [e.disableVendorPrefixes, n]);\n return a(function () {\n h(n, e.stylisPlugins) || s(e.stylisPlugins);\n }, [e.stylisPlugins]), r.createElement(ue.Provider, {\n value: u\n }, r.createElement(de.Provider, {\n value: l\n }, \"production\" !== process.env.NODE_ENV ? r.Children.only(e.children) : e.children));\n}\nvar ve = function () {\n function e(e, t) {\n var n = this;\n this.inject = function (e, t) {\n void 0 === t && (t = pe);\n var r = n.name + t.hash;\n e.hasNameForId(n.id, r) || e.insertRules(n.id, r, t(n.rules, r, \"@keyframes\"));\n }, this.toString = function () {\n return j(12, String(n.name));\n }, this.name = e, this.id = \"sc-keyframes-\" + e, this.rules = t;\n }\n return e.prototype.getName = function (e) {\n return void 0 === e && (e = pe), this.name + e.hash;\n }, e;\n }(),\n ge = /([A-Z])/,\n Se = /([A-Z])/g,\n we = /^ms-/,\n Ee = function Ee(e) {\n return \"-\" + e.toLowerCase();\n };\nfunction be(e) {\n return ge.test(e) ? e.replace(Se, Ee).replace(we, \"-ms-\") : e;\n}\nvar _e = function _e(e) {\n return null == e || !1 === e || \"\" === e;\n};\nfunction Ne(e, n, r, o) {\n if (Array.isArray(e)) {\n for (var s, i = [], a = 0, c = e.length; a < c; a += 1) {\n \"\" !== (s = Ne(e[a], n, r, o)) && (Array.isArray(s) ? i.push.apply(i, s) : i.push(s));\n }\n return i;\n }\n if (_e(e)) return \"\";\n if (N(e)) return \".\" + e.styledComponentId;\n if (b(e)) {\n if (\"function\" != typeof (l = e) || l.prototype && l.prototype.isReactComponent || !n) return e;\n var u = e(n);\n return \"production\" !== process.env.NODE_ENV && t(u) && console.warn(_(e) + \" is not a styled component and cannot be referred to via component selector. See https://www.styled-components.com/docs/advanced#referring-to-other-components for more details.\"), Ne(u, n, r, o);\n }\n var l;\n return e instanceof ve ? r ? (e.inject(r, o), e.getName(o)) : e : S(e) ? function e(t, n) {\n var r,\n o,\n s = [];\n for (var i in t) {\n t.hasOwnProperty(i) && !_e(t[i]) && (Array.isArray(t[i]) && t[i].isCss || b(t[i]) ? s.push(be(i) + \":\", t[i], \";\") : S(t[i]) ? s.push.apply(s, e(t[i], i)) : s.push(be(i) + \": \" + (r = i, null == (o = t[i]) || \"boolean\" == typeof o || \"\" === o ? \"\" : \"number\" != typeof o || 0 === o || r in f ? String(o).trim() : o + \"px\") + \";\"));\n }\n return n ? [n + \" {\"].concat(s, [\"}\"]) : s;\n }(e) : e.toString();\n}\nvar Ae = function Ae(e) {\n return Array.isArray(e) && (e.isCss = !0), e;\n};\nfunction Ce(e) {\n for (var t = arguments.length, n = new Array(t > 1 ? t - 1 : 0), r = 1; r < t; r++) {\n n[r - 1] = arguments[r];\n }\n return b(e) || S(e) ? Ae(Ne(g(w, [e].concat(n)))) : 0 === n.length && 1 === e.length && \"string\" == typeof e[0] ? e : Ae(Ne(g(e, n)));\n}\nvar Ie = /invalid hook call/i,\n Pe = new Set(),\n Oe = function Oe(e, t) {\n if (\"production\" !== process.env.NODE_ENV) {\n var n = \"The component \" + e + (t ? ' with the id of \"' + t + '\"' : \"\") + \" has been created dynamically.\\nYou may see this warning because you've called styled inside another component.\\nTo resolve this only create new StyledComponents outside of any render method and function component.\",\n r = console.error;\n try {\n var o = !0;\n console.error = function (e) {\n if (Ie.test(e)) o = !1, Pe.delete(n);else {\n for (var t = arguments.length, s = new Array(t > 1 ? t - 1 : 0), i = 1; i < t; i++) {\n s[i - 1] = arguments[i];\n }\n r.apply(void 0, [e].concat(s));\n }\n }, c(), o && !Pe.has(n) && (console.warn(n), Pe.add(n));\n } catch (e) {\n Ie.test(e.message) && Pe.delete(n);\n } finally {\n console.error = r;\n }\n }\n },\n Re = function Re(e, t, n) {\n return void 0 === n && (n = E), e.theme !== n.theme && e.theme || t || n.theme;\n },\n De = /[!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~-]+/g,\n je = /(^-|-$)/g;\nfunction Te(e) {\n return e.replace(De, \"-\").replace(je, \"\");\n}\nvar xe = function xe(e) {\n return ee(ne(e) >>> 0);\n};\nfunction ke(e) {\n return \"string\" == typeof e && (\"production\" === process.env.NODE_ENV || e.charAt(0) === e.charAt(0).toLowerCase());\n}\nvar Ve = function Ve(e) {\n return \"function\" == typeof e || \"object\" == typeof e && null !== e && !Array.isArray(e);\n },\n Be = function Be(e) {\n return \"__proto__\" !== e && \"constructor\" !== e && \"prototype\" !== e;\n };\nfunction ze(e, t, n) {\n var r = e[n];\n Ve(t) && Ve(r) ? Me(r, t) : e[n] = t;\n}\nfunction Me(e) {\n for (var t = arguments.length, n = new Array(t > 1 ? t - 1 : 0), r = 1; r < t; r++) {\n n[r - 1] = arguments[r];\n }\n for (var o = 0, s = n; o < s.length; o++) {\n var i = s[o];\n if (Ve(i)) for (var a in i) {\n Be(a) && ze(e, i[a], a);\n }\n }\n return e;\n}\nvar Ge = r.createContext(),\n Le = Ge.Consumer;\nfunction Fe(e) {\n var t = s(Ge),\n n = i(function () {\n return function (e, t) {\n if (!e) return j(14);\n if (b(e)) {\n var n = e(t);\n return \"production\" === process.env.NODE_ENV || null !== n && !Array.isArray(n) && \"object\" == typeof n ? n : j(7);\n }\n return Array.isArray(e) || \"object\" != typeof e ? j(8) : t ? v({}, t, {}, e) : e;\n }(e.theme, t);\n }, [e.theme, t]);\n return e.children ? r.createElement(Ge.Provider, {\n value: n\n }, e.children) : null;\n}\nvar Ye = {};\nfunction qe(e, t, n) {\n var o = N(e),\n i = !ke(e),\n a = t.attrs,\n c = void 0 === a ? w : a,\n d = t.componentId,\n h = void 0 === d ? function (e, t) {\n var n = \"string\" != typeof e ? \"sc\" : Te(e);\n Ye[n] = (Ye[n] || 0) + 1;\n var r = n + \"-\" + xe(\"5.3.6\" + n + Ye[n]);\n return t ? t + \"-\" + r : r;\n }(t.displayName, t.parentComponentId) : d,\n p = t.displayName,\n f = void 0 === p ? function (e) {\n return ke(e) ? \"styled.\" + e : \"Styled(\" + _(e) + \")\";\n }(e) : p,\n g = t.displayName && t.componentId ? Te(t.displayName) + \"-\" + t.componentId : t.componentId || h,\n S = o && e.attrs ? Array.prototype.concat(e.attrs, c).filter(Boolean) : c,\n A = t.shouldForwardProp;\n o && e.shouldForwardProp && (A = t.shouldForwardProp ? function (n, r, o) {\n return e.shouldForwardProp(n, r, o) && t.shouldForwardProp(n, r, o);\n } : e.shouldForwardProp);\n var C,\n I = new se(n, g, o ? e.componentStyle : void 0),\n P = I.isStatic && 0 === c.length,\n O = function O(e, t) {\n return function (e, t, n, r) {\n var o = e.attrs,\n i = e.componentStyle,\n a = e.defaultProps,\n c = e.foldedComponentIds,\n d = e.shouldForwardProp,\n h = e.styledComponentId,\n p = e.target;\n \"production\" !== process.env.NODE_ENV && l(h);\n var f = function (e, t, n) {\n void 0 === e && (e = E);\n var r = v({}, t, {\n theme: e\n }),\n o = {};\n return n.forEach(function (e) {\n var t,\n n,\n s,\n i = e;\n for (t in b(i) && (i = i(r)), i) {\n r[t] = o[t] = \"className\" === t ? (n = o[t], s = i[t], n && s ? n + \" \" + s : n || s) : i[t];\n }\n }), [r, o];\n }(Re(t, s(Ge), a) || E, t, o),\n y = f[0],\n g = f[1],\n S = function (e, t, n, r) {\n var o = fe(),\n s = me(),\n i = t ? e.generateAndInjectStyles(E, o, s) : e.generateAndInjectStyles(n, o, s);\n return \"production\" !== process.env.NODE_ENV && l(i), \"production\" !== process.env.NODE_ENV && !t && r && r(i), i;\n }(i, r, y, \"production\" !== process.env.NODE_ENV ? e.warnTooManyClasses : void 0),\n w = n,\n _ = g.$as || t.$as || g.as || t.as || p,\n N = ke(_),\n A = g !== t ? v({}, t, {}, g) : t,\n C = {};\n for (var I in A) {\n \"$\" !== I[0] && \"as\" !== I && (\"forwardedAs\" === I ? C.as = A[I] : (d ? d(I, m, _) : !N || m(I)) && (C[I] = A[I]));\n }\n return t.style && g.style !== t.style && (C.style = v({}, t.style, {}, g.style)), C.className = Array.prototype.concat(c, h, S !== h ? S : null, t.className, g.className).filter(Boolean).join(\" \"), C.ref = w, u(_, C);\n }(C, e, t, P);\n };\n return O.displayName = f, (C = r.forwardRef(O)).attrs = S, C.componentStyle = I, C.displayName = f, C.shouldForwardProp = A, C.foldedComponentIds = o ? Array.prototype.concat(e.foldedComponentIds, e.styledComponentId) : w, C.styledComponentId = g, C.target = o ? e.target : e, C.withComponent = function (e) {\n var r = t.componentId,\n o = function (e, t) {\n if (null == e) return {};\n var n,\n r,\n o = {},\n s = Object.keys(e);\n for (r = 0; r < s.length; r++) {\n n = s[r], t.indexOf(n) >= 0 || (o[n] = e[n]);\n }\n return o;\n }(t, [\"componentId\"]),\n s = r && r + \"-\" + (ke(e) ? e : Te(_(e)));\n return qe(e, v({}, o, {\n attrs: S,\n componentId: s\n }), n);\n }, Object.defineProperty(C, \"defaultProps\", {\n get: function get() {\n return this._foldedDefaultProps;\n },\n set: function set(t) {\n this._foldedDefaultProps = o ? Me({}, e.defaultProps, t) : t;\n }\n }), \"production\" !== process.env.NODE_ENV && (Oe(f, g), C.warnTooManyClasses = function (e, t) {\n var n = {},\n r = !1;\n return function (o) {\n if (!r && (n[o] = !0, Object.keys(n).length >= 200)) {\n var s = t ? ' with the id of \"' + t + '\"' : \"\";\n console.warn(\"Over 200 classes were generated for component \" + e + s + \".\\nConsider using the attrs method, together with a style object for frequently changed styles.\\nExample:\\n const Component = styled.div.attrs(props => ({\\n style: {\\n background: props.background,\\n },\\n }))`width: 100%;`\\n\\n \"), r = !0, n = {};\n }\n };\n }(f, g)), C.toString = function () {\n return \".\" + C.styledComponentId;\n }, i && y(C, e, {\n attrs: !0,\n componentStyle: !0,\n displayName: !0,\n foldedComponentIds: !0,\n shouldForwardProp: !0,\n styledComponentId: !0,\n target: !0,\n withComponent: !0\n }), C;\n}\nvar He = function He(e) {\n return function e(t, r, o) {\n if (void 0 === o && (o = E), !n(r)) return j(1, String(r));\n var s = function s() {\n return t(r, o, Ce.apply(void 0, arguments));\n };\n return s.withConfig = function (n) {\n return e(t, r, v({}, o, {}, n));\n }, s.attrs = function (n) {\n return e(t, r, v({}, o, {\n attrs: Array.prototype.concat(o.attrs, n).filter(Boolean)\n }));\n }, s;\n }(qe, e);\n};\n[\"a\", \"abbr\", \"address\", \"area\", \"article\", \"aside\", \"audio\", \"b\", \"base\", \"bdi\", \"bdo\", \"big\", \"blockquote\", \"body\", \"br\", \"button\", \"canvas\", \"caption\", \"cite\", \"code\", \"col\", \"colgroup\", \"data\", \"datalist\", \"dd\", \"del\", \"details\", \"dfn\", \"dialog\", \"div\", \"dl\", \"dt\", \"em\", \"embed\", \"fieldset\", \"figcaption\", \"figure\", \"footer\", \"form\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"head\", \"header\", \"hgroup\", \"hr\", \"html\", \"i\", \"iframe\", \"img\", \"input\", \"ins\", \"kbd\", \"keygen\", \"label\", \"legend\", \"li\", \"link\", \"main\", \"map\", \"mark\", \"marquee\", \"menu\", \"menuitem\", \"meta\", \"meter\", \"nav\", \"noscript\", \"object\", \"ol\", \"optgroup\", \"option\", \"output\", \"p\", \"param\", \"picture\", \"pre\", \"progress\", \"q\", \"rp\", \"rt\", \"ruby\", \"s\", \"samp\", \"script\", \"section\", \"select\", \"small\", \"source\", \"span\", \"strong\", \"style\", \"sub\", \"summary\", \"sup\", \"table\", \"tbody\", \"td\", \"textarea\", \"tfoot\", \"th\", \"thead\", \"time\", \"title\", \"tr\", \"track\", \"u\", \"ul\", \"var\", \"video\", \"wbr\", \"circle\", \"clipPath\", \"defs\", \"ellipse\", \"foreignObject\", \"g\", \"image\", \"line\", \"linearGradient\", \"marker\", \"mask\", \"path\", \"pattern\", \"polygon\", \"polyline\", \"radialGradient\", \"rect\", \"stop\", \"svg\", \"text\", \"textPath\", \"tspan\"].forEach(function (e) {\n He[e] = He(e);\n});\nvar $e = function () {\n function e(e, t) {\n this.rules = e, this.componentId = t, this.isStatic = re(e), Z.registerId(this.componentId + 1);\n }\n var t = e.prototype;\n return t.createStyles = function (e, t, n, r) {\n var o = r(Ne(this.rules, t, n, r).join(\"\"), \"\"),\n s = this.componentId + e;\n n.insertRules(s, s, o);\n }, t.removeStyles = function (e, t) {\n t.clearRules(this.componentId + e);\n }, t.renderStyles = function (e, t, n, r) {\n e > 2 && Z.registerId(this.componentId + e), this.removeStyles(e, n), this.createStyles(e, t, n, r);\n }, e;\n}();\nfunction We(e) {\n for (var t = arguments.length, n = new Array(t > 1 ? t - 1 : 0), o = 1; o < t; o++) {\n n[o - 1] = arguments[o];\n }\n var i = Ce.apply(void 0, [e].concat(n)),\n a = \"sc-global-\" + xe(JSON.stringify(i)),\n u = new $e(i, a);\n function l(e) {\n var t = fe(),\n n = me(),\n o = s(Ge),\n l = c(t.allocateGSInstance(a)).current;\n return \"production\" !== process.env.NODE_ENV && r.Children.count(e.children) && console.warn(\"The global style component \" + a + \" was given child JSX. createGlobalStyle does not render children.\"), \"production\" !== process.env.NODE_ENV && i.some(function (e) {\n return \"string\" == typeof e && -1 !== e.indexOf(\"@import\");\n }) && console.warn(\"Please do not use @import CSS syntax in createGlobalStyle at this time, as the CSSOM APIs we use in production do not handle it well. Instead, we recommend using a library such as react-helmet to inject a typical meta tag to the stylesheet, or simply embedding it manually in your index.html section for a simpler app.\"), t.server && h(l, e, t, o, n), d(function () {\n if (!t.server) return h(l, e, t, o, n), function () {\n return u.removeStyles(l, t);\n };\n }, [l, e, t, o, n]), null;\n }\n function h(e, t, n, r, o) {\n if (u.isStatic) u.renderStyles(e, O, n, o);else {\n var s = v({}, t, {\n theme: Re(t, r, l.defaultProps)\n });\n u.renderStyles(e, s, n, o);\n }\n }\n return \"production\" !== process.env.NODE_ENV && Oe(a), r.memo(l);\n}\nfunction Ue(e) {\n \"production\" !== process.env.NODE_ENV && \"undefined\" != typeof navigator && \"ReactNative\" === navigator.product && console.warn(\"`keyframes` cannot be used on ReactNative, only on the web. To do animation in ReactNative please use Animated.\");\n for (var t = arguments.length, n = new Array(t > 1 ? t - 1 : 0), r = 1; r < t; r++) {\n n[r - 1] = arguments[r];\n }\n var o = Ce.apply(void 0, [e].concat(n)).join(\"\"),\n s = xe(o);\n return new ve(s, o);\n}\nvar Je = function () {\n function e() {\n var e = this;\n this._emitSheetCSS = function () {\n var t = e.instance.toString();\n if (!t) return \"\";\n var n = q();\n return \"\";\n }, this.getStyleTags = function () {\n return e.sealed ? j(2) : e._emitSheetCSS();\n }, this.getStyleElement = function () {\n var t;\n if (e.sealed) return j(2);\n var n = ((t = {})[A] = \"\", t[\"data-styled-version\"] = \"5.3.6\", t.dangerouslySetInnerHTML = {\n __html: e.instance.toString()\n }, t),\n o = q();\n return o && (n.nonce = o), [r.createElement(\"style\", v({}, n, {\n key: \"sc-0-0\"\n }))];\n }, this.seal = function () {\n e.sealed = !0;\n }, this.instance = new Z({\n isServer: !0\n }), this.sealed = !1;\n }\n var t = e.prototype;\n return t.collectStyles = function (e) {\n return this.sealed ? j(2) : r.createElement(ye, {\n sheet: this.instance\n }, e);\n }, t.interleaveWithNodeStream = function (e) {\n return j(3);\n }, e;\n }(),\n Xe = function Xe(e) {\n var t = r.forwardRef(function (t, n) {\n var o = s(Ge),\n i = e.defaultProps,\n a = Re(t, o, i);\n return \"production\" !== process.env.NODE_ENV && void 0 === a && console.warn('[withTheme] You are not using a ThemeProvider nor passing a theme prop or a theme in defaultProps in component class \"' + _(e) + '\"'), r.createElement(e, v({}, t, {\n theme: a,\n ref: n\n }));\n });\n return y(t, e), t.displayName = \"WithTheme(\" + _(e) + \")\", t;\n },\n Ze = function Ze() {\n return s(Ge);\n },\n Ke = {\n StyleSheet: Z,\n masterSheet: he\n };\n\"production\" !== process.env.NODE_ENV && \"undefined\" != typeof navigator && \"ReactNative\" === navigator.product && console.warn(\"It looks like you've imported 'styled-components' on React Native.\\nPerhaps you're looking to import 'styled-components/native'?\\nRead more about this at https://www.styled-components.com/docs/basics#react-native\"), \"production\" !== process.env.NODE_ENV && \"test\" !== process.env.NODE_ENV && \"undefined\" != typeof window && (window[\"__styled-components-init__\"] = window[\"__styled-components-init__\"] || 0, 1 === window[\"__styled-components-init__\"] && console.warn(\"It looks like there are several instances of 'styled-components' initialized in this application. This may cause dynamic styles to not render properly, errors during the rehydration process, a missing theme prop, and makes your application bigger without good reason.\\n\\nSee https://s-c.sh/2BAXzed for more info.\"), window[\"__styled-components-init__\"] += 1);\nexport default He;\nexport { Je as ServerStyleSheet, le as StyleSheetConsumer, ue as StyleSheetContext, ye as StyleSheetManager, Le as ThemeConsumer, Ge as ThemeContext, Fe as ThemeProvider, Ke as __PRIVATE__, We as createGlobalStyle, Ce as css, N as isStyledComponent, Ue as keyframes, Ze as useTheme, C as version, Xe as withTheme };","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar _tmcClient = require('./tmc-client');\nvar _tmcClient2 = _interopRequireDefault(_tmcClient);\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n}\ntry {\n /* eslint-disable global-require */\n require('fetch-polyfill');\n require('babel-polyfill');\n /* eslint-enable global-require */\n} catch (e) {}\nexports.default = _tmcClient2.default;\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\nvar _api = require('./utils/api');\nvar _api2 = _interopRequireDefault(_api);\nvar _userStore = require('./utils/user-store');\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n}\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nvar TmcClient = function () {\n function TmcClient(clientId, clientSecret) {\n var oAuthSite = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'https://tmc.mooc.fi';\n _classCallCheck(this, TmcClient);\n this.clientId = clientId;\n this.clientSecret = clientSecret;\n this.api = new _api2.default(oAuthSite);\n }\n _createClass(TmcClient, [{\n key: 'authenticate',\n value: function authenticate(_ref) {\n var _this = this;\n var username = _ref.username;\n var password = _ref.password;\n return new Promise(function (resolve, reject) {\n var body = ['client_id=' + _this.clientId, 'client_secret=' + _this.clientSecret, 'username=' + encodeURIComponent(username), 'password=' + encodeURIComponent(password), 'grant_type=password'].join('&');\n var options = {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n body: body\n };\n _this.api.post('/oauth/token', options).then(function (response) {\n return response.json();\n }).then(function (response) {\n var user = {\n username: username,\n accessToken: response.access_token\n };\n if (username.indexOf('@') !== -1) {\n _this.api.get('/api/v8/users/current', {\n accessToken: response.access_token\n }).then(function (res) {\n return res.json();\n }).then(function (details) {\n user.username = details.username;\n (0, _userStore.setUser)(user);\n resolve(user);\n });\n } else {\n (0, _userStore.setUser)(user);\n resolve(user);\n }\n }).catch(reject);\n });\n }\n }, {\n key: 'unauthenticate',\n value: function unauthenticate() {\n (0, _userStore.removeUser)();\n return this;\n }\n }, {\n key: 'getUser',\n value: function getUser() {\n return (0, _userStore.getUser)();\n }\n }]);\n return TmcClient;\n}();\nexports.default = TmcClient;\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\nvar _userStore = require('./user-store');\nvar _fetchPonyfill2 = require('fetch-ponyfill');\nvar _fetchPonyfill3 = _interopRequireDefault(_fetchPonyfill2);\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n}\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nvar _fetchPonyfill = (0, _fetchPonyfill3.default)();\nvar fetch = _fetchPonyfill.fetch;\nvar Request = _fetchPonyfill.Request;\nvar Api = function () {\n function Api(oAuthSite) {\n _classCallCheck(this, Api);\n this.oauthSite = oAuthSite;\n }\n _createClass(Api, [{\n key: 'request',\n value: function request(path) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var headers = options.headers || {};\n var user = (0, _userStore.getUser)();\n if (user && user.accessToken || options.accessToken) {\n var token = void 0;\n if (user && user.accessToken) {\n token = user.accessToken;\n } else {\n token = options.accessToken;\n }\n headers = Object.assign({\n authorization: 'Bearer ' + token,\n 'Content-Type': 'application/json'\n }, headers);\n }\n return fetch(new Request('' + this.oauthSite + path, Object.assign({\n mode: 'cors'\n }, options, {\n headers: headers\n }))).then(function (response) {\n return response.ok ? Promise.resolve(response) : Promise.reject(response);\n });\n }\n }, {\n key: 'post',\n value: function post(path) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return this.request(path, Object.assign({}, options, {\n method: 'POST'\n }));\n }\n }, {\n key: 'get',\n value: function get(path) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return this.request(path, Object.assign({}, options, {\n method: 'GET'\n }));\n }\n }]);\n return Api;\n}();\nexports.default = Api;\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getUser = getUser;\nexports.setUser = setUser;\nexports.removeUser = removeUser;\nvar _store = require('store');\nvar _store2 = _interopRequireDefault(_store);\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n}\nfunction getUser() {\n return _store2.default.get('tmc.user');\n}\nfunction setUser(user) {\n _store2.default.set('tmc.user', user);\n}\nfunction removeUser() {\n _store2.default.remove('tmc.user');\n}","(function (self) {\n 'use strict';\n\n function fetchPonyfill(options) {\n var Promise = options && options.Promise || self.Promise;\n var XMLHttpRequest = options && options.XMLHttpRequest || self.XMLHttpRequest;\n var global = self;\n return function () {\n var self = Object.create(global, {\n fetch: {\n value: undefined,\n writable: true\n }\n });\n (function (self) {\n 'use strict';\n\n if (self.fetch) {\n return;\n }\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob: 'FileReader' in self && 'Blob' in self && function () {\n try {\n new Blob();\n return true;\n } catch (e) {\n return false;\n }\n }(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n };\n if (support.arrayBuffer) {\n var viewClasses = ['[object Int8Array]', '[object Uint8Array]', '[object Uint8ClampedArray]', '[object Int16Array]', '[object Uint16Array]', '[object Int32Array]', '[object Uint32Array]', '[object Float32Array]', '[object Float64Array]'];\n var isDataView = function isDataView(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj);\n };\n var isArrayBufferView = ArrayBuffer.isView || function (obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1;\n };\n }\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name);\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name');\n }\n return name.toLowerCase();\n }\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value);\n }\n return value;\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function next() {\n var value = items.shift();\n return {\n done: value === undefined,\n value: value\n };\n }\n };\n if (support.iterable) {\n iterator[Symbol.iterator] = function () {\n return iterator;\n };\n }\n return iterator;\n }\n function Headers(headers) {\n this.map = {};\n if (headers instanceof Headers) {\n headers.forEach(function (value, name) {\n this.append(name, value);\n }, this);\n } else if (Array.isArray(headers)) {\n headers.forEach(function (header) {\n this.append(header[0], header[1]);\n }, this);\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function (name) {\n this.append(name, headers[name]);\n }, this);\n }\n }\n Headers.prototype.append = function (name, value) {\n name = normalizeName(name);\n value = normalizeValue(value);\n var oldValue = this.map[name];\n this.map[name] = oldValue ? oldValue + ',' + value : value;\n };\n Headers.prototype['delete'] = function (name) {\n delete this.map[normalizeName(name)];\n };\n Headers.prototype.get = function (name) {\n name = normalizeName(name);\n return this.has(name) ? this.map[name] : null;\n };\n Headers.prototype.has = function (name) {\n return this.map.hasOwnProperty(normalizeName(name));\n };\n Headers.prototype.set = function (name, value) {\n this.map[normalizeName(name)] = normalizeValue(value);\n };\n Headers.prototype.forEach = function (callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this);\n }\n }\n };\n Headers.prototype.keys = function () {\n var items = [];\n this.forEach(function (value, name) {\n items.push(name);\n });\n return iteratorFor(items);\n };\n Headers.prototype.values = function () {\n var items = [];\n this.forEach(function (value) {\n items.push(value);\n });\n return iteratorFor(items);\n };\n Headers.prototype.entries = function () {\n var items = [];\n this.forEach(function (value, name) {\n items.push([name, value]);\n });\n return iteratorFor(items);\n };\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries;\n }\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'));\n }\n body.bodyUsed = true;\n }\n function fileReaderReady(reader) {\n return new Promise(function (resolve, reject) {\n reader.onload = function () {\n resolve(reader.result);\n };\n reader.onerror = function () {\n reject(reader.error);\n };\n });\n }\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader();\n var promise = fileReaderReady(reader);\n reader.readAsArrayBuffer(blob);\n return promise;\n }\n function readBlobAsText(blob) {\n var reader = new FileReader();\n var promise = fileReaderReady(reader);\n reader.readAsText(blob);\n return promise;\n }\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf);\n var chars = new Array(view.length);\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i]);\n }\n return chars.join('');\n }\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0);\n } else {\n var view = new Uint8Array(buf.byteLength);\n view.set(new Uint8Array(buf));\n return view.buffer;\n }\n }\n function Body() {\n this.bodyUsed = false;\n this._initBody = function (body) {\n this._bodyInit = body;\n if (!body) {\n this._bodyText = '';\n } else if (typeof body === 'string') {\n this._bodyText = body;\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body;\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body;\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString();\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer);\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer]);\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body);\n } else {\n throw new Error('unsupported BodyInit type');\n }\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8');\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type);\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n }\n };\n if (support.blob) {\n this.blob = function () {\n var rejected = consumed(this);\n if (rejected) {\n return rejected;\n }\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob);\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]));\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob');\n } else {\n return Promise.resolve(new Blob([this._bodyText]));\n }\n };\n this.arrayBuffer = function () {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer);\n } else {\n return this.blob().then(readBlobAsArrayBuffer);\n }\n };\n }\n this.text = function () {\n var rejected = consumed(this);\n if (rejected) {\n return rejected;\n }\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob);\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer));\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text');\n } else {\n return Promise.resolve(this._bodyText);\n }\n };\n if (support.formData) {\n this.formData = function () {\n return this.text().then(decode);\n };\n }\n this.json = function () {\n return this.text().then(JSON.parse);\n };\n return this;\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];\n function normalizeMethod(method) {\n var upcased = method.toUpperCase();\n return methods.indexOf(upcased) > -1 ? upcased : method;\n }\n function Request(input, options) {\n options = options || {};\n var body = options.body;\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read');\n }\n this.url = input.url;\n this.credentials = input.credentials;\n if (!options.headers) {\n this.headers = new Headers(input.headers);\n }\n this.method = input.method;\n this.mode = input.mode;\n if (!body && input._bodyInit != null) {\n body = input._bodyInit;\n input.bodyUsed = true;\n }\n } else {\n this.url = String(input);\n }\n this.credentials = options.credentials || this.credentials || 'omit';\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers);\n }\n this.method = normalizeMethod(options.method || this.method || 'GET');\n this.mode = options.mode || this.mode || null;\n this.referrer = null;\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests');\n }\n this._initBody(body);\n }\n Request.prototype.clone = function () {\n return new Request(this, {\n body: this._bodyInit\n });\n };\n function decode(body) {\n var form = new FormData();\n body.trim().split('&').forEach(function (bytes) {\n if (bytes) {\n var split = bytes.split('=');\n var name = split.shift().replace(/\\+/g, ' ');\n var value = split.join('=').replace(/\\+/g, ' ');\n form.append(decodeURIComponent(name), decodeURIComponent(value));\n }\n });\n return form;\n }\n function parseHeaders(rawHeaders) {\n var headers = new Headers();\n // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n // https://tools.ietf.org/html/rfc7230#section-3.2\n var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ');\n preProcessedHeaders.split(/\\r?\\n/).forEach(function (line) {\n var parts = line.split(':');\n var key = parts.shift().trim();\n if (key) {\n var value = parts.join(':').trim();\n headers.append(key, value);\n }\n });\n return headers;\n }\n Body.call(Request.prototype);\n function Response(bodyInit, options) {\n if (!options) {\n options = {};\n }\n this.type = 'default';\n this.status = options.status === undefined ? 200 : options.status;\n this.ok = this.status >= 200 && this.status < 300;\n this.statusText = 'statusText' in options ? options.statusText : 'OK';\n this.headers = new Headers(options.headers);\n this.url = options.url || '';\n this._initBody(bodyInit);\n }\n Body.call(Response.prototype);\n Response.prototype.clone = function () {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n });\n };\n Response.error = function () {\n var response = new Response(null, {\n status: 0,\n statusText: ''\n });\n response.type = 'error';\n return response;\n };\n var redirectStatuses = [301, 302, 303, 307, 308];\n Response.redirect = function (url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code');\n }\n return new Response(null, {\n status: status,\n headers: {\n location: url\n }\n });\n };\n self.Headers = Headers;\n self.Request = Request;\n self.Response = Response;\n self.fetch = function (input, init) {\n return new Promise(function (resolve, reject) {\n var request = new Request(input, init);\n var xhr = new XMLHttpRequest();\n xhr.onload = function () {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n };\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');\n var body = 'response' in xhr ? xhr.response : xhr.responseText;\n resolve(new Response(body, options));\n };\n xhr.onerror = function () {\n reject(new TypeError('Network request failed'));\n };\n xhr.ontimeout = function () {\n reject(new TypeError('Network request failed'));\n };\n xhr.open(request.method, request.url, true);\n if (request.credentials === 'include') {\n xhr.withCredentials = true;\n } else if (request.credentials === 'omit') {\n xhr.withCredentials = false;\n }\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob';\n }\n request.headers.forEach(function (value, name) {\n xhr.setRequestHeader(name, value);\n });\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);\n });\n };\n self.fetch.polyfill = true;\n })(typeof self !== 'undefined' ? self : this);\n return {\n fetch: self.fetch,\n Headers: self.Headers,\n Request: self.Request,\n Response: self.Response\n };\n }();\n }\n if (typeof define === 'function' && define.amd) {\n define(function () {\n return fetchPonyfill;\n });\n } else if (typeof exports === 'object') {\n module.exports = fetchPonyfill;\n } else {\n self.fetchPonyfill = fetchPonyfill;\n }\n})(typeof self !== 'undefined' ? self : typeof global !== 'undefined' ? global : this);","\"use strict\"\n// Module export pattern from\n// https://github.com/umdjs/umd/blob/master/returnExports.js\n;\n\n(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define([], factory);\n } else if (typeof exports === 'object') {\n // Node. Does not work with strict CommonJS, but\n // only CommonJS-like environments that support module.exports,\n // like Node.\n module.exports = factory();\n } else {\n // Browser globals (root is window)\n root.store = factory();\n }\n})(this, function () {\n // Store.js\n var store = {},\n win = typeof window != 'undefined' ? window : global,\n doc = win.document,\n localStorageName = 'localStorage',\n scriptTag = 'script',\n storage;\n store.disabled = false;\n store.version = '1.3.20';\n store.set = function (key, value) {};\n store.get = function (key, defaultVal) {};\n store.has = function (key) {\n return store.get(key) !== undefined;\n };\n store.remove = function (key) {};\n store.clear = function () {};\n store.transact = function (key, defaultVal, transactionFn) {\n if (transactionFn == null) {\n transactionFn = defaultVal;\n defaultVal = null;\n }\n if (defaultVal == null) {\n defaultVal = {};\n }\n var val = store.get(key, defaultVal);\n transactionFn(val);\n store.set(key, val);\n };\n store.getAll = function () {};\n store.forEach = function () {};\n store.serialize = function (value) {\n return JSON.stringify(value);\n };\n store.deserialize = function (value) {\n if (typeof value != 'string') {\n return undefined;\n }\n try {\n return JSON.parse(value);\n } catch (e) {\n return value || undefined;\n }\n };\n\n // Functions to encapsulate questionable FireFox 3.6.13 behavior\n // when about.config::dom.storage.enabled === false\n // See https://github.com/marcuswestin/store.js/issues#issue/13\n function isLocalStorageNameSupported() {\n try {\n return localStorageName in win && win[localStorageName];\n } catch (err) {\n return false;\n }\n }\n if (isLocalStorageNameSupported()) {\n storage = win[localStorageName];\n store.set = function (key, val) {\n if (val === undefined) {\n return store.remove(key);\n }\n storage.setItem(key, store.serialize(val));\n return val;\n };\n store.get = function (key, defaultVal) {\n var val = store.deserialize(storage.getItem(key));\n return val === undefined ? defaultVal : val;\n };\n store.remove = function (key) {\n storage.removeItem(key);\n };\n store.clear = function () {\n storage.clear();\n };\n store.getAll = function () {\n var ret = {};\n store.forEach(function (key, val) {\n ret[key] = val;\n });\n return ret;\n };\n store.forEach = function (callback) {\n for (var i = 0; i < storage.length; i++) {\n var key = storage.key(i);\n callback(key, store.get(key));\n }\n };\n } else if (doc && doc.documentElement.addBehavior) {\n var storageOwner, storageContainer;\n // Since #userData storage applies only to specific paths, we need to\n // somehow link our data to a specific path. We choose /favicon.ico\n // as a pretty safe option, since all browsers already make a request to\n // this URL anyway and being a 404 will not hurt us here. We wrap an\n // iframe pointing to the favicon in an ActiveXObject(htmlfile) object\n // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)\n // since the iframe access rules appear to allow direct access and\n // manipulation of the document element, even for a 404 page. This\n // document can be used instead of the current document (which would\n // have been limited to the current path) to perform #userData storage.\n try {\n storageContainer = new ActiveXObject('htmlfile');\n storageContainer.open();\n storageContainer.write('<' + scriptTag + '>document.w=window');\n storageContainer.close();\n storageOwner = storageContainer.w.frames[0].document;\n storage = storageOwner.createElement('div');\n } catch (e) {\n // somehow ActiveXObject instantiation failed (perhaps some special\n // security settings or otherwse), fall back to per-path storage\n storage = doc.createElement('div');\n storageOwner = doc.body;\n }\n var withIEStorage = function withIEStorage(storeFunction) {\n return function () {\n var args = Array.prototype.slice.call(arguments, 0);\n args.unshift(storage);\n // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx\n // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx\n storageOwner.appendChild(storage);\n storage.addBehavior('#default#userData');\n storage.load(localStorageName);\n var result = storeFunction.apply(store, args);\n storageOwner.removeChild(storage);\n return result;\n };\n };\n\n // In IE7, keys cannot start with a digit or contain certain chars.\n // See https://github.com/marcuswestin/store.js/issues/40\n // See https://github.com/marcuswestin/store.js/issues/83\n var forbiddenCharsRegex = new RegExp(\"[!\\\"#$%&'()*+,/\\\\\\\\:;<=>?@[\\\\]^`{|}~]\", \"g\");\n var ieKeyFix = function ieKeyFix(key) {\n return key.replace(/^d/, '___$&').replace(forbiddenCharsRegex, '___');\n };\n store.set = withIEStorage(function (storage, key, val) {\n key = ieKeyFix(key);\n if (val === undefined) {\n return store.remove(key);\n }\n storage.setAttribute(key, store.serialize(val));\n storage.save(localStorageName);\n return val;\n });\n store.get = withIEStorage(function (storage, key, defaultVal) {\n key = ieKeyFix(key);\n var val = store.deserialize(storage.getAttribute(key));\n return val === undefined ? defaultVal : val;\n });\n store.remove = withIEStorage(function (storage, key) {\n key = ieKeyFix(key);\n storage.removeAttribute(key);\n storage.save(localStorageName);\n });\n store.clear = withIEStorage(function (storage) {\n var attributes = storage.XMLDocument.documentElement.attributes;\n storage.load(localStorageName);\n for (var i = attributes.length - 1; i >= 0; i--) {\n storage.removeAttribute(attributes[i].name);\n }\n storage.save(localStorageName);\n });\n store.getAll = function (storage) {\n var ret = {};\n store.forEach(function (key, val) {\n ret[key] = val;\n });\n return ret;\n };\n store.forEach = withIEStorage(function (storage, callback) {\n var attributes = storage.XMLDocument.documentElement.attributes;\n for (var i = 0, attr; attr = attributes[i]; ++i) {\n callback(attr.name, store.deserialize(storage.getAttribute(attr.name)));\n }\n });\n }\n try {\n var testKey = '__storejs__';\n store.set(testKey, testKey);\n if (store.get(testKey) != testKey) {\n store.disabled = true;\n }\n store.remove(testKey);\n } catch (e) {\n store.disabled = true;\n }\n store.enabled = !store.disabled;\n return store;\n});","var randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID: randomUUID\n};","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n return getRandomValues(rnds8);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;","require('../../modules/core.regexp.escape');\nmodule.exports = require('../../modules/_core').RegExp.escape;\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","var cof = require('./_cof');\nmodule.exports = function (it, msg) {\n if (typeof it != 'number' && cof(it) != 'Number') throw TypeError(msg);\n return +it;\n};\n","// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = require('./_wks')('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) require('./_hide')(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n","'use strict';\nvar at = require('./_string-at')(true);\n\n // `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? at(S, index).length : 1);\n};\n","module.exports = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\n\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var to = toAbsoluteIndex(target, len);\n var from = toAbsoluteIndex(start, len);\n var end = arguments.length > 2 ? arguments[2] : undefined;\n var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n var inc = 1;\n if (from < to && to < from + count) {\n inc = -1;\n from += count - 1;\n to += count - 1;\n }\n while (count-- > 0) {\n if (from in O) O[to] = O[from];\n else delete O[to];\n to += inc;\n from += inc;\n } return O;\n};\n","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n var O = toObject(this);\n var length = toLength(O.length);\n var aLen = arguments.length;\n var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);\n var end = aLen > 2 ? arguments[2] : undefined;\n var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n while (endPos > index) O[index++] = value;\n return O;\n};\n","var forOf = require('./_for-of');\n\nmodule.exports = function (iter, ITERATOR) {\n var result = [];\n forOf(iter, false, result.push, result, ITERATOR);\n return result;\n};\n","// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n","// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./_ctx');\nvar IObject = require('./_iobject');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar asc = require('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || asc;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IObject(O);\n var f = ctx(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n","var aFunction = require('./_a-function');\nvar toObject = require('./_to-object');\nvar IObject = require('./_iobject');\nvar toLength = require('./_to-length');\n\nmodule.exports = function (that, callbackfn, aLen, memo, isRight) {\n aFunction(callbackfn);\n var O = toObject(that);\n var self = IObject(O);\n var length = toLength(O.length);\n var index = isRight ? length - 1 : 0;\n var i = isRight ? -1 : 1;\n if (aLen < 2) for (;;) {\n if (index in self) {\n memo = self[index];\n index += i;\n break;\n }\n index += i;\n if (isRight ? index < 0 : length <= index) {\n throw TypeError('Reduce of empty array with no initial value');\n }\n }\n for (;isRight ? index >= 0 : length > index; index += i) if (index in self) {\n memo = callbackfn(memo, self[index], index, O);\n }\n return memo;\n};\n","var isObject = require('./_is-object');\nvar isArray = require('./_is-array');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (original) {\n var C;\n if (isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n","// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = require('./_array-species-constructor');\n\nmodule.exports = function (original, length) {\n return new (speciesConstructor(original))(length);\n};\n","'use strict';\nvar aFunction = require('./_a-function');\nvar isObject = require('./_is-object');\nvar invoke = require('./_invoke');\nvar arraySlice = [].slice;\nvar factories = {};\n\nvar construct = function (F, len, args) {\n if (!(len in factories)) {\n for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']';\n // eslint-disable-next-line no-new-func\n factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');\n } return factories[len](F, args);\n};\n\nmodule.exports = Function.bind || function bind(that /* , ...args */) {\n var fn = aFunction(this);\n var partArgs = arraySlice.call(arguments, 1);\n var bound = function (/* args... */) {\n var args = partArgs.concat(arraySlice.call(arguments));\n return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);\n };\n if (isObject(fn.prototype)) bound.prototype = fn.prototype;\n return bound;\n};\n","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","'use strict';\nvar dP = require('./_object-dp').f;\nvar create = require('./_object-create');\nvar redefineAll = require('./_redefine-all');\nvar ctx = require('./_ctx');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar $iterDefine = require('./_iter-define');\nvar step = require('./_iter-step');\nvar setSpecies = require('./_set-species');\nvar DESCRIPTORS = require('./_descriptors');\nvar fastKey = require('./_meta').fastKey;\nvar validate = require('./_validate-collection');\nvar SIZE = DESCRIPTORS ? '_s' : 'size';\n\nvar getEntry = function (that, key) {\n // fast case\n var index = fastKey(key);\n var entry;\n if (index !== 'F') return that._i[index];\n // frozen object case\n for (entry = that._f; entry; entry = entry.n) {\n if (entry.k == key) return entry;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = create(null); // index\n that._f = undefined; // first entry\n that._l = undefined; // last entry\n that[SIZE] = 0; // size\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.1.3.1 Map.prototype.clear()\n // 23.2.3.2 Set.prototype.clear()\n clear: function clear() {\n for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {\n entry.r = true;\n if (entry.p) entry.p = entry.p.n = undefined;\n delete data[entry.i];\n }\n that._f = that._l = undefined;\n that[SIZE] = 0;\n },\n // 23.1.3.3 Map.prototype.delete(key)\n // 23.2.3.4 Set.prototype.delete(value)\n 'delete': function (key) {\n var that = validate(this, NAME);\n var entry = getEntry(that, key);\n if (entry) {\n var next = entry.n;\n var prev = entry.p;\n delete that._i[entry.i];\n entry.r = true;\n if (prev) prev.n = next;\n if (next) next.p = prev;\n if (that._f == entry) that._f = next;\n if (that._l == entry) that._l = prev;\n that[SIZE]--;\n } return !!entry;\n },\n // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n forEach: function forEach(callbackfn /* , that = undefined */) {\n validate(this, NAME);\n var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n var entry;\n while (entry = entry ? entry.n : this._f) {\n f(entry.v, entry.k, this);\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n }\n },\n // 23.1.3.7 Map.prototype.has(key)\n // 23.2.3.7 Set.prototype.has(value)\n has: function has(key) {\n return !!getEntry(validate(this, NAME), key);\n }\n });\n if (DESCRIPTORS) dP(C.prototype, 'size', {\n get: function () {\n return validate(this, NAME)[SIZE];\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var entry = getEntry(that, key);\n var prev, index;\n // change existing entry\n if (entry) {\n entry.v = value;\n // create new entry\n } else {\n that._l = entry = {\n i: index = fastKey(key, true), // <- index\n k: key, // <- key\n v: value, // <- value\n p: prev = that._l, // <- previous entry\n n: undefined, // <- next entry\n r: false // <- removed\n };\n if (!that._f) that._f = entry;\n if (prev) prev.n = entry;\n that[SIZE]++;\n // add to index\n if (index !== 'F') that._i[index] = entry;\n } return that;\n },\n getEntry: getEntry,\n setStrong: function (C, NAME, IS_MAP) {\n // add .keys, .values, .entries, [@@iterator]\n // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n $iterDefine(C, NAME, function (iterated, kind) {\n this._t = validate(iterated, NAME); // target\n this._k = kind; // kind\n this._l = undefined; // previous\n }, function () {\n var that = this;\n var kind = that._k;\n var entry = that._l;\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n // get next entry\n if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {\n // or finish the iteration\n that._t = undefined;\n return step(1);\n }\n // return step by kind\n if (kind == 'keys') return step(0, entry.k);\n if (kind == 'values') return step(0, entry.v);\n return step(0, [entry.k, entry.v]);\n }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n // add [@@species], 23.1.2.2, 23.2.2.2\n setSpecies(NAME);\n }\n};\n","// https://github.com/DavidBruant/Map-Set.prototype.toJSON\nvar classof = require('./_classof');\nvar from = require('./_array-from-iterable');\nmodule.exports = function (NAME) {\n return function toJSON() {\n if (classof(this) != NAME) throw TypeError(NAME + \"#toJSON isn't generic\");\n return from(this);\n };\n};\n","'use strict';\nvar redefineAll = require('./_redefine-all');\nvar getWeak = require('./_meta').getWeak;\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar createArrayMethod = require('./_array-methods');\nvar $has = require('./_has');\nvar validate = require('./_validate-collection');\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n return arrayFind(store.a, function (it) {\n return it[0] === key;\n });\n};\nUncaughtFrozenStore.prototype = {\n get: function (key) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) return entry[1];\n },\n has: function (key) {\n return !!findUncaughtFrozen(this, key);\n },\n set: function (key, value) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) entry[1] = value;\n else this.a.push([key, value]);\n },\n 'delete': function (key) {\n var index = arrayFindIndex(this.a, function (it) {\n return it[0] === key;\n });\n if (~index) this.a.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = id++; // collection id\n that._l = undefined; // leak store for uncaught frozen objects\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.3.3.2 WeakMap.prototype.delete(key)\n // 23.4.3.3 WeakSet.prototype.delete(value)\n 'delete': function (key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n return data && $has(data, this._i) && delete data[this._i];\n },\n // 23.3.3.4 WeakMap.prototype.has(key)\n // 23.4.3.4 WeakSet.prototype.has(value)\n has: function has(key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n return data && $has(data, this._i);\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var data = getWeak(anObject(key), true);\n if (data === true) uncaughtFrozenStore(that).set(key, value);\n else data[that._i] = value;\n return that;\n },\n ufstore: uncaughtFrozenStore\n};\n","'use strict';\nvar global = require('./_global');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar redefineAll = require('./_redefine-all');\nvar meta = require('./_meta');\nvar forOf = require('./_for-of');\nvar anInstance = require('./_an-instance');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar $iterDetect = require('./_iter-detect');\nvar setToStringTag = require('./_set-to-string-tag');\nvar inheritIfRequired = require('./_inherit-if-required');\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n var Base = global[NAME];\n var C = Base;\n var ADDER = IS_MAP ? 'set' : 'add';\n var proto = C && C.prototype;\n var O = {};\n var fixMethod = function (KEY) {\n var fn = proto[KEY];\n redefine(proto, KEY,\n KEY == 'delete' ? function (a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'has' ? function has(a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'get' ? function get(a) {\n return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n );\n };\n if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n new C().entries().next();\n }))) {\n // create collection constructor\n C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n redefineAll(C.prototype, methods);\n meta.NEED = true;\n } else {\n var instance = new C();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new C();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n if (!ACCEPT_ITERABLES) {\n C = wrapper(function (target, iterable) {\n anInstance(target, C, NAME);\n var that = inheritIfRequired(new Base(), target, C);\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n return that;\n });\n C.prototype = proto;\n proto.constructor = C;\n }\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n // weak collections should not contains .clear method\n if (IS_WEAK && proto.clear) delete proto.clear;\n }\n\n setToStringTag(C, NAME);\n\n O[NAME] = C;\n $export($export.G + $export.W + $export.F * (C != Base), O);\n\n if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n return C;\n};\n","var core = module.exports = { version: '2.6.12' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","'use strict';\nvar $defineProperty = require('./_object-dp');\nvar createDesc = require('./_property-desc');\n\nmodule.exports = function (object, index, value) {\n if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n else object[index] = value;\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","'use strict';\n// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()\nvar fails = require('./_fails');\nvar getTime = Date.prototype.getTime;\nvar $toISOString = Date.prototype.toISOString;\n\nvar lz = function (num) {\n return num > 9 ? num : '0' + num;\n};\n\n// PhantomJS / old WebKit has a broken implementations\nmodule.exports = (fails(function () {\n return $toISOString.call(new Date(-5e13 - 1)) != '0385-07-25T07:06:39.999Z';\n}) || !fails(function () {\n $toISOString.call(new Date(NaN));\n})) ? function toISOString() {\n if (!isFinite(getTime.call(this))) throw RangeError('Invalid time value');\n var d = this;\n var y = d.getUTCFullYear();\n var m = d.getUTCMilliseconds();\n var s = y < 0 ? '-' : y > 9999 ? '+' : '';\n return s + ('00000' + Math.abs(y)).slice(s ? -6 : -4) +\n '-' + lz(d.getUTCMonth() + 1) + '-' + lz(d.getUTCDate()) +\n 'T' + lz(d.getUTCHours()) + ':' + lz(d.getUTCMinutes()) +\n ':' + lz(d.getUTCSeconds()) + '.' + (m > 99 ? m : '0' + lz(m)) + 'Z';\n} : $toISOString;\n","'use strict';\nvar anObject = require('./_an-object');\nvar toPrimitive = require('./_to-primitive');\nvar NUMBER = 'number';\n\nmodule.exports = function (hint) {\n if (hint !== 'string' && hint !== NUMBER && hint !== 'default') throw TypeError('Incorrect hint');\n return toPrimitive(anObject(this), hint != NUMBER);\n};\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","// all enumerable object keys, includes symbols\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nmodule.exports = function (it) {\n var result = getKeys(it);\n var getSymbols = gOPS.f;\n if (getSymbols) {\n var symbols = getSymbols(it);\n var isEnum = pIE.f;\n var i = 0;\n var key;\n while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n } return result;\n};\n","var global = require('./_global');\nvar core = require('./_core');\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar ctx = require('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","var MATCH = require('./_wks')('match');\nmodule.exports = function (KEY) {\n var re = /./;\n try {\n '/./'[KEY](re);\n } catch (e) {\n try {\n re[MATCH] = false;\n return !'/./'[KEY](re);\n } catch (f) { /* empty */ }\n } return true;\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n","'use strict';\nrequire('./es6.regexp.exec');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar fails = require('./_fails');\nvar defined = require('./_defined');\nvar wks = require('./_wks');\nvar regexpExec = require('./_regexp-exec');\n\nvar SPECIES = wks('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$') !== '7';\n});\n\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () {\n // Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length === 2 && result[0] === 'a' && result[1] === 'b';\n})();\n\nmodule.exports = function (KEY, length, exec) {\n var SYMBOL = wks(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n re.exec = function () { execCalled = true; return null; };\n if (KEY === 'split') {\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n }\n re[SYMBOL]('');\n return !execCalled;\n }) : undefined;\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var fns = exec(\n defined,\n SYMBOL,\n ''[KEY],\n function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }\n );\n var strfn = fns[0];\n var rxfn = fns[1];\n\n redefine(String.prototype, KEY, strfn);\n hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n};\n","'use strict';\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = require('./_an-object');\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","'use strict';\n// https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray\nvar isArray = require('./_is-array');\nvar isObject = require('./_is-object');\nvar toLength = require('./_to-length');\nvar ctx = require('./_ctx');\nvar IS_CONCAT_SPREADABLE = require('./_wks')('isConcatSpreadable');\n\nfunction flattenIntoArray(target, original, source, sourceLen, start, depth, mapper, thisArg) {\n var targetIndex = start;\n var sourceIndex = 0;\n var mapFn = mapper ? ctx(mapper, thisArg, 3) : false;\n var element, spreadable;\n\n while (sourceIndex < sourceLen) {\n if (sourceIndex in source) {\n element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex];\n\n spreadable = false;\n if (isObject(element)) {\n spreadable = element[IS_CONCAT_SPREADABLE];\n spreadable = spreadable !== undefined ? !!spreadable : isArray(element);\n }\n\n if (spreadable && depth > 0) {\n targetIndex = flattenIntoArray(target, original, element, toLength(element.length), targetIndex, depth - 1) - 1;\n } else {\n if (targetIndex >= 0x1fffffffffffff) throw TypeError();\n target[targetIndex] = element;\n }\n\n targetIndex++;\n }\n sourceIndex++;\n }\n return targetIndex;\n}\n\nmodule.exports = flattenIntoArray;\n","var ctx = require('./_ctx');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar getIterFn = require('./core.get-iterator-method');\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n var f = ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = call(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n","module.exports = require('./_shared')('native-function-to-string', Function.toString);\n","// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","var isObject = require('./_is-object');\nvar setPrototypeOf = require('./_set-proto').set;\nmodule.exports = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n};\n","// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n};\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","// check on default Array iterator\nvar Iterators = require('./_iterators');\nvar ITERATOR = require('./_wks')('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n","// 20.1.2.3 Number.isInteger(number)\nvar isObject = require('./_is-object');\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","// 7.2.8 IsRegExp(argument)\nvar isObject = require('./_is-object');\nvar cof = require('./_cof');\nvar MATCH = require('./_wks')('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) anObject(ret.call(iterator));\n throw e;\n }\n};\n","'use strict';\nvar create = require('./_object-create');\nvar descriptor = require('./_property-desc');\nvar setToStringTag = require('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = $native || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n","var ITERATOR = require('./_wks')('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n // eslint-disable-next-line no-throw-literal\n Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n","module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n","module.exports = {};\n","module.exports = false;\n","// 20.2.2.14 Math.expm1(x)\nvar $expm1 = Math.expm1;\nmodule.exports = (!$expm1\n // Old FF bug\n || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168\n // Tor Browser bug\n || $expm1(-2e-17) != -2e-17\n) ? function expm1(x) {\n return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;\n} : $expm1;\n","// 20.2.2.16 Math.fround(x)\nvar sign = require('./_math-sign');\nvar pow = Math.pow;\nvar EPSILON = pow(2, -52);\nvar EPSILON32 = pow(2, -23);\nvar MAX32 = pow(2, 127) * (2 - EPSILON32);\nvar MIN32 = pow(2, -126);\n\nvar roundTiesToEven = function (n) {\n return n + 1 / EPSILON - 1 / EPSILON;\n};\n\nmodule.exports = Math.fround || function fround(x) {\n var $abs = Math.abs(x);\n var $sign = sign(x);\n var a, result;\n if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;\n a = (1 + EPSILON32 / EPSILON) * $abs;\n result = a - (a - $abs);\n // eslint-disable-next-line no-self-compare\n if (result > MAX32 || result != result) return $sign * Infinity;\n return $sign * result;\n};\n","// 20.2.2.20 Math.log1p(x)\nmodule.exports = Math.log1p || function log1p(x) {\n return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);\n};\n","// https://rwaldron.github.io/proposal-math-extensions/\nmodule.exports = Math.scale || function scale(x, inLow, inHigh, outLow, outHigh) {\n if (\n arguments.length === 0\n // eslint-disable-next-line no-self-compare\n || x != x\n // eslint-disable-next-line no-self-compare\n || inLow != inLow\n // eslint-disable-next-line no-self-compare\n || inHigh != inHigh\n // eslint-disable-next-line no-self-compare\n || outLow != outLow\n // eslint-disable-next-line no-self-compare\n || outHigh != outHigh\n ) return NaN;\n if (x === Infinity || x === -Infinity) return x;\n return (x - inLow) * (outHigh - outLow) / (inHigh - inLow) + outLow;\n};\n","// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n","var META = require('./_uid')('meta');\nvar isObject = require('./_is-object');\nvar has = require('./_has');\nvar setDesc = require('./_object-dp').f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\nvar FREEZE = !require('./_fails')(function () {\n return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n setDesc(it, META, { value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n } });\n};\nvar fastKey = function (it, create) {\n // return primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n};\nvar getWeak = function (it, create) {\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n return it;\n};\nvar meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n};\n","var Map = require('./es6.map');\nvar $export = require('./_export');\nvar shared = require('./_shared')('metadata');\nvar store = shared.store || (shared.store = new (require('./es6.weak-map'))());\n\nvar getOrCreateMetadataMap = function (target, targetKey, create) {\n var targetMetadata = store.get(target);\n if (!targetMetadata) {\n if (!create) return undefined;\n store.set(target, targetMetadata = new Map());\n }\n var keyMetadata = targetMetadata.get(targetKey);\n if (!keyMetadata) {\n if (!create) return undefined;\n targetMetadata.set(targetKey, keyMetadata = new Map());\n } return keyMetadata;\n};\nvar ordinaryHasOwnMetadata = function (MetadataKey, O, P) {\n var metadataMap = getOrCreateMetadataMap(O, P, false);\n return metadataMap === undefined ? false : metadataMap.has(MetadataKey);\n};\nvar ordinaryGetOwnMetadata = function (MetadataKey, O, P) {\n var metadataMap = getOrCreateMetadataMap(O, P, false);\n return metadataMap === undefined ? undefined : metadataMap.get(MetadataKey);\n};\nvar ordinaryDefineOwnMetadata = function (MetadataKey, MetadataValue, O, P) {\n getOrCreateMetadataMap(O, P, true).set(MetadataKey, MetadataValue);\n};\nvar ordinaryOwnMetadataKeys = function (target, targetKey) {\n var metadataMap = getOrCreateMetadataMap(target, targetKey, false);\n var keys = [];\n if (metadataMap) metadataMap.forEach(function (_, key) { keys.push(key); });\n return keys;\n};\nvar toMetaKey = function (it) {\n return it === undefined || typeof it == 'symbol' ? it : String(it);\n};\nvar exp = function (O) {\n $export($export.S, 'Reflect', O);\n};\n\nmodule.exports = {\n store: store,\n map: getOrCreateMetadataMap,\n has: ordinaryHasOwnMetadata,\n get: ordinaryGetOwnMetadata,\n set: ordinaryDefineOwnMetadata,\n keys: ordinaryOwnMetadataKeys,\n key: toMetaKey,\n exp: exp\n};\n","var global = require('./_global');\nvar macrotask = require('./_task').set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = require('./_cof')(process) == 'process';\n\nmodule.exports = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n var promise = Promise.resolve(undefined);\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n};\n","'use strict';\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = require('./_a-function');\n\nfunction PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar DESCRIPTORS = require('./_descriptors');\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nvar toObject = require('./_to-object');\nvar IObject = require('./_iobject');\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || require('./_fails')(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = gOPS.f;\n var isEnum = pIE.f;\n while (aLen > index) {\n var S = IObject(arguments[index++]);\n var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!DESCRIPTORS || isEnum.call(S, key)) T[key] = S[key];\n }\n } return T;\n} : $assign;\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = require('./_dom-create')('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n require('./_html').appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n","'use strict';\n// Forced replacement prototype accessors methods\nmodule.exports = require('./_library') || !require('./_fails')(function () {\n var K = Math.random();\n // In FF throws only define methods\n // eslint-disable-next-line no-undef, no-useless-call\n __defineSetter__.call(null, K, function () { /* empty */ });\n delete require('./_global')[K];\n});\n","var pIE = require('./_object-pie');\nvar createDesc = require('./_property-desc');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar has = require('./_has');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n","// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = require('./_to-iobject');\nvar gOPN = require('./_object-gopn').f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return gOPN(it);\n } catch (e) {\n return windowNames.slice();\n }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal');\nvar hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n","exports.f = Object.getOwnPropertySymbols;\n","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has');\nvar toObject = require('./_to-object');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n","exports.f = {}.propertyIsEnumerable;\n","// most Object methods by ES6 should accept primitives\nvar $export = require('./_export');\nvar core = require('./_core');\nvar fails = require('./_fails');\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n","var DESCRIPTORS = require('./_descriptors');\nvar getKeys = require('./_object-keys');\nvar toIObject = require('./_to-iobject');\nvar isEnum = require('./_object-pie').f;\nmodule.exports = function (isEntries) {\n return function (it) {\n var O = toIObject(it);\n var keys = getKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) {\n key = keys[i++];\n if (!DESCRIPTORS || isEnum.call(O, key)) {\n result.push(isEntries ? [key, O[key]] : O[key]);\n }\n }\n return result;\n };\n};\n","// all object keys, includes non-enumerable and symbols\nvar gOPN = require('./_object-gopn');\nvar gOPS = require('./_object-gops');\nvar anObject = require('./_an-object');\nvar Reflect = require('./_global').Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n var keys = gOPN.f(anObject(it));\n var getSymbols = gOPS.f;\n return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n","var $parseFloat = require('./_global').parseFloat;\nvar $trim = require('./_string-trim').trim;\n\nmodule.exports = 1 / $parseFloat(require('./_string-ws') + '-0') !== -Infinity ? function parseFloat(str) {\n var string = $trim(String(str), 3);\n var result = $parseFloat(string);\n return result === 0 && string.charAt(0) == '-' ? -0 : result;\n} : $parseFloat;\n","var $parseInt = require('./_global').parseInt;\nvar $trim = require('./_string-trim').trim;\nvar ws = require('./_string-ws');\nvar hex = /^[-+]?0[xX]/;\n\nmodule.exports = $parseInt(ws + '08') !== 8 || $parseInt(ws + '0x16') !== 22 ? function parseInt(str, radix) {\n var string = $trim(String(str), 3);\n return $parseInt(string, (radix >>> 0) || (hex.test(string) ? 16 : 10));\n} : $parseInt;\n","module.exports = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n};\n","var anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar newPromiseCapability = require('./_new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","var redefine = require('./_redefine');\nmodule.exports = function (target, src, safe) {\n for (var key in src) redefine(target, key, src[key], safe);\n return target;\n};\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar $toString = require('./_function-to-string');\nvar TO_STRING = 'toString';\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n","'use strict';\n\nvar classof = require('./_classof');\nvar builtinExec = RegExp.prototype.exec;\n\n // `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw new TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n if (classof(R) !== 'RegExp') {\n throw new TypeError('RegExp#exec called on incompatible receiver');\n }\n return builtinExec.call(R, S);\n};\n","'use strict';\n\nvar regexpFlags = require('./_flags');\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar LAST_INDEX = 'lastIndex';\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/,\n re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0;\n})();\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + re.source + '$(?!\\\\s)', regexpFlags.call(re));\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX];\n\n match = nativeExec.call(re, str);\n\n if (UPDATES_LAST_INDEX_WRONG && match) {\n re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n // eslint-disable-next-line no-loop-func\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n","module.exports = function (regExp, replace) {\n var replacer = replace === Object(replace) ? function (part) {\n return replace[part];\n } : replace;\n return function (it) {\n return String(it).replace(regExp, replacer);\n };\n};\n","// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) {\n // eslint-disable-next-line no-self-compare\n return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n","'use strict';\n// https://tc39.github.io/proposal-setmap-offrom/\nvar $export = require('./_export');\nvar aFunction = require('./_a-function');\nvar ctx = require('./_ctx');\nvar forOf = require('./_for-of');\n\nmodule.exports = function (COLLECTION) {\n $export($export.S, COLLECTION, { from: function from(source /* , mapFn, thisArg */) {\n var mapFn = arguments[1];\n var mapping, A, n, cb;\n aFunction(this);\n mapping = mapFn !== undefined;\n if (mapping) aFunction(mapFn);\n if (source == undefined) return new this();\n A = [];\n if (mapping) {\n n = 0;\n cb = ctx(mapFn, arguments[2], 2);\n forOf(source, false, function (nextItem) {\n A.push(cb(nextItem, n++));\n });\n } else {\n forOf(source, false, A.push, A);\n }\n return new this(A);\n } });\n};\n","'use strict';\n// https://tc39.github.io/proposal-setmap-offrom/\nvar $export = require('./_export');\n\nmodule.exports = function (COLLECTION) {\n $export($export.S, COLLECTION, { of: function of() {\n var length = arguments.length;\n var A = new Array(length);\n while (length--) A[length] = arguments[length];\n return new this(A);\n } });\n};\n","// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n","'use strict';\nvar global = require('./_global');\nvar dP = require('./_object-dp');\nvar DESCRIPTORS = require('./_descriptors');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (KEY) {\n var C = global[KEY];\n if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n","var def = require('./_object-dp').f;\nvar has = require('./_has');\nvar TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n","var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: require('./_library') ? 'pure' : 'global',\n copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n});\n","// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar SPECIES = require('./_wks')('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n","'use strict';\nvar fails = require('./_fails');\n\nmodule.exports = function (method, arg) {\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call\n arg ? method.call(null, function () { /* empty */ }, 1) : method.call(null);\n });\n};\n","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('./_is-regexp');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(defined(that));\n};\n","var $export = require('./_export');\nvar fails = require('./_fails');\nvar defined = require('./_defined');\nvar quot = /\"/g;\n// B.2.3.2.1 CreateHTML(string, tag, attribute, value)\nvar createHTML = function (string, tag, attribute, value) {\n var S = String(defined(string));\n var p1 = '<' + tag;\n if (attribute !== '') p1 += ' ' + attribute + '=\"' + String(value).replace(quot, '"') + '\"';\n return p1 + '>' + S + '';\n};\nmodule.exports = function (NAME, exec) {\n var O = {};\n O[NAME] = exec(createHTML);\n $export($export.P + $export.F * fails(function () {\n var test = ''[NAME]('\"');\n return test !== test.toLowerCase() || test.split('\"').length > 3;\n }), 'String', O);\n};\n","// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = require('./_to-length');\nvar repeat = require('./_string-repeat');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, maxLength, fillString, left) {\n var S = String(defined(that));\n var stringLength = S.length;\n var fillStr = fillString === undefined ? ' ' : String(fillString);\n var intMaxLength = toLength(maxLength);\n if (intMaxLength <= stringLength || fillStr == '') return S;\n var fillLen = intMaxLength - stringLength;\n var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n return left ? stringFiller + S : S + stringFiller;\n};\n","'use strict';\nvar toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n\nmodule.exports = function repeat(count) {\n var str = String(defined(this));\n var res = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;\n return res;\n};\n","var $export = require('./_export');\nvar defined = require('./_defined');\nvar fails = require('./_fails');\nvar spaces = require('./_string-ws');\nvar space = '[' + spaces + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n var exp = {};\n var FORCE = fails(function () {\n return !!spaces[KEY]() || non[KEY]() != non;\n });\n var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n if (ALIAS) exp[ALIAS] = fn;\n $export($export.P + $export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n string = String(defined(string));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n};\n\nmodule.exports = exporter;\n","module.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","var ctx = require('./_ctx');\nvar invoke = require('./_invoke');\nvar html = require('./_html');\nvar cel = require('./_dom-create');\nvar global = require('./_global');\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (require('./_cof')(process) == 'process') {\n defer = function (id) {\n process.nextTick(ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n defer = function (id) {\n global.postMessage(id + '', '*');\n };\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in cel('script')) {\n defer = function (id) {\n html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(ctx(run, id, 1), 0);\n };\n }\n}\nmodule.exports = {\n set: setTask,\n clear: clearTask\n};\n","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","// https://tc39.github.io/ecma262/#sec-toindex\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nmodule.exports = function (it) {\n if (it === undefined) return 0;\n var number = toInteger(it);\n var length = toLength(number);\n if (number !== length) throw RangeError('Wrong length!');\n return length;\n};\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","'use strict';\nif (require('./_descriptors')) {\n var LIBRARY = require('./_library');\n var global = require('./_global');\n var fails = require('./_fails');\n var $export = require('./_export');\n var $typed = require('./_typed');\n var $buffer = require('./_typed-buffer');\n var ctx = require('./_ctx');\n var anInstance = require('./_an-instance');\n var propertyDesc = require('./_property-desc');\n var hide = require('./_hide');\n var redefineAll = require('./_redefine-all');\n var toInteger = require('./_to-integer');\n var toLength = require('./_to-length');\n var toIndex = require('./_to-index');\n var toAbsoluteIndex = require('./_to-absolute-index');\n var toPrimitive = require('./_to-primitive');\n var has = require('./_has');\n var classof = require('./_classof');\n var isObject = require('./_is-object');\n var toObject = require('./_to-object');\n var isArrayIter = require('./_is-array-iter');\n var create = require('./_object-create');\n var getPrototypeOf = require('./_object-gpo');\n var gOPN = require('./_object-gopn').f;\n var getIterFn = require('./core.get-iterator-method');\n var uid = require('./_uid');\n var wks = require('./_wks');\n var createArrayMethod = require('./_array-methods');\n var createArrayIncludes = require('./_array-includes');\n var speciesConstructor = require('./_species-constructor');\n var ArrayIterators = require('./es6.array.iterator');\n var Iterators = require('./_iterators');\n var $iterDetect = require('./_iter-detect');\n var setSpecies = require('./_set-species');\n var arrayFill = require('./_array-fill');\n var arrayCopyWithin = require('./_array-copy-within');\n var $DP = require('./_object-dp');\n var $GOPD = require('./_object-gopd');\n var dP = $DP.f;\n var gOPD = $GOPD.f;\n var RangeError = global.RangeError;\n var TypeError = global.TypeError;\n var Uint8Array = global.Uint8Array;\n var ARRAY_BUFFER = 'ArrayBuffer';\n var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER;\n var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\n var PROTOTYPE = 'prototype';\n var ArrayProto = Array[PROTOTYPE];\n var $ArrayBuffer = $buffer.ArrayBuffer;\n var $DataView = $buffer.DataView;\n var arrayForEach = createArrayMethod(0);\n var arrayFilter = createArrayMethod(2);\n var arraySome = createArrayMethod(3);\n var arrayEvery = createArrayMethod(4);\n var arrayFind = createArrayMethod(5);\n var arrayFindIndex = createArrayMethod(6);\n var arrayIncludes = createArrayIncludes(true);\n var arrayIndexOf = createArrayIncludes(false);\n var arrayValues = ArrayIterators.values;\n var arrayKeys = ArrayIterators.keys;\n var arrayEntries = ArrayIterators.entries;\n var arrayLastIndexOf = ArrayProto.lastIndexOf;\n var arrayReduce = ArrayProto.reduce;\n var arrayReduceRight = ArrayProto.reduceRight;\n var arrayJoin = ArrayProto.join;\n var arraySort = ArrayProto.sort;\n var arraySlice = ArrayProto.slice;\n var arrayToString = ArrayProto.toString;\n var arrayToLocaleString = ArrayProto.toLocaleString;\n var ITERATOR = wks('iterator');\n var TAG = wks('toStringTag');\n var TYPED_CONSTRUCTOR = uid('typed_constructor');\n var DEF_CONSTRUCTOR = uid('def_constructor');\n var ALL_CONSTRUCTORS = $typed.CONSTR;\n var TYPED_ARRAY = $typed.TYPED;\n var VIEW = $typed.VIEW;\n var WRONG_LENGTH = 'Wrong length!';\n\n var $map = createArrayMethod(1, function (O, length) {\n return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);\n });\n\n var LITTLE_ENDIAN = fails(function () {\n // eslint-disable-next-line no-undef\n return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;\n });\n\n var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {\n new Uint8Array(1).set({});\n });\n\n var toOffset = function (it, BYTES) {\n var offset = toInteger(it);\n if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');\n return offset;\n };\n\n var validate = function (it) {\n if (isObject(it) && TYPED_ARRAY in it) return it;\n throw TypeError(it + ' is not a typed array!');\n };\n\n var allocate = function (C, length) {\n if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {\n throw TypeError('It is not a typed array constructor!');\n } return new C(length);\n };\n\n var speciesFromList = function (O, list) {\n return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);\n };\n\n var fromList = function (C, list) {\n var index = 0;\n var length = list.length;\n var result = allocate(C, length);\n while (length > index) result[index] = list[index++];\n return result;\n };\n\n var addGetter = function (it, key, internal) {\n dP(it, key, { get: function () { return this._d[internal]; } });\n };\n\n var $from = function from(source /* , mapfn, thisArg */) {\n var O = toObject(source);\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iterFn = getIterFn(O);\n var i, length, values, result, step, iterator;\n if (iterFn != undefined && !isArrayIter(iterFn)) {\n for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {\n values.push(step.value);\n } O = values;\n }\n if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);\n for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {\n result[i] = mapping ? mapfn(O[i], i) : O[i];\n }\n return result;\n };\n\n var $of = function of(/* ...items */) {\n var index = 0;\n var length = arguments.length;\n var result = allocate(this, length);\n while (length > index) result[index] = arguments[index++];\n return result;\n };\n\n // iOS Safari 6.x fails here\n var TO_LOCALE_BUG = !!Uint8Array && fails(function () { arrayToLocaleString.call(new Uint8Array(1)); });\n\n var $toLocaleString = function toLocaleString() {\n return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);\n };\n\n var proto = {\n copyWithin: function copyWithin(target, start /* , end */) {\n return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n },\n every: function every(callbackfn /* , thisArg */) {\n return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n fill: function fill(value /* , start, end */) { // eslint-disable-line no-unused-vars\n return arrayFill.apply(validate(this), arguments);\n },\n filter: function filter(callbackfn /* , thisArg */) {\n return speciesFromList(this, arrayFilter(validate(this), callbackfn,\n arguments.length > 1 ? arguments[1] : undefined));\n },\n find: function find(predicate /* , thisArg */) {\n return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n findIndex: function findIndex(predicate /* , thisArg */) {\n return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n forEach: function forEach(callbackfn /* , thisArg */) {\n arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n indexOf: function indexOf(searchElement /* , fromIndex */) {\n return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n includes: function includes(searchElement /* , fromIndex */) {\n return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n join: function join(separator) { // eslint-disable-line no-unused-vars\n return arrayJoin.apply(validate(this), arguments);\n },\n lastIndexOf: function lastIndexOf(searchElement /* , fromIndex */) { // eslint-disable-line no-unused-vars\n return arrayLastIndexOf.apply(validate(this), arguments);\n },\n map: function map(mapfn /* , thisArg */) {\n return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n reduce: function reduce(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduce.apply(validate(this), arguments);\n },\n reduceRight: function reduceRight(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduceRight.apply(validate(this), arguments);\n },\n reverse: function reverse() {\n var that = this;\n var length = validate(that).length;\n var middle = Math.floor(length / 2);\n var index = 0;\n var value;\n while (index < middle) {\n value = that[index];\n that[index++] = that[--length];\n that[length] = value;\n } return that;\n },\n some: function some(callbackfn /* , thisArg */) {\n return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n sort: function sort(comparefn) {\n return arraySort.call(validate(this), comparefn);\n },\n subarray: function subarray(begin, end) {\n var O = validate(this);\n var length = O.length;\n var $begin = toAbsoluteIndex(begin, length);\n return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(\n O.buffer,\n O.byteOffset + $begin * O.BYTES_PER_ELEMENT,\n toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin)\n );\n }\n };\n\n var $slice = function slice(start, end) {\n return speciesFromList(this, arraySlice.call(validate(this), start, end));\n };\n\n var $set = function set(arrayLike /* , offset */) {\n validate(this);\n var offset = toOffset(arguments[1], 1);\n var length = this.length;\n var src = toObject(arrayLike);\n var len = toLength(src.length);\n var index = 0;\n if (len + offset > length) throw RangeError(WRONG_LENGTH);\n while (index < len) this[offset + index] = src[index++];\n };\n\n var $iterators = {\n entries: function entries() {\n return arrayEntries.call(validate(this));\n },\n keys: function keys() {\n return arrayKeys.call(validate(this));\n },\n values: function values() {\n return arrayValues.call(validate(this));\n }\n };\n\n var isTAIndex = function (target, key) {\n return isObject(target)\n && target[TYPED_ARRAY]\n && typeof key != 'symbol'\n && key in target\n && String(+key) == String(key);\n };\n var $getDesc = function getOwnPropertyDescriptor(target, key) {\n return isTAIndex(target, key = toPrimitive(key, true))\n ? propertyDesc(2, target[key])\n : gOPD(target, key);\n };\n var $setDesc = function defineProperty(target, key, desc) {\n if (isTAIndex(target, key = toPrimitive(key, true))\n && isObject(desc)\n && has(desc, 'value')\n && !has(desc, 'get')\n && !has(desc, 'set')\n // TODO: add validation descriptor w/o calling accessors\n && !desc.configurable\n && (!has(desc, 'writable') || desc.writable)\n && (!has(desc, 'enumerable') || desc.enumerable)\n ) {\n target[key] = desc.value;\n return target;\n } return dP(target, key, desc);\n };\n\n if (!ALL_CONSTRUCTORS) {\n $GOPD.f = $getDesc;\n $DP.f = $setDesc;\n }\n\n $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {\n getOwnPropertyDescriptor: $getDesc,\n defineProperty: $setDesc\n });\n\n if (fails(function () { arrayToString.call({}); })) {\n arrayToString = arrayToLocaleString = function toString() {\n return arrayJoin.call(this);\n };\n }\n\n var $TypedArrayPrototype$ = redefineAll({}, proto);\n redefineAll($TypedArrayPrototype$, $iterators);\n hide($TypedArrayPrototype$, ITERATOR, $iterators.values);\n redefineAll($TypedArrayPrototype$, {\n slice: $slice,\n set: $set,\n constructor: function () { /* noop */ },\n toString: arrayToString,\n toLocaleString: $toLocaleString\n });\n addGetter($TypedArrayPrototype$, 'buffer', 'b');\n addGetter($TypedArrayPrototype$, 'byteOffset', 'o');\n addGetter($TypedArrayPrototype$, 'byteLength', 'l');\n addGetter($TypedArrayPrototype$, 'length', 'e');\n dP($TypedArrayPrototype$, TAG, {\n get: function () { return this[TYPED_ARRAY]; }\n });\n\n // eslint-disable-next-line max-statements\n module.exports = function (KEY, BYTES, wrapper, CLAMPED) {\n CLAMPED = !!CLAMPED;\n var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array';\n var GETTER = 'get' + KEY;\n var SETTER = 'set' + KEY;\n var TypedArray = global[NAME];\n var Base = TypedArray || {};\n var TAC = TypedArray && getPrototypeOf(TypedArray);\n var FORCED = !TypedArray || !$typed.ABV;\n var O = {};\n var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];\n var getter = function (that, index) {\n var data = that._d;\n return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);\n };\n var setter = function (that, index, value) {\n var data = that._d;\n if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;\n data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);\n };\n var addElement = function (that, index) {\n dP(that, index, {\n get: function () {\n return getter(this, index);\n },\n set: function (value) {\n return setter(this, index, value);\n },\n enumerable: true\n });\n };\n if (FORCED) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME, '_d');\n var index = 0;\n var offset = 0;\n var buffer, byteLength, length, klass;\n if (!isObject(data)) {\n length = toIndex(data);\n byteLength = length * BYTES;\n buffer = new $ArrayBuffer(byteLength);\n } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n buffer = data;\n offset = toOffset($offset, BYTES);\n var $len = data.byteLength;\n if ($length === undefined) {\n if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n byteLength = $len - offset;\n if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n } else {\n byteLength = toLength($length) * BYTES;\n if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);\n }\n length = byteLength / BYTES;\n } else if (TYPED_ARRAY in data) {\n return fromList(TypedArray, data);\n } else {\n return $from.call(TypedArray, data);\n }\n hide(that, '_d', {\n b: buffer,\n o: offset,\n l: byteLength,\n e: length,\n v: new $DataView(buffer)\n });\n while (index < length) addElement(that, index++);\n });\n TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);\n hide(TypedArrayPrototype, 'constructor', TypedArray);\n } else if (!fails(function () {\n TypedArray(1);\n }) || !fails(function () {\n new TypedArray(-1); // eslint-disable-line no-new\n }) || !$iterDetect(function (iter) {\n new TypedArray(); // eslint-disable-line no-new\n new TypedArray(null); // eslint-disable-line no-new\n new TypedArray(1.5); // eslint-disable-line no-new\n new TypedArray(iter); // eslint-disable-line no-new\n }, true)) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME);\n var klass;\n // `ws` module bug, temporarily remove validation length for Uint8Array\n // https://github.com/websockets/ws/pull/645\n if (!isObject(data)) return new Base(toIndex(data));\n if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n return $length !== undefined\n ? new Base(data, toOffset($offset, BYTES), $length)\n : $offset !== undefined\n ? new Base(data, toOffset($offset, BYTES))\n : new Base(data);\n }\n if (TYPED_ARRAY in data) return fromList(TypedArray, data);\n return $from.call(TypedArray, data);\n });\n arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {\n if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);\n });\n TypedArray[PROTOTYPE] = TypedArrayPrototype;\n if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray;\n }\n var $nativeIterator = TypedArrayPrototype[ITERATOR];\n var CORRECT_ITER_NAME = !!$nativeIterator\n && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined);\n var $iterator = $iterators.values;\n hide(TypedArray, TYPED_CONSTRUCTOR, true);\n hide(TypedArrayPrototype, TYPED_ARRAY, NAME);\n hide(TypedArrayPrototype, VIEW, true);\n hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);\n\n if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {\n dP(TypedArrayPrototype, TAG, {\n get: function () { return NAME; }\n });\n }\n\n O[NAME] = TypedArray;\n\n $export($export.G + $export.W + $export.F * (TypedArray != Base), O);\n\n $export($export.S, NAME, {\n BYTES_PER_ELEMENT: BYTES\n });\n\n $export($export.S + $export.F * fails(function () { Base.of.call(TypedArray, 1); }), NAME, {\n from: $from,\n of: $of\n });\n\n if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);\n\n $export($export.P, NAME, proto);\n\n setSpecies(NAME);\n\n $export($export.P + $export.F * FORCED_SET, NAME, { set: $set });\n\n $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);\n\n if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString;\n\n $export($export.P + $export.F * fails(function () {\n new TypedArray(1).slice();\n }), NAME, { slice: $slice });\n\n $export($export.P + $export.F * (fails(function () {\n return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();\n }) || !fails(function () {\n TypedArrayPrototype.toLocaleString.call([1, 2]);\n })), NAME, { toLocaleString: $toLocaleString });\n\n Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;\n if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);\n };\n} else module.exports = function () { /* empty */ };\n","'use strict';\nvar global = require('./_global');\nvar DESCRIPTORS = require('./_descriptors');\nvar LIBRARY = require('./_library');\nvar $typed = require('./_typed');\nvar hide = require('./_hide');\nvar redefineAll = require('./_redefine-all');\nvar fails = require('./_fails');\nvar anInstance = require('./_an-instance');\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nvar toIndex = require('./_to-index');\nvar gOPN = require('./_object-gopn').f;\nvar dP = require('./_object-dp').f;\nvar arrayFill = require('./_array-fill');\nvar setToStringTag = require('./_set-to-string-tag');\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length!';\nvar WRONG_INDEX = 'Wrong index!';\nvar $ArrayBuffer = global[ARRAY_BUFFER];\nvar $DataView = global[DATA_VIEW];\nvar Math = global.Math;\nvar RangeError = global.RangeError;\n// eslint-disable-next-line no-shadow-restricted-names\nvar Infinity = global.Infinity;\nvar BaseBuffer = $ArrayBuffer;\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\nvar BUFFER = 'buffer';\nvar BYTE_LENGTH = 'byteLength';\nvar BYTE_OFFSET = 'byteOffset';\nvar $BUFFER = DESCRIPTORS ? '_b' : BUFFER;\nvar $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH;\nvar $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET;\n\n// IEEE754 conversions based on https://github.com/feross/ieee754\nfunction packIEEE754(value, mLen, nBytes) {\n var buffer = new Array(nBytes);\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;\n var i = 0;\n var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n var e, m, c;\n value = abs(value);\n // eslint-disable-next-line no-self-compare\n if (value != value || value === Infinity) {\n // eslint-disable-next-line no-self-compare\n m = value != value ? 1 : 0;\n e = eMax;\n } else {\n e = floor(log(value) / LN2);\n if (value * (c = pow(2, -e)) < 1) {\n e--;\n c *= 2;\n }\n if (e + eBias >= 1) {\n value += rt / c;\n } else {\n value += rt * pow(2, 1 - eBias);\n }\n if (value * c >= 2) {\n e++;\n c /= 2;\n }\n if (e + eBias >= eMax) {\n m = 0;\n e = eMax;\n } else if (e + eBias >= 1) {\n m = (value * c - 1) * pow(2, mLen);\n e = e + eBias;\n } else {\n m = value * pow(2, eBias - 1) * pow(2, mLen);\n e = 0;\n }\n }\n for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8);\n e = e << mLen | m;\n eLen += mLen;\n for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8);\n buffer[--i] |= s * 128;\n return buffer;\n}\nfunction unpackIEEE754(buffer, mLen, nBytes) {\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var nBits = eLen - 7;\n var i = nBytes - 1;\n var s = buffer[i--];\n var e = s & 127;\n var m;\n s >>= 7;\n for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8);\n m = e & (1 << -nBits) - 1;\n e >>= -nBits;\n nBits += mLen;\n for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8);\n if (e === 0) {\n e = 1 - eBias;\n } else if (e === eMax) {\n return m ? NaN : s ? -Infinity : Infinity;\n } else {\n m = m + pow(2, mLen);\n e = e - eBias;\n } return (s ? -1 : 1) * m * pow(2, e - mLen);\n}\n\nfunction unpackI32(bytes) {\n return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];\n}\nfunction packI8(it) {\n return [it & 0xff];\n}\nfunction packI16(it) {\n return [it & 0xff, it >> 8 & 0xff];\n}\nfunction packI32(it) {\n return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];\n}\nfunction packF64(it) {\n return packIEEE754(it, 52, 8);\n}\nfunction packF32(it) {\n return packIEEE754(it, 23, 4);\n}\n\nfunction addGetter(C, key, internal) {\n dP(C[PROTOTYPE], key, { get: function () { return this[internal]; } });\n}\n\nfunction get(view, bytes, index, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = store.slice(start, start + bytes);\n return isLittleEndian ? pack : pack.reverse();\n}\nfunction set(view, bytes, index, conversion, value, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = conversion(+value);\n for (var i = 0; i < bytes; i++) store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];\n}\n\nif (!$typed.ABV) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n var byteLength = toIndex(length);\n this._b = arrayFill.call(new Array(byteLength), 0);\n this[$LENGTH] = byteLength;\n };\n\n $DataView = function DataView(buffer, byteOffset, byteLength) {\n anInstance(this, $DataView, DATA_VIEW);\n anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n var bufferLength = buffer[$LENGTH];\n var offset = toInteger(byteOffset);\n if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');\n byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);\n this[$BUFFER] = buffer;\n this[$OFFSET] = offset;\n this[$LENGTH] = byteLength;\n };\n\n if (DESCRIPTORS) {\n addGetter($ArrayBuffer, BYTE_LENGTH, '_l');\n addGetter($DataView, BUFFER, '_b');\n addGetter($DataView, BYTE_LENGTH, '_l');\n addGetter($DataView, BYTE_OFFSET, '_o');\n }\n\n redefineAll($DataView[PROTOTYPE], {\n getInt8: function getInt8(byteOffset) {\n return get(this, 1, byteOffset)[0] << 24 >> 24;\n },\n getUint8: function getUint8(byteOffset) {\n return get(this, 1, byteOffset)[0];\n },\n getInt16: function getInt16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n },\n getUint16: function getUint16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return bytes[1] << 8 | bytes[0];\n },\n getInt32: function getInt32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1]));\n },\n getUint32: function getUint32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;\n },\n getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);\n },\n getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);\n },\n setInt8: function setInt8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setUint8: function setUint8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packF32, value, arguments[2]);\n },\n setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n set(this, 8, byteOffset, packF64, value, arguments[2]);\n }\n });\n} else {\n if (!fails(function () {\n $ArrayBuffer(1);\n }) || !fails(function () {\n new $ArrayBuffer(-1); // eslint-disable-line no-new\n }) || fails(function () {\n new $ArrayBuffer(); // eslint-disable-line no-new\n new $ArrayBuffer(1.5); // eslint-disable-line no-new\n new $ArrayBuffer(NaN); // eslint-disable-line no-new\n return $ArrayBuffer.name != ARRAY_BUFFER;\n })) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer);\n return new BaseBuffer(toIndex(length));\n };\n var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];\n for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {\n if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]);\n }\n if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer;\n }\n // iOS Safari 7.x bug\n var view = new $DataView(new $ArrayBuffer(2));\n var $setInt8 = $DataView[PROTOTYPE].setInt8;\n view.setInt8(0, 2147483648);\n view.setInt8(1, 2147483649);\n if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], {\n setInt8: function setInt8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n },\n setUint8: function setUint8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n }\n }, true);\n}\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\nhide($DataView[PROTOTYPE], $typed.VIEW, true);\nexports[ARRAY_BUFFER] = $ArrayBuffer;\nexports[DATA_VIEW] = $DataView;\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar uid = require('./_uid');\nvar TYPED = uid('typed_array');\nvar VIEW = uid('view');\nvar ABV = !!(global.ArrayBuffer && global.DataView);\nvar CONSTR = ABV;\nvar i = 0;\nvar l = 9;\nvar Typed;\n\nvar TypedArrayConstructors = (\n 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'\n).split(',');\n\nwhile (i < l) {\n if (Typed = global[TypedArrayConstructors[i++]]) {\n hide(Typed.prototype, TYPED, true);\n hide(Typed.prototype, VIEW, true);\n } else CONSTR = false;\n}\n\nmodule.exports = {\n ABV: ABV,\n CONSTR: CONSTR,\n TYPED: TYPED,\n VIEW: VIEW\n};\n","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","var global = require('./_global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n","var isObject = require('./_is-object');\nmodule.exports = function (it, TYPE) {\n if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n return it;\n};\n","var global = require('./_global');\nvar core = require('./_core');\nvar LIBRARY = require('./_library');\nvar wksExt = require('./_wks-ext');\nvar defineProperty = require('./_object-dp').f;\nmodule.exports = function (name) {\n var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n","exports.f = require('./_wks');\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","// https://github.com/benjamingr/RexExp.escape\nvar $export = require('./_export');\nvar $re = require('./_replacer')(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\n$export($export.S, 'RegExp', { escape: function escape(it) { return $re(it); } });\n","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { copyWithin: require('./_array-copy-within') });\n\nrequire('./_add-to-unscopables')('copyWithin');\n","'use strict';\nvar $export = require('./_export');\nvar $every = require('./_array-methods')(4);\n\n$export($export.P + $export.F * !require('./_strict-method')([].every, true), 'Array', {\n // 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [, thisArg])\n every: function every(callbackfn /* , thisArg */) {\n return $every(this, callbackfn, arguments[1]);\n }\n});\n","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { fill: require('./_array-fill') });\n\nrequire('./_add-to-unscopables')('fill');\n","'use strict';\nvar $export = require('./_export');\nvar $filter = require('./_array-methods')(2);\n\n$export($export.P + $export.F * !require('./_strict-method')([].filter, true), 'Array', {\n // 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg])\n filter: function filter(callbackfn /* , thisArg */) {\n return $filter(this, callbackfn, arguments[1]);\n }\n});\n","'use strict';\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(6);\nvar KEY = 'findIndex';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","'use strict';\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","'use strict';\nvar $export = require('./_export');\nvar $forEach = require('./_array-methods')(0);\nvar STRICT = require('./_strict-method')([].forEach, true);\n\n$export($export.P + $export.F * !STRICT, 'Array', {\n // 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg])\n forEach: function forEach(callbackfn /* , thisArg */) {\n return $forEach(this, callbackfn, arguments[1]);\n }\n});\n","'use strict';\nvar ctx = require('./_ctx');\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar toLength = require('./_to-length');\nvar createProperty = require('./_create-property');\nvar getIterFn = require('./core.get-iterator-method');\n\n$export($export.S + $export.F * !require('./_iter-detect')(function (iter) { Array.from(iter); }), 'Array', {\n // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iterFn = getIterFn(O);\n var length, result, step, iterator;\n if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n // if object isn't iterable or it's array with default iterator - use simple case\n if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n }\n } else {\n length = toLength(O.length);\n for (result = new C(length); length > index; index++) {\n createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar $indexOf = require('./_array-includes')(false);\nvar $native = [].indexOf;\nvar NEGATIVE_ZERO = !!$native && 1 / [1].indexOf(1, -0) < 0;\n\n$export($export.P + $export.F * (NEGATIVE_ZERO || !require('./_strict-method')($native)), 'Array', {\n // 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex])\n indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n return NEGATIVE_ZERO\n // convert -0 to +0\n ? $native.apply(this, arguments) || 0\n : $indexOf(this, searchElement, arguments[1]);\n }\n});\n","// 22.1.2.2 / 15.4.3.2 Array.isArray(arg)\nvar $export = require('./_export');\n\n$export($export.S, 'Array', { isArray: require('./_is-array') });\n","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables');\nvar step = require('./_iter-step');\nvar Iterators = require('./_iterators');\nvar toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","'use strict';\n// 22.1.3.13 Array.prototype.join(separator)\nvar $export = require('./_export');\nvar toIObject = require('./_to-iobject');\nvar arrayJoin = [].join;\n\n// fallback for not array-like strings\n$export($export.P + $export.F * (require('./_iobject') != Object || !require('./_strict-method')(arrayJoin)), 'Array', {\n join: function join(separator) {\n return arrayJoin.call(toIObject(this), separator === undefined ? ',' : separator);\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar toIObject = require('./_to-iobject');\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nvar $native = [].lastIndexOf;\nvar NEGATIVE_ZERO = !!$native && 1 / [1].lastIndexOf(1, -0) < 0;\n\n$export($export.P + $export.F * (NEGATIVE_ZERO || !require('./_strict-method')($native)), 'Array', {\n // 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [, fromIndex])\n lastIndexOf: function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n // convert -0 to +0\n if (NEGATIVE_ZERO) return $native.apply(this, arguments) || 0;\n var O = toIObject(this);\n var length = toLength(O.length);\n var index = length - 1;\n if (arguments.length > 1) index = Math.min(index, toInteger(arguments[1]));\n if (index < 0) index = length + index;\n for (;index >= 0; index--) if (index in O) if (O[index] === searchElement) return index || 0;\n return -1;\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar $map = require('./_array-methods')(1);\n\n$export($export.P + $export.F * !require('./_strict-method')([].map, true), 'Array', {\n // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg])\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments[1]);\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar createProperty = require('./_create-property');\n\n// WebKit Array.of isn't generic\n$export($export.S + $export.F * require('./_fails')(function () {\n function F() { /* empty */ }\n return !(Array.of.call(F) instanceof F);\n}), 'Array', {\n // 22.1.2.3 Array.of( ...items)\n of: function of(/* ...args */) {\n var index = 0;\n var aLen = arguments.length;\n var result = new (typeof this == 'function' ? this : Array)(aLen);\n while (aLen > index) createProperty(result, index, arguments[index++]);\n result.length = aLen;\n return result;\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar $reduce = require('./_array-reduce');\n\n$export($export.P + $export.F * !require('./_strict-method')([].reduceRight, true), 'Array', {\n // 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [, initialValue])\n reduceRight: function reduceRight(callbackfn /* , initialValue */) {\n return $reduce(this, callbackfn, arguments.length, arguments[1], true);\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar $reduce = require('./_array-reduce');\n\n$export($export.P + $export.F * !require('./_strict-method')([].reduce, true), 'Array', {\n // 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue])\n reduce: function reduce(callbackfn /* , initialValue */) {\n return $reduce(this, callbackfn, arguments.length, arguments[1], false);\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar html = require('./_html');\nvar cof = require('./_cof');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nvar arraySlice = [].slice;\n\n// fallback for not array-like ES3 strings and DOM objects\n$export($export.P + $export.F * require('./_fails')(function () {\n if (html) arraySlice.call(html);\n}), 'Array', {\n slice: function slice(begin, end) {\n var len = toLength(this.length);\n var klass = cof(this);\n end = end === undefined ? len : end;\n if (klass == 'Array') return arraySlice.call(this, begin, end);\n var start = toAbsoluteIndex(begin, len);\n var upTo = toAbsoluteIndex(end, len);\n var size = toLength(upTo - start);\n var cloned = new Array(size);\n var i = 0;\n for (; i < size; i++) cloned[i] = klass == 'String'\n ? this.charAt(start + i)\n : this[start + i];\n return cloned;\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar $some = require('./_array-methods')(3);\n\n$export($export.P + $export.F * !require('./_strict-method')([].some, true), 'Array', {\n // 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [, thisArg])\n some: function some(callbackfn /* , thisArg */) {\n return $some(this, callbackfn, arguments[1]);\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar aFunction = require('./_a-function');\nvar toObject = require('./_to-object');\nvar fails = require('./_fails');\nvar $sort = [].sort;\nvar test = [1, 2, 3];\n\n$export($export.P + $export.F * (fails(function () {\n // IE8-\n test.sort(undefined);\n}) || !fails(function () {\n // V8 bug\n test.sort(null);\n // Old WebKit\n}) || !require('./_strict-method')($sort)), 'Array', {\n // 22.1.3.25 Array.prototype.sort(comparefn)\n sort: function sort(comparefn) {\n return comparefn === undefined\n ? $sort.call(toObject(this))\n : $sort.call(toObject(this), aFunction(comparefn));\n }\n});\n","require('./_set-species')('Array');\n","// 20.3.3.1 / 15.9.4.4 Date.now()\nvar $export = require('./_export');\n\n$export($export.S, 'Date', { now: function () { return new Date().getTime(); } });\n","// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()\nvar $export = require('./_export');\nvar toISOString = require('./_date-to-iso-string');\n\n// PhantomJS / old WebKit has a broken implementations\n$export($export.P + $export.F * (Date.prototype.toISOString !== toISOString), 'Date', {\n toISOString: toISOString\n});\n","'use strict';\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar toPrimitive = require('./_to-primitive');\n\n$export($export.P + $export.F * require('./_fails')(function () {\n return new Date(NaN).toJSON() !== null\n || Date.prototype.toJSON.call({ toISOString: function () { return 1; } }) !== 1;\n}), 'Date', {\n // eslint-disable-next-line no-unused-vars\n toJSON: function toJSON(key) {\n var O = toObject(this);\n var pv = toPrimitive(O);\n return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString();\n }\n});\n","var TO_PRIMITIVE = require('./_wks')('toPrimitive');\nvar proto = Date.prototype;\n\nif (!(TO_PRIMITIVE in proto)) require('./_hide')(proto, TO_PRIMITIVE, require('./_date-to-primitive'));\n","var DateProto = Date.prototype;\nvar INVALID_DATE = 'Invalid Date';\nvar TO_STRING = 'toString';\nvar $toString = DateProto[TO_STRING];\nvar getTime = DateProto.getTime;\nif (new Date(NaN) + '' != INVALID_DATE) {\n require('./_redefine')(DateProto, TO_STRING, function toString() {\n var value = getTime.call(this);\n // eslint-disable-next-line no-self-compare\n return value === value ? $toString.call(this) : INVALID_DATE;\n });\n}\n","// 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...)\nvar $export = require('./_export');\n\n$export($export.P, 'Function', { bind: require('./_bind') });\n","'use strict';\nvar isObject = require('./_is-object');\nvar getPrototypeOf = require('./_object-gpo');\nvar HAS_INSTANCE = require('./_wks')('hasInstance');\nvar FunctionProto = Function.prototype;\n// 19.2.3.6 Function.prototype[@@hasInstance](V)\nif (!(HAS_INSTANCE in FunctionProto)) require('./_object-dp').f(FunctionProto, HAS_INSTANCE, { value: function (O) {\n if (typeof this != 'function' || !isObject(O)) return false;\n if (!isObject(this.prototype)) return O instanceof this;\n // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this:\n while (O = getPrototypeOf(O)) if (this.prototype === O) return true;\n return false;\n} });\n","var dP = require('./_object-dp').f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || require('./_descriptors') && dP(FProto, NAME, {\n configurable: true,\n get: function () {\n try {\n return ('' + this).match(nameRE)[1];\n } catch (e) {\n return '';\n }\n }\n});\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar MAP = 'Map';\n\n// 23.1 Map Objects\nmodule.exports = require('./_collection')(MAP, function (get) {\n return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.1.3.6 Map.prototype.get(key)\n get: function get(key) {\n var entry = strong.getEntry(validate(this, MAP), key);\n return entry && entry.v;\n },\n // 23.1.3.9 Map.prototype.set(key, value)\n set: function set(key, value) {\n return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);\n }\n}, strong, true);\n","// 20.2.2.3 Math.acosh(x)\nvar $export = require('./_export');\nvar log1p = require('./_math-log1p');\nvar sqrt = Math.sqrt;\nvar $acosh = Math.acosh;\n\n$export($export.S + $export.F * !($acosh\n // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509\n && Math.floor($acosh(Number.MAX_VALUE)) == 710\n // Tor Browser bug: Math.acosh(Infinity) -> NaN\n && $acosh(Infinity) == Infinity\n), 'Math', {\n acosh: function acosh(x) {\n return (x = +x) < 1 ? NaN : x > 94906265.62425156\n ? Math.log(x) + Math.LN2\n : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n }\n});\n","// 20.2.2.5 Math.asinh(x)\nvar $export = require('./_export');\nvar $asinh = Math.asinh;\n\nfunction asinh(x) {\n return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));\n}\n\n// Tor Browser bug: Math.asinh(0) -> -0\n$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh });\n","// 20.2.2.7 Math.atanh(x)\nvar $export = require('./_export');\nvar $atanh = Math.atanh;\n\n// Tor Browser bug: Math.atanh(-0) -> 0\n$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {\n atanh: function atanh(x) {\n return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;\n }\n});\n","// 20.2.2.9 Math.cbrt(x)\nvar $export = require('./_export');\nvar sign = require('./_math-sign');\n\n$export($export.S, 'Math', {\n cbrt: function cbrt(x) {\n return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);\n }\n});\n","// 20.2.2.11 Math.clz32(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n clz32: function clz32(x) {\n return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;\n }\n});\n","// 20.2.2.12 Math.cosh(x)\nvar $export = require('./_export');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n cosh: function cosh(x) {\n return (exp(x = +x) + exp(-x)) / 2;\n }\n});\n","// 20.2.2.14 Math.expm1(x)\nvar $export = require('./_export');\nvar $expm1 = require('./_math-expm1');\n\n$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 });\n","// 20.2.2.16 Math.fround(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { fround: require('./_math-fround') });\n","// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])\nvar $export = require('./_export');\nvar abs = Math.abs;\n\n$export($export.S, 'Math', {\n hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars\n var sum = 0;\n var i = 0;\n var aLen = arguments.length;\n var larg = 0;\n var arg, div;\n while (i < aLen) {\n arg = abs(arguments[i++]);\n if (larg < arg) {\n div = larg / arg;\n sum = sum * div * div + 1;\n larg = arg;\n } else if (arg > 0) {\n div = arg / larg;\n sum += div * div;\n } else sum += arg;\n }\n return larg === Infinity ? Infinity : larg * Math.sqrt(sum);\n }\n});\n","// 20.2.2.18 Math.imul(x, y)\nvar $export = require('./_export');\nvar $imul = Math.imul;\n\n// some WebKit versions fails with big numbers, some has wrong arity\n$export($export.S + $export.F * require('./_fails')(function () {\n return $imul(0xffffffff, 5) != -5 || $imul.length != 2;\n}), 'Math', {\n imul: function imul(x, y) {\n var UINT16 = 0xffff;\n var xn = +x;\n var yn = +y;\n var xl = UINT16 & xn;\n var yl = UINT16 & yn;\n return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);\n }\n});\n","// 20.2.2.21 Math.log10(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log10: function log10(x) {\n return Math.log(x) * Math.LOG10E;\n }\n});\n","// 20.2.2.20 Math.log1p(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { log1p: require('./_math-log1p') });\n","// 20.2.2.22 Math.log2(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log2: function log2(x) {\n return Math.log(x) / Math.LN2;\n }\n});\n","// 20.2.2.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { sign: require('./_math-sign') });\n","// 20.2.2.30 Math.sinh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n// V8 near Chromium 38 has a problem with very small numbers\n$export($export.S + $export.F * require('./_fails')(function () {\n return !Math.sinh(-2e-17) != -2e-17;\n}), 'Math', {\n sinh: function sinh(x) {\n return Math.abs(x = +x) < 1\n ? (expm1(x) - expm1(-x)) / 2\n : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);\n }\n});\n","// 20.2.2.33 Math.tanh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n tanh: function tanh(x) {\n var a = expm1(x = +x);\n var b = expm1(-x);\n return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));\n }\n});\n","// 20.2.2.34 Math.trunc(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n trunc: function trunc(it) {\n return (it > 0 ? Math.floor : Math.ceil)(it);\n }\n});\n","'use strict';\nvar global = require('./_global');\nvar has = require('./_has');\nvar cof = require('./_cof');\nvar inheritIfRequired = require('./_inherit-if-required');\nvar toPrimitive = require('./_to-primitive');\nvar fails = require('./_fails');\nvar gOPN = require('./_object-gopn').f;\nvar gOPD = require('./_object-gopd').f;\nvar dP = require('./_object-dp').f;\nvar $trim = require('./_string-trim').trim;\nvar NUMBER = 'Number';\nvar $Number = global[NUMBER];\nvar Base = $Number;\nvar proto = $Number.prototype;\n// Opera ~12 has broken Object#toString\nvar BROKEN_COF = cof(require('./_object-create')(proto)) == NUMBER;\nvar TRIM = 'trim' in String.prototype;\n\n// 7.1.3 ToNumber(argument)\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n if (typeof it == 'string' && it.length > 2) {\n it = TRIM ? it.trim() : $trim(it, 3);\n var first = it.charCodeAt(0);\n var third, radix, maxCode;\n if (first === 43 || first === 45) {\n third = it.charCodeAt(2);\n if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n } else if (first === 48) {\n switch (it.charCodeAt(1)) {\n case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i\n default: return +it;\n }\n for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n code = digits.charCodeAt(i);\n // parseInt parses a string to a first unavailable symbol\n // but ToNumber should return NaN if a string contains unavailable symbols\n if (code < 48 || code > maxCode) return NaN;\n } return parseInt(digits, radix);\n }\n } return +it;\n};\n\nif (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n $Number = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var that = this;\n return that instanceof $Number\n // check on 1..constructor(foo) case\n && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER)\n ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);\n };\n for (var keys = require('./_descriptors') ? gOPN(Base) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES6 (in case, if modules with ES6 Number statics required before):\n 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n ).split(','), j = 0, key; keys.length > j; j++) {\n if (has(Base, key = keys[j]) && !has($Number, key)) {\n dP($Number, key, gOPD(Base, key));\n }\n }\n $Number.prototype = proto;\n proto.constructor = $Number;\n require('./_redefine')(global, NUMBER, $Number);\n}\n","// 20.1.2.1 Number.EPSILON\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });\n","// 20.1.2.2 Number.isFinite(number)\nvar $export = require('./_export');\nvar _isFinite = require('./_global').isFinite;\n\n$export($export.S, 'Number', {\n isFinite: function isFinite(it) {\n return typeof it == 'number' && _isFinite(it);\n }\n});\n","// 20.1.2.3 Number.isInteger(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { isInteger: require('./_is-integer') });\n","// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n","// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = require('./_export');\nvar isInteger = require('./_is-integer');\nvar abs = Math.abs;\n\n$export($export.S, 'Number', {\n isSafeInteger: function isSafeInteger(number) {\n return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n }\n});\n","// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });\n","// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });\n","var $export = require('./_export');\nvar $parseFloat = require('./_parse-float');\n// 20.1.2.12 Number.parseFloat(string)\n$export($export.S + $export.F * (Number.parseFloat != $parseFloat), 'Number', { parseFloat: $parseFloat });\n","var $export = require('./_export');\nvar $parseInt = require('./_parse-int');\n// 20.1.2.13 Number.parseInt(string, radix)\n$export($export.S + $export.F * (Number.parseInt != $parseInt), 'Number', { parseInt: $parseInt });\n","'use strict';\nvar $export = require('./_export');\nvar toInteger = require('./_to-integer');\nvar aNumberValue = require('./_a-number-value');\nvar repeat = require('./_string-repeat');\nvar $toFixed = 1.0.toFixed;\nvar floor = Math.floor;\nvar data = [0, 0, 0, 0, 0, 0];\nvar ERROR = 'Number.toFixed: incorrect invocation!';\nvar ZERO = '0';\n\nvar multiply = function (n, c) {\n var i = -1;\n var c2 = c;\n while (++i < 6) {\n c2 += n * data[i];\n data[i] = c2 % 1e7;\n c2 = floor(c2 / 1e7);\n }\n};\nvar divide = function (n) {\n var i = 6;\n var c = 0;\n while (--i >= 0) {\n c += data[i];\n data[i] = floor(c / n);\n c = (c % n) * 1e7;\n }\n};\nvar numToString = function () {\n var i = 6;\n var s = '';\n while (--i >= 0) {\n if (s !== '' || i === 0 || data[i] !== 0) {\n var t = String(data[i]);\n s = s === '' ? t : s + repeat.call(ZERO, 7 - t.length) + t;\n }\n } return s;\n};\nvar pow = function (x, n, acc) {\n return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);\n};\nvar log = function (x) {\n var n = 0;\n var x2 = x;\n while (x2 >= 4096) {\n n += 12;\n x2 /= 4096;\n }\n while (x2 >= 2) {\n n += 1;\n x2 /= 2;\n } return n;\n};\n\n$export($export.P + $export.F * (!!$toFixed && (\n 0.00008.toFixed(3) !== '0.000' ||\n 0.9.toFixed(0) !== '1' ||\n 1.255.toFixed(2) !== '1.25' ||\n 1000000000000000128.0.toFixed(0) !== '1000000000000000128'\n) || !require('./_fails')(function () {\n // V8 ~ Android 4.3-\n $toFixed.call({});\n})), 'Number', {\n toFixed: function toFixed(fractionDigits) {\n var x = aNumberValue(this, ERROR);\n var f = toInteger(fractionDigits);\n var s = '';\n var m = ZERO;\n var e, z, j, k;\n if (f < 0 || f > 20) throw RangeError(ERROR);\n // eslint-disable-next-line no-self-compare\n if (x != x) return 'NaN';\n if (x <= -1e21 || x >= 1e21) return String(x);\n if (x < 0) {\n s = '-';\n x = -x;\n }\n if (x > 1e-21) {\n e = log(x * pow(2, 69, 1)) - 69;\n z = e < 0 ? x * pow(2, -e, 1) : x / pow(2, e, 1);\n z *= 0x10000000000000;\n e = 52 - e;\n if (e > 0) {\n multiply(0, z);\n j = f;\n while (j >= 7) {\n multiply(1e7, 0);\n j -= 7;\n }\n multiply(pow(10, j, 1), 0);\n j = e - 1;\n while (j >= 23) {\n divide(1 << 23);\n j -= 23;\n }\n divide(1 << j);\n multiply(1, 1);\n divide(2);\n m = numToString();\n } else {\n multiply(0, z);\n multiply(1 << -e, 0);\n m = numToString() + repeat.call(ZERO, f);\n }\n }\n if (f > 0) {\n k = m.length;\n m = s + (k <= f ? '0.' + repeat.call(ZERO, f - k) + m : m.slice(0, k - f) + '.' + m.slice(k - f));\n } else {\n m = s + m;\n } return m;\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar $fails = require('./_fails');\nvar aNumberValue = require('./_a-number-value');\nvar $toPrecision = 1.0.toPrecision;\n\n$export($export.P + $export.F * ($fails(function () {\n // IE7-\n return $toPrecision.call(1, undefined) !== '1';\n}) || !$fails(function () {\n // V8 ~ Android 4.3-\n $toPrecision.call({});\n})), 'Number', {\n toPrecision: function toPrecision(precision) {\n var that = aNumberValue(this, 'Number#toPrecision: incorrect invocation!');\n return precision === undefined ? $toPrecision.call(that) : $toPrecision.call(that, precision);\n }\n});\n","// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', { assign: require('./_object-assign') });\n","var $export = require('./_export');\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\n$export($export.S, 'Object', { create: require('./_object-create') });\n","var $export = require('./_export');\n// 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties)\n$export($export.S + $export.F * !require('./_descriptors'), 'Object', { defineProperties: require('./_object-dps') });\n","var $export = require('./_export');\n// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)\n$export($export.S + $export.F * !require('./_descriptors'), 'Object', { defineProperty: require('./_object-dp').f });\n","// 19.1.2.5 Object.freeze(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('freeze', function ($freeze) {\n return function freeze(it) {\n return $freeze && isObject(it) ? $freeze(meta(it)) : it;\n };\n});\n","// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = require('./_to-iobject');\nvar $getOwnPropertyDescriptor = require('./_object-gopd').f;\n\nrequire('./_object-sap')('getOwnPropertyDescriptor', function () {\n return function getOwnPropertyDescriptor(it, key) {\n return $getOwnPropertyDescriptor(toIObject(it), key);\n };\n});\n","// 19.1.2.7 Object.getOwnPropertyNames(O)\nrequire('./_object-sap')('getOwnPropertyNames', function () {\n return require('./_object-gopn-ext').f;\n});\n","// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = require('./_to-object');\nvar $getPrototypeOf = require('./_object-gpo');\n\nrequire('./_object-sap')('getPrototypeOf', function () {\n return function getPrototypeOf(it) {\n return $getPrototypeOf(toObject(it));\n };\n});\n","// 19.1.2.11 Object.isExtensible(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isExtensible', function ($isExtensible) {\n return function isExtensible(it) {\n return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;\n };\n});\n","// 19.1.2.12 Object.isFrozen(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isFrozen', function ($isFrozen) {\n return function isFrozen(it) {\n return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;\n };\n});\n","// 19.1.2.13 Object.isSealed(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isSealed', function ($isSealed) {\n return function isSealed(it) {\n return isObject(it) ? $isSealed ? $isSealed(it) : false : true;\n };\n});\n","// 19.1.3.10 Object.is(value1, value2)\nvar $export = require('./_export');\n$export($export.S, 'Object', { is: require('./_same-value') });\n","// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object');\nvar $keys = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n","// 19.1.2.15 Object.preventExtensions(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('preventExtensions', function ($preventExtensions) {\n return function preventExtensions(it) {\n return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;\n };\n});\n","// 19.1.2.17 Object.seal(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('seal', function ($seal) {\n return function seal(it) {\n return $seal && isObject(it) ? $seal(meta(it)) : it;\n };\n});\n","// 19.1.3.19 Object.setPrototypeOf(O, proto)\nvar $export = require('./_export');\n$export($export.S, 'Object', { setPrototypeOf: require('./_set-proto').set });\n","'use strict';\n// 19.1.3.6 Object.prototype.toString()\nvar classof = require('./_classof');\nvar test = {};\ntest[require('./_wks')('toStringTag')] = 'z';\nif (test + '' != '[object z]') {\n require('./_redefine')(Object.prototype, 'toString', function toString() {\n return '[object ' + classof(this) + ']';\n }, true);\n}\n","var $export = require('./_export');\nvar $parseFloat = require('./_parse-float');\n// 18.2.4 parseFloat(string)\n$export($export.G + $export.F * (parseFloat != $parseFloat), { parseFloat: $parseFloat });\n","var $export = require('./_export');\nvar $parseInt = require('./_parse-int');\n// 18.2.5 parseInt(string, radix)\n$export($export.G + $export.F * (parseInt != $parseInt), { parseInt: $parseInt });\n","'use strict';\nvar LIBRARY = require('./_library');\nvar global = require('./_global');\nvar ctx = require('./_ctx');\nvar classof = require('./_classof');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar aFunction = require('./_a-function');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar speciesConstructor = require('./_species-constructor');\nvar task = require('./_task').set;\nvar microtask = require('./_microtask')();\nvar newPromiseCapabilityModule = require('./_new-promise-capability');\nvar perform = require('./_perform');\nvar userAgent = require('./_user-agent');\nvar promiseResolve = require('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[require('./_wks')('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode || typeof PromiseRejectionEvent == 'function')\n && promise.then(empty) instanceof FakePromise\n // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // we can't detect it synchronously, so just check versions\n && v8.indexOf('6.6') !== 0\n && userAgent.indexOf('Chrome/66') === -1;\n } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // may throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n if (domain && !exited) domain.exit();\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n};\nvar onUnhandled = function (promise) {\n task.call(global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = perform(function () {\n if (isNode) {\n process.emit('unhandledRejection', value, promise);\n } else if (handler = global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n};\nvar isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n task.call(global, function () {\n var handler;\n if (isNode) {\n process.emit('rejectionHandled', promise);\n } else if (handler = global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n};\nvar $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n};\nvar $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n anInstance(this, $Promise, PROMISE, '_h');\n aFunction(executor);\n Internal.call(this);\n try {\n executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = require('./_redefine-all')($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode ? process.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = ctx($resolve, promise, 1);\n this.reject = ctx($reject, promise, 1);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\nrequire('./_set-to-string-tag')($Promise, PROMISE);\nrequire('./_set-species')(PROMISE);\nWrapper = require('./_core')[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n }\n});\n$export($export.S + $export.F * !(USE_NATIVE && require('./_iter-detect')(function (iter) {\n $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n});\n","// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)\nvar $export = require('./_export');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar rApply = (require('./_global').Reflect || {}).apply;\nvar fApply = Function.apply;\n// MS Edge argumentsList argument is optional\n$export($export.S + $export.F * !require('./_fails')(function () {\n rApply(function () { /* empty */ });\n}), 'Reflect', {\n apply: function apply(target, thisArgument, argumentsList) {\n var T = aFunction(target);\n var L = anObject(argumentsList);\n return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);\n }\n});\n","// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])\nvar $export = require('./_export');\nvar create = require('./_object-create');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar bind = require('./_bind');\nvar rConstruct = (require('./_global').Reflect || {}).construct;\n\n// MS Edge supports only 2 arguments and argumentsList argument is optional\n// FF Nightly sets third argument as `new.target`, but does not create `this` from it\nvar NEW_TARGET_BUG = fails(function () {\n function F() { /* empty */ }\n return !(rConstruct(function () { /* empty */ }, [], F) instanceof F);\n});\nvar ARGS_BUG = !fails(function () {\n rConstruct(function () { /* empty */ });\n});\n\n$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {\n construct: function construct(Target, args /* , newTarget */) {\n aFunction(Target);\n anObject(args);\n var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);\n if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);\n if (Target == newTarget) {\n // w/o altered newTarget, optimization for 0-4 arguments\n switch (args.length) {\n case 0: return new Target();\n case 1: return new Target(args[0]);\n case 2: return new Target(args[0], args[1]);\n case 3: return new Target(args[0], args[1], args[2]);\n case 4: return new Target(args[0], args[1], args[2], args[3]);\n }\n // w/o altered newTarget, lot of arguments case\n var $args = [null];\n $args.push.apply($args, args);\n return new (bind.apply(Target, $args))();\n }\n // with altered newTarget, not support built-in constructors\n var proto = newTarget.prototype;\n var instance = create(isObject(proto) ? proto : Object.prototype);\n var result = Function.apply.call(Target, instance, args);\n return isObject(result) ? result : instance;\n }\n});\n","// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)\nvar dP = require('./_object-dp');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar toPrimitive = require('./_to-primitive');\n\n// MS Edge has broken Reflect.defineProperty - throwing instead of returning false\n$export($export.S + $export.F * require('./_fails')(function () {\n // eslint-disable-next-line no-undef\n Reflect.defineProperty(dP.f({}, 1, { value: 1 }), 1, { value: 2 });\n}), 'Reflect', {\n defineProperty: function defineProperty(target, propertyKey, attributes) {\n anObject(target);\n propertyKey = toPrimitive(propertyKey, true);\n anObject(attributes);\n try {\n dP.f(target, propertyKey, attributes);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.4 Reflect.deleteProperty(target, propertyKey)\nvar $export = require('./_export');\nvar gOPD = require('./_object-gopd').f;\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n deleteProperty: function deleteProperty(target, propertyKey) {\n var desc = gOPD(anObject(target), propertyKey);\n return desc && !desc.configurable ? false : delete target[propertyKey];\n }\n});\n","'use strict';\n// 26.1.5 Reflect.enumerate(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar Enumerate = function (iterated) {\n this._t = anObject(iterated); // target\n this._i = 0; // next index\n var keys = this._k = []; // keys\n var key;\n for (key in iterated) keys.push(key);\n};\nrequire('./_iter-create')(Enumerate, 'Object', function () {\n var that = this;\n var keys = that._k;\n var key;\n do {\n if (that._i >= keys.length) return { value: undefined, done: true };\n } while (!((key = keys[that._i++]) in that._t));\n return { value: key, done: false };\n});\n\n$export($export.S, 'Reflect', {\n enumerate: function enumerate(target) {\n return new Enumerate(target);\n }\n});\n","// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)\nvar gOPD = require('./_object-gopd');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {\n return gOPD.f(anObject(target), propertyKey);\n }\n});\n","// 26.1.8 Reflect.getPrototypeOf(target)\nvar $export = require('./_export');\nvar getProto = require('./_object-gpo');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n getPrototypeOf: function getPrototypeOf(target) {\n return getProto(anObject(target));\n }\n});\n","// 26.1.6 Reflect.get(target, propertyKey [, receiver])\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\n\nfunction get(target, propertyKey /* , receiver */) {\n var receiver = arguments.length < 3 ? target : arguments[2];\n var desc, proto;\n if (anObject(target) === receiver) return target[propertyKey];\n if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value')\n ? desc.value\n : desc.get !== undefined\n ? desc.get.call(receiver)\n : undefined;\n if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver);\n}\n\n$export($export.S, 'Reflect', { get: get });\n","// 26.1.9 Reflect.has(target, propertyKey)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', {\n has: function has(target, propertyKey) {\n return propertyKey in target;\n }\n});\n","// 26.1.10 Reflect.isExtensible(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $isExtensible = Object.isExtensible;\n\n$export($export.S, 'Reflect', {\n isExtensible: function isExtensible(target) {\n anObject(target);\n return $isExtensible ? $isExtensible(target) : true;\n }\n});\n","// 26.1.11 Reflect.ownKeys(target)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', { ownKeys: require('./_own-keys') });\n","// 26.1.12 Reflect.preventExtensions(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $preventExtensions = Object.preventExtensions;\n\n$export($export.S, 'Reflect', {\n preventExtensions: function preventExtensions(target) {\n anObject(target);\n try {\n if ($preventExtensions) $preventExtensions(target);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.14 Reflect.setPrototypeOf(target, proto)\nvar $export = require('./_export');\nvar setProto = require('./_set-proto');\n\nif (setProto) $export($export.S, 'Reflect', {\n setPrototypeOf: function setPrototypeOf(target, proto) {\n setProto.check(target, proto);\n try {\n setProto.set(target, proto);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])\nvar dP = require('./_object-dp');\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar createDesc = require('./_property-desc');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\n\nfunction set(target, propertyKey, V /* , receiver */) {\n var receiver = arguments.length < 4 ? target : arguments[3];\n var ownDesc = gOPD.f(anObject(target), propertyKey);\n var existingDescriptor, proto;\n if (!ownDesc) {\n if (isObject(proto = getPrototypeOf(target))) {\n return set(proto, propertyKey, V, receiver);\n }\n ownDesc = createDesc(0);\n }\n if (has(ownDesc, 'value')) {\n if (ownDesc.writable === false || !isObject(receiver)) return false;\n if (existingDescriptor = gOPD.f(receiver, propertyKey)) {\n if (existingDescriptor.get || existingDescriptor.set || existingDescriptor.writable === false) return false;\n existingDescriptor.value = V;\n dP.f(receiver, propertyKey, existingDescriptor);\n } else dP.f(receiver, propertyKey, createDesc(0, V));\n return true;\n }\n return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);\n}\n\n$export($export.S, 'Reflect', { set: set });\n","var global = require('./_global');\nvar inheritIfRequired = require('./_inherit-if-required');\nvar dP = require('./_object-dp').f;\nvar gOPN = require('./_object-gopn').f;\nvar isRegExp = require('./_is-regexp');\nvar $flags = require('./_flags');\nvar $RegExp = global.RegExp;\nvar Base = $RegExp;\nvar proto = $RegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n// \"new\" creates a new object, old webkit buggy here\nvar CORRECT_NEW = new $RegExp(re1) !== re1;\n\nif (require('./_descriptors') && (!CORRECT_NEW || require('./_fails')(function () {\n re2[require('./_wks')('match')] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';\n}))) {\n $RegExp = function RegExp(p, f) {\n var tiRE = this instanceof $RegExp;\n var piRE = isRegExp(p);\n var fiU = f === undefined;\n return !tiRE && piRE && p.constructor === $RegExp && fiU ? p\n : inheritIfRequired(CORRECT_NEW\n ? new Base(piRE && !fiU ? p.source : p, f)\n : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f)\n , tiRE ? this : proto, $RegExp);\n };\n var proxy = function (key) {\n key in $RegExp || dP($RegExp, key, {\n configurable: true,\n get: function () { return Base[key]; },\n set: function (it) { Base[key] = it; }\n });\n };\n for (var keys = gOPN(Base), i = 0; keys.length > i;) proxy(keys[i++]);\n proto.constructor = $RegExp;\n $RegExp.prototype = proto;\n require('./_redefine')(global, 'RegExp', $RegExp);\n}\n\nrequire('./_set-species')('RegExp');\n","'use strict';\nvar regexpExec = require('./_regexp-exec');\nrequire('./_export')({\n target: 'RegExp',\n proto: true,\n forced: regexpExec !== /./.exec\n}, {\n exec: regexpExec\n});\n","// 21.2.5.3 get RegExp.prototype.flags()\nif (require('./_descriptors') && /./g.flags != 'g') require('./_object-dp').f(RegExp.prototype, 'flags', {\n configurable: true,\n get: require('./_flags')\n});\n","'use strict';\n\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar advanceStringIndex = require('./_advance-string-index');\nvar regExpExec = require('./_regexp-exec-abstract');\n\n// @@match logic\nrequire('./_fix-re-wks')('match', 1, function (defined, MATCH, $match, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[MATCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative($match, regexp, this);\n if (res.done) return res.value;\n var rx = anObject(regexp);\n var S = String(this);\n if (!rx.global) return regExpExec(rx, S);\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n","'use strict';\n\nvar anObject = require('./_an-object');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar toInteger = require('./_to-integer');\nvar advanceStringIndex = require('./_advance-string-index');\nvar regExpExec = require('./_regexp-exec-abstract');\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&`']|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&`']|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nrequire('./_fix-re-wks')('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) {\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = defined(this);\n var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n return fn !== undefined\n ? fn.call(searchValue, O, replaceValue)\n : $replace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n var res = maybeCallNative($replace, regexp, this, replaceValue);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n results.push(result);\n if (!global) break;\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n var matched = String(result[0]);\n var position = max(min(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return $replace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n});\n","'use strict';\n\nvar anObject = require('./_an-object');\nvar sameValue = require('./_same-value');\nvar regExpExec = require('./_regexp-exec-abstract');\n\n// @@search logic\nrequire('./_fix-re-wks')('search', 1, function (defined, SEARCH, $search, maybeCallNative) {\n return [\n // `String.prototype.search` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.search\n function search(regexp) {\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[SEARCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n },\n // `RegExp.prototype[@@search]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n function (regexp) {\n var res = maybeCallNative($search, regexp, this);\n if (res.done) return res.value;\n var rx = anObject(regexp);\n var S = String(this);\n var previousLastIndex = rx.lastIndex;\n if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n var result = regExpExec(rx, S);\n if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n return result === null ? -1 : result.index;\n }\n ];\n});\n","'use strict';\n\nvar isRegExp = require('./_is-regexp');\nvar anObject = require('./_an-object');\nvar speciesConstructor = require('./_species-constructor');\nvar advanceStringIndex = require('./_advance-string-index');\nvar toLength = require('./_to-length');\nvar callRegExpExec = require('./_regexp-exec-abstract');\nvar regexpExec = require('./_regexp-exec');\nvar fails = require('./_fails');\nvar $min = Math.min;\nvar $push = [].push;\nvar $SPLIT = 'split';\nvar LENGTH = 'length';\nvar LAST_INDEX = 'lastIndex';\nvar MAX_UINT32 = 0xffffffff;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nrequire('./_fix-re-wks')('split', 2, function (defined, SPLIT, $split, maybeCallNative) {\n var internalSplit;\n if (\n 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n ''[$SPLIT](/.?/)[LENGTH]\n ) {\n // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(this);\n if (separator === undefined && limit === 0) return [];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) return $split.call(string, separator, limit);\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n var splitLimit = limit === undefined ? MAX_UINT32 : limit >>> 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy[LAST_INDEX];\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n lastLength = match[0][LENGTH];\n lastLastIndex = lastIndex;\n if (output[LENGTH] >= splitLimit) break;\n }\n if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n }\n if (lastLastIndex === string[LENGTH]) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n };\n // Chakra, V8\n } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit);\n };\n } else {\n internalSplit = $split;\n }\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = defined(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = $min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n});\n","'use strict';\nrequire('./es6.regexp.flags');\nvar anObject = require('./_an-object');\nvar $flags = require('./_flags');\nvar DESCRIPTORS = require('./_descriptors');\nvar TO_STRING = 'toString';\nvar $toString = /./[TO_STRING];\n\nvar define = function (fn) {\n require('./_redefine')(RegExp.prototype, TO_STRING, fn, true);\n};\n\n// 21.2.5.14 RegExp.prototype.toString()\nif (require('./_fails')(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) {\n define(function toString() {\n var R = anObject(this);\n return '/'.concat(R.source, '/',\n 'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined);\n });\n// FF44- RegExp#toString has a wrong name\n} else if ($toString.name != TO_STRING) {\n define(function toString() {\n return $toString.call(this);\n });\n}\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar SET = 'Set';\n\n// 23.2 Set Objects\nmodule.exports = require('./_collection')(SET, function (get) {\n return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.2.3.1 Set.prototype.add(value)\n add: function add(value) {\n return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);\n }\n}, strong);\n","'use strict';\n// B.2.3.2 String.prototype.anchor(name)\nrequire('./_string-html')('anchor', function (createHTML) {\n return function anchor(name) {\n return createHTML(this, 'a', 'name', name);\n };\n});\n","'use strict';\n// B.2.3.3 String.prototype.big()\nrequire('./_string-html')('big', function (createHTML) {\n return function big() {\n return createHTML(this, 'big', '', '');\n };\n});\n","'use strict';\n// B.2.3.4 String.prototype.blink()\nrequire('./_string-html')('blink', function (createHTML) {\n return function blink() {\n return createHTML(this, 'blink', '', '');\n };\n});\n","'use strict';\n// B.2.3.5 String.prototype.bold()\nrequire('./_string-html')('bold', function (createHTML) {\n return function bold() {\n return createHTML(this, 'b', '', '');\n };\n});\n","'use strict';\nvar $export = require('./_export');\nvar $at = require('./_string-at')(false);\n$export($export.P, 'String', {\n // 21.1.3.3 String.prototype.codePointAt(pos)\n codePointAt: function codePointAt(pos) {\n return $at(this, pos);\n }\n});\n","// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar ENDS_WITH = 'endsWith';\nvar $endsWith = ''[ENDS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(ENDS_WITH), 'String', {\n endsWith: function endsWith(searchString /* , endPosition = @length */) {\n var that = context(this, searchString, ENDS_WITH);\n var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n var len = toLength(that.length);\n var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);\n var search = String(searchString);\n return $endsWith\n ? $endsWith.call(that, search, end)\n : that.slice(end - search.length, end) === search;\n }\n});\n","'use strict';\n// B.2.3.6 String.prototype.fixed()\nrequire('./_string-html')('fixed', function (createHTML) {\n return function fixed() {\n return createHTML(this, 'tt', '', '');\n };\n});\n","'use strict';\n// B.2.3.7 String.prototype.fontcolor(color)\nrequire('./_string-html')('fontcolor', function (createHTML) {\n return function fontcolor(color) {\n return createHTML(this, 'font', 'color', color);\n };\n});\n","'use strict';\n// B.2.3.8 String.prototype.fontsize(size)\nrequire('./_string-html')('fontsize', function (createHTML) {\n return function fontsize(size) {\n return createHTML(this, 'font', 'size', size);\n };\n});\n","var $export = require('./_export');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar fromCharCode = String.fromCharCode;\nvar $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n // 21.1.2.2 String.fromCodePoint(...codePoints)\n fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n var res = [];\n var aLen = arguments.length;\n var i = 0;\n var code;\n while (aLen > i) {\n code = +arguments[i++];\n if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n res.push(code < 0x10000\n ? fromCharCode(code)\n : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n );\n } return res.join('');\n }\n});\n","// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n'use strict';\nvar $export = require('./_export');\nvar context = require('./_string-context');\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(INCLUDES), 'String', {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~context(this, searchString, INCLUDES)\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\n// B.2.3.9 String.prototype.italics()\nrequire('./_string-html')('italics', function (createHTML) {\n return function italics() {\n return createHTML(this, 'i', '', '');\n };\n});\n","'use strict';\nvar $at = require('./_string-at')(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\nrequire('./_iter-define')(String, 'String', function (iterated) {\n this._t = String(iterated); // target\n this._i = 0; // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var index = this._i;\n var point;\n if (index >= O.length) return { value: undefined, done: true };\n point = $at(O, index);\n this._i += point.length;\n return { value: point, done: false };\n});\n","'use strict';\n// B.2.3.10 String.prototype.link(url)\nrequire('./_string-html')('link', function (createHTML) {\n return function link(url) {\n return createHTML(this, 'a', 'href', url);\n };\n});\n","var $export = require('./_export');\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\n\n$export($export.S, 'String', {\n // 21.1.2.4 String.raw(callSite, ...substitutions)\n raw: function raw(callSite) {\n var tpl = toIObject(callSite.raw);\n var len = toLength(tpl.length);\n var aLen = arguments.length;\n var res = [];\n var i = 0;\n while (len > i) {\n res.push(String(tpl[i++]));\n if (i < aLen) res.push(String(arguments[i]));\n } return res.join('');\n }\n});\n","var $export = require('./_export');\n\n$export($export.P, 'String', {\n // 21.1.3.13 String.prototype.repeat(count)\n repeat: require('./_string-repeat')\n});\n","'use strict';\n// B.2.3.11 String.prototype.small()\nrequire('./_string-html')('small', function (createHTML) {\n return function small() {\n return createHTML(this, 'small', '', '');\n };\n});\n","// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(STARTS_WITH), 'String', {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = context(this, searchString, STARTS_WITH);\n var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return $startsWith\n ? $startsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n","'use strict';\n// B.2.3.12 String.prototype.strike()\nrequire('./_string-html')('strike', function (createHTML) {\n return function strike() {\n return createHTML(this, 'strike', '', '');\n };\n});\n","'use strict';\n// B.2.3.13 String.prototype.sub()\nrequire('./_string-html')('sub', function (createHTML) {\n return function sub() {\n return createHTML(this, 'sub', '', '');\n };\n});\n","'use strict';\n// B.2.3.14 String.prototype.sup()\nrequire('./_string-html')('sup', function (createHTML) {\n return function sup() {\n return createHTML(this, 'sup', '', '');\n };\n});\n","'use strict';\n// 21.1.3.25 String.prototype.trim()\nrequire('./_string-trim')('trim', function ($trim) {\n return function trim() {\n return $trim(this, 3);\n };\n});\n","'use strict';\n// ECMAScript 6 symbols shim\nvar global = require('./_global');\nvar has = require('./_has');\nvar DESCRIPTORS = require('./_descriptors');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar META = require('./_meta').KEY;\nvar $fails = require('./_fails');\nvar shared = require('./_shared');\nvar setToStringTag = require('./_set-to-string-tag');\nvar uid = require('./_uid');\nvar wks = require('./_wks');\nvar wksExt = require('./_wks-ext');\nvar wksDefine = require('./_wks-define');\nvar enumKeys = require('./_enum-keys');\nvar isArray = require('./_is-array');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar toObject = require('./_to-object');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar createDesc = require('./_property-desc');\nvar _create = require('./_object-create');\nvar gOPNExt = require('./_object-gopn-ext');\nvar $GOPD = require('./_object-gopd');\nvar $GOPS = require('./_object-gops');\nvar $DP = require('./_object-dp');\nvar $keys = require('./_object-keys');\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function' && !!$GOPS.f;\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n return _create(dP({}, 'a', {\n get: function () { return dP(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (it, key, D) {\n var protoDesc = gOPD(ObjectProto, key);\n if (protoDesc) delete ObjectProto[key];\n dP(it, key, D);\n if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n sym._k = tag;\n return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n anObject(it);\n key = toPrimitive(key, true);\n anObject(D);\n if (has(AllSymbols, key)) {\n if (!D.enumerable) {\n if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n it[HIDDEN][key] = true;\n } else {\n if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n D = _create(D, { enumerable: createDesc(0, false) });\n } return setSymbolDesc(it, key, D);\n } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n anObject(it);\n var keys = enumKeys(P = toIObject(P));\n var i = 0;\n var l = keys.length;\n var key;\n while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n return it;\n};\nvar $create = function create(it, P) {\n return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n var E = isEnum.call(this, key = toPrimitive(key, true));\n if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n it = toIObject(it);\n key = toPrimitive(key, true);\n if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n var D = gOPD(it, key);\n if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n var names = gOPN(toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n var IS_OP = it === ObjectProto;\n var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n var $set = function (value) {\n if (this === ObjectProto) $set.call(OPSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDesc(this, tag, createDesc(1, value));\n };\n if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n return wrap(tag);\n };\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return this._k;\n });\n\n $GOPD.f = $getOwnPropertyDescriptor;\n $DP.f = $defineProperty;\n require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;\n require('./_object-pie').f = $propertyIsEnumerable;\n $GOPS.f = $getOwnPropertySymbols;\n\n if (DESCRIPTORS && !require('./_library')) {\n redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n }\n\n wksExt.f = function (name) {\n return wrap(wks(name));\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n // 19.4.2.1 Symbol.for(key)\n 'for': function (key) {\n return has(SymbolRegistry, key += '')\n ? SymbolRegistry[key]\n : SymbolRegistry[key] = $Symbol(key);\n },\n // 19.4.2.5 Symbol.keyFor(sym)\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n },\n useSetter: function () { setter = true; },\n useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n // 19.1.2.2 Object.create(O [, Properties])\n create: $create,\n // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n defineProperty: $defineProperty,\n // 19.1.2.3 Object.defineProperties(O, Properties)\n defineProperties: $defineProperties,\n // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n // 19.1.2.7 Object.getOwnPropertyNames(O)\n getOwnPropertyNames: $getOwnPropertyNames,\n // 19.1.2.8 Object.getOwnPropertySymbols(O)\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n// https://bugs.chromium.org/p/v8/issues/detail?id=3443\nvar FAILS_ON_PRIMITIVES = $fails(function () { $GOPS.f(1); });\n\n$export($export.S + $export.F * FAILS_ON_PRIMITIVES, 'Object', {\n getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n return $GOPS.f(toObject(it));\n }\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n var S = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n // WebKit converts symbol values to JSON as null\n // V8 throws on boxed symbols\n return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n stringify: function stringify(it) {\n var args = [it];\n var i = 1;\n var replacer, $replacer;\n while (arguments.length > i) args.push(arguments[i++]);\n $replacer = replacer = args[1];\n if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n if (!isArray(replacer)) replacer = function (key, value) {\n if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n if (!isSymbol(value)) return value;\n };\n args[1] = replacer;\n return _stringify.apply($JSON, args);\n }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n","'use strict';\nvar $export = require('./_export');\nvar $typed = require('./_typed');\nvar buffer = require('./_typed-buffer');\nvar anObject = require('./_an-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nvar isObject = require('./_is-object');\nvar ArrayBuffer = require('./_global').ArrayBuffer;\nvar speciesConstructor = require('./_species-constructor');\nvar $ArrayBuffer = buffer.ArrayBuffer;\nvar $DataView = buffer.DataView;\nvar $isView = $typed.ABV && ArrayBuffer.isView;\nvar $slice = $ArrayBuffer.prototype.slice;\nvar VIEW = $typed.VIEW;\nvar ARRAY_BUFFER = 'ArrayBuffer';\n\n$export($export.G + $export.W + $export.F * (ArrayBuffer !== $ArrayBuffer), { ArrayBuffer: $ArrayBuffer });\n\n$export($export.S + $export.F * !$typed.CONSTR, ARRAY_BUFFER, {\n // 24.1.3.1 ArrayBuffer.isView(arg)\n isView: function isView(it) {\n return $isView && $isView(it) || isObject(it) && VIEW in it;\n }\n});\n\n$export($export.P + $export.U + $export.F * require('./_fails')(function () {\n return !new $ArrayBuffer(2).slice(1, undefined).byteLength;\n}), ARRAY_BUFFER, {\n // 24.1.4.3 ArrayBuffer.prototype.slice(start, end)\n slice: function slice(start, end) {\n if ($slice !== undefined && end === undefined) return $slice.call(anObject(this), start); // FF fix\n var len = anObject(this).byteLength;\n var first = toAbsoluteIndex(start, len);\n var fin = toAbsoluteIndex(end === undefined ? len : end, len);\n var result = new (speciesConstructor(this, $ArrayBuffer))(toLength(fin - first));\n var viewS = new $DataView(this);\n var viewT = new $DataView(result);\n var index = 0;\n while (first < fin) {\n viewT.setUint8(index++, viewS.getUint8(first++));\n } return result;\n }\n});\n\nrequire('./_set-species')(ARRAY_BUFFER);\n","var $export = require('./_export');\n$export($export.G + $export.W + $export.F * !require('./_typed').ABV, {\n DataView: require('./_typed-buffer').DataView\n});\n","require('./_typed-array')('Float32', 4, function (init) {\n return function Float32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Float64', 8, function (init) {\n return function Float64Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Int16', 2, function (init) {\n return function Int16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Int32', 4, function (init) {\n return function Int32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Int8', 1, function (init) {\n return function Int8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint16', 2, function (init) {\n return function Uint16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint32', 4, function (init) {\n return function Uint32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint8', 1, function (init) {\n return function Uint8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint8', 1, function (init) {\n return function Uint8ClampedArray(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n}, true);\n","'use strict';\nvar global = require('./_global');\nvar each = require('./_array-methods')(0);\nvar redefine = require('./_redefine');\nvar meta = require('./_meta');\nvar assign = require('./_object-assign');\nvar weak = require('./_collection-weak');\nvar isObject = require('./_is-object');\nvar validate = require('./_validate-collection');\nvar NATIVE_WEAK_MAP = require('./_validate-collection');\nvar IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar InternalMap;\n\nvar wrapper = function (get) {\n return function WeakMap() {\n return get(this, arguments.length > 0 ? arguments[0] : undefined);\n };\n};\n\nvar methods = {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n if (isObject(key)) {\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n return data ? data[this._i] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return weak.def(validate(this, WEAK_MAP), key, value);\n }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = require('./_collection')(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (NATIVE_WEAK_MAP && IS_IE11) {\n InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n assign(InternalMap.prototype, methods);\n meta.NEED = true;\n each(['delete', 'has', 'get', 'set'], function (key) {\n var proto = $WeakMap.prototype;\n var method = proto[key];\n redefine(proto, key, function (a, b) {\n // store frozen objects on internal weakmap shim\n if (isObject(a) && !isExtensible(a)) {\n if (!this._f) this._f = new InternalMap();\n var result = this._f[key](a, b);\n return key == 'set' ? this : result;\n // store all the rest on native weakmap\n } return method.call(this, a, b);\n });\n });\n}\n","'use strict';\nvar weak = require('./_collection-weak');\nvar validate = require('./_validate-collection');\nvar WEAK_SET = 'WeakSet';\n\n// 23.4 WeakSet Objects\nrequire('./_collection')(WEAK_SET, function (get) {\n return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return weak.def(validate(this, WEAK_SET), value, true);\n }\n}, weak, false, true);\n","'use strict';\n// https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatMap\nvar $export = require('./_export');\nvar flattenIntoArray = require('./_flatten-into-array');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar aFunction = require('./_a-function');\nvar arraySpeciesCreate = require('./_array-species-create');\n\n$export($export.P, 'Array', {\n flatMap: function flatMap(callbackfn /* , thisArg */) {\n var O = toObject(this);\n var sourceLen, A;\n aFunction(callbackfn);\n sourceLen = toLength(O.length);\n A = arraySpeciesCreate(O, 0);\n flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments[1]);\n return A;\n }\n});\n\nrequire('./_add-to-unscopables')('flatMap');\n","'use strict';\n// https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatten\nvar $export = require('./_export');\nvar flattenIntoArray = require('./_flatten-into-array');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar toInteger = require('./_to-integer');\nvar arraySpeciesCreate = require('./_array-species-create');\n\n$export($export.P, 'Array', {\n flatten: function flatten(/* depthArg = 1 */) {\n var depthArg = arguments[0];\n var O = toObject(this);\n var sourceLen = toLength(O.length);\n var A = arraySpeciesCreate(O, 0);\n flattenIntoArray(A, O, O, sourceLen, 0, depthArg === undefined ? 1 : toInteger(depthArg));\n return A;\n }\n});\n\nrequire('./_add-to-unscopables')('flatten');\n","'use strict';\n// https://github.com/tc39/Array.prototype.includes\nvar $export = require('./_export');\nvar $includes = require('./_array-includes')(true);\n\n$export($export.P, 'Array', {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nrequire('./_add-to-unscopables')('includes');\n","// https://github.com/rwaldron/tc39-notes/blob/master/es6/2014-09/sept-25.md#510-globalasap-for-enqueuing-a-microtask\nvar $export = require('./_export');\nvar microtask = require('./_microtask')();\nvar process = require('./_global').process;\nvar isNode = require('./_cof')(process) == 'process';\n\n$export($export.G, {\n asap: function asap(fn) {\n var domain = isNode && process.domain;\n microtask(domain ? domain.bind(fn) : fn);\n }\n});\n","// https://github.com/ljharb/proposal-is-error\nvar $export = require('./_export');\nvar cof = require('./_cof');\n\n$export($export.S, 'Error', {\n isError: function isError(it) {\n return cof(it) === 'Error';\n }\n});\n","// https://github.com/tc39/proposal-global\nvar $export = require('./_export');\n\n$export($export.G, { global: require('./_global') });\n","// https://tc39.github.io/proposal-setmap-offrom/#sec-map.from\nrequire('./_set-collection-from')('Map');\n","// https://tc39.github.io/proposal-setmap-offrom/#sec-map.of\nrequire('./_set-collection-of')('Map');\n","// https://github.com/DavidBruant/Map-Set.prototype.toJSON\nvar $export = require('./_export');\n\n$export($export.P + $export.R, 'Map', { toJSON: require('./_collection-to-json')('Map') });\n","// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n clamp: function clamp(x, lower, upper) {\n return Math.min(upper, Math.max(lower, x));\n }\n});\n","// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { DEG_PER_RAD: Math.PI / 180 });\n","// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = require('./_export');\nvar RAD_PER_DEG = 180 / Math.PI;\n\n$export($export.S, 'Math', {\n degrees: function degrees(radians) {\n return radians * RAD_PER_DEG;\n }\n});\n","// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = require('./_export');\nvar scale = require('./_math-scale');\nvar fround = require('./_math-fround');\n\n$export($export.S, 'Math', {\n fscale: function fscale(x, inLow, inHigh, outLow, outHigh) {\n return fround(scale(x, inLow, inHigh, outLow, outHigh));\n }\n});\n","// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n iaddh: function iaddh(x0, x1, y0, y1) {\n var $x0 = x0 >>> 0;\n var $x1 = x1 >>> 0;\n var $y0 = y0 >>> 0;\n return $x1 + (y1 >>> 0) + (($x0 & $y0 | ($x0 | $y0) & ~($x0 + $y0 >>> 0)) >>> 31) | 0;\n }\n});\n","// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n imulh: function imulh(u, v) {\n var UINT16 = 0xffff;\n var $u = +u;\n var $v = +v;\n var u0 = $u & UINT16;\n var v0 = $v & UINT16;\n var u1 = $u >> 16;\n var v1 = $v >> 16;\n var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);\n return u1 * v1 + (t >> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >> 16);\n }\n});\n","// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n isubh: function isubh(x0, x1, y0, y1) {\n var $x0 = x0 >>> 0;\n var $x1 = x1 >>> 0;\n var $y0 = y0 >>> 0;\n return $x1 - (y1 >>> 0) - ((~$x0 & $y0 | ~($x0 ^ $y0) & $x0 - $y0 >>> 0) >>> 31) | 0;\n }\n});\n","// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { RAD_PER_DEG: 180 / Math.PI });\n","// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = require('./_export');\nvar DEG_PER_RAD = Math.PI / 180;\n\n$export($export.S, 'Math', {\n radians: function radians(degrees) {\n return degrees * DEG_PER_RAD;\n }\n});\n","// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { scale: require('./_math-scale') });\n","// http://jfbastien.github.io/papers/Math.signbit.html\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { signbit: function signbit(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) != x ? x : x == 0 ? 1 / x == Infinity : x > 0;\n} });\n","// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n umulh: function umulh(u, v) {\n var UINT16 = 0xffff;\n var $u = +u;\n var $v = +v;\n var u0 = $u & UINT16;\n var v0 = $v & UINT16;\n var u1 = $u >>> 16;\n var v1 = $v >>> 16;\n var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);\n return u1 * v1 + (t >>> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >>> 16);\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar aFunction = require('./_a-function');\nvar $defineProperty = require('./_object-dp');\n\n// B.2.2.2 Object.prototype.__defineGetter__(P, getter)\nrequire('./_descriptors') && $export($export.P + require('./_object-forced-pam'), 'Object', {\n __defineGetter__: function __defineGetter__(P, getter) {\n $defineProperty.f(toObject(this), P, { get: aFunction(getter), enumerable: true, configurable: true });\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar aFunction = require('./_a-function');\nvar $defineProperty = require('./_object-dp');\n\n// B.2.2.3 Object.prototype.__defineSetter__(P, setter)\nrequire('./_descriptors') && $export($export.P + require('./_object-forced-pam'), 'Object', {\n __defineSetter__: function __defineSetter__(P, setter) {\n $defineProperty.f(toObject(this), P, { set: aFunction(setter), enumerable: true, configurable: true });\n }\n});\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $entries = require('./_object-to-array')(true);\n\n$export($export.S, 'Object', {\n entries: function entries(it) {\n return $entries(it);\n }\n});\n","// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar $export = require('./_export');\nvar ownKeys = require('./_own-keys');\nvar toIObject = require('./_to-iobject');\nvar gOPD = require('./_object-gopd');\nvar createProperty = require('./_create-property');\n\n$export($export.S, 'Object', {\n getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n var O = toIObject(object);\n var getDesc = gOPD.f;\n var keys = ownKeys(O);\n var result = {};\n var i = 0;\n var key, desc;\n while (keys.length > i) {\n desc = getDesc(O, key = keys[i++]);\n if (desc !== undefined) createProperty(result, key, desc);\n }\n return result;\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar toPrimitive = require('./_to-primitive');\nvar getPrototypeOf = require('./_object-gpo');\nvar getOwnPropertyDescriptor = require('./_object-gopd').f;\n\n// B.2.2.4 Object.prototype.__lookupGetter__(P)\nrequire('./_descriptors') && $export($export.P + require('./_object-forced-pam'), 'Object', {\n __lookupGetter__: function __lookupGetter__(P) {\n var O = toObject(this);\n var K = toPrimitive(P, true);\n var D;\n do {\n if (D = getOwnPropertyDescriptor(O, K)) return D.get;\n } while (O = getPrototypeOf(O));\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar toPrimitive = require('./_to-primitive');\nvar getPrototypeOf = require('./_object-gpo');\nvar getOwnPropertyDescriptor = require('./_object-gopd').f;\n\n// B.2.2.5 Object.prototype.__lookupSetter__(P)\nrequire('./_descriptors') && $export($export.P + require('./_object-forced-pam'), 'Object', {\n __lookupSetter__: function __lookupSetter__(P) {\n var O = toObject(this);\n var K = toPrimitive(P, true);\n var D;\n do {\n if (D = getOwnPropertyDescriptor(O, K)) return D.set;\n } while (O = getPrototypeOf(O));\n }\n});\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $values = require('./_object-to-array')(false);\n\n$export($export.S, 'Object', {\n values: function values(it) {\n return $values(it);\n }\n});\n","'use strict';\n// https://github.com/zenparsing/es-observable\nvar $export = require('./_export');\nvar global = require('./_global');\nvar core = require('./_core');\nvar microtask = require('./_microtask')();\nvar OBSERVABLE = require('./_wks')('observable');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar anInstance = require('./_an-instance');\nvar redefineAll = require('./_redefine-all');\nvar hide = require('./_hide');\nvar forOf = require('./_for-of');\nvar RETURN = forOf.RETURN;\n\nvar getMethod = function (fn) {\n return fn == null ? undefined : aFunction(fn);\n};\n\nvar cleanupSubscription = function (subscription) {\n var cleanup = subscription._c;\n if (cleanup) {\n subscription._c = undefined;\n cleanup();\n }\n};\n\nvar subscriptionClosed = function (subscription) {\n return subscription._o === undefined;\n};\n\nvar closeSubscription = function (subscription) {\n if (!subscriptionClosed(subscription)) {\n subscription._o = undefined;\n cleanupSubscription(subscription);\n }\n};\n\nvar Subscription = function (observer, subscriber) {\n anObject(observer);\n this._c = undefined;\n this._o = observer;\n observer = new SubscriptionObserver(this);\n try {\n var cleanup = subscriber(observer);\n var subscription = cleanup;\n if (cleanup != null) {\n if (typeof cleanup.unsubscribe === 'function') cleanup = function () { subscription.unsubscribe(); };\n else aFunction(cleanup);\n this._c = cleanup;\n }\n } catch (e) {\n observer.error(e);\n return;\n } if (subscriptionClosed(this)) cleanupSubscription(this);\n};\n\nSubscription.prototype = redefineAll({}, {\n unsubscribe: function unsubscribe() { closeSubscription(this); }\n});\n\nvar SubscriptionObserver = function (subscription) {\n this._s = subscription;\n};\n\nSubscriptionObserver.prototype = redefineAll({}, {\n next: function next(value) {\n var subscription = this._s;\n if (!subscriptionClosed(subscription)) {\n var observer = subscription._o;\n try {\n var m = getMethod(observer.next);\n if (m) return m.call(observer, value);\n } catch (e) {\n try {\n closeSubscription(subscription);\n } finally {\n throw e;\n }\n }\n }\n },\n error: function error(value) {\n var subscription = this._s;\n if (subscriptionClosed(subscription)) throw value;\n var observer = subscription._o;\n subscription._o = undefined;\n try {\n var m = getMethod(observer.error);\n if (!m) throw value;\n value = m.call(observer, value);\n } catch (e) {\n try {\n cleanupSubscription(subscription);\n } finally {\n throw e;\n }\n } cleanupSubscription(subscription);\n return value;\n },\n complete: function complete(value) {\n var subscription = this._s;\n if (!subscriptionClosed(subscription)) {\n var observer = subscription._o;\n subscription._o = undefined;\n try {\n var m = getMethod(observer.complete);\n value = m ? m.call(observer, value) : undefined;\n } catch (e) {\n try {\n cleanupSubscription(subscription);\n } finally {\n throw e;\n }\n } cleanupSubscription(subscription);\n return value;\n }\n }\n});\n\nvar $Observable = function Observable(subscriber) {\n anInstance(this, $Observable, 'Observable', '_f')._f = aFunction(subscriber);\n};\n\nredefineAll($Observable.prototype, {\n subscribe: function subscribe(observer) {\n return new Subscription(observer, this._f);\n },\n forEach: function forEach(fn) {\n var that = this;\n return new (core.Promise || global.Promise)(function (resolve, reject) {\n aFunction(fn);\n var subscription = that.subscribe({\n next: function (value) {\n try {\n return fn(value);\n } catch (e) {\n reject(e);\n subscription.unsubscribe();\n }\n },\n error: reject,\n complete: resolve\n });\n });\n }\n});\n\nredefineAll($Observable, {\n from: function from(x) {\n var C = typeof this === 'function' ? this : $Observable;\n var method = getMethod(anObject(x)[OBSERVABLE]);\n if (method) {\n var observable = anObject(method.call(x));\n return observable.constructor === C ? observable : new C(function (observer) {\n return observable.subscribe(observer);\n });\n }\n return new C(function (observer) {\n var done = false;\n microtask(function () {\n if (!done) {\n try {\n if (forOf(x, false, function (it) {\n observer.next(it);\n if (done) return RETURN;\n }) === RETURN) return;\n } catch (e) {\n if (done) throw e;\n observer.error(e);\n return;\n } observer.complete();\n }\n });\n return function () { done = true; };\n });\n },\n of: function of() {\n for (var i = 0, l = arguments.length, items = new Array(l); i < l;) items[i] = arguments[i++];\n return new (typeof this === 'function' ? this : $Observable)(function (observer) {\n var done = false;\n microtask(function () {\n if (!done) {\n for (var j = 0; j < items.length; ++j) {\n observer.next(items[j]);\n if (done) return;\n } observer.complete();\n }\n });\n return function () { done = true; };\n });\n }\n});\n\nhide($Observable.prototype, OBSERVABLE, function () { return this; });\n\n$export($export.G, { Observable: $Observable });\n\nrequire('./_set-species')('Observable');\n","// https://github.com/tc39/proposal-promise-finally\n'use strict';\nvar $export = require('./_export');\nvar core = require('./_core');\nvar global = require('./_global');\nvar speciesConstructor = require('./_species-constructor');\nvar promiseResolve = require('./_promise-resolve');\n\n$export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) {\n var C = speciesConstructor(this, core.Promise || global.Promise);\n var isFunction = typeof onFinally == 'function';\n return this.then(\n isFunction ? function (x) {\n return promiseResolve(C, onFinally()).then(function () { return x; });\n } : onFinally,\n isFunction ? function (e) {\n return promiseResolve(C, onFinally()).then(function () { throw e; });\n } : onFinally\n );\n} });\n","'use strict';\n// https://github.com/tc39/proposal-promise-try\nvar $export = require('./_export');\nvar newPromiseCapability = require('./_new-promise-capability');\nvar perform = require('./_perform');\n\n$export($export.S, 'Promise', { 'try': function (callbackfn) {\n var promiseCapability = newPromiseCapability.f(this);\n var result = perform(callbackfn);\n (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v);\n return promiseCapability.promise;\n} });\n","var metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar toMetaKey = metadata.key;\nvar ordinaryDefineOwnMetadata = metadata.set;\n\nmetadata.exp({ defineMetadata: function defineMetadata(metadataKey, metadataValue, target, targetKey) {\n ordinaryDefineOwnMetadata(metadataKey, metadataValue, anObject(target), toMetaKey(targetKey));\n} });\n","var metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar toMetaKey = metadata.key;\nvar getOrCreateMetadataMap = metadata.map;\nvar store = metadata.store;\n\nmetadata.exp({ deleteMetadata: function deleteMetadata(metadataKey, target /* , targetKey */) {\n var targetKey = arguments.length < 3 ? undefined : toMetaKey(arguments[2]);\n var metadataMap = getOrCreateMetadataMap(anObject(target), targetKey, false);\n if (metadataMap === undefined || !metadataMap['delete'](metadataKey)) return false;\n if (metadataMap.size) return true;\n var targetMetadata = store.get(target);\n targetMetadata['delete'](targetKey);\n return !!targetMetadata.size || store['delete'](target);\n} });\n","var Set = require('./es6.set');\nvar from = require('./_array-from-iterable');\nvar metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar getPrototypeOf = require('./_object-gpo');\nvar ordinaryOwnMetadataKeys = metadata.keys;\nvar toMetaKey = metadata.key;\n\nvar ordinaryMetadataKeys = function (O, P) {\n var oKeys = ordinaryOwnMetadataKeys(O, P);\n var parent = getPrototypeOf(O);\n if (parent === null) return oKeys;\n var pKeys = ordinaryMetadataKeys(parent, P);\n return pKeys.length ? oKeys.length ? from(new Set(oKeys.concat(pKeys))) : pKeys : oKeys;\n};\n\nmetadata.exp({ getMetadataKeys: function getMetadataKeys(target /* , targetKey */) {\n return ordinaryMetadataKeys(anObject(target), arguments.length < 2 ? undefined : toMetaKey(arguments[1]));\n} });\n","var metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar getPrototypeOf = require('./_object-gpo');\nvar ordinaryHasOwnMetadata = metadata.has;\nvar ordinaryGetOwnMetadata = metadata.get;\nvar toMetaKey = metadata.key;\n\nvar ordinaryGetMetadata = function (MetadataKey, O, P) {\n var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);\n if (hasOwn) return ordinaryGetOwnMetadata(MetadataKey, O, P);\n var parent = getPrototypeOf(O);\n return parent !== null ? ordinaryGetMetadata(MetadataKey, parent, P) : undefined;\n};\n\nmetadata.exp({ getMetadata: function getMetadata(metadataKey, target /* , targetKey */) {\n return ordinaryGetMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2]));\n} });\n","var metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar ordinaryOwnMetadataKeys = metadata.keys;\nvar toMetaKey = metadata.key;\n\nmetadata.exp({ getOwnMetadataKeys: function getOwnMetadataKeys(target /* , targetKey */) {\n return ordinaryOwnMetadataKeys(anObject(target), arguments.length < 2 ? undefined : toMetaKey(arguments[1]));\n} });\n","var metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar ordinaryGetOwnMetadata = metadata.get;\nvar toMetaKey = metadata.key;\n\nmetadata.exp({ getOwnMetadata: function getOwnMetadata(metadataKey, target /* , targetKey */) {\n return ordinaryGetOwnMetadata(metadataKey, anObject(target)\n , arguments.length < 3 ? undefined : toMetaKey(arguments[2]));\n} });\n","var metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar getPrototypeOf = require('./_object-gpo');\nvar ordinaryHasOwnMetadata = metadata.has;\nvar toMetaKey = metadata.key;\n\nvar ordinaryHasMetadata = function (MetadataKey, O, P) {\n var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);\n if (hasOwn) return true;\n var parent = getPrototypeOf(O);\n return parent !== null ? ordinaryHasMetadata(MetadataKey, parent, P) : false;\n};\n\nmetadata.exp({ hasMetadata: function hasMetadata(metadataKey, target /* , targetKey */) {\n return ordinaryHasMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2]));\n} });\n","var metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar ordinaryHasOwnMetadata = metadata.has;\nvar toMetaKey = metadata.key;\n\nmetadata.exp({ hasOwnMetadata: function hasOwnMetadata(metadataKey, target /* , targetKey */) {\n return ordinaryHasOwnMetadata(metadataKey, anObject(target)\n , arguments.length < 3 ? undefined : toMetaKey(arguments[2]));\n} });\n","var $metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar toMetaKey = $metadata.key;\nvar ordinaryDefineOwnMetadata = $metadata.set;\n\n$metadata.exp({ metadata: function metadata(metadataKey, metadataValue) {\n return function decorator(target, targetKey) {\n ordinaryDefineOwnMetadata(\n metadataKey, metadataValue,\n (targetKey !== undefined ? anObject : aFunction)(target),\n toMetaKey(targetKey)\n );\n };\n} });\n","// https://tc39.github.io/proposal-setmap-offrom/#sec-set.from\nrequire('./_set-collection-from')('Set');\n","// https://tc39.github.io/proposal-setmap-offrom/#sec-set.of\nrequire('./_set-collection-of')('Set');\n","// https://github.com/DavidBruant/Map-Set.prototype.toJSON\nvar $export = require('./_export');\n\n$export($export.P + $export.R, 'Set', { toJSON: require('./_collection-to-json')('Set') });\n","'use strict';\n// https://github.com/mathiasbynens/String.prototype.at\nvar $export = require('./_export');\nvar $at = require('./_string-at')(true);\nvar $fails = require('./_fails');\n\nvar FORCED = $fails(function () {\n return '𠮷'.at(0) !== '𠮷';\n});\n\n$export($export.P + $export.F * FORCED, 'String', {\n at: function at(pos) {\n return $at(this, pos);\n }\n});\n","'use strict';\n// https://tc39.github.io/String.prototype.matchAll/\nvar $export = require('./_export');\nvar defined = require('./_defined');\nvar toLength = require('./_to-length');\nvar isRegExp = require('./_is-regexp');\nvar getFlags = require('./_flags');\nvar RegExpProto = RegExp.prototype;\n\nvar $RegExpStringIterator = function (regexp, string) {\n this._r = regexp;\n this._s = string;\n};\n\nrequire('./_iter-create')($RegExpStringIterator, 'RegExp String', function next() {\n var match = this._r.exec(this._s);\n return { value: match, done: match === null };\n});\n\n$export($export.P, 'String', {\n matchAll: function matchAll(regexp) {\n defined(this);\n if (!isRegExp(regexp)) throw TypeError(regexp + ' is not a regexp!');\n var S = String(this);\n var flags = 'flags' in RegExpProto ? String(regexp.flags) : getFlags.call(regexp);\n var rx = new RegExp(regexp.source, ~flags.indexOf('g') ? flags : 'g' + flags);\n rx.lastIndex = toLength(regexp.lastIndex);\n return new $RegExpStringIterator(rx, S);\n }\n});\n","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\nvar WEBKIT_BUG = /Version\\/10\\.\\d+(\\.\\d+)?( Mobile\\/\\w+)? Safari\\//.test(userAgent);\n\n$export($export.P + $export.F * WEBKIT_BUG, 'String', {\n padEnd: function padEnd(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n }\n});\n","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\nvar WEBKIT_BUG = /Version\\/10\\.\\d+(\\.\\d+)?( Mobile\\/\\w+)? Safari\\//.test(userAgent);\n\n$export($export.P + $export.F * WEBKIT_BUG, 'String', {\n padStart: function padStart(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n }\n});\n","'use strict';\n// https://github.com/sebmarkbage/ecmascript-string-left-right-trim\nrequire('./_string-trim')('trimLeft', function ($trim) {\n return function trimLeft() {\n return $trim(this, 1);\n };\n}, 'trimStart');\n","'use strict';\n// https://github.com/sebmarkbage/ecmascript-string-left-right-trim\nrequire('./_string-trim')('trimRight', function ($trim) {\n return function trimRight() {\n return $trim(this, 2);\n };\n}, 'trimEnd');\n","require('./_wks-define')('asyncIterator');\n","require('./_wks-define')('observable');\n","// https://github.com/tc39/proposal-global\nvar $export = require('./_export');\n\n$export($export.S, 'System', { global: require('./_global') });\n","// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.from\nrequire('./_set-collection-from')('WeakMap');\n","// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.of\nrequire('./_set-collection-of')('WeakMap');\n","// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.from\nrequire('./_set-collection-from')('WeakSet');\n","// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.of\nrequire('./_set-collection-of')('WeakSet');\n","var $iterators = require('./es6.array.iterator');\nvar getKeys = require('./_object-keys');\nvar redefine = require('./_redefine');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar wks = require('./_wks');\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME = collections[i];\n var explicit = DOMIterables[NAME];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = ArrayValues;\n if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n }\n}\n","var $export = require('./_export');\nvar $task = require('./_task');\n$export($export.G + $export.B, {\n setImmediate: $task.set,\n clearImmediate: $task.clear\n});\n","// ie9- setTimeout & setInterval additional parameters fix\nvar global = require('./_global');\nvar $export = require('./_export');\nvar userAgent = require('./_user-agent');\nvar slice = [].slice;\nvar MSIE = /MSIE .\\./.test(userAgent); // <- dirty ie9- check\nvar wrap = function (set) {\n return function (fn, time /* , ...args */) {\n var boundArgs = arguments.length > 2;\n var args = boundArgs ? slice.call(arguments, 2) : false;\n return set(boundArgs ? function () {\n // eslint-disable-next-line no-new-func\n (typeof fn == 'function' ? fn : Function(fn)).apply(this, args);\n } : fn, time);\n };\n};\n$export($export.G + $export.B + $export.F * MSIE, {\n setTimeout: wrap(global.setTimeout),\n setInterval: wrap(global.setInterval)\n});\n","require('./modules/es6.symbol');\nrequire('./modules/es6.object.create');\nrequire('./modules/es6.object.define-property');\nrequire('./modules/es6.object.define-properties');\nrequire('./modules/es6.object.get-own-property-descriptor');\nrequire('./modules/es6.object.get-prototype-of');\nrequire('./modules/es6.object.keys');\nrequire('./modules/es6.object.get-own-property-names');\nrequire('./modules/es6.object.freeze');\nrequire('./modules/es6.object.seal');\nrequire('./modules/es6.object.prevent-extensions');\nrequire('./modules/es6.object.is-frozen');\nrequire('./modules/es6.object.is-sealed');\nrequire('./modules/es6.object.is-extensible');\nrequire('./modules/es6.object.assign');\nrequire('./modules/es6.object.is');\nrequire('./modules/es6.object.set-prototype-of');\nrequire('./modules/es6.object.to-string');\nrequire('./modules/es6.function.bind');\nrequire('./modules/es6.function.name');\nrequire('./modules/es6.function.has-instance');\nrequire('./modules/es6.parse-int');\nrequire('./modules/es6.parse-float');\nrequire('./modules/es6.number.constructor');\nrequire('./modules/es6.number.to-fixed');\nrequire('./modules/es6.number.to-precision');\nrequire('./modules/es6.number.epsilon');\nrequire('./modules/es6.number.is-finite');\nrequire('./modules/es6.number.is-integer');\nrequire('./modules/es6.number.is-nan');\nrequire('./modules/es6.number.is-safe-integer');\nrequire('./modules/es6.number.max-safe-integer');\nrequire('./modules/es6.number.min-safe-integer');\nrequire('./modules/es6.number.parse-float');\nrequire('./modules/es6.number.parse-int');\nrequire('./modules/es6.math.acosh');\nrequire('./modules/es6.math.asinh');\nrequire('./modules/es6.math.atanh');\nrequire('./modules/es6.math.cbrt');\nrequire('./modules/es6.math.clz32');\nrequire('./modules/es6.math.cosh');\nrequire('./modules/es6.math.expm1');\nrequire('./modules/es6.math.fround');\nrequire('./modules/es6.math.hypot');\nrequire('./modules/es6.math.imul');\nrequire('./modules/es6.math.log10');\nrequire('./modules/es6.math.log1p');\nrequire('./modules/es6.math.log2');\nrequire('./modules/es6.math.sign');\nrequire('./modules/es6.math.sinh');\nrequire('./modules/es6.math.tanh');\nrequire('./modules/es6.math.trunc');\nrequire('./modules/es6.string.from-code-point');\nrequire('./modules/es6.string.raw');\nrequire('./modules/es6.string.trim');\nrequire('./modules/es6.string.iterator');\nrequire('./modules/es6.string.code-point-at');\nrequire('./modules/es6.string.ends-with');\nrequire('./modules/es6.string.includes');\nrequire('./modules/es6.string.repeat');\nrequire('./modules/es6.string.starts-with');\nrequire('./modules/es6.string.anchor');\nrequire('./modules/es6.string.big');\nrequire('./modules/es6.string.blink');\nrequire('./modules/es6.string.bold');\nrequire('./modules/es6.string.fixed');\nrequire('./modules/es6.string.fontcolor');\nrequire('./modules/es6.string.fontsize');\nrequire('./modules/es6.string.italics');\nrequire('./modules/es6.string.link');\nrequire('./modules/es6.string.small');\nrequire('./modules/es6.string.strike');\nrequire('./modules/es6.string.sub');\nrequire('./modules/es6.string.sup');\nrequire('./modules/es6.date.now');\nrequire('./modules/es6.date.to-json');\nrequire('./modules/es6.date.to-iso-string');\nrequire('./modules/es6.date.to-string');\nrequire('./modules/es6.date.to-primitive');\nrequire('./modules/es6.array.is-array');\nrequire('./modules/es6.array.from');\nrequire('./modules/es6.array.of');\nrequire('./modules/es6.array.join');\nrequire('./modules/es6.array.slice');\nrequire('./modules/es6.array.sort');\nrequire('./modules/es6.array.for-each');\nrequire('./modules/es6.array.map');\nrequire('./modules/es6.array.filter');\nrequire('./modules/es6.array.some');\nrequire('./modules/es6.array.every');\nrequire('./modules/es6.array.reduce');\nrequire('./modules/es6.array.reduce-right');\nrequire('./modules/es6.array.index-of');\nrequire('./modules/es6.array.last-index-of');\nrequire('./modules/es6.array.copy-within');\nrequire('./modules/es6.array.fill');\nrequire('./modules/es6.array.find');\nrequire('./modules/es6.array.find-index');\nrequire('./modules/es6.array.species');\nrequire('./modules/es6.array.iterator');\nrequire('./modules/es6.regexp.constructor');\nrequire('./modules/es6.regexp.exec');\nrequire('./modules/es6.regexp.to-string');\nrequire('./modules/es6.regexp.flags');\nrequire('./modules/es6.regexp.match');\nrequire('./modules/es6.regexp.replace');\nrequire('./modules/es6.regexp.search');\nrequire('./modules/es6.regexp.split');\nrequire('./modules/es6.promise');\nrequire('./modules/es6.map');\nrequire('./modules/es6.set');\nrequire('./modules/es6.weak-map');\nrequire('./modules/es6.weak-set');\nrequire('./modules/es6.typed.array-buffer');\nrequire('./modules/es6.typed.data-view');\nrequire('./modules/es6.typed.int8-array');\nrequire('./modules/es6.typed.uint8-array');\nrequire('./modules/es6.typed.uint8-clamped-array');\nrequire('./modules/es6.typed.int16-array');\nrequire('./modules/es6.typed.uint16-array');\nrequire('./modules/es6.typed.int32-array');\nrequire('./modules/es6.typed.uint32-array');\nrequire('./modules/es6.typed.float32-array');\nrequire('./modules/es6.typed.float64-array');\nrequire('./modules/es6.reflect.apply');\nrequire('./modules/es6.reflect.construct');\nrequire('./modules/es6.reflect.define-property');\nrequire('./modules/es6.reflect.delete-property');\nrequire('./modules/es6.reflect.enumerate');\nrequire('./modules/es6.reflect.get');\nrequire('./modules/es6.reflect.get-own-property-descriptor');\nrequire('./modules/es6.reflect.get-prototype-of');\nrequire('./modules/es6.reflect.has');\nrequire('./modules/es6.reflect.is-extensible');\nrequire('./modules/es6.reflect.own-keys');\nrequire('./modules/es6.reflect.prevent-extensions');\nrequire('./modules/es6.reflect.set');\nrequire('./modules/es6.reflect.set-prototype-of');\nrequire('./modules/es7.array.includes');\nrequire('./modules/es7.array.flat-map');\nrequire('./modules/es7.array.flatten');\nrequire('./modules/es7.string.at');\nrequire('./modules/es7.string.pad-start');\nrequire('./modules/es7.string.pad-end');\nrequire('./modules/es7.string.trim-left');\nrequire('./modules/es7.string.trim-right');\nrequire('./modules/es7.string.match-all');\nrequire('./modules/es7.symbol.async-iterator');\nrequire('./modules/es7.symbol.observable');\nrequire('./modules/es7.object.get-own-property-descriptors');\nrequire('./modules/es7.object.values');\nrequire('./modules/es7.object.entries');\nrequire('./modules/es7.object.define-getter');\nrequire('./modules/es7.object.define-setter');\nrequire('./modules/es7.object.lookup-getter');\nrequire('./modules/es7.object.lookup-setter');\nrequire('./modules/es7.map.to-json');\nrequire('./modules/es7.set.to-json');\nrequire('./modules/es7.map.of');\nrequire('./modules/es7.set.of');\nrequire('./modules/es7.weak-map.of');\nrequire('./modules/es7.weak-set.of');\nrequire('./modules/es7.map.from');\nrequire('./modules/es7.set.from');\nrequire('./modules/es7.weak-map.from');\nrequire('./modules/es7.weak-set.from');\nrequire('./modules/es7.global');\nrequire('./modules/es7.system.global');\nrequire('./modules/es7.error.is-error');\nrequire('./modules/es7.math.clamp');\nrequire('./modules/es7.math.deg-per-rad');\nrequire('./modules/es7.math.degrees');\nrequire('./modules/es7.math.fscale');\nrequire('./modules/es7.math.iaddh');\nrequire('./modules/es7.math.isubh');\nrequire('./modules/es7.math.imulh');\nrequire('./modules/es7.math.rad-per-deg');\nrequire('./modules/es7.math.radians');\nrequire('./modules/es7.math.scale');\nrequire('./modules/es7.math.umulh');\nrequire('./modules/es7.math.signbit');\nrequire('./modules/es7.promise.finally');\nrequire('./modules/es7.promise.try');\nrequire('./modules/es7.reflect.define-metadata');\nrequire('./modules/es7.reflect.delete-metadata');\nrequire('./modules/es7.reflect.get-metadata');\nrequire('./modules/es7.reflect.get-metadata-keys');\nrequire('./modules/es7.reflect.get-own-metadata');\nrequire('./modules/es7.reflect.get-own-metadata-keys');\nrequire('./modules/es7.reflect.has-metadata');\nrequire('./modules/es7.reflect.has-own-metadata');\nrequire('./modules/es7.reflect.metadata');\nrequire('./modules/es7.asap');\nrequire('./modules/es7.observable');\nrequire('./modules/web.timers');\nrequire('./modules/web.immediate');\nrequire('./modules/web.dom.iterable');\nmodule.exports = require('./modules/_core');\n","/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * https://raw.github.com/facebook/regenerator/master/LICENSE file. An\n * additional grant of patent rights can be found in the PATENTS file in\n * the same directory.\n */\n\n!(function(global) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration. If the Promise is rejected, however, the\n // result for this iteration will be rejected with the same\n // reason. Note that rejections of yielded Promises are not\n // thrown back into the generator function, as is the case\n // when an awaited Promise is rejected. This difference in\n // behavior between yield and await is important, because it\n // allows the consumer to decide what to do with the yielded\n // rejection (swallow it and continue, manually .throw it back\n // into the generator, abandon iteration, whatever). With\n // await, by contrast, there is no opportunity to examine the\n // rejection reason outside the generator function, so the\n // only option is to throw it from the await expression, and\n // let the generator function handle the exception.\n result.value = unwrapped;\n resolve(result);\n }, reject);\n }\n }\n\n if (typeof global.process === \"object\" && global.process.domain) {\n invoke = global.process.domain.bind(invoke);\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // Among the various tricks for obtaining a reference to the global\n // object, this seems to be the most reliable technique that does not\n // use indirect eval (which violates Content Security Policy).\n typeof global === \"object\" ? global :\n typeof window === \"object\" ? window :\n typeof self === \"object\" ? self : this\n);\n","var isConstructor = require('../internals/is-constructor');\nvar tryToString = require('../internals/try-to-string');\n\nvar $TypeError = TypeError;\n\n// `Assert: IsConstructor(argument) is true`\nmodule.exports = function (argument) {\n if (isConstructor(argument)) return argument;\n throw $TypeError(tryToString(argument) + ' is not a constructor');\n};\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\n\n// `AdvanceStringIndex` abstract operation\n// https://tc39.es/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? charAt(S, index).length : 1);\n};\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar isCallable = require('../internals/is-callable');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar $Object = Object;\n\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && isCallable(O.callee) ? 'Arguments' : result;\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n // eslint-disable-next-line es/no-object-getprototypeof -- required for testing\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n","// `CreateIterResultObject` abstract operation\n// https://tc39.es/ecma262/#sec-createiterresultobject\nmodule.exports = function (value, done) {\n return { value: value, done: done };\n};\n","var uncurryThis = require('../internals/function-uncurry-this-clause');\nvar aCallable = require('../internals/a-callable');\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar bind = uncurryThis(uncurryThis.bind);\n\n// optional / simple context binding\nmodule.exports = function (fn, that) {\n aCallable(fn);\n return that === undefined ? fn : NATIVE_BIND ? bind(fn, that) : function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","var classofRaw = require('../internals/classof-raw');\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = function (fn) {\n // Nashorn bug:\n // https://github.com/zloirock/core-js/issues/1128\n // https://github.com/zloirock/core-js/issues/1130\n if (classofRaw(fn) === 'Function') return uncurryThis(fn);\n};\n","var classof = require('../internals/classof');\nvar getMethod = require('../internals/get-method');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar Iterators = require('../internals/iterators');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (!isNullOrUndefined(it)) return getMethod(it, ITERATOR)\n || getMethod(it, '@@iterator')\n || Iterators[classof(it)];\n};\n","var call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar tryToString = require('../internals/try-to-string');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (argument, usingIterator) {\n var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator;\n if (aCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument));\n throw $TypeError(tryToString(argument) + ' is not iterable');\n};\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar classof = require('../internals/classof');\nvar getBuiltIn = require('../internals/get-built-in');\nvar inspectSource = require('../internals/inspect-source');\n\nvar noop = function () { /* empty */ };\nvar empty = [];\nvar construct = getBuiltIn('Reflect', 'construct');\nvar constructorRegExp = /^\\s*(?:class|function)\\b/;\nvar exec = uncurryThis(constructorRegExp.exec);\nvar INCORRECT_TO_STRING = !constructorRegExp.exec(noop);\n\nvar isConstructorModern = function isConstructor(argument) {\n if (!isCallable(argument)) return false;\n try {\n construct(noop, empty, argument);\n return true;\n } catch (error) {\n return false;\n }\n};\n\nvar isConstructorLegacy = function isConstructor(argument) {\n if (!isCallable(argument)) return false;\n switch (classof(argument)) {\n case 'AsyncFunction':\n case 'GeneratorFunction':\n case 'AsyncGeneratorFunction': return false;\n }\n try {\n // we can't check .prototype since constructors produced by .bind haven't it\n // `Function#toString` throws on some built-it function in some legacy engines\n // (for example, `DOMQuad` and similar in FF41-)\n return INCORRECT_TO_STRING || !!exec(constructorRegExp, inspectSource(argument));\n } catch (error) {\n return true;\n }\n};\n\nisConstructorLegacy.sham = true;\n\n// `IsConstructor` abstract operation\n// https://tc39.es/ecma262/#sec-isconstructor\nmodule.exports = !construct || fails(function () {\n var called;\n return isConstructorModern(isConstructorModern.call)\n || !isConstructorModern(Object)\n || !isConstructorModern(function () { called = true; })\n || called;\n}) ? isConstructorLegacy : isConstructorModern;\n","var isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.es/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');\n};\n","var bind = require('../internals/function-bind-context');\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar tryToString = require('../internals/try-to-string');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar iteratorClose = require('../internals/iterator-close');\n\nvar $TypeError = TypeError;\n\nvar Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n};\n\nvar ResultPrototype = Result.prototype;\n\nmodule.exports = function (iterable, unboundFunction, options) {\n var that = options && options.that;\n var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n var IS_RECORD = !!(options && options.IS_RECORD);\n var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n var INTERRUPTED = !!(options && options.INTERRUPTED);\n var fn = bind(unboundFunction, that);\n var iterator, iterFn, index, length, result, next, step;\n\n var stop = function (condition) {\n if (iterator) iteratorClose(iterator, 'normal', condition);\n return new Result(true, condition);\n };\n\n var callFn = function (value) {\n if (AS_ENTRIES) {\n anObject(value);\n return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n } return INTERRUPTED ? fn(value, stop) : fn(value);\n };\n\n if (IS_RECORD) {\n iterator = iterable.iterator;\n } else if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (!iterFn) throw $TypeError(tryToString(iterable) + ' is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) {\n result = callFn(iterable[index]);\n if (result && isPrototypeOf(ResultPrototype, result)) return result;\n } return new Result(false);\n }\n iterator = getIterator(iterable, iterFn);\n }\n\n next = IS_RECORD ? iterable.next : iterator.next;\n while (!(step = call(next, iterator)).done) {\n try {\n result = callFn(step.value);\n } catch (error) {\n iteratorClose(iterator, 'throw', error);\n }\n if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result;\n } return new Result(false);\n};\n","var call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar getMethod = require('../internals/get-method');\n\nmodule.exports = function (iterator, kind, value) {\n var innerResult, innerError;\n anObject(iterator);\n try {\n innerResult = getMethod(iterator, 'return');\n if (!innerResult) {\n if (kind === 'throw') throw value;\n return value;\n }\n innerResult = call(innerResult, iterator);\n } catch (error) {\n innerError = true;\n innerResult = error;\n }\n if (kind === 'throw') throw value;\n if (innerError) throw innerResult;\n anObject(innerResult);\n return value;\n};\n","'use strict';\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar Iterators = require('../internals/iterators');\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next, ENUMERABLE_NEXT) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(+!ENUMERABLE_NEXT, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n Iterators[TO_STRING_TAG] = returnThis;\n return IteratorConstructor;\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\n// `%IteratorPrototype%` object\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\n/* eslint-disable es/no-array-prototype-keys -- safe */\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nvar NEW_ITERATOR_PROTOTYPE = !isObject(IteratorPrototype) || fails(function () {\n var test = {};\n // FF44- legacy iterators case\n return IteratorPrototype[ITERATOR].call(test) !== test;\n});\n\nif (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};\nelse if (IS_PURE) IteratorPrototype = create(IteratorPrototype);\n\n// `%IteratorPrototype%[@@iterator]()` method\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator\nif (!isCallable(IteratorPrototype[ITERATOR])) {\n defineBuiltIn(IteratorPrototype, ITERATOR, function () {\n return this;\n });\n}\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n","module.exports = {};\n","'use strict';\nvar aCallable = require('../internals/a-callable');\n\nvar $TypeError = TypeError;\n\nvar PromiseCapability = function (C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw $TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aCallable(resolve);\n this.reject = aCallable(reject);\n};\n\n// `NewPromiseCapability` abstract operation\n// https://tc39.es/ecma262/#sec-newpromisecapability\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","/* global ActiveXObject -- old IE, WSH */\nvar anObject = require('../internals/an-object');\nvar definePropertiesModule = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n activeXDocument = null; // avoid memory leak\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n activeXDocument = new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = typeof document != 'undefined'\n ? document.domain && activeXDocument\n ? NullProtoObjectViaActiveX(activeXDocument) // old IE\n : NullProtoObjectViaIFrame()\n : NullProtoObjectViaActiveX(activeXDocument); // WSH\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.es/ecma262/#sec-object.create\n// eslint-disable-next-line es/no-object-create -- safe\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : definePropertiesModule.f(result, Properties);\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.es/ecma262/#sec-object.defineproperties\n// eslint-disable-next-line es/no-object-defineproperties -- safe\nexports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var props = toIndexedObject(Properties);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]);\n return O;\n};\n","var hasOwn = require('../internals/has-own-property');\nvar isCallable = require('../internals/is-callable');\nvar toObject = require('../internals/to-object');\nvar sharedKey = require('../internals/shared-key');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar $Object = Object;\nvar ObjectPrototype = $Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.getprototypeof\n// eslint-disable-next-line es/no-object-getprototypeof -- safe\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : function (O) {\n var object = toObject(O);\n if (hasOwn(object, IE_PROTO)) return object[IE_PROTO];\n var constructor = object.constructor;\n if (isCallable(constructor) && object instanceof constructor) {\n return constructor.prototype;\n } return object instanceof $Object ? ObjectPrototype : null;\n};\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\n// eslint-disable-next-line es/no-object-keys -- safe\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","module.exports = function (exec) {\n try {\n return { error: false, value: exec() };\n } catch (error) {\n return { error: true, value: error };\n }\n};\n","var call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar isCallable = require('../internals/is-callable');\nvar classof = require('../internals/classof-raw');\nvar regexpExec = require('../internals/regexp-exec');\n\nvar $TypeError = TypeError;\n\n// `RegExpExec` abstract operation\n// https://tc39.es/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (isCallable(exec)) {\n var result = call(exec, R, S);\n if (result !== null) anObject(result);\n return result;\n }\n if (classof(R) === 'RegExp') return call(regexpExec, R, S);\n throw $TypeError('RegExp#exec called on incompatible receiver');\n};\n","'use strict';\n/* eslint-disable regexp/no-empty-capturing-group, regexp/no-empty-group, regexp/no-lazy-ends -- testing */\n/* eslint-disable regexp/no-useless-quantifier -- testing */\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toString = require('../internals/to-string');\nvar regexpFlags = require('../internals/regexp-flags');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar shared = require('../internals/shared');\nvar create = require('../internals/object-create');\nvar getInternalState = require('../internals/internal-state').get;\nvar UNSUPPORTED_DOT_ALL = require('../internals/regexp-unsupported-dot-all');\nvar UNSUPPORTED_NCG = require('../internals/regexp-unsupported-ncg');\n\nvar nativeReplace = shared('native-string-replace', String.prototype.replace);\nvar nativeExec = RegExp.prototype.exec;\nvar patchedExec = nativeExec;\nvar charAt = uncurryThis(''.charAt);\nvar indexOf = uncurryThis(''.indexOf);\nvar replace = uncurryThis(''.replace);\nvar stringSlice = uncurryThis(''.slice);\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/;\n var re2 = /b*/g;\n call(nativeExec, re1, 'a');\n call(nativeExec, re2, 'a');\n return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\nvar UNSUPPORTED_Y = stickyHelpers.BROKEN_CARET;\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG;\n\nif (PATCH) {\n patchedExec = function exec(string) {\n var re = this;\n var state = getInternalState(re);\n var str = toString(string);\n var raw = state.raw;\n var result, reCopy, lastIndex, match, i, object, group;\n\n if (raw) {\n raw.lastIndex = re.lastIndex;\n result = call(patchedExec, raw, str);\n re.lastIndex = raw.lastIndex;\n return result;\n }\n\n var groups = state.groups;\n var sticky = UNSUPPORTED_Y && re.sticky;\n var flags = call(regexpFlags, re);\n var source = re.source;\n var charsAdded = 0;\n var strCopy = str;\n\n if (sticky) {\n flags = replace(flags, 'y', '');\n if (indexOf(flags, 'g') === -1) {\n flags += 'g';\n }\n\n strCopy = stringSlice(str, re.lastIndex);\n // Support anchored sticky behavior.\n if (re.lastIndex > 0 && (!re.multiline || re.multiline && charAt(str, re.lastIndex - 1) !== '\\n')) {\n source = '(?: ' + source + ')';\n strCopy = ' ' + strCopy;\n charsAdded++;\n }\n // ^(? + rx + ) is needed, in combination with some str slicing, to\n // simulate the 'y' flag.\n reCopy = new RegExp('^(?:' + source + ')', flags);\n }\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n match = call(nativeExec, sticky ? reCopy : re, strCopy);\n\n if (sticky) {\n if (match) {\n match.input = stringSlice(match.input, charsAdded);\n match[0] = stringSlice(match[0], charsAdded);\n match.index = re.lastIndex;\n re.lastIndex += match[0].length;\n } else re.lastIndex = 0;\n } else if (UPDATES_LAST_INDEX_WRONG && match) {\n re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn't work for /(.?)?/\n call(nativeReplace, match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n if (match && groups) {\n match.groups = object = create(null);\n for (i = 0; i < groups.length; i++) {\n group = groups[i];\n object[group[0]] = match[group[1]];\n }\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n","'use strict';\nvar anObject = require('../internals/an-object');\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.hasIndices) result += 'd';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.dotAll) result += 's';\n if (that.unicode) result += 'u';\n if (that.unicodeSets) result += 'v';\n if (that.sticky) result += 'y';\n return result;\n};\n","var call = require('../internals/function-call');\nvar hasOwn = require('../internals/has-own-property');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar regExpFlags = require('../internals/regexp-flags');\n\nvar RegExpPrototype = RegExp.prototype;\n\nmodule.exports = function (R) {\n var flags = R.flags;\n return flags === undefined && !('flags' in RegExpPrototype) && !hasOwn(R, 'flags') && isPrototypeOf(RegExpPrototype, R)\n ? call(regExpFlags, R) : flags;\n};\n","var fails = require('../internals/fails');\nvar global = require('../internals/global');\n\n// babel-minify and Closure Compiler transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\nvar $RegExp = global.RegExp;\n\nvar UNSUPPORTED_Y = fails(function () {\n var re = $RegExp('a', 'y');\n re.lastIndex = 2;\n return re.exec('abcd') != null;\n});\n\n// UC Browser bug\n// https://github.com/zloirock/core-js/issues/1008\nvar MISSED_STICKY = UNSUPPORTED_Y || fails(function () {\n return !$RegExp('a', 'y').sticky;\n});\n\nvar BROKEN_CARET = UNSUPPORTED_Y || fails(function () {\n // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n var re = $RegExp('^r', 'gy');\n re.lastIndex = 2;\n return re.exec('str') != null;\n});\n\nmodule.exports = {\n BROKEN_CARET: BROKEN_CARET,\n MISSED_STICKY: MISSED_STICKY,\n UNSUPPORTED_Y: UNSUPPORTED_Y\n};\n","var fails = require('../internals/fails');\nvar global = require('../internals/global');\n\n// babel-minify and Closure Compiler transpiles RegExp('.', 's') -> /./s and it causes SyntaxError\nvar $RegExp = global.RegExp;\n\nmodule.exports = fails(function () {\n var re = $RegExp('.', 's');\n return !(re.dotAll && re.exec('\\n') && re.flags === 's');\n});\n","var fails = require('../internals/fails');\nvar global = require('../internals/global');\n\n// babel-minify and Closure Compiler transpiles RegExp('(?b)', 'g') -> /(?b)/g and it causes SyntaxError\nvar $RegExp = global.RegExp;\n\nmodule.exports = fails(function () {\n var re = $RegExp('(?b)', 'g');\n return re.exec('b').groups.a !== 'b' ||\n 'b'.replace(re, '$c') !== 'bc';\n});\n","var defineProperty = require('../internals/object-define-property').f;\nvar hasOwn = require('../internals/has-own-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (target, TAG, STATIC) {\n if (target && !STATIC) target = target.prototype;\n if (target && !hasOwn(target, TO_STRING_TAG)) {\n defineProperty(target, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n","var anObject = require('../internals/an-object');\nvar aConstructor = require('../internals/a-constructor');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.es/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || isNullOrUndefined(S = anObject(C)[SPECIES]) ? defaultConstructor : aConstructor(S);\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toString = require('../internals/to-string');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar charAt = uncurryThis(''.charAt);\nvar charCodeAt = uncurryThis(''.charCodeAt);\nvar stringSlice = uncurryThis(''.slice);\n\nvar createMethod = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = toString(requireObjectCoercible($this));\n var position = toIntegerOrInfinity(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = charCodeAt(S, position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = charCodeAt(S, position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING\n ? charAt(S, position)\n : first\n : CONVERT_TO_STRING\n ? stringSlice(S, position, position + 2)\n : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nmodule.exports = {\n // `String.prototype.codePointAt` method\n // https://tc39.es/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod(true)\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","var classof = require('../internals/classof');\n\nvar $String = String;\n\nmodule.exports = function (argument) {\n if (classof(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string');\n return $String(argument);\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar iterate = require('../internals/iterate');\n\n// `Promise.allSettled` method\n// https://tc39.es/ecma262/#sec-promise.allsettled\n$({ target: 'Promise', stat: true }, {\n allSettled: function allSettled(iterable) {\n var C = this;\n var capability = newPromiseCapabilityModule.f(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var promiseResolve = aCallable(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n remaining++;\n call(promiseResolve, C, promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = { status: 'fulfilled', value: value };\n --remaining || resolve(values);\n }, function (error) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = { status: 'rejected', reason: error };\n --remaining || resolve(values);\n });\n });\n --remaining || resolve(values);\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\n/* eslint-disable es/no-string-prototype-matchall -- safe */\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this-clause');\nvar createIteratorConstructor = require('../internals/iterator-create-constructor');\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar toLength = require('../internals/to-length');\nvar toString = require('../internals/to-string');\nvar anObject = require('../internals/an-object');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar classof = require('../internals/classof-raw');\nvar isRegExp = require('../internals/is-regexp');\nvar getRegExpFlags = require('../internals/regexp-get-flags');\nvar getMethod = require('../internals/get-method');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar speciesConstructor = require('../internals/species-constructor');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\nvar InternalStateModule = require('../internals/internal-state');\nvar IS_PURE = require('../internals/is-pure');\n\nvar MATCH_ALL = wellKnownSymbol('matchAll');\nvar REGEXP_STRING = 'RegExp String';\nvar REGEXP_STRING_ITERATOR = REGEXP_STRING + ' Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(REGEXP_STRING_ITERATOR);\nvar RegExpPrototype = RegExp.prototype;\nvar $TypeError = TypeError;\nvar stringIndexOf = uncurryThis(''.indexOf);\nvar nativeMatchAll = uncurryThis(''.matchAll);\n\nvar WORKS_WITH_NON_GLOBAL_REGEX = !!nativeMatchAll && !fails(function () {\n nativeMatchAll('a', /./);\n});\n\nvar $RegExpStringIterator = createIteratorConstructor(function RegExpStringIterator(regexp, string, $global, fullUnicode) {\n setInternalState(this, {\n type: REGEXP_STRING_ITERATOR,\n regexp: regexp,\n string: string,\n global: $global,\n unicode: fullUnicode,\n done: false\n });\n}, REGEXP_STRING, function next() {\n var state = getInternalState(this);\n if (state.done) return createIterResultObject(undefined, true);\n var R = state.regexp;\n var S = state.string;\n var match = regExpExec(R, S);\n if (match === null) {\n state.done = true;\n return createIterResultObject(undefined, true);\n }\n if (state.global) {\n if (toString(match[0]) === '') R.lastIndex = advanceStringIndex(S, toLength(R.lastIndex), state.unicode);\n return createIterResultObject(match, false);\n }\n state.done = true;\n return createIterResultObject(match, false);\n});\n\nvar $matchAll = function (string) {\n var R = anObject(this);\n var S = toString(string);\n var C = speciesConstructor(R, RegExp);\n var flags = toString(getRegExpFlags(R));\n var matcher, $global, fullUnicode;\n matcher = new C(C === RegExp ? R.source : R, flags);\n $global = !!~stringIndexOf(flags, 'g');\n fullUnicode = !!~stringIndexOf(flags, 'u');\n matcher.lastIndex = toLength(R.lastIndex);\n return new $RegExpStringIterator(matcher, S, $global, fullUnicode);\n};\n\n// `String.prototype.matchAll` method\n// https://tc39.es/ecma262/#sec-string.prototype.matchall\n$({ target: 'String', proto: true, forced: WORKS_WITH_NON_GLOBAL_REGEX }, {\n matchAll: function matchAll(regexp) {\n var O = requireObjectCoercible(this);\n var flags, S, matcher, rx;\n if (!isNullOrUndefined(regexp)) {\n if (isRegExp(regexp)) {\n flags = toString(requireObjectCoercible(getRegExpFlags(regexp)));\n if (!~stringIndexOf(flags, 'g')) throw $TypeError('`.matchAll` does not allow non-global regexes');\n }\n if (WORKS_WITH_NON_GLOBAL_REGEX) return nativeMatchAll(O, regexp);\n matcher = getMethod(regexp, MATCH_ALL);\n if (matcher === undefined && IS_PURE && classof(regexp) == 'RegExp') matcher = $matchAll;\n if (matcher) return call(matcher, regexp, O);\n } else if (WORKS_WITH_NON_GLOBAL_REGEX) return nativeMatchAll(O, regexp);\n S = toString(O);\n rx = new RegExp(regexp, 'g');\n return IS_PURE ? call($matchAll, rx, S) : rx[MATCH_ALL](S);\n }\n});\n\nIS_PURE || MATCH_ALL in RegExpPrototype || defineBuiltIn(RegExpPrototype, MATCH_ALL, $matchAll);\n","// TODO: Remove from `core-js@4`\nrequire('../modules/es.promise.all-settled.js');\n","// TODO: Remove from `core-js@4`\nrequire('../modules/es.string.match-all');\n","const courseSettings = {\n language: \"fi\",\n name: \"Ohjelmoinnin perusteet ja jatkokurssi 2023\",\n siteUrl: \"https://ohjelmointi-23.mooc.fi\",\n githubUrl: \"https://github.com/rage/ohjelmointi-23\",\n subtitle: \"Johdatus ohjelmointiin Python-kielellä\",\n slug: \"ohjelmointi-2023\",\n organizationName: \"MOOC\",\n tmcCourse: \"ohjelmointi-2023\",\n quizzesId: \"6540e753-fc9b-42ab-b137-7d0d66608e5e\",\n tmcOrganization: \"mooc\",\n bannerPath: \"banner.svg\",\n showExerciseDescriptionWhenNotLoggedIn: true,\n courseVariants: [\n {\n tmcOrganization: \"haaga-helia\",\n tmcCourse: \"python-2022\",\n },\n {\n tmcOrganization: \"laurea\",\n tmcCourse: \"laurea-python-syksy-2023\"\n },\n {\n tmcOrganization: \"hbc\",\n tmcCourse: \"hbc-kyber23AL\"\n },\n {\n tmcOrganization: \"hbc\",\n tmcCourse: \"hbc-python-KYBER23B\"\n },\n {\n tmcOrganization: \"hbc\",\n tmcCourse: \"hbc-python-PELI23AL\"\n },\n {\n tmcOrganization: \"hbc\",\n tmcCourse: \"hbc-python-PELI23B\"\n },\n {\n tmcOrganization: \"hbc\",\n tmcCourse: \"hbc-python-WEB23A\"\n },\n {\n tmcOrganization: \"hbc\",\n tmcCourse: \"hbc-python-WEB23B\"\n },\n {\n tmcOrganization: \"uwasa\",\n tmcCourse: \"python-2023\"\n },\n {\n tmcOrganization: \"laurea\",\n tmcCourse: \"OhjelmointiPerusSyksy2023PythonKKAH\"\n },\n ],\n}\n\nmodule.exports = courseSettings\n","import React from \"react\"\nimport { Link } from \"gatsby\"\nimport styled from \"styled-components\"\nimport { Button as MaterialButton } from \"@material-ui/core\"\nimport withSimpleErrorBoundary from \"../util/withSimpleErrorBoundary\"\n\nconst StyledLink = styled(Link)`\n margin: 1rem 0.5rem;\n`\n\nconst Button = ({ children, to, onClick, disabled, variant = \"outlined\" }) => (\n \n {children}\n \n)\n\nexport default withSimpleErrorBoundary(Button)\n","import styled from \"styled-components\"\nimport withSimpleErrorBoundary from \"../util/withSimpleErrorBoundary\"\n\nconst Container = styled.div`\n width: 90%;\n max-width: 800px;\n margin: 0 auto;\n`\n\nexport default withSimpleErrorBoundary(Container)\n","import React, { Fragment } from \"react\"\nimport styled from \"styled-components\"\n\nimport { CircularProgress } from \"@material-ui/core\"\nimport withSimpleErrorBoundary from \"../util/withSimpleErrorBoundary\"\n\nconst LoadingWrapper = styled.div`\n padding: 5rem;\n display: flex;\n align-items: center;\n flex-direction: column;\n width: 100%;\n ${(props) =>\n props.heightHint &&\n `\n height: ${props.heightHint};\n `}\n`\n\nconst Loading = ({ children, loading = true, heightHint = \"500px\" }) => {\n if (loading) {\n return (\n \n \n \n )\n }\n\n return {children}\n}\n\nexport default withSimpleErrorBoundary(Loading)\n","import React, { Fragment } from \"react\"\nimport Button from \"./Button\"\nimport { signOut, getCachedUserDetails } from \"../services/moocfi\"\nimport LoginStateContext, {\n withLoginStateContext,\n} from \"../contexes/LoginStateContext\"\nimport { withTranslation } from \"react-i18next\"\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\"\nimport { faUser as profileIcon } from \"@fortawesome/free-solid-svg-icons\"\nimport styled from \"styled-components\"\nimport withSimpleErrorBoundary from \"../util/withSimpleErrorBoundary\"\n\nconst StyledIcon = styled(FontAwesomeIcon)`\n margin-right: 0.5rem;\n`\n\nclass LoginControls extends React.Component {\n static contextType = LoginStateContext\n\n doSignOut = (e) => {\n e.preventDefault()\n signOut()\n }\n\n async componentDidMount() {\n if (!this.context.loggedIn) {\n return\n }\n const details = await getCachedUserDetails()\n let name = `${details?.user_field?.first_name || \"\"} ${\n details?.user_field?.last_name || \"\"\n }`.trim()\n if (name === \"\") {\n name = details.email\n }\n this.setState({\n name,\n })\n }\n\n state = {\n name: \"Loading...\",\n }\n\n render() {\n return this.context.loggedIn ? (\n \n \n \n \n ) : (\n \n \n \n \n )\n }\n}\n\nexport default withTranslation(\"common\")(\n withSimpleErrorBoundary(withLoginStateContext(LoginControls)),\n)\n","import React from \"react\"\nimport { loggedIn, onLoginStateChanged } from \"../services/moocfi\"\n\nconst LoginStateContext = React.createContext()\n\nexport class LoginStateContextProvider extends React.Component {\n constructor(props) {\n super(props)\n this.state = {\n loggedIn: loggedIn(),\n }\n }\n\n componentDidMount() {\n onLoginStateChanged((loggedIn) => {\n this.setState({ loggedIn })\n })\n setTimeout(() => {\n this.setState({\n loggedIn: loggedIn(),\n })\n }, 5000)\n }\n\n render() {\n return (\n \n {this.props.children}\n \n )\n }\n}\n\nexport function withLoginStateContext(Component) {\n return (props) => (\n \n \n \n )\n}\n\nexport default LoginStateContext\n","import React from \"react\"\n\nexport default React.createContext()\n","import TmcClient from \"tmc-client-js\"\nimport fetchPonyfill from \"fetch-ponyfill\"\nimport axios from \"axios\"\nimport * as store from \"store\"\nimport { v4 as uuidv4 } from \"uuid\"\nimport CourseSettings from \"../../course-settings\"\n\nconst { fetch } = fetchPonyfill()\nconst BASE_URL = \"https://tmc.mooc.fi/api/v8\"\n\nconst tmcClient = new TmcClient(\n \"59a09eef080463f90f8c2f29fbf63014167d13580e1de3562e57b9e6e4515182\",\n \"2ddf92a15a31f87c1aabb712b7cfd1b88f3465465ec475811ccce6febb1bad28\",\n)\n\nconst loginStateListeners = []\n\nexport function authenticate(credentials) {\n return new Promise((resolve, reject) => {\n tmcClient.authenticate(credentials).then(\n (res) => {\n loginStateChanged()\n resolve(res)\n },\n (err) => {\n reject(err)\n },\n )\n })\n}\n\nexport function createAccount(data) {\n data.username = uuidv4()\n const body = {\n user: data,\n origin: CourseSettings.name,\n language: \"fi\",\n }\n return new Promise((resolve, reject) => {\n fetch(`${BASE_URL}/users`, {\n body: JSON.stringify(body),\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }).then((res) => {\n res.json().then((json) => {\n if (!json.success) {\n reject(json.errors)\n } else {\n resolve(json)\n }\n })\n })\n })\n}\n\nexport function resetPassword(email) {\n return new Promise((resolve, reject) => {\n fetch(`${BASE_URL}/users/password_reset`, {\n body: JSON.stringify({ email: email, origin: window.location.host }),\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }).then((res) => {\n res.json().then((json) => {\n resolve(json)\n })\n })\n })\n}\n\nexport function loggedIn() {\n return accessToken() ? true : false\n}\n\nexport function signOut() {\n store.remove(\"tmc.courses\")\n store.remove(\"tmc.user\")\n store.remove(\"tmc.user.details\")\n loginStateChanged()\n}\n\nexport function onLoginStateChanged(callback) {\n loginStateListeners.push(callback)\n}\n\nexport async function userDetails() {\n const res = await axios.get(\n `${BASE_URL}/users/current?show_user_fields=true&extra_fields=${CourseSettings.slug}`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${accessToken()}`,\n },\n },\n )\n store.set(\"tmc.user.details\", res.data)\n return res.data\n}\n\nexport async function getCachedUserDetails() {\n let details = store.get(\"tmc.user.details\")\n if (!details) {\n details = await userDetails()\n }\n return details\n}\n\nconst createHeader = () => ({\n Authorization: `Bearer ${accessToken()}`,\n})\n\nconst setPasswordFields = (\n user,\n currentPassword,\n password,\n confirmPassword,\n) => {\n user[\"old_password\"] = currentPassword\n user[\"password\"] = password\n user[\"password_repeat\"] = confirmPassword\n}\n\nexport async function updateUserDetails({ extraFields, userField }) {\n const res = await axios.put(\n `${BASE_URL}/users/current`,\n {\n user: {\n extra_fields: {\n namespace: CourseSettings.slug,\n data: extraFields,\n },\n },\n user_field: userField,\n },\n { headers: { Authorization: `Bearer ${accessToken()}` } },\n )\n store.remove(\"tmc.user.details\")\n await userDetails()\n return res\n}\n\nexport function updatePassword(currentPassword, password, confirmPassword) {\n setPasswordFields(userDetails, currentPassword, password, confirmPassword)\n const id = userDetails[\"id\"]\n\n return axios\n .put(`${BASE_URL}/users/${id}`, userDetails, { headers: createHeader() })\n .then((res) => {\n return res\n })\n .catch((error) => {\n return Promise.reject(error.response)\n })\n}\n\nexport async function courseVariants() {\n let res = await Promise.allSettled(\n (CourseSettings.courseVariants ?? []).map(async (x) => {\n const courseRes = await axios.get(\n `${BASE_URL}/org/${x.tmcOrganization}/courses/${x.tmcCourse}`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${accessToken()}`,\n },\n },\n )\n const orgRes = await axios.get(`${BASE_URL}/org/${x.tmcOrganization}`, {\n headers: { \"Content-Type\": \"application/json\" },\n })\n return {\n key: `${x.tmcOrganization}-${x.tmcCourse}`,\n tmcCourse: x.tmcCourse,\n tmcOrganization: x.tmcOrganization,\n title: courseRes.data.title,\n organizationName: orgRes.data.name,\n quizzesId: x.quizzesId ?? CourseSettings.quizzesId,\n }\n }),\n )\n res = res.filter((x) => x.status === \"fulfilled\").map((x) => x.value)\n store.set(\"tmc.courses\", res)\n return res\n}\n\nexport function getCachedCourseVariants() {\n let variants = store.get(\"tmc.courses\")\n if (!variants) {\n variants = courseVariants()\n }\n return variants\n}\n\nexport async function fetchProgrammingExerciseDetails(exerciseName) {\n const accessTokenValue = accessToken()\n const headers = {\n \"Content-Type\": \"application/json\",\n }\n if (accessTokenValue) {\n headers[\"Authorization\"] = `Bearer ${accessTokenValue}`\n }\n const { tmcOrganization, tmcCourse } = await getCourseVariant()\n const res = await axios.get(\n `${BASE_URL}/org/${tmcOrganization}/courses/${tmcCourse}/exercises/${exerciseName}`,\n {\n headers: headers,\n },\n )\n return res.data\n}\n\nexport async function fetchProgrammingExerciseModelSolution(exerciseId) {\n const res = await axios.get(\n `${BASE_URL}/exercises/${exerciseId}/model_solutions`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${accessToken()}`,\n },\n },\n )\n return res.data\n}\n\nexport async function fetchProgrammingProgress(exerciseName) {\n const { tmcOrganization, tmcCourse } = await getCourseVariant()\n const res = await axios.get(\n `${BASE_URL}/org/${tmcOrganization}/courses/${tmcCourse}/users/current/progress`,\n {\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${accessToken()}`,\n },\n },\n )\n return res.data?.points_by_group\n}\n\nexport function canDoResearch() {\n try {\n return store.get(\"tmc.user.details\")?.extra_fields?.research === \"1\"\n } catch (error) {\n return false\n }\n}\n\nfunction loginStateChanged() {\n loginStateListeners.forEach((listener) => {\n listener(loggedIn())\n })\n}\n\nexport function accessToken() {\n try {\n return store.get(\"tmc.user\").accessToken || null\n } catch (error) {\n return null\n }\n}\n\nexport async function getCourseVariant() {\n const defaultVariant = {\n key: `${CourseSettings.tmcOrganization}-${CourseSettings.tmcCourse}`,\n tmcOrganization: CourseSettings.tmcOrganization,\n tmcCourse: CourseSettings.tmcCourse,\n title: CourseSettings.name,\n organizationName: CourseSettings.organizationName,\n quizzesId: CourseSettings.quizzesId,\n }\n\n const userDetails = loggedIn() && (await getCachedUserDetails())\n if (userDetails?.extra_fields?.use_course_variant !== \"t\") {\n return defaultVariant\n }\n\n const variant = (await getCachedCourseVariants()).find(\n (x) => x.key === userDetails?.extra_fields?.course_variant,\n )\n\n return variant || defaultVariant\n}\n","import axios from \"axios\"\nimport { accessToken, getCourseVariant } from \"./moocfi\"\n\nexport async function fetchQuizzesProgress() {\n const { quizzesId } = await getCourseVariant()\n const response = await axios.get(\n `https://quizzes.mooc.fi/api/v2/general/course/${quizzesId}/progress`,\n { headers: { Authorization: `Bearer ${accessToken()}` } },\n )\n return response.data\n}\n\nexport async function fetchQuizNames() {\n const { quizzesId } = await getCourseVariant()\n const response = await axios.get(\n `https://quizzes.mooc.fi/api/v2/general/course/${quizzesId}/quiz-titles`,\n )\n return response.data\n}\n","import i18n from \"i18next\"\nimport { initReactI18next } from \"react-i18next\"\nimport CourseSettings from \"../course-settings\"\nimport commonEN from \"./locales/common/en\"\nimport pointsBalloonEN from \"./locales/pointsBalloon/en\"\nimport userEN from \"./locales/user/en\"\nimport commonFI from \"./locales/common/fi\"\nimport pointsBalloonFI from \"./locales/pointsBalloon/fi\"\nimport userFI from \"./locales/user/fi\"\n\nconst resources = {\n en: {\n common: commonEN,\n \"points-balloon\": pointsBalloonEN,\n user: userEN,\n },\n fi: {\n common: commonFI,\n \"points-balloon\": pointsBalloonFI,\n user: userFI,\n },\n}\n\ni18n.use(initReactI18next).init({\n resources,\n ns: [\"common\", \"user\", \"points-balloon\"],\n defaultNS: \"common\",\n react: {\n wait: true,\n },\n lng: CourseSettings.language,\n})\n\nexport default i18n\n","import React from \"react\"\nimport logo from \"../images/logo.png\"\nimport styled from \"styled-components\"\nimport \"typeface-open-sans-condensed\"\nimport withSimpleErrorBoundary from \"../util/withSimpleErrorBoundary\"\n\nconst LogoImg = styled.img`\n width: 3.4em;\n height: 3.4em;\n margin-right: 0.5em;\n margin-bottom: 0;\n`\n\nconst LogoTypography = styled.div`\n flex: 1;\n font-family: \"Open Sans Condensed\", sans-serif !important;\n font-size: 1.75em !important;\n`\n\nconst StyledLink = styled.a`\n text-decoration: none;\n color: black;\n display: flex;\n align-items: center;\n padding: 1em;\n padding-right: 1.7em;\n height: 64px;\n background-color: white;\n\n :hover {\n text-decoration: none;\n color: black;\n }\n`\n\nconst Logo = () => (\n \n \n \n MOOC.fi\n \n \n)\n\nexport default withSimpleErrorBoundary(Logo)\n","export default \"data:image/png;base64,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\"","// Used for animations\nimport { createGlobalStyle } from \"styled-components\"\n\ncreateGlobalStyle`\n .render-element-off-screen-for-measurement {\n position: absolute !important;\n top: -100000px !important;\n height: auto !important;\n }\n`\n\nconst saveHeight = (element, height) => {\n element.style.setProperty(\"--calculated-height\", height)\n}\n\nconst calculateElementHeightOffScreen = (element) => {\n return new Promise((resolve) => {\n element.classList.add(\"render-element-off-screen-for-measurement\")\n setTimeout(() => {\n const height = element.getBoundingClientRect().height\n element.classList.remove(\"render-element-off-screen-for-measurement\")\n resolve(height)\n }, 100)\n })\n}\n\nconst calculateElementHeight = async (element) => {\n let { height } = element.getBoundingClientRect()\n if (height === 0) {\n height = await calculateElementHeightOffScreen(element)\n }\n saveHeight(element, height)\n}\n\nexport const trackElementHeight = (element) => {\n if (element === null) {\n return\n }\n element.classList.add(\"track-element-height-changes-for-animations\")\n calculateElementHeight(element)\n}\n\nconst trackHeight = () => {\n window.addEventListener(\"resize\", () => {\n document\n .querySelectorAll(\".track-element-height-changes-for-animations\")\n .forEach((e) => {\n calculateElementHeight(e)\n })\n })\n}\n\nexport default trackHeight\n","import * as React from 'react';\nimport createSvgIcon from '../../utils/createSvgIcon';\n/**\n * @ignore - internal component.\n */\n\nexport default createSvgIcon( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\"\n}), 'Person');","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport * as React from 'react';\nimport clsx from 'clsx';\nimport { chainPropTypes } from '@material-ui/utils';\nimport withStyles from '../styles/withStyles';\nimport Person from '../internal/svg-icons/Person';\nexport var styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n width: 40,\n height: 40,\n fontFamily: theme.typography.fontFamily,\n fontSize: theme.typography.pxToRem(20),\n lineHeight: 1,\n borderRadius: '50%',\n overflow: 'hidden',\n userSelect: 'none'\n },\n /* Styles applied to the root element if not `src` or `srcSet`. */\n colorDefault: {\n color: theme.palette.background.default,\n backgroundColor: theme.palette.type === 'light' ? theme.palette.grey[400] : theme.palette.grey[600]\n },\n /* Styles applied to the root element if `variant=\"circle\"`. */\n circle: {},\n /* Styles applied to the root element if `variant=\"circular\"`. */\n circular: {},\n /* Styles applied to the root element if `variant=\"rounded\"`. */\n rounded: {\n borderRadius: theme.shape.borderRadius\n },\n /* Styles applied to the root element if `variant=\"square\"`. */\n square: {\n borderRadius: 0\n },\n /* Styles applied to the img element if either `src` or `srcSet` is defined. */\n img: {\n width: '100%',\n height: '100%',\n textAlign: 'center',\n // Handle non-square image. The property isn't supported by IE 11.\n objectFit: 'cover',\n // Hide alt text.\n color: 'transparent',\n // Hide the image broken icon, only works on Chrome.\n textIndent: 10000\n },\n /* Styles applied to the fallback icon */\n fallback: {\n width: '75%',\n height: '75%'\n }\n };\n};\nfunction useLoaded(_ref) {\n var src = _ref.src,\n srcSet = _ref.srcSet;\n var _React$useState = React.useState(false),\n loaded = _React$useState[0],\n setLoaded = _React$useState[1];\n React.useEffect(function () {\n if (!src && !srcSet) {\n return undefined;\n }\n setLoaded(false);\n var active = true;\n var image = new Image();\n image.src = src;\n image.srcSet = srcSet;\n image.onload = function () {\n if (!active) {\n return;\n }\n setLoaded('loaded');\n };\n image.onerror = function () {\n if (!active) {\n return;\n }\n setLoaded('error');\n };\n return function () {\n active = false;\n };\n }, [src, srcSet]);\n return loaded;\n}\nvar Avatar = /*#__PURE__*/React.forwardRef(function Avatar(props, ref) {\n var alt = props.alt,\n childrenProp = props.children,\n classes = props.classes,\n className = props.className,\n _props$component = props.component,\n Component = _props$component === void 0 ? 'div' : _props$component,\n imgProps = props.imgProps,\n sizes = props.sizes,\n src = props.src,\n srcSet = props.srcSet,\n _props$variant = props.variant,\n variant = _props$variant === void 0 ? 'circular' : _props$variant,\n other = _objectWithoutProperties(props, [\"alt\", \"children\", \"classes\", \"className\", \"component\", \"imgProps\", \"sizes\", \"src\", \"srcSet\", \"variant\"]);\n var children = null; // Use a hook instead of onError on the img element to support server-side rendering.\n\n var loaded = useLoaded({\n src: src,\n srcSet: srcSet\n });\n var hasImg = src || srcSet;\n var hasImgNotFailing = hasImg && loaded !== 'error';\n if (hasImgNotFailing) {\n children = /*#__PURE__*/React.createElement(\"img\", _extends({\n alt: alt,\n src: src,\n srcSet: srcSet,\n sizes: sizes,\n className: classes.img\n }, imgProps));\n } else if (childrenProp != null) {\n children = childrenProp;\n } else if (hasImg && alt) {\n children = alt[0];\n } else {\n children = /*#__PURE__*/React.createElement(Person, {\n className: classes.fallback\n });\n }\n return /*#__PURE__*/React.createElement(Component, _extends({\n className: clsx(classes.root, classes.system, classes[variant], className, !hasImgNotFailing && classes.colorDefault),\n ref: ref\n }, other), children);\n});\nprocess.env.NODE_ENV !== \"production\" ? void 0 : void 0;\nexport default withStyles(styles, {\n name: 'MuiAvatar'\n})(Avatar);","import React from \"react\"\nimport styled from \"styled-components\"\n\nimport { Motion, spring } from \"react-motion\"\n\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\"\nimport { faCaretRight } from \"@fortawesome/free-solid-svg-icons\"\nimport { trackElementHeight } from \"../../util/trackHeight\"\nimport GatsbyLink from \"gatsby-link\"\nimport { Location } from \"@reach/router\"\nimport Avatar from \"@material-ui/core/Avatar\"\nimport Chip from \"@material-ui/core/Chip\"\nimport Divider from \"@material-ui/core/Divider\"\n\nimport { faUnlockAlt as icon } from \"@fortawesome/free-solid-svg-icons\"\nimport withSimpleErrorBoundary from \"../../util/withSimpleErrorBoundary\"\n\nconst ChildrenList = styled.ul`\n height: calc(var(--open-ratio) * var(--calculated-height) * 1px);\n overflow: hidden;\n margin-left: 0;\n`\n\nconst ListItem = styled.li`\n list-style-type: none;\n margin-bottom: 0;\n padding: 0.75em;\n display: flex;\n align-items: center;\n`\n\nconst ListItemLabel = styled.div`\n flex: 1;\n padding: 0.3em;\n`\n\nconst NavigationLink = styled(GatsbyLink)`\n border-left: 0.5em solid white;\n width: 100%;\n background-color: white;\n ${(props) =>\n props.active === \"t\" &&\n `\n border-color: #f75b4b !important;\n background-color: #edeaea;\n `}\n :hover {\n text-decoration: none;\n color: black;\n background-color: #f5ebeb;\n border-color: #f5ebeb;\n //filter: brightness(0.5);\n }\n`\n\nconst DisabledItem = styled.div`\n opacity: 0.5;\n width: 100%;\n cursor: default !important;\n border-left: 0.5em solid white;\n`\n\nconst DisabledItemWithLink = styled(GatsbyLink)`\n opacity: 0.5;\n width: 100%;\n border-left: 0.5em solid white;\n background-color: white;\n ${(props) =>\n props.active === \"t\" &&\n `\n border-color: #f75b4b !important;\n background-color: #edeaea;\n `}\n :hover {\n text-decoration: none;\n color: black;\n background-color: #f5ebeb;\n border-color: #f5ebeb;\n //filter: brightness(0.5);\n }\n`\n\nconst ItemTitleWrapper = styled.div`\n display: flex;\n align-items: center;\n\n a {\n color: black;\n text-decoration: none;\n }\n\n &.active-section {\n background-color: #ffdfdf;\n border-top-left-radius: 5px;\n border-bottom-left-radius: 5px;\n a {\n color: black;\n }\n }\n`\n\nconst StyledIcon = styled(FontAwesomeIcon)`\n vertical-align: middle;\n margin-right: 0.5em;\n margin-left: 0.5em;\n transform: rotate(calc(var(--open-ratio) * 90deg));\n`\n\nconst StyledChip = styled(Chip)`\n span {\n width: 6.5em;\n }\n`\n\nconst StyledDivider = styled(Divider)`\n margin: 1em 16px !important;\n`\n\nconst Centered = styled.div`\n text-align: center;\n margin-bottom: 0.5rem;\n`\n\nclass TreeViewItem extends React.Component {\n constructor(props) {\n super(props)\n this.state = {\n childrenVisible: props.item.childrenVisibleByDefault || false,\n }\n this.childrenListRef = React.createRef()\n }\n\n onClick = () => {\n this.setState((prev) => ({\n childrenVisible: !prev.childrenVisible,\n }))\n }\n\n componentDidMount() {\n if (this.props.item.children) {\n trackElementHeight(this.childrenListRef.current)\n }\n }\n render() {\n if (this.props.item.separator) {\n return (\n \n \n {this.props.item.title}\n \n )\n }\n return (\n \n \n {({ navigate, location }) => {\n let active =\n location.pathname === this.props.item.path ||\n location.pathname.includes(this.props.item.path + \"/\")\n if (this.props.item.path === \"/\") {\n active = location.pathname === this.props.item.path\n }\n return (\n \n {({ openRatio }) => (\n \n \n {this.props.item.children && (\n \n )}\n \n \n {this.props.item.title}\n {this.props.item.tba && (\n \n \n \n }\n label={this.props.item.tba}\n />\n )}\n \n \n \n {this.props.item.children && (\n \n {this.props.item.children.map((i) => (\n \n ))}\n \n )}\n \n )}\n \n )\n }}\n \n \n )\n }\n}\n\nfunction LinkWrapper(props) {\n if (props.disabled) {\n if (process.env.NODE_ENV === \"production\") {\n return \n }\n return \n }\n return \n}\n\nexport default withSimpleErrorBoundary(TreeViewItem)\n","import React from \"react\"\nimport TreeViewItem from \"./TreeViewItem\"\nimport styled from \"styled-components\"\nimport withSimpleErrorBoundary from \"../../util/withSimpleErrorBoundary\"\n\nconst StyledUl = styled.ul`\n margin-left: 0;\n margin-top: 0.5em;\n padding-left: 0;\n`\n\nclass TreeView extends React.Component {\n render() {\n return (\n \n {this.props.data.map((top) => (\n \n ))}\n \n )\n }\n}\n\nexport default withSimpleErrorBoundary(TreeView)\n","export const SMALL_MEDIUM_BREAKPOINT = \"900px\"\nexport const MEDIUM_LARGE_BREAKPOINT = \"1200px\"\nexport const MEDIUM_SIDEBAR_WIDTH = \"245px\"\nexport const LARGE_SIDEBAR_WIDTH = \"324px\"\n","import React from \"react\"\nimport styled from \"styled-components\"\nimport { graphql, StaticQuery } from \"gatsby\"\nimport { Button } from \"@material-ui/core\"\nimport CourseSettings from \"../../course-settings\"\n\nimport Logo from \"./Logo\"\nimport TreeView from \"./TreeView\"\nimport withSimpleErrorBoundary from \"../util/withSimpleErrorBoundary\"\n\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\"\n\nimport { faBars, faTimes } from \"@fortawesome/free-solid-svg-icons\"\nimport {\n MEDIUM_LARGE_BREAKPOINT,\n SMALL_MEDIUM_BREAKPOINT,\n MEDIUM_SIDEBAR_WIDTH,\n LARGE_SIDEBAR_WIDTH,\n} from \"../util/constants\"\n\nconst StyledIcon = styled(FontAwesomeIcon)`\n vertical-align: middle;\n margin-right: 0.5em;\n margin-left: 0.1em;\n color: var(--color);\n font-size: 1.5em;\n`\n\nconst SidebarContainer = styled.div`\n display: flex;\n flex-direction: column;\n background-color: white;\n\n ${(props) =>\n !props.mobileMenuOpen &&\n `\n display: none;\n `}\n\n @media only screen and (min-width: ${SMALL_MEDIUM_BREAKPOINT}) {\n height: 100%;\n width: ${LARGE_SIDEBAR_WIDTH};\n position: fixed;\n top: 0;\n left: 0;\n background-color: white;\n z-index: 100;\n box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.2),\n 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 2px 1px -1px rgba(0, 0, 0, 0.12);\n overflow-y: scroll;\n display: flex;\n }\n @media only screen and (max-width: ${MEDIUM_LARGE_BREAKPOINT}) {\n width: ${MEDIUM_SIDEBAR_WIDTH};\n font-size: 0.85rem;\n }\n @media only screen and (max-width: ${SMALL_MEDIUM_BREAKPOINT}) {\n width: 90%;\n max-width: 500px;\n margin: 0 auto;\n }\n`\nconst LogoContainer = styled.div`\n display: flex;\n background-color: white;\n justify-content: space-around;\n align-content: center;\n align-items: center;\n`\n\nconst TreeViewContainer = styled.nav`\n flex: 1;\n margin-bottom: 1em;\n`\n\nconst Brand = styled.div`\n width: 100%;\n text-align: center;\n padding: 1em;\n padding-top: 2em;\n font-weight: bold;\n color: #c0392b;\n font-size: 1.15em;\n`\n\nconst MenuExpanderWrapper = styled.div`\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-top: 1em;\n @media only screen and (min-width: ${SMALL_MEDIUM_BREAKPOINT}) {\n display: none;\n }\n`\n\nconst MobileWrapper = styled.div`\n @media only screen and (max-width: ${SMALL_MEDIUM_BREAKPOINT}) {\n width: 100%;\n height: 100%;\n position: fixed;\n top: 0;\n left: 0;\n z-index: 999999999;\n overflow-y: scroll;\n background-color: white;\n }\n`\n\nconst MobileWrapperOrFragment = (props) => {\n if (props.mobileMenuOpen) {\n return \n }\n return
{props.children}
\n}\n\nconst Sidebar = (props) => {\n let edges =\n props.data?.allMarkdownRemark?.edges.map((o) => o.node?.frontmatter) || []\n if (process.env.NODE_ENV === \"production\") {\n edges = edges.filter((o) => !o.hidden)\n }\n\n edges = edges\n .filter((o) => !o.hide_in_sidebar)\n .sort((a, b) =>\n a.title.localeCompare(b.title, undefined, {\n numeric: true,\n sensitivity: \"base\",\n }),\n )\n\n let coursePartEdges = edges.filter(\n (o) => !o.information_page && !o.course_info_page && !o.upcoming,\n )\n\n let informationPageEdges = edges\n .filter((o) => o.information_page || o.course_info_page)\n .sort((a, b) => b.sidebar_priority - a.sidebar_priority)\n\n let upcomingPageEdges = edges\n .filter((o) => o.upcoming)\n .map((o) => ({\n title: o.title,\n tba: o.upcoming,\n path: o.path,\n separator_after: o.separator_after,\n }))\n\n let content = informationPageEdges\n .concat(coursePartEdges)\n .concat(upcomingPageEdges)\n\n let separatorEdges = []\n content.forEach((edge) => {\n if (edge.separator_after) {\n separatorEdges.push(edge)\n }\n })\n\n separatorEdges.forEach((edge) => {\n let middlepoint = content.findIndex((o) => o.title === edge.title)\n content.splice(middlepoint + 1, 0, {\n separator: true,\n title: edge.separator_after,\n })\n })\n\n return (\n \n \n \n {props.mobileMenuOpen ? (\n \n \n Sulje valikko\n \n ) : (\n \n \n Avaa valikko\n \n )}\n \n \n \n {CourseSettings.name}\n \n \n \n \n \n \n \n \n )\n}\n\nconst query = graphql`\n query {\n allMarkdownRemark(\n filter: { fileAbsolutePath: { regex: \"/index.md|data/[^/]+/*.md/\" } }\n sort: { fields: [frontmatter___path] }\n ) {\n edges {\n node {\n id\n frontmatter {\n title\n information_page\n course_info_page\n path\n hidden\n separator_after\n upcoming\n hide_in_sidebar\n sidebar_priority\n }\n }\n }\n }\n }\n`\n\nconst SidebarWithData = (props) => (\n }\n />\n)\n\nexport default withSimpleErrorBoundary(SidebarWithData)\n","import React from \"react\"\nimport styled from \"styled-components\"\nimport withSimpleErrorBoundary from \"../util/withSimpleErrorBoundary\"\n\nconst ContentAreaContainer = styled.main`\n padding: 0 0.5rem;\n background-color: #fcfcfc;\n margin-bottom: 5rem;\n min-height: 80vh;\n font-size: 1rem;\n ${(props) =>\n props.mobileMenuOpen &&\n `\n display: none;\n `}\n`\n\nclass ContentArea extends React.Component {\n render() {\n return (\n \n {this.props.children}\n \n )\n }\n}\n\nexport default withSimpleErrorBoundary(ContentArea)\n","import React from \"react\"\nimport styled from \"styled-components\"\nimport LoginControls from \"./LoginControls\"\nimport withSimpleErrorBoundary from \"../util/withSimpleErrorBoundary\"\nimport LoginStateContext, {\n withLoginStateContext,\n} from \"../contexes/LoginStateContext\"\nimport Button from \"./Button\"\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\"\nimport { faChartLine as pointsIcon } from \"@fortawesome/free-solid-svg-icons\"\nimport CourseSettings from \"../../course-settings\"\n\nconst TopBarContainer = styled.div`\n height: 4rem;\n width: 100%;\n display: flex;\n justify-content: flex-end;\n @media only screen and (max-width: 1200px) {\n justify-content: center;\n }\n`\n\nconst StyledIcon = styled(FontAwesomeIcon)`\n margin-right: 0.5rem;\n`\n\nclass TopBar extends React.Component {\n static contextType = LoginStateContext\n\n render() {\n return (\n \n {CourseSettings.useNewPointsVisualization && this.context.loggedIn && (\n \n )}\n \n \n )\n }\n}\n\nexport default withSimpleErrorBoundary(withLoginStateContext(TopBar))\n","export default __webpack_public_path__ + \"static/banner-84ef18e01729a6202c2c9b3c8ef46a38.svg\";","export default __webpack_public_path__ + \"static/moocfi-logo-bw-40fb2db8a1b68fff676338919b31ae7c.png\";","import React, { useContext } from \"react\"\nimport styled from \"styled-components\"\nimport BackgroundImage from \"../images/banner.svg\"\nimport { Card, CardContent } from \"@material-ui/core\"\nimport { Link } from \"gatsby\"\nimport { withTranslation } from \"react-i18next\"\nimport withSimpleErrorBoundary from \"../util/withSimpleErrorBoundary\"\nimport CourseSettings from \"../../course-settings\"\n\nimport UHLogo from \"../images/uh-logo.png\"\nimport MoocfiLogo from \"../images/moocfi-logo-bw.png\"\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\"\nimport {\n faTwitter,\n faFacebook,\n faYoutube,\n faGithub,\n} from \"@fortawesome/free-brands-svg-icons\"\nimport Button from \"./Button\"\nimport PagesContext from \"../contexes/PagesContext\"\n\nconst StyledIcon = styled(FontAwesomeIcon)`\n color: black;\n margin-bottom: 1rem;\n margin: 1rem;\n`\n\nconst SocialContainer = styled.div``\n\nconst ContentContainer = styled.div`\n padding: 1rem 0;\n`\n\nconst GithubContainer = styled.div`\n padding-top: 1rem;\n a {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n`\n\nconst ButtonContainer = styled.div`\n padding: 1rem 0;\n`\n\nconst FooterWrapper = styled.footer`\n height: 35rem;\n position: relative;\n a {\n color: #006fe6;\n }\n`\n\nconst FooterBackground = styled.div`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n width: 100%;\n height: 100%;\n background-image: url(${BackgroundImage});\n filter: invert(1) grayscale(1) brightness(1.5) opacity(0.5);\n z-index: -50000;\n`\n\nconst FooterContent = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n`\n\nconst StyledCard = styled(Card)`\n width: 90%;\n max-width: 800px;\n`\n\nconst StyledCardContent = styled(CardContent)`\n flex-direction: column;\n display: flex;\n align-items: center;\n justify-content: center;\n`\n\nconst BrandsContainer = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n img {\n height: 6rem;\n width: auto;\n margin: 1rem;\n }\n`\n\nconst Footer = ({ t }) => {\n const pagesContextValue = useContext(PagesContext)\n const filePath = pagesContextValue?.current?.filePath\n\n return (\n \n \n \n \n \n \n \n \n
{t(\"footer-src\")}
\n
\n \n \n \n {filePath && (\n \n )}\n \n \n {t(\"makers\")}{\" \"}\n \n {t(\"rage\")}\n \n .\n \n\n \n {t(\"credits\")}.\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \"Helsingin\n \n \n \"MOOC.fi\"\n \n \n \n \n \n \n )\n}\n\nexport default withTranslation(\"common\")(withSimpleErrorBoundary(Footer))\n","export default \"data:image/png;base64,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\"","import _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nimport * as React from 'react';\nimport clsx from 'clsx';\nimport { chainPropTypes } from '@material-ui/utils';\nimport withStyles from '../styles/withStyles';\nimport ButtonBase from '../ButtonBase';\nimport capitalize from '../utils/capitalize';\nexport var styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: _extends({}, theme.typography.button, {\n boxSizing: 'border-box',\n minHeight: 36,\n transition: theme.transitions.create(['background-color', 'box-shadow', 'border'], {\n duration: theme.transitions.duration.short\n }),\n borderRadius: '50%',\n padding: 0,\n minWidth: 0,\n width: 56,\n height: 56,\n boxShadow: theme.shadows[6],\n '&:active': {\n boxShadow: theme.shadows[12]\n },\n color: theme.palette.getContrastText(theme.palette.grey[300]),\n backgroundColor: theme.palette.grey[300],\n '&:hover': {\n backgroundColor: theme.palette.grey.A100,\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: theme.palette.grey[300]\n },\n '&$disabled': {\n backgroundColor: theme.palette.action.disabledBackground\n },\n textDecoration: 'none'\n },\n '&$focusVisible': {\n boxShadow: theme.shadows[6]\n },\n '&$disabled': {\n color: theme.palette.action.disabled,\n boxShadow: theme.shadows[0],\n backgroundColor: theme.palette.action.disabledBackground\n }\n }),\n /* Styles applied to the span element that wraps the children. */\n label: {\n width: '100%',\n // assure the correct width for iOS Safari\n display: 'inherit',\n alignItems: 'inherit',\n justifyContent: 'inherit'\n },\n /* Styles applied to the root element if `color=\"primary\"`. */\n primary: {\n color: theme.palette.primary.contrastText,\n backgroundColor: theme.palette.primary.main,\n '&:hover': {\n backgroundColor: theme.palette.primary.dark,\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: theme.palette.primary.main\n }\n }\n },\n /* Styles applied to the root element if `color=\"secondary\"`. */\n secondary: {\n color: theme.palette.secondary.contrastText,\n backgroundColor: theme.palette.secondary.main,\n '&:hover': {\n backgroundColor: theme.palette.secondary.dark,\n // Reset on touch devices, it doesn't add specificity\n '@media (hover: none)': {\n backgroundColor: theme.palette.secondary.main\n }\n }\n },\n /* Styles applied to the root element if `variant=\"extended\"`. */\n extended: {\n borderRadius: 48 / 2,\n padding: '0 16px',\n width: 'auto',\n minHeight: 'auto',\n minWidth: 48,\n height: 48,\n '&$sizeSmall': {\n width: 'auto',\n padding: '0 8px',\n borderRadius: 34 / 2,\n minWidth: 34,\n height: 34\n },\n '&$sizeMedium': {\n width: 'auto',\n padding: '0 16px',\n borderRadius: 40 / 2,\n minWidth: 40,\n height: 40\n }\n },\n /* Pseudo-class applied to the ButtonBase root element if the button is keyboard focused. */\n focusVisible: {},\n /* Pseudo-class applied to the root element if `disabled={true}`. */\n disabled: {},\n /* Styles applied to the root element if `color=\"inherit\"`. */\n colorInherit: {\n color: 'inherit'\n },\n /* Styles applied to the root element if `size=\"small\"``. */\n sizeSmall: {\n width: 40,\n height: 40\n },\n /* Styles applied to the root element if `size=\"medium\"``. */\n sizeMedium: {\n width: 48,\n height: 48\n }\n };\n};\nvar Fab = /*#__PURE__*/React.forwardRef(function Fab(props, ref) {\n var children = props.children,\n classes = props.classes,\n className = props.className,\n _props$color = props.color,\n color = _props$color === void 0 ? 'default' : _props$color,\n _props$component = props.component,\n component = _props$component === void 0 ? 'button' : _props$component,\n _props$disabled = props.disabled,\n disabled = _props$disabled === void 0 ? false : _props$disabled,\n _props$disableFocusRi = props.disableFocusRipple,\n disableFocusRipple = _props$disableFocusRi === void 0 ? false : _props$disableFocusRi,\n focusVisibleClassName = props.focusVisibleClassName,\n _props$size = props.size,\n size = _props$size === void 0 ? 'large' : _props$size,\n _props$variant = props.variant,\n variant = _props$variant === void 0 ? 'circular' : _props$variant,\n other = _objectWithoutProperties(props, [\"children\", \"classes\", \"className\", \"color\", \"component\", \"disabled\", \"disableFocusRipple\", \"focusVisibleClassName\", \"size\", \"variant\"]);\n return /*#__PURE__*/React.createElement(ButtonBase, _extends({\n className: clsx(classes.root, className, size !== 'large' && classes[\"size\".concat(capitalize(size))], disabled && classes.disabled, variant === 'extended' && classes.extended, {\n 'primary': classes.primary,\n 'secondary': classes.secondary,\n 'inherit': classes.colorInherit\n }[color]),\n component: component,\n disabled: disabled,\n focusRipple: !disableFocusRipple,\n focusVisibleClassName: clsx(classes.focusVisible, focusVisibleClassName),\n ref: ref\n }, other), /*#__PURE__*/React.createElement(\"span\", {\n className: classes.label\n }, children));\n});\nprocess.env.NODE_ENV !== \"production\" ? void 0 : void 0;\nexport default withStyles(styles, {\n name: 'MuiFab'\n})(Fab);","import React from \"react\"\nimport withSimpleErrorBoundary from \"../../util/withSimpleErrorBoundary\"\nimport Fab from \"@material-ui/core/Fab\"\nimport styled from \"styled-components\"\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\"\nimport { faChartLine as icon } from \"@fortawesome/free-solid-svg-icons\"\n\nconst StyledIcon = styled(FontAwesomeIcon)`\n color: white;\n font-size: 1.5em !important;\n`\n\nconst StyledFab = styled(Fab)`\n background-color: #00a5ff !important;\n`\n\nconst PointsBalloonBalloon = ({ onClick }) => (\n \n \n \n)\n\nexport default withSimpleErrorBoundary(PointsBalloonBalloon)\n","export function flatten(arr) {\n return arr.reduce(function (flat, toFlatten) {\n return flat.concat(\n Array.isArray(toFlatten) ? flatten(toFlatten) : toFlatten,\n )\n }, [])\n}\n\nexport function zip(arr, ...arrs) {\n return arr.map((val, i) => arrs.reduce((a, arr) => [...a, arr[i]], [val]))\n}\n\nexport function getCommonElements(array1, array2) {\n return array1.filter((value) => -1 !== array2.indexOf(value))\n}\n","import { fetchProgrammingProgress } from \"./moocfi\"\nimport { zip } from \"../util/arrays\"\nimport { fetchQuizzesProgress } from \"./quizzes\"\n\n//eslint-disable-next-line no-unused-vars\nconst introductionCourseGroups = [\n \"osa01\",\n \"osa02\",\n \"osa03\",\n \"osa04\",\n \"osa05\",\n \"osa06\",\n \"osa07\",\n]\n\nexport async function fetchProgress(t) {\n // await fetchQuizzesProgress()\n const serviceIdentifiers = [t(\"programmingService\"), t(\"quizService\")]\n const progressesCollection = await Promise.all([\n fetchProgrammingProgress(),\n fetchQuizzesProgress(),\n ])\n // const userDetails = await getCachedUserDetails()\n // const currentCourseVariant = userDetails?.extra_fields?.course_variant\n const progressByGroup = {}\n\n zip(serviceIdentifiers, progressesCollection).forEach(\n ([identifier, progresses]) => {\n console.log(JSON.stringify(progresses))\n progresses.forEach((progressEntry) => {\n if (!progressByGroup[progressEntry.group]) {\n progressByGroup[progressEntry.group] = {}\n }\n progressByGroup[progressEntry.group][identifier] = progressEntry\n })\n },\n )\n const toBeDeleted = []\n Object.entries(progressByGroup).forEach(([group, serviceEntries]) => {\n if (\n !Object.keys(serviceEntries).find((o) => o === t(\"programmingService\"))\n ) {\n toBeDeleted.push(group)\n }\n })\n // TODO: this is not a good way to do this\n toBeDeleted.forEach((o) => {\n delete progressByGroup[o]\n })\n return progressByGroup\n}\n","import _isObject from \"lodash/isObject\";\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nimport { isValidElement } from 'react';\nvar SVGContainerPropKeys = ['viewBox', 'children'];\nvar SVGElementPropKeys = ['aria-activedescendant', 'aria-atomic', 'aria-autocomplete', 'aria-busy', 'aria-checked', 'aria-colcount', 'aria-colindex', 'aria-colspan', 'aria-controls', 'aria-current', 'aria-describedby', 'aria-details', 'aria-disabled', 'aria-errormessage', 'aria-expanded', 'aria-flowto', 'aria-haspopup', 'aria-hidden', 'aria-invalid', 'aria-keyshortcuts', 'aria-label', 'aria-labelledby', 'aria-level', 'aria-live', 'aria-modal', 'aria-multiline', 'aria-multiselectable', 'aria-orientation', 'aria-owns', 'aria-placeholder', 'aria-posinset', 'aria-pressed', 'aria-readonly', 'aria-relevant', 'aria-required', 'aria-roledescription', 'aria-rowcount', 'aria-rowindex', 'aria-rowspan', 'aria-selected', 'aria-setsize', 'aria-sort', 'aria-valuemax', 'aria-valuemin', 'aria-valuenow', 'aria-valuetext', 'className', 'color', 'height', 'id', 'lang', 'max', 'media', 'method', 'min', 'name', 'style', 'target', 'type', 'width', 'role', 'tabIndex', 'accentHeight', 'accumulate', 'additive', 'alignmentBaseline', 'allowReorder', 'alphabetic', 'amplitude', 'arabicForm', 'ascent', 'attributeName', 'attributeType', 'autoReverse', 'azimuth', 'baseFrequency', 'baselineShift', 'baseProfile', 'bbox', 'begin', 'bias', 'by', 'calcMode', 'capHeight', 'clip', 'clipPath', 'clipPathUnits', 'clipRule', 'colorInterpolation', 'colorInterpolationFilters', 'colorProfile', 'colorRendering', 'contentScriptType', 'contentStyleType', 'cursor', 'cx', 'cy', 'd', 'decelerate', 'descent', 'diffuseConstant', 'direction', 'display', 'divisor', 'dominantBaseline', 'dur', 'dx', 'dy', 'edgeMode', 'elevation', 'enableBackground', 'end', 'exponent', 'externalResourcesRequired', 'fill', 'fillOpacity', 'fillRule', 'filter', 'filterRes', 'filterUnits', 'floodColor', 'floodOpacity', 'focusable', 'fontFamily', 'fontSize', 'fontSizeAdjust', 'fontStretch', 'fontStyle', 'fontVariant', 'fontWeight', 'format', 'from', 'fx', 'fy', 'g1', 'g2', 'glyphName', 'glyphOrientationHorizontal', 'glyphOrientationVertical', 'glyphRef', 'gradientTransform', 'gradientUnits', 'hanging', 'horizAdvX', 'horizOriginX', 'href', 'ideographic', 'imageRendering', 'in2', 'in', 'intercept', 'k1', 'k2', 'k3', 'k4', 'k', 'kernelMatrix', 'kernelUnitLength', 'kerning', 'keyPoints', 'keySplines', 'keyTimes', 'lengthAdjust', 'letterSpacing', 'lightingColor', 'limitingConeAngle', 'local', 'markerEnd', 'markerHeight', 'markerMid', 'markerStart', 'markerUnits', 'markerWidth', 'mask', 'maskContentUnits', 'maskUnits', 'mathematical', 'mode', 'numOctaves', 'offset', 'opacity', 'operator', 'order', 'orient', 'orientation', 'origin', 'overflow', 'overlinePosition', 'overlineThickness', 'paintOrder', 'panose1', 'pathLength', 'patternContentUnits', 'patternTransform', 'patternUnits', 'pointerEvents', 'points', 'pointsAtX', 'pointsAtY', 'pointsAtZ', 'preserveAlpha', 'preserveAspectRatio', 'primitiveUnits', 'r', 'radius', 'refX', 'refY', 'renderingIntent', 'repeatCount', 'repeatDur', 'requiredExtensions', 'requiredFeatures', 'restart', 'result', 'rotate', 'rx', 'ry', 'seed', 'shapeRendering', 'slope', 'spacing', 'specularConstant', 'specularExponent', 'speed', 'spreadMethod', 'startOffset', 'stdDeviation', 'stemh', 'stemv', 'stitchTiles', 'stopColor', 'stopOpacity', 'strikethroughPosition', 'strikethroughThickness', 'string', 'stroke', 'strokeDasharray', 'strokeDashoffset', 'strokeLinecap', 'strokeLinejoin', 'strokeMiterlimit', 'strokeOpacity', 'strokeWidth', 'surfaceScale', 'systemLanguage', 'tableValues', 'targetX', 'targetY', 'textAnchor', 'textDecoration', 'textLength', 'textRendering', 'to', 'transform', 'u1', 'u2', 'underlinePosition', 'underlineThickness', 'unicode', 'unicodeBidi', 'unicodeRange', 'unitsPerEm', 'vAlphabetic', 'values', 'vectorEffect', 'version', 'vertAdvY', 'vertOriginX', 'vertOriginY', 'vHanging', 'vIdeographic', 'viewTarget', 'visibility', 'vMathematical', 'widths', 'wordSpacing', 'writingMode', 'x1', 'x2', 'x', 'xChannelSelector', 'xHeight', 'xlinkActuate', 'xlinkArcrole', 'xlinkHref', 'xlinkRole', 'xlinkShow', 'xlinkTitle', 'xlinkType', 'xmlBase', 'xmlLang', 'xmlns', 'xmlnsXlink', 'xmlSpace', 'y1', 'y2', 'y', 'yChannelSelector', 'z', 'zoomAndPan', 'ref', 'key', 'angle'];\nvar EventKeys = ['dangerouslySetInnerHTML', 'onCopy', 'onCopyCapture', 'onCut', 'onCutCapture', 'onPaste', 'onPasteCapture', 'onCompositionEnd', 'onCompositionEndCapture', 'onCompositionStart', 'onCompositionStartCapture', 'onCompositionUpdate', 'onCompositionUpdateCapture', 'onFocus', 'onFocusCapture', 'onBlur', 'onBlurCapture', 'onChange', 'onChangeCapture', 'onBeforeInput', 'onBeforeInputCapture', 'onInput', 'onInputCapture', 'onReset', 'onResetCapture', 'onSubmit', 'onSubmitCapture', 'onInvalid', 'onInvalidCapture', 'onLoad', 'onLoadCapture', 'onError', 'onErrorCapture', 'onKeyDown', 'onKeyDownCapture', 'onKeyPress', 'onKeyPressCapture', 'onKeyUp', 'onKeyUpCapture', 'onAbort', 'onAbortCapture', 'onCanPlay', 'onCanPlayCapture', 'onCanPlayThrough', 'onCanPlayThroughCapture', 'onDurationChange', 'onDurationChangeCapture', 'onEmptied', 'onEmptiedCapture', 'onEncrypted', 'onEncryptedCapture', 'onEnded', 'onEndedCapture', 'onLoadedData', 'onLoadedDataCapture', 'onLoadedMetadata', 'onLoadedMetadataCapture', 'onLoadStart', 'onLoadStartCapture', 'onPause', 'onPauseCapture', 'onPlay', 'onPlayCapture', 'onPlaying', 'onPlayingCapture', 'onProgress', 'onProgressCapture', 'onRateChange', 'onRateChangeCapture', 'onSeeked', 'onSeekedCapture', 'onSeeking', 'onSeekingCapture', 'onStalled', 'onStalledCapture', 'onSuspend', 'onSuspendCapture', 'onTimeUpdate', 'onTimeUpdateCapture', 'onVolumeChange', 'onVolumeChangeCapture', 'onWaiting', 'onWaitingCapture', 'onAuxClick', 'onAuxClickCapture', 'onClick', 'onClickCapture', 'onContextMenu', 'onContextMenuCapture', 'onDoubleClick', 'onDoubleClickCapture', 'onDrag', 'onDragCapture', 'onDragEnd', 'onDragEndCapture', 'onDragEnter', 'onDragEnterCapture', 'onDragExit', 'onDragExitCapture', 'onDragLeave', 'onDragLeaveCapture', 'onDragOver', 'onDragOverCapture', 'onDragStart', 'onDragStartCapture', 'onDrop', 'onDropCapture', 'onMouseDown', 'onMouseDownCapture', 'onMouseEnter', 'onMouseLeave', 'onMouseMove', 'onMouseMoveCapture', 'onMouseOut', 'onMouseOutCapture', 'onMouseOver', 'onMouseOverCapture', 'onMouseUp', 'onMouseUpCapture', 'onSelect', 'onSelectCapture', 'onTouchCancel', 'onTouchCancelCapture', 'onTouchEnd', 'onTouchEndCapture', 'onTouchMove', 'onTouchMoveCapture', 'onTouchStart', 'onTouchStartCapture', 'onPointerDown', 'onPointerDownCapture', 'onPointerMove', 'onPointerMoveCapture', 'onPointerUp', 'onPointerUpCapture', 'onPointerCancel', 'onPointerCancelCapture', 'onPointerEnter', 'onPointerEnterCapture', 'onPointerLeave', 'onPointerLeaveCapture', 'onPointerOver', 'onPointerOverCapture', 'onPointerOut', 'onPointerOutCapture', 'onGotPointerCapture', 'onGotPointerCaptureCapture', 'onLostPointerCapture', 'onLostPointerCaptureCapture', 'onScroll', 'onScrollCapture', 'onWheel', 'onWheelCapture', 'onAnimationStart', 'onAnimationStartCapture', 'onAnimationEnd', 'onAnimationEndCapture', 'onAnimationIteration', 'onAnimationIterationCapture', 'onTransitionEnd', 'onTransitionEndCapture']; // Animation Types => TODO: Should be moved when react-smooth is typescriptified.\n\nexport var filterProps = function filterProps(props, includeEvents, isSvg) {\n if (!props || typeof props === 'function' || typeof props === 'boolean') {\n return null;\n }\n var inputProps = props;\n if ( /*#__PURE__*/isValidElement(props)) {\n inputProps = props.props;\n }\n if (!_isObject(inputProps)) {\n return null;\n }\n var out = {};\n Object.keys(inputProps).forEach(function (key) {\n // viewBox only exist in \n if (SVGElementPropKeys.includes(key) || isSvg && SVGContainerPropKeys.includes(key) || includeEvents && EventKeys.includes(key)) {\n out[key] = inputProps[key];\n }\n });\n return out;\n};\nexport var adaptEventHandlers = function adaptEventHandlers(props, newHandler) {\n if (!props || typeof props === 'function' || typeof props === 'boolean') {\n return null;\n }\n var inputProps = props;\n if ( /*#__PURE__*/isValidElement(props)) {\n inputProps = props.props;\n }\n if (!_isObject(inputProps)) {\n return null;\n }\n var out = {};\n Object.keys(inputProps).forEach(function (key) {\n if (EventKeys.includes(key)) {\n out[key] = newHandler || function (e) {\n return inputProps[key](inputProps, e);\n };\n }\n });\n return out;\n};\nvar getEventHandlerOfChild = function getEventHandlerOfChild(originalHandler, data, index) {\n return function (e) {\n originalHandler(data, index, e);\n return null;\n };\n};\nexport var adaptEventsOfChild = function adaptEventsOfChild(props, data, index) {\n if (!_isObject(props) || _typeof(props) !== 'object') {\n return null;\n }\n var out = null;\n Object.keys(props).forEach(function (key) {\n var item = props[key];\n if (EventKeys.includes(key) && typeof item === 'function') {\n if (!out) out = {};\n out[key] = getEventHandlerOfChild(item, data, index);\n }\n });\n return out;\n};","function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\n\n/**\n * @fileOverview Surface\n */\nimport React from 'react';\nimport classNames from 'classnames';\nimport { filterProps } from '../util/types';\nexport function Surface(props) {\n var children = props.children,\n width = props.width,\n height = props.height,\n viewBox = props.viewBox,\n className = props.className,\n style = props.style,\n others = _objectWithoutProperties(props, [\"children\", \"width\", \"height\", \"viewBox\", \"className\", \"style\"]);\n var svgView = viewBox || {\n width: width,\n height: height,\n x: 0,\n y: 0\n };\n var layerClass = classNames('recharts-surface', className);\n return /*#__PURE__*/React.createElement(\"svg\", _extends({}, filterProps(others, true, true), {\n className: layerClass,\n width: width,\n height: height,\n style: style,\n viewBox: \"\".concat(svgView.x, \" \").concat(svgView.y, \" \").concat(svgView.width, \" \").concat(svgView.height),\n version: \"1.1\"\n }), /*#__PURE__*/React.createElement(\"title\", null, props.title), /*#__PURE__*/React.createElement(\"desc\", null, props.desc), children);\n}","function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\n\n/**\n * @fileOverview Layer\n */\nimport React from 'react';\nimport classNames from 'classnames';\nimport { filterProps } from '../util/types';\nexport var Layer = /*#__PURE__*/React.forwardRef(function (props, ref) {\n var children = props.children,\n className = props.className,\n others = _objectWithoutProperties(props, [\"children\", \"className\"]);\n var layerClass = classNames('recharts-layer', className);\n return /*#__PURE__*/React.createElement(\"g\", _extends({\n className: layerClass\n }, filterProps(others, true), {\n ref: ref\n }), children);\n});","export default function setRafTimeout(callback) {\n var timeout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var currTime = -1;\n var shouldUpdate = function shouldUpdate(now) {\n if (currTime < 0) {\n currTime = now;\n }\n if (now - currTime > timeout) {\n callback(now);\n currTime = -1;\n } else {\n requestAnimationFrame(shouldUpdate);\n }\n };\n requestAnimationFrame(shouldUpdate);\n}","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nfunction _toArray(arr) {\n return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest();\n}\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n}\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\nimport setRafTimeout from './setRafTimeout';\nexport default function createAnimateManager() {\n var currStyle = {};\n var handleChange = function handleChange() {\n return null;\n };\n var shouldStop = false;\n var setStyle = function setStyle(_style) {\n if (shouldStop) {\n return;\n }\n if (Array.isArray(_style)) {\n if (!_style.length) {\n return;\n }\n var styles = _style;\n var _styles = _toArray(styles),\n curr = _styles[0],\n restStyles = _styles.slice(1);\n if (typeof curr === 'number') {\n setRafTimeout(setStyle.bind(null, restStyles), curr);\n return;\n }\n setStyle(curr);\n setRafTimeout(setStyle.bind(null, restStyles));\n return;\n }\n if (_typeof(_style) === 'object') {\n currStyle = _style;\n handleChange(currStyle);\n }\n if (typeof _style === 'function') {\n _style();\n }\n };\n return {\n stop: function stop() {\n shouldStop = true;\n },\n start: function start(style) {\n shouldStop = false;\n setStyle(style);\n },\n subscribe: function subscribe(_handleChange) {\n handleChange = _handleChange;\n return function () {\n handleChange = function handleChange() {\n return null;\n };\n };\n }\n };\n}","function ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\n\n/* eslint no-console: 0 */\nvar PREFIX_LIST = ['Webkit', 'Moz', 'O', 'ms'];\nvar IN_LINE_PREFIX_LIST = ['-webkit-', '-moz-', '-o-', '-ms-'];\nvar IN_COMPATIBLE_PROPERTY = ['transform', 'transformOrigin', 'transition'];\nexport var getIntersectionKeys = function getIntersectionKeys(preObj, nextObj) {\n return [Object.keys(preObj), Object.keys(nextObj)].reduce(function (a, b) {\n return a.filter(function (c) {\n return b.includes(c);\n });\n });\n};\nexport var identity = function identity(param) {\n return param;\n};\n/*\n * @description: convert camel case to dash case\n * string => string\n */\n\nexport var getDashCase = function getDashCase(name) {\n return name.replace(/([A-Z])/g, function (v) {\n return \"-\".concat(v.toLowerCase());\n });\n};\n/*\n * @description: add compatible style prefix\n * (string, string) => object\n */\n\nexport var generatePrefixStyle = function generatePrefixStyle(name, value) {\n if (IN_COMPATIBLE_PROPERTY.indexOf(name) === -1) {\n return _defineProperty({}, name, value);\n }\n var isTransition = name === 'transition';\n var camelName = name.replace(/(\\w)/, function (v) {\n return v.toUpperCase();\n });\n var styleVal = value;\n return PREFIX_LIST.reduce(function (result, property, i) {\n if (isTransition) {\n styleVal = value.replace(/(transform|transform-origin)/gim, \"\".concat(IN_LINE_PREFIX_LIST[i], \"$1\"));\n }\n return _objectSpread(_objectSpread({}, result), {}, _defineProperty({}, property + camelName, styleVal));\n }, {});\n};\nexport var log = function log() {\n var _console;\n (_console = console).log.apply(_console, arguments);\n};\n/*\n * @description: log the value of a varible\n * string => any => any\n */\n\nexport var debug = function debug(name) {\n return function (item) {\n log(name, item);\n return item;\n };\n};\n/*\n * @description: log name, args, return value of a function\n * function => function\n */\n\nexport var debugf = function debugf(tag, f) {\n return function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n var res = f.apply(void 0, args);\n var name = tag || f.name || 'anonymous function';\n var argNames = \"(\".concat(args.map(JSON.stringify).join(', '), \")\");\n log(\"\".concat(name, \": \").concat(argNames, \" => \").concat(JSON.stringify(res)));\n return res;\n };\n};\n/*\n * @description: map object on every element in this object.\n * (function, object) => object\n */\n\nexport var mapObject = function mapObject(fn, obj) {\n return Object.keys(obj).reduce(function (res, key) {\n return _objectSpread(_objectSpread({}, res), {}, _defineProperty({}, key, fn(key, obj[key])));\n }, {});\n};\n/*\n * @description: add compatible prefix to style\n * object => object\n */\n\nexport var translateStyle = function translateStyle(style) {\n return Object.keys(style).reduce(function (res, key) {\n return _objectSpread(_objectSpread({}, res), generatePrefixStyle(key, res[key]));\n }, style);\n};\nexport var compose = function compose() {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n if (!args.length) {\n return identity;\n }\n var fns = args.reverse(); // first function can receive multiply arguments\n\n var firstFn = fns[0];\n var tailsFn = fns.slice(1);\n return function () {\n return tailsFn.reduce(function (res, fn) {\n return fn(res);\n }, firstFn.apply(void 0, arguments));\n };\n};\nexport var getTransitionVal = function getTransitionVal(props, duration, easing) {\n return props.map(function (prop) {\n return \"\".concat(getDashCase(prop), \" \").concat(duration, \"ms \").concat(easing);\n }).join(',');\n};\nvar isDev = process.env.NODE_ENV !== 'production';\nexport var warn = function warn(condition, format, a, b, c, d, e, f) {\n if (isDev && typeof console !== 'undefined' && console.warn) {\n if (format === undefined) {\n console.warn('LogUtils requires an error message argument');\n }\n if (!condition) {\n if (format === undefined) {\n console.warn('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n console.warn(format.replace(/%s/g, function () {\n return args[argIndex++];\n }));\n }\n }\n }\n};","function _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n return _arr;\n}\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n}\nimport { warn } from './util';\nvar ACCURACY = 1e-4;\nvar cubicBezierFactor = function cubicBezierFactor(c1, c2) {\n return [0, 3 * c1, 3 * c2 - 6 * c1, 3 * c1 - 3 * c2 + 1];\n};\nvar multyTime = function multyTime(params, t) {\n return params.map(function (param, i) {\n return param * Math.pow(t, i);\n }).reduce(function (pre, curr) {\n return pre + curr;\n });\n};\nvar cubicBezier = function cubicBezier(c1, c2) {\n return function (t) {\n var params = cubicBezierFactor(c1, c2);\n return multyTime(params, t);\n };\n};\nvar derivativeCubicBezier = function derivativeCubicBezier(c1, c2) {\n return function (t) {\n var params = cubicBezierFactor(c1, c2);\n var newParams = [].concat(_toConsumableArray(params.map(function (param, i) {\n return param * i;\n }).slice(1)), [0]);\n return multyTime(newParams, t);\n };\n}; // calculate cubic-bezier using Newton's method\n\nexport var configBezier = function configBezier() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n var x1 = args[0],\n y1 = args[1],\n x2 = args[2],\n y2 = args[3];\n if (args.length === 1) {\n switch (args[0]) {\n case 'linear':\n x1 = 0.0;\n y1 = 0.0;\n x2 = 1.0;\n y2 = 1.0;\n break;\n case 'ease':\n x1 = 0.25;\n y1 = 0.1;\n x2 = 0.25;\n y2 = 1.0;\n break;\n case 'ease-in':\n x1 = 0.42;\n y1 = 0.0;\n x2 = 1.0;\n y2 = 1.0;\n break;\n case 'ease-out':\n x1 = 0.42;\n y1 = 0.0;\n x2 = 0.58;\n y2 = 1.0;\n break;\n case 'ease-in-out':\n x1 = 0.0;\n y1 = 0.0;\n x2 = 0.58;\n y2 = 1.0;\n break;\n default:\n {\n var easing = args[0].split('(');\n if (easing[0] === 'cubic-bezier' && easing[1].split(')')[0].split(',').length === 4) {\n var _easing$1$split$0$spl = easing[1].split(')')[0].split(',').map(function (x) {\n return parseFloat(x);\n });\n var _easing$1$split$0$spl2 = _slicedToArray(_easing$1$split$0$spl, 4);\n x1 = _easing$1$split$0$spl2[0];\n y1 = _easing$1$split$0$spl2[1];\n x2 = _easing$1$split$0$spl2[2];\n y2 = _easing$1$split$0$spl2[3];\n } else {\n warn(false, '[configBezier]: arguments should be one of ' + 'oneOf \\'linear\\', \\'ease\\', \\'ease-in\\', \\'ease-out\\', ' + '\\'ease-in-out\\',\\'cubic-bezier(x1,y1,x2,y2)\\', instead received %s', args);\n }\n }\n }\n }\n warn([x1, x2, y1, y2].every(function (num) {\n return typeof num === 'number' && num >= 0 && num <= 1;\n }), '[configBezier]: arguments should be x1, y1, x2, y2 of [0, 1] instead received %s', args);\n var curveX = cubicBezier(x1, x2);\n var curveY = cubicBezier(y1, y2);\n var derCurveX = derivativeCubicBezier(x1, x2);\n var rangeValue = function rangeValue(value) {\n if (value > 1) {\n return 1;\n } else if (value < 0) {\n return 0;\n }\n return value;\n };\n var bezier = function bezier(_t) {\n var t = _t > 1 ? 1 : _t;\n var x = t;\n for (var i = 0; i < 8; ++i) {\n var evalT = curveX(x) - t;\n var derVal = derCurveX(x);\n if (Math.abs(evalT - t) < ACCURACY || derVal < ACCURACY) {\n return curveY(x);\n }\n x = rangeValue(x - evalT / derVal);\n }\n return curveY(x);\n };\n bezier.isStepper = false;\n return bezier;\n};\nexport var configSpring = function configSpring() {\n var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var _config$stiff = config.stiff,\n stiff = _config$stiff === void 0 ? 100 : _config$stiff,\n _config$damping = config.damping,\n damping = _config$damping === void 0 ? 8 : _config$damping,\n _config$dt = config.dt,\n dt = _config$dt === void 0 ? 17 : _config$dt;\n var stepper = function stepper(currX, destX, currV) {\n var FSpring = -(currX - destX) * stiff;\n var FDamping = currV * damping;\n var newV = currV + (FSpring - FDamping) * dt / 1000;\n var newX = currV * dt / 1000 + currX;\n if (Math.abs(newX - destX) < ACCURACY && Math.abs(newV) < ACCURACY) {\n return [destX, 0];\n }\n return [newX, newV];\n };\n stepper.isStepper = true;\n stepper.dt = dt;\n return stepper;\n};\nexport var configEasing = function configEasing() {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n var easing = args[0];\n if (typeof easing === 'string') {\n switch (easing) {\n case 'ease':\n case 'ease-in-out':\n case 'ease-out':\n case 'ease-in':\n case 'linear':\n return configBezier(easing);\n case 'spring':\n return configSpring();\n default:\n if (easing.split('(')[0] === 'cubic-bezier') {\n return configBezier(easing);\n }\n warn(false, '[configEasing]: first argument should be one of \\'ease\\', \\'ease-in\\', ' + '\\'ease-out\\', \\'ease-in-out\\',\\'cubic-bezier(x1,y1,x2,y2)\\', \\'linear\\' and \\'spring\\', instead received %s', args);\n }\n }\n if (typeof easing === 'function') {\n return easing;\n }\n warn(false, '[configEasing]: first argument type should be function or ' + 'string, instead received %s', args);\n return null;\n};","function _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n}\nfunction _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n return _arr;\n}\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\nimport { getIntersectionKeys, mapObject } from './util';\nvar alpha = function alpha(begin, end, k) {\n return begin + (end - begin) * k;\n};\nvar needContinue = function needContinue(_ref) {\n var from = _ref.from,\n to = _ref.to;\n return from !== to;\n};\n/*\n * @description: cal new from value and velocity in each stepper\n * @return: { [styleProperty]: { from, to, velocity } }\n */\n\nvar calStepperVals = function calStepperVals(easing, preVals, steps) {\n var nextStepVals = mapObject(function (key, val) {\n if (needContinue(val)) {\n var _easing = easing(val.from, val.to, val.velocity),\n _easing2 = _slicedToArray(_easing, 2),\n newX = _easing2[0],\n newV = _easing2[1];\n return _objectSpread(_objectSpread({}, val), {}, {\n from: newX,\n velocity: newV\n });\n }\n return val;\n }, preVals);\n if (steps < 1) {\n return mapObject(function (key, val) {\n if (needContinue(val)) {\n return _objectSpread(_objectSpread({}, val), {}, {\n velocity: alpha(val.velocity, nextStepVals[key].velocity, steps),\n from: alpha(val.from, nextStepVals[key].from, steps)\n });\n }\n return val;\n }, preVals);\n }\n return calStepperVals(easing, nextStepVals, steps - 1);\n}; // configure update function\n\nexport default (function (from, to, easing, duration, render) {\n var interKeys = getIntersectionKeys(from, to);\n var timingStyle = interKeys.reduce(function (res, key) {\n return _objectSpread(_objectSpread({}, res), {}, _defineProperty({}, key, [from[key], to[key]]));\n }, {});\n var stepperStyle = interKeys.reduce(function (res, key) {\n return _objectSpread(_objectSpread({}, res), {}, _defineProperty({}, key, {\n from: from[key],\n velocity: 0,\n to: to[key]\n }));\n }, {});\n var cafId = -1;\n var preTime;\n var beginTime;\n var update = function update() {\n return null;\n };\n var getCurrStyle = function getCurrStyle() {\n return mapObject(function (key, val) {\n return val.from;\n }, stepperStyle);\n };\n var shouldStopAnimation = function shouldStopAnimation() {\n return !Object.values(stepperStyle).filter(needContinue).length;\n }; // stepper timing function like spring\n\n var stepperUpdate = function stepperUpdate(now) {\n if (!preTime) {\n preTime = now;\n }\n var deltaTime = now - preTime;\n var steps = deltaTime / easing.dt;\n stepperStyle = calStepperVals(easing, stepperStyle, steps); // get union set and add compatible prefix\n\n render(_objectSpread(_objectSpread(_objectSpread({}, from), to), getCurrStyle(stepperStyle)));\n preTime = now;\n if (!shouldStopAnimation()) {\n cafId = requestAnimationFrame(update);\n }\n }; // t => val timing function like cubic-bezier\n\n var timingUpdate = function timingUpdate(now) {\n if (!beginTime) {\n beginTime = now;\n }\n var t = (now - beginTime) / duration;\n var currStyle = mapObject(function (key, val) {\n return alpha.apply(void 0, _toConsumableArray(val).concat([easing(t)]));\n }, timingStyle); // get union set and add compatible prefix\n\n render(_objectSpread(_objectSpread(_objectSpread({}, from), to), currStyle));\n if (t < 1) {\n cafId = requestAnimationFrame(update);\n } else {\n var finalStyle = mapObject(function (key, val) {\n return alpha.apply(void 0, _toConsumableArray(val).concat([easing(1)]));\n }, timingStyle);\n render(_objectSpread(_objectSpread(_objectSpread({}, from), to), finalStyle));\n }\n };\n update = easing.isStepper ? stepperUpdate : timingUpdate; // return start animation method\n\n return function () {\n requestAnimationFrame(update); // return stop animation method\n\n return function () {\n cancelAnimationFrame(cafId);\n };\n };\n});","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n}\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}\nfunction _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n return _possibleConstructorReturn(this, result);\n };\n}\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n return _assertThisInitialized(self);\n}\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}\nfunction _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\nimport React, { PureComponent, cloneElement, Children } from 'react';\nimport { deepEqual } from 'fast-equals';\nimport createAnimateManager from './AnimateManager';\nimport { configEasing } from './easing';\nimport configUpdate from './configUpdate';\nimport { getTransitionVal, identity, translateStyle } from './util';\nvar Animate = /*#__PURE__*/function (_PureComponent) {\n _inherits(Animate, _PureComponent);\n var _super = _createSuper(Animate);\n function Animate(props, context) {\n var _this;\n _classCallCheck(this, Animate);\n _this = _super.call(this, props, context);\n var _this$props = _this.props,\n isActive = _this$props.isActive,\n attributeName = _this$props.attributeName,\n from = _this$props.from,\n to = _this$props.to,\n steps = _this$props.steps,\n children = _this$props.children;\n _this.handleStyleChange = _this.handleStyleChange.bind(_assertThisInitialized(_this));\n _this.changeStyle = _this.changeStyle.bind(_assertThisInitialized(_this));\n if (!isActive) {\n _this.state = {\n style: {}\n }; // if children is a function and animation is not active, set style to 'to'\n\n if (typeof children === 'function') {\n _this.state = {\n style: to\n };\n }\n return _possibleConstructorReturn(_this);\n }\n if (steps && steps.length) {\n _this.state = {\n style: steps[0].style\n };\n } else if (from) {\n if (typeof children === 'function') {\n _this.state = {\n style: from\n };\n return _possibleConstructorReturn(_this);\n }\n _this.state = {\n style: attributeName ? _defineProperty({}, attributeName, from) : from\n };\n } else {\n _this.state = {\n style: {}\n };\n }\n return _this;\n }\n _createClass(Animate, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var _this$props2 = this.props,\n isActive = _this$props2.isActive,\n canBegin = _this$props2.canBegin;\n this.mounted = true;\n if (!isActive || !canBegin) {\n return;\n }\n this.runAnimation(this.props);\n }\n }, {\n key: \"componentDidUpdate\",\n value: function componentDidUpdate(prevProps) {\n var _this$props3 = this.props,\n isActive = _this$props3.isActive,\n canBegin = _this$props3.canBegin,\n attributeName = _this$props3.attributeName,\n shouldReAnimate = _this$props3.shouldReAnimate;\n if (!canBegin) {\n return;\n }\n if (!isActive) {\n var newState = {\n style: attributeName ? _defineProperty({}, attributeName, this.props.to) : this.props.to\n };\n if (this.state && this.state.style) {\n if (attributeName && this.state.style[attributeName] !== this.props.to || !attributeName && this.state.style !== this.props.to) {\n // eslint-disable-next-line react/no-did-update-set-state\n this.setState(newState);\n }\n }\n return;\n }\n if (deepEqual(prevProps.to, this.props.to) && prevProps.canBegin && prevProps.isActive) {\n return;\n }\n var isTriggered = !prevProps.canBegin || !prevProps.isActive;\n if (this.manager) {\n this.manager.stop();\n }\n if (this.stopJSAnimation) {\n this.stopJSAnimation();\n }\n var from = isTriggered || shouldReAnimate ? this.props.from : prevProps.to;\n if (this.state && this.state.style) {\n var _newState = {\n style: attributeName ? _defineProperty({}, attributeName, from) : from\n };\n if (attributeName && this.state.style[attributeName] !== from || !attributeName && this.state.style !== from) {\n // eslint-disable-next-line react/no-did-update-set-state\n this.setState(_newState);\n }\n }\n this.runAnimation(_objectSpread(_objectSpread({}, this.props), {}, {\n from: from,\n begin: 0\n }));\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n this.mounted = false;\n if (this.unSubscribe) {\n this.unSubscribe();\n }\n if (this.manager) {\n this.manager.stop();\n this.manager = null;\n }\n if (this.stopJSAnimation) {\n this.stopJSAnimation();\n }\n }\n }, {\n key: \"runJSAnimation\",\n value: function runJSAnimation(props) {\n var _this2 = this;\n var from = props.from,\n to = props.to,\n duration = props.duration,\n easing = props.easing,\n begin = props.begin,\n onAnimationEnd = props.onAnimationEnd,\n onAnimationStart = props.onAnimationStart;\n var startAnimation = configUpdate(from, to, configEasing(easing), duration, this.changeStyle);\n var finalStartAnimation = function finalStartAnimation() {\n _this2.stopJSAnimation = startAnimation();\n };\n this.manager.start([onAnimationStart, begin, finalStartAnimation, duration, onAnimationEnd]);\n }\n }, {\n key: \"runStepAnimation\",\n value: function runStepAnimation(props) {\n var _this3 = this;\n var steps = props.steps,\n begin = props.begin,\n onAnimationStart = props.onAnimationStart;\n var _steps$ = steps[0],\n initialStyle = _steps$.style,\n _steps$$duration = _steps$.duration,\n initialTime = _steps$$duration === void 0 ? 0 : _steps$$duration;\n var addStyle = function addStyle(sequence, nextItem, index) {\n if (index === 0) {\n return sequence;\n }\n var duration = nextItem.duration,\n _nextItem$easing = nextItem.easing,\n easing = _nextItem$easing === void 0 ? 'ease' : _nextItem$easing,\n style = nextItem.style,\n nextProperties = nextItem.properties,\n onAnimationEnd = nextItem.onAnimationEnd;\n var preItem = index > 0 ? steps[index - 1] : nextItem;\n var properties = nextProperties || Object.keys(style);\n if (typeof easing === 'function' || easing === 'spring') {\n return [].concat(_toConsumableArray(sequence), [_this3.runJSAnimation.bind(_this3, {\n from: preItem.style,\n to: style,\n duration: duration,\n easing: easing\n }), duration]);\n }\n var transition = getTransitionVal(properties, duration, easing);\n var newStyle = _objectSpread(_objectSpread(_objectSpread({}, preItem.style), style), {}, {\n transition: transition\n });\n return [].concat(_toConsumableArray(sequence), [newStyle, duration, onAnimationEnd]).filter(identity);\n };\n return this.manager.start([onAnimationStart].concat(_toConsumableArray(steps.reduce(addStyle, [initialStyle, Math.max(initialTime, begin)])), [props.onAnimationEnd]));\n }\n }, {\n key: \"runAnimation\",\n value: function runAnimation(props) {\n if (!this.manager) {\n this.manager = createAnimateManager();\n }\n var begin = props.begin,\n duration = props.duration,\n attributeName = props.attributeName,\n propsTo = props.to,\n easing = props.easing,\n onAnimationStart = props.onAnimationStart,\n onAnimationEnd = props.onAnimationEnd,\n steps = props.steps,\n children = props.children;\n var manager = this.manager;\n this.unSubscribe = manager.subscribe(this.handleStyleChange);\n if (typeof easing === 'function' || typeof children === 'function' || easing === 'spring') {\n this.runJSAnimation(props);\n return;\n }\n if (steps.length > 1) {\n this.runStepAnimation(props);\n return;\n }\n var to = attributeName ? _defineProperty({}, attributeName, propsTo) : propsTo;\n var transition = getTransitionVal(Object.keys(to), duration, easing);\n manager.start([onAnimationStart, begin, _objectSpread(_objectSpread({}, to), {}, {\n transition: transition\n }), duration, onAnimationEnd]);\n }\n }, {\n key: \"handleStyleChange\",\n value: function handleStyleChange(style) {\n this.changeStyle(style);\n }\n }, {\n key: \"changeStyle\",\n value: function changeStyle(style) {\n if (this.mounted) {\n this.setState({\n style: style\n });\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props4 = this.props,\n children = _this$props4.children,\n begin = _this$props4.begin,\n duration = _this$props4.duration,\n attributeName = _this$props4.attributeName,\n easing = _this$props4.easing,\n isActive = _this$props4.isActive,\n steps = _this$props4.steps,\n from = _this$props4.from,\n to = _this$props4.to,\n canBegin = _this$props4.canBegin,\n onAnimationEnd = _this$props4.onAnimationEnd,\n shouldReAnimate = _this$props4.shouldReAnimate,\n onAnimationReStart = _this$props4.onAnimationReStart,\n others = _objectWithoutProperties(_this$props4, [\"children\", \"begin\", \"duration\", \"attributeName\", \"easing\", \"isActive\", \"steps\", \"from\", \"to\", \"canBegin\", \"onAnimationEnd\", \"shouldReAnimate\", \"onAnimationReStart\"]);\n var count = Children.count(children);\n var stateStyle = translateStyle(this.state.style);\n if (typeof children === 'function') {\n return children(stateStyle);\n }\n if (!isActive || count === 0) {\n return children;\n }\n var cloneContainer = function cloneContainer(container) {\n var _container$props = container.props,\n _container$props$styl = _container$props.style,\n style = _container$props$styl === void 0 ? {} : _container$props$styl,\n className = _container$props.className;\n var res = /*#__PURE__*/cloneElement(container, _objectSpread(_objectSpread({}, others), {}, {\n style: _objectSpread(_objectSpread({}, style), stateStyle),\n className: className\n }));\n return res;\n };\n if (count === 1) {\n return cloneContainer(Children.only(children));\n }\n return /*#__PURE__*/React.createElement(\"div\", null, Children.map(children, function (child) {\n return cloneContainer(child);\n }));\n }\n }]);\n return Animate;\n}(PureComponent);\nAnimate.displayName = 'Animate';\nAnimate.defaultProps = {\n begin: 0,\n duration: 1000,\n from: '',\n to: '',\n attributeName: '',\n easing: 'ease',\n isActive: true,\n canBegin: true,\n steps: [],\n onAnimationEnd: function onAnimationEnd() {},\n onAnimationStart: function onAnimationStart() {}\n};\nexport default Animate;","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n}\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}\nfunction _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n return _possibleConstructorReturn(this, result);\n };\n}\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n return _assertThisInitialized(self);\n}\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}\nfunction _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\nimport React, { Component, Children } from 'react';\nimport { Transition } from 'react-transition-group';\nimport Animate from './Animate';\nif (Number.isFinite === undefined) {\n Number.isFinite = function (value) {\n return typeof value === 'number' && isFinite(value);\n };\n}\nvar parseDurationOfSingleTransition = function parseDurationOfSingleTransition() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var steps = options.steps,\n duration = options.duration;\n if (steps && steps.length) {\n return steps.reduce(function (result, entry) {\n return result + (Number.isFinite(entry.duration) && entry.duration > 0 ? entry.duration : 0);\n }, 0);\n }\n if (Number.isFinite(duration)) {\n return duration;\n }\n return 0;\n};\nvar AnimateGroupChild = /*#__PURE__*/function (_Component) {\n _inherits(AnimateGroupChild, _Component);\n var _super = _createSuper(AnimateGroupChild);\n function AnimateGroupChild() {\n var _this;\n _classCallCheck(this, AnimateGroupChild);\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n _this = _super.call.apply(_super, [this].concat(args));\n _this.state = {\n isActive: false\n };\n _this.handleEnter = function (node, isAppearing) {\n var _this$props = _this.props,\n appearOptions = _this$props.appearOptions,\n enterOptions = _this$props.enterOptions;\n _this.handleStyleActive(isAppearing ? appearOptions : enterOptions);\n };\n _this.handleExit = function () {\n _this.handleStyleActive(_this.props.leaveOptions);\n };\n return _this;\n }\n _createClass(AnimateGroupChild, [{\n key: \"handleStyleActive\",\n value: function handleStyleActive(style) {\n if (style) {\n var onAnimationEnd = style.onAnimationEnd ? function () {\n style.onAnimationEnd();\n } : null;\n this.setState(_objectSpread(_objectSpread({}, style), {}, {\n onAnimationEnd: onAnimationEnd,\n isActive: true\n }));\n }\n }\n }, {\n key: \"parseTimeout\",\n value: function parseTimeout() {\n var _this$props2 = this.props,\n appearOptions = _this$props2.appearOptions,\n enterOptions = _this$props2.enterOptions,\n leaveOptions = _this$props2.leaveOptions;\n return parseDurationOfSingleTransition(appearOptions) + parseDurationOfSingleTransition(enterOptions) + parseDurationOfSingleTransition(leaveOptions);\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this2 = this;\n var _this$props3 = this.props,\n children = _this$props3.children,\n appearOptions = _this$props3.appearOptions,\n enterOptions = _this$props3.enterOptions,\n leaveOptions = _this$props3.leaveOptions,\n props = _objectWithoutProperties(_this$props3, [\"children\", \"appearOptions\", \"enterOptions\", \"leaveOptions\"]);\n return /*#__PURE__*/React.createElement(Transition, _extends({}, props, {\n onEnter: this.handleEnter,\n onExit: this.handleExit,\n timeout: this.parseTimeout()\n }), function () {\n return /*#__PURE__*/React.createElement(Animate, _this2.state, Children.only(children));\n });\n }\n }]);\n return AnimateGroupChild;\n}(Component);\nexport default AnimateGroupChild;","import React, { Children } from 'react';\nimport { TransitionGroup } from 'react-transition-group';\nimport AnimateGroupChild from './AnimateGroupChild';\nfunction AnimateGroup(props) {\n var component = props.component,\n children = props.children,\n appear = props.appear,\n enter = props.enter,\n leave = props.leave;\n return /*#__PURE__*/React.createElement(TransitionGroup, {\n component: component\n }, Children.map(children, function (child, index) {\n return /*#__PURE__*/React.createElement(AnimateGroupChild, {\n appearOptions: appear,\n enterOptions: enter,\n leaveOptions: leave,\n key: \"child-\".concat(index) // eslint-disable-line\n }, child);\n }));\n}\nAnimateGroup.defaultProps = {\n component: 'span'\n};\nexport default AnimateGroup;","import Animate from './Animate';\nimport { configBezier, configSpring } from './easing';\nimport { translateStyle } from './util';\nimport AnimateGroup from './AnimateGroup';\nexport { configSpring, configBezier, AnimateGroup, translateStyle };\nexport default Animate;","import _get from \"lodash/get\";\nimport _isArray from \"lodash/isArray\";\nimport _isNaN from \"lodash/isNaN\";\nimport _isNumber from \"lodash/isNumber\";\nimport _isString from \"lodash/isString\";\nexport var mathSign = function mathSign(value) {\n if (value === 0) {\n return 0;\n }\n if (value > 0) {\n return 1;\n }\n return -1;\n};\nexport var isPercent = function isPercent(value) {\n return _isString(value) && value.indexOf('%') === value.length - 1;\n};\nexport var isNumber = function isNumber(value) {\n return _isNumber(value) && !_isNaN(value);\n};\nexport var isNumOrStr = function isNumOrStr(value) {\n return isNumber(value) || _isString(value);\n};\nvar idCounter = 0;\nexport var uniqueId = function uniqueId(prefix) {\n var id = ++idCounter;\n return \"\".concat(prefix || '').concat(id);\n};\n/**\n * Get percent value of a total value\n * @param {Number|String} percent A percent\n * @param {Number} totalValue Total value\n * @param {NUmber} defaultValue The value returned when percent is undefined or invalid\n * @param {Boolean} validate If set to be true, the result will be validated\n * @return {Number} value\n */\n\nexport var getPercentValue = function getPercentValue(percent, totalValue) {\n var defaultValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var validate = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n if (!isNumber(percent) && !_isString(percent)) {\n return defaultValue;\n }\n var value;\n if (isPercent(percent)) {\n var index = percent.indexOf('%');\n value = totalValue * parseFloat(percent.slice(0, index)) / 100;\n } else {\n value = +percent;\n }\n if (_isNaN(value)) {\n value = defaultValue;\n }\n if (validate && value > totalValue) {\n value = totalValue;\n }\n return value;\n};\nexport var getAnyElementOfObject = function getAnyElementOfObject(obj) {\n if (!obj) {\n return null;\n }\n var keys = Object.keys(obj);\n if (keys && keys.length) {\n return obj[keys[0]];\n }\n return null;\n};\nexport var hasDuplicate = function hasDuplicate(ary) {\n if (!_isArray(ary)) {\n return false;\n }\n var len = ary.length;\n var cache = {};\n for (var i = 0; i < len; i++) {\n if (!cache[ary[i]]) {\n cache[ary[i]] = true;\n } else {\n return true;\n }\n }\n return false;\n};\nexport var interpolateNumber = function interpolateNumber(numberA, numberB) {\n if (isNumber(numberA) && isNumber(numberB)) {\n return function (t) {\n return numberA + t * (numberB - numberA);\n };\n }\n return function () {\n return numberB;\n };\n};\nexport function findEntryInArray(ary, specifiedKey, specifiedValue) {\n if (!ary || !ary.length) {\n return null;\n }\n return ary.find(function (entry) {\n return entry && (typeof specifiedKey === 'function' ? specifiedKey(entry) : _get(entry, specifiedKey)) === specifiedValue;\n });\n}\n/**\n * The least square linear regression\n * @param {Array} data The array of points\n * @returns {Object} The domain of x, and the parameter of linear function\n */\n\nexport var getLinearRegression = function getLinearRegression(data) {\n if (!data || !data.length) {\n return null;\n }\n var len = data.length;\n var xsum = 0;\n var ysum = 0;\n var xysum = 0;\n var xxsum = 0;\n var xmin = Infinity;\n var xmax = -Infinity;\n var xcurrent = 0;\n var ycurrent = 0;\n for (var i = 0; i < len; i++) {\n xcurrent = data[i].cx || 0;\n ycurrent = data[i].cy || 0;\n xsum += xcurrent;\n ysum += ycurrent;\n xysum += xcurrent * ycurrent;\n xxsum += xcurrent * xcurrent;\n xmin = Math.min(xmin, xcurrent);\n xmax = Math.max(xmax, xcurrent);\n }\n var a = len * xxsum !== xsum * xsum ? (len * xysum - xsum * ysum) / (len * xxsum - xsum * xsum) : 0;\n return {\n xmin: xmin,\n xmax: xmax,\n a: a,\n b: (ysum - a * xsum) / len\n };\n};","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nimport _isNil from \"lodash/isNil\";\nimport _sortBy from \"lodash/sortBy\";\nimport _isArray from \"lodash/isArray\";\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n}\nfunction _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n return _arr;\n}\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n}\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}\nfunction _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n return _possibleConstructorReturn(this, result);\n };\n}\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n return _assertThisInitialized(self);\n}\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}\nfunction _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\nimport React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport { isNumOrStr } from '../util/DataUtils';\nfunction defaultFormatter(value) {\n return _isArray(value) && isNumOrStr(value[0]) && isNumOrStr(value[1]) ? value.join(' ~ ') : value;\n}\nexport var DefaultTooltipContent = /*#__PURE__*/function (_PureComponent) {\n _inherits(DefaultTooltipContent, _PureComponent);\n var _super = _createSuper(DefaultTooltipContent);\n function DefaultTooltipContent() {\n _classCallCheck(this, DefaultTooltipContent);\n return _super.apply(this, arguments);\n }\n _createClass(DefaultTooltipContent, [{\n key: \"renderContent\",\n value: function renderContent() {\n var _this$props = this.props,\n payload = _this$props.payload,\n separator = _this$props.separator,\n formatter = _this$props.formatter,\n itemStyle = _this$props.itemStyle,\n itemSorter = _this$props.itemSorter;\n if (payload && payload.length) {\n var listStyle = {\n padding: 0,\n margin: 0\n };\n var items = (itemSorter ? _sortBy(payload, itemSorter) : payload).map(function (entry, i) {\n if (entry.type === 'none') {\n return null;\n }\n var finalItemStyle = _objectSpread({\n display: 'block',\n paddingTop: 4,\n paddingBottom: 4,\n color: entry.color || '#000'\n }, itemStyle);\n var finalFormatter = entry.formatter || formatter || defaultFormatter;\n var value = entry.value,\n name = entry.name;\n if (finalFormatter && value != null && name != null) {\n var formatted = finalFormatter(value, name, entry, i, payload);\n if (Array.isArray(formatted)) {\n var _ref = formatted;\n var _ref2 = _slicedToArray(_ref, 2);\n value = _ref2[0];\n name = _ref2[1];\n } else {\n value = formatted;\n }\n }\n return /*#__PURE__*/(\n // eslint-disable-next-line react/no-array-index-key\n React.createElement(\"li\", {\n className: \"recharts-tooltip-item\",\n key: \"tooltip-item-\".concat(i),\n style: finalItemStyle\n }, isNumOrStr(name) ? /*#__PURE__*/React.createElement(\"span\", {\n className: \"recharts-tooltip-item-name\"\n }, name) : null, isNumOrStr(name) ? /*#__PURE__*/React.createElement(\"span\", {\n className: \"recharts-tooltip-item-separator\"\n }, separator) : null, /*#__PURE__*/React.createElement(\"span\", {\n className: \"recharts-tooltip-item-value\"\n }, value), /*#__PURE__*/React.createElement(\"span\", {\n className: \"recharts-tooltip-item-unit\"\n }, entry.unit || ''))\n );\n });\n return /*#__PURE__*/React.createElement(\"ul\", {\n className: \"recharts-tooltip-item-list\",\n style: listStyle\n }, items);\n }\n return null;\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props2 = this.props,\n wrapperClassName = _this$props2.wrapperClassName,\n contentStyle = _this$props2.contentStyle,\n labelClassName = _this$props2.labelClassName,\n labelStyle = _this$props2.labelStyle,\n label = _this$props2.label,\n labelFormatter = _this$props2.labelFormatter,\n payload = _this$props2.payload;\n var finalStyle = _objectSpread({\n margin: 0,\n padding: 10,\n backgroundColor: '#fff',\n border: '1px solid #ccc',\n whiteSpace: 'nowrap'\n }, contentStyle);\n var finalLabelStyle = _objectSpread({\n margin: 0\n }, labelStyle);\n var hasLabel = !_isNil(label);\n var finalLabel = hasLabel ? label : '';\n var wrapperCN = classNames('recharts-default-tooltip', wrapperClassName);\n var labelCN = classNames('recharts-tooltip-label', labelClassName);\n if (hasLabel && labelFormatter && payload !== undefined && payload !== null) {\n finalLabel = labelFormatter(label, payload);\n }\n return /*#__PURE__*/React.createElement(\"div\", {\n className: wrapperCN,\n style: finalStyle\n }, /*#__PURE__*/React.createElement(\"p\", {\n className: labelCN,\n style: finalLabelStyle\n }, /*#__PURE__*/React.isValidElement(finalLabel) ? finalLabel : \"\".concat(finalLabel)), this.renderContent());\n }\n }]);\n return DefaultTooltipContent;\n}(PureComponent);\nDefaultTooltipContent.displayName = 'DefaultTooltipContent';\nDefaultTooltipContent.defaultProps = {\n separator: ' : ',\n contentStyle: {},\n itemStyle: {},\n labelStyle: {}\n};","var parseIsSsrByDefault = function parseIsSsrByDefault() {\n return !(typeof window !== 'undefined' && window.document && window.document.createElement && window.setTimeout);\n};\nexport var Global = {\n isSsr: parseIsSsrByDefault(),\n get: function get(key) {\n return Global[key];\n },\n set: function set(key, value) {\n if (typeof key === 'string') {\n Global[key] = value;\n } else {\n var keys = Object.keys(key);\n if (keys && keys.length) {\n keys.forEach(function (k) {\n Global[k] = key[k];\n });\n }\n }\n }\n};","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nimport _isNil from \"lodash/isNil\";\nimport _isFunction from \"lodash/isFunction\";\nimport _uniqBy from \"lodash/uniqBy\";\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n}\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}\nfunction _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n return _possibleConstructorReturn(this, result);\n };\n}\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n return _assertThisInitialized(self);\n}\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}\nfunction _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\n/**\n * @fileOverview Tooltip\n */\nimport React, { PureComponent } from 'react';\nimport { translateStyle } from 'react-smooth';\nimport classNames from 'classnames';\nimport { DefaultTooltipContent } from './DefaultTooltipContent';\nimport { Global } from '../util/Global';\nimport { isNumber } from '../util/DataUtils';\nvar CLS_PREFIX = 'recharts-tooltip-wrapper';\nvar EPS = 1;\nfunction defaultUniqBy(entry) {\n return entry.dataKey;\n}\nfunction getUniqPayload(option, payload) {\n if (option === true) {\n return _uniqBy(payload, defaultUniqBy);\n }\n if (_isFunction(option)) {\n return _uniqBy(payload, option);\n }\n return payload;\n}\nfunction renderContent(content, props) {\n if ( /*#__PURE__*/React.isValidElement(content)) {\n return /*#__PURE__*/React.cloneElement(content, props);\n }\n if (_isFunction(content)) {\n return /*#__PURE__*/React.createElement(content, props);\n }\n return /*#__PURE__*/React.createElement(DefaultTooltipContent, props);\n}\nexport var Tooltip = /*#__PURE__*/function (_PureComponent) {\n _inherits(Tooltip, _PureComponent);\n var _super = _createSuper(Tooltip);\n function Tooltip() {\n var _this;\n _classCallCheck(this, Tooltip);\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n _this = _super.call.apply(_super, [this].concat(args));\n _this.state = {\n boxWidth: -1,\n boxHeight: -1,\n dismissed: false,\n dismissedAtCoordinate: {\n x: 0,\n y: 0\n }\n };\n _this.wrapperNode = void 0;\n _this.getTranslate = function (_ref) {\n var key = _ref.key,\n tooltipDimension = _ref.tooltipDimension,\n viewBoxDimension = _ref.viewBoxDimension;\n var _this$props = _this.props,\n allowEscapeViewBox = _this$props.allowEscapeViewBox,\n coordinate = _this$props.coordinate,\n offset = _this$props.offset,\n position = _this$props.position,\n viewBox = _this$props.viewBox;\n if (position && isNumber(position[key])) {\n return position[key];\n }\n var restricted = coordinate[key] - tooltipDimension - offset;\n var unrestricted = coordinate[key] + offset;\n if (allowEscapeViewBox[key]) {\n return unrestricted;\n }\n var tooltipBoundary = coordinate[key] + tooltipDimension + offset;\n var viewBoxBoundary = viewBox[key] + viewBoxDimension;\n if (tooltipBoundary > viewBoxBoundary) {\n return Math.max(restricted, viewBox[key]);\n }\n return Math.max(unrestricted, viewBox[key]);\n };\n return _this;\n }\n _createClass(Tooltip, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n this.updateBBox();\n }\n }, {\n key: \"componentDidUpdate\",\n value: function componentDidUpdate() {\n this.updateBBox();\n }\n }, {\n key: \"updateBBox\",\n value: function updateBBox() {\n var _this$state = this.state,\n boxWidth = _this$state.boxWidth,\n boxHeight = _this$state.boxHeight,\n dismissed = _this$state.dismissed;\n if (dismissed) {\n this.wrapperNode.blur();\n if (this.props.coordinate.x !== this.state.dismissedAtCoordinate.x || this.props.coordinate.y !== this.state.dismissedAtCoordinate.y) {\n this.setState({\n dismissed: false\n });\n }\n } else {\n this.wrapperNode.focus({\n preventScroll: true\n });\n }\n if (this.wrapperNode && this.wrapperNode.getBoundingClientRect) {\n var box = this.wrapperNode.getBoundingClientRect();\n if (Math.abs(box.width - boxWidth) > EPS || Math.abs(box.height - boxHeight) > EPS) {\n this.setState({\n boxWidth: box.width,\n boxHeight: box.height\n });\n }\n } else if (boxWidth !== -1 || boxHeight !== -1) {\n this.setState({\n boxWidth: -1,\n boxHeight: -1\n });\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n var _classNames,\n _this2 = this;\n var _this$props2 = this.props,\n payload = _this$props2.payload,\n isAnimationActive = _this$props2.isAnimationActive,\n animationDuration = _this$props2.animationDuration,\n animationEasing = _this$props2.animationEasing,\n filterNull = _this$props2.filterNull,\n payloadUniqBy = _this$props2.payloadUniqBy;\n var finalPayload = getUniqPayload(payloadUniqBy, filterNull && payload && payload.length ? payload.filter(function (entry) {\n return !_isNil(entry.value);\n }) : payload);\n var hasPayload = finalPayload && finalPayload.length;\n var _this$props3 = this.props,\n content = _this$props3.content,\n viewBox = _this$props3.viewBox,\n coordinate = _this$props3.coordinate,\n position = _this$props3.position,\n active = _this$props3.active,\n wrapperStyle = _this$props3.wrapperStyle;\n var outerStyle = _objectSpread({\n pointerEvents: 'none',\n visibility: !this.state.dismissed && active && hasPayload ? 'visible' : 'hidden',\n position: 'absolute',\n top: 0,\n left: 0\n }, wrapperStyle);\n var translateX, translateY;\n if (position && isNumber(position.x) && isNumber(position.y)) {\n translateX = position.x;\n translateY = position.y;\n } else {\n var _this$state2 = this.state,\n boxWidth = _this$state2.boxWidth,\n boxHeight = _this$state2.boxHeight;\n if (boxWidth > 0 && boxHeight > 0 && coordinate) {\n translateX = this.getTranslate({\n key: 'x',\n tooltipDimension: boxWidth,\n viewBoxDimension: viewBox.width\n });\n translateY = this.getTranslate({\n key: 'y',\n tooltipDimension: boxHeight,\n viewBoxDimension: viewBox.height\n });\n } else {\n outerStyle.visibility = 'hidden';\n }\n }\n outerStyle = _objectSpread(_objectSpread({}, translateStyle({\n transform: this.props.useTranslate3d ? \"translate3d(\".concat(translateX, \"px, \").concat(translateY, \"px, 0)\") : \"translate(\".concat(translateX, \"px, \").concat(translateY, \"px)\")\n })), outerStyle);\n if (isAnimationActive && active) {\n outerStyle = _objectSpread(_objectSpread({}, translateStyle({\n transition: \"transform \".concat(animationDuration, \"ms \").concat(animationEasing)\n })), outerStyle);\n }\n var cls = classNames(CLS_PREFIX, (_classNames = {}, _defineProperty(_classNames, \"\".concat(CLS_PREFIX, \"-right\"), isNumber(translateX) && coordinate && isNumber(coordinate.x) && translateX >= coordinate.x), _defineProperty(_classNames, \"\".concat(CLS_PREFIX, \"-left\"), isNumber(translateX) && coordinate && isNumber(coordinate.x) && translateX < coordinate.x), _defineProperty(_classNames, \"\".concat(CLS_PREFIX, \"-bottom\"), isNumber(translateY) && coordinate && isNumber(coordinate.y) && translateY >= coordinate.y), _defineProperty(_classNames, \"\".concat(CLS_PREFIX, \"-top\"), isNumber(translateY) && coordinate && isNumber(coordinate.y) && translateY < coordinate.y), _classNames));\n return /*#__PURE__*/(\n // ESLint is disabled to allow listening to the `Escape` key. Refer to\n // https://github.com/recharts/recharts/pull/2925\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions\n React.createElement(\"div\", {\n tabIndex: -1,\n role: \"dialog\",\n onKeyDown: function onKeyDown(event) {\n if (event.key === 'Escape') {\n _this2.setState({\n dismissed: true,\n dismissedAtCoordinate: _objectSpread(_objectSpread({}, _this2.state.dismissedAtCoordinate), {}, {\n x: _this2.props.coordinate.x,\n y: _this2.props.coordinate.y\n })\n });\n }\n },\n className: cls,\n style: outerStyle,\n ref: function ref(node) {\n _this2.wrapperNode = node;\n }\n }, renderContent(content, _objectSpread(_objectSpread({}, this.props), {}, {\n payload: finalPayload\n })))\n );\n }\n }]);\n return Tooltip;\n}(PureComponent);\nTooltip.displayName = 'Tooltip';\nTooltip.defaultProps = {\n active: false,\n allowEscapeViewBox: {\n x: false,\n y: false\n },\n offset: 10,\n viewBox: {\n x1: 0,\n x2: 0,\n y1: 0,\n y2: 0\n },\n coordinate: {\n x: 0,\n y: 0\n },\n cursorStyle: {},\n separator: ' : ',\n wrapperStyle: {},\n contentStyle: {},\n itemStyle: {},\n labelStyle: {},\n cursor: true,\n trigger: 'hover',\n isAnimationActive: !Global.isSsr,\n animationEasing: 'ease',\n animationDuration: 400,\n filterNull: true,\n useTranslate3d: false\n};","export var abs = Math.abs;\nexport var atan2 = Math.atan2;\nexport var cos = Math.cos;\nexport var max = Math.max;\nexport var min = Math.min;\nexport var sin = Math.sin;\nexport var sqrt = Math.sqrt;\nexport var epsilon = 1e-12;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var tau = 2 * pi;\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\nexport function asin(x) {\n return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}","import { pi, tau } from \"../math.js\";\nexport default {\n draw: function draw(context, size) {\n var r = Math.sqrt(size / pi);\n context.moveTo(r, 0);\n context.arc(0, 0, r, 0, tau);\n }\n};","export default {\n draw: function draw(context, size) {\n var r = Math.sqrt(size / 5) / 2;\n context.moveTo(-3 * r, -r);\n context.lineTo(-r, -r);\n context.lineTo(-r, -3 * r);\n context.lineTo(r, -3 * r);\n context.lineTo(r, -r);\n context.lineTo(3 * r, -r);\n context.lineTo(3 * r, r);\n context.lineTo(r, r);\n context.lineTo(r, 3 * r);\n context.lineTo(-r, 3 * r);\n context.lineTo(-r, r);\n context.lineTo(-3 * r, r);\n context.closePath();\n }\n};","var tan30 = Math.sqrt(1 / 3),\n tan30_2 = tan30 * 2;\nexport default {\n draw: function draw(context, size) {\n var y = Math.sqrt(size / tan30_2),\n x = y * tan30;\n context.moveTo(0, -y);\n context.lineTo(x, 0);\n context.lineTo(0, y);\n context.lineTo(-x, 0);\n context.closePath();\n }\n};","export default {\n draw: function draw(context, size) {\n var w = Math.sqrt(size),\n x = -w / 2;\n context.rect(x, x, w, w);\n }\n};","import { pi, tau } from \"../math.js\";\nvar ka = 0.89081309152928522810,\n kr = Math.sin(pi / 10) / Math.sin(7 * pi / 10),\n kx = Math.sin(tau / 10) * kr,\n ky = -Math.cos(tau / 10) * kr;\nexport default {\n draw: function draw(context, size) {\n var r = Math.sqrt(size * ka),\n x = kx * r,\n y = ky * r;\n context.moveTo(0, -r);\n context.lineTo(x, y);\n for (var i = 1; i < 5; ++i) {\n var a = tau * i / 5,\n c = Math.cos(a),\n s = Math.sin(a);\n context.lineTo(s * r, -c * r);\n context.lineTo(c * x - s * y, s * x + c * y);\n }\n context.closePath();\n }\n};","var sqrt3 = Math.sqrt(3);\nexport default {\n draw: function draw(context, size) {\n var y = -Math.sqrt(size / (sqrt3 * 3));\n context.moveTo(0, y * 2);\n context.lineTo(-sqrt3 * y, -y);\n context.lineTo(sqrt3 * y, -y);\n context.closePath();\n }\n};","var c = -0.5,\n s = Math.sqrt(3) / 2,\n k = 1 / Math.sqrt(12),\n a = (k / 2 + 1) * 3;\nexport default {\n draw: function draw(context, size) {\n var r = Math.sqrt(size / a),\n x0 = r / 2,\n y0 = r * k,\n x1 = x0,\n y1 = r * k + r,\n x2 = -x1,\n y2 = y1;\n context.moveTo(x0, y0);\n context.lineTo(x1, y1);\n context.lineTo(x2, y2);\n context.lineTo(c * x0 - s * y0, s * x0 + c * y0);\n context.lineTo(c * x1 - s * y1, s * x1 + c * y1);\n context.lineTo(c * x2 - s * y2, s * x2 + c * y2);\n context.lineTo(c * x0 + s * y0, c * y0 - s * x0);\n context.lineTo(c * x1 + s * y1, c * y1 - s * x1);\n context.lineTo(c * x2 + s * y2, c * y2 - s * x2);\n context.closePath();\n }\n};","var pi = Math.PI,\n tau = 2 * pi,\n epsilon = 1e-6,\n tauEpsilon = tau - epsilon;\nfunction Path() {\n this._x0 = this._y0 =\n // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n}\nfunction path() {\n return new Path();\n}\nPath.prototype = path.prototype = {\n constructor: Path,\n moveTo: function moveTo(x, y) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y);\n },\n closePath: function closePath() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._ += \"Z\";\n }\n },\n lineTo: function lineTo(x, y) {\n this._ += \"L\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n quadraticCurveTo: function quadraticCurveTo(x1, y1, x, y) {\n this._ += \"Q\" + +x1 + \",\" + +y1 + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n bezierCurveTo: function bezierCurveTo(x1, y1, x2, y2, x, y) {\n this._ += \"C\" + +x1 + \",\" + +y1 + \",\" + +x2 + \",\" + +y2 + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n arcTo: function arcTo(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n var x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._ += \"M\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon)) ;\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._ += \"L\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Otherwise, draw an arc!\n else {\n var x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._ += \"L\" + (x1 + t01 * x01) + \",\" + (y1 + t01 * y01);\n }\n this._ += \"A\" + r + \",\" + r + \",0,0,\" + +(y01 * x20 > x01 * y20) + \",\" + (this._x1 = x1 + t21 * x21) + \",\" + (this._y1 = y1 + t21 * y21);\n }\n },\n arc: function arc(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r, ccw = !!ccw;\n var dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._ += \"M\" + x0 + \",\" + y0;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._ += \"L\" + x0 + \",\" + y0;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % tau + tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (x - dx) + \",\" + (y - dy) + \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (this._x1 = x0) + \",\" + (this._y1 = y0);\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,\" + +(da >= pi) + \",\" + cw + \",\" + (this._x1 = x + r * Math.cos(a1)) + \",\" + (this._y1 = y + r * Math.sin(a1));\n }\n },\n rect: function rect(x, y, w, h) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y) + \"h\" + +w + \"v\" + +h + \"h\" + -w + \"Z\";\n },\n toString: function toString() {\n return this._;\n }\n};\nexport default path;","export default function (x) {\n return function constant() {\n return x;\n };\n}","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nimport _upperFirst from \"lodash/upperFirst\";\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n}\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}\nfunction _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n return _possibleConstructorReturn(this, result);\n };\n}\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n return _assertThisInitialized(self);\n}\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}\nfunction _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\n/**\n * @fileOverview Curve\n */\nimport React, { PureComponent } from 'react';\nimport { symbol as shapeSymbol, symbolCircle, symbolCross, symbolDiamond, symbolSquare, symbolStar, symbolTriangle, symbolWye } from 'd3-shape';\nimport classNames from 'classnames';\nimport { filterProps } from '../util/types';\nvar symbolFactories = {\n symbolCircle: symbolCircle,\n symbolCross: symbolCross,\n symbolDiamond: symbolDiamond,\n symbolSquare: symbolSquare,\n symbolStar: symbolStar,\n symbolTriangle: symbolTriangle,\n symbolWye: symbolWye\n};\nvar RADIAN = Math.PI / 180;\nvar getSymbolFactory = function getSymbolFactory(type) {\n var name = \"symbol\".concat(_upperFirst(type));\n return symbolFactories[name] || symbolCircle;\n};\nvar calculateAreaSize = function calculateAreaSize(size, sizeType, type) {\n if (sizeType === 'area') {\n return size;\n }\n switch (type) {\n case 'cross':\n return 5 * size * size / 9;\n case 'diamond':\n return 0.5 * size * size / Math.sqrt(3);\n case 'square':\n return size * size;\n case 'star':\n {\n var angle = 18 * RADIAN;\n return 1.25 * size * size * (Math.tan(angle) - Math.tan(angle * 2) * Math.pow(Math.tan(angle), 2));\n }\n case 'triangle':\n return Math.sqrt(3) * size * size / 4;\n case 'wye':\n return (21 - 10 * Math.sqrt(3)) * size * size / 8;\n default:\n return Math.PI * size * size / 4;\n }\n};\nexport var Symbols = /*#__PURE__*/function (_PureComponent) {\n _inherits(Symbols, _PureComponent);\n var _super = _createSuper(Symbols);\n function Symbols() {\n _classCallCheck(this, Symbols);\n return _super.apply(this, arguments);\n }\n _createClass(Symbols, [{\n key: \"getPath\",\n value:\n /**\n * Calculate the path of curve\n * @return {String} path\n */\n function getPath() {\n var _this$props = this.props,\n size = _this$props.size,\n sizeType = _this$props.sizeType,\n type = _this$props.type;\n var symbolFactory = getSymbolFactory(type);\n var symbol = shapeSymbol().type(symbolFactory).size(calculateAreaSize(size, sizeType, type));\n return symbol();\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props2 = this.props,\n className = _this$props2.className,\n cx = _this$props2.cx,\n cy = _this$props2.cy,\n size = _this$props2.size;\n if (cx === +cx && cy === +cy && size === +size) {\n return /*#__PURE__*/React.createElement(\"path\", _extends({}, filterProps(this.props, true), {\n className: classNames('recharts-symbols', className),\n transform: \"translate(\".concat(cx, \", \").concat(cy, \")\"),\n d: this.getPath()\n }));\n }\n return null;\n }\n }]);\n return Symbols;\n}(PureComponent);\nSymbols.defaultProps = {\n type: 'circle',\n size: 64,\n sizeType: 'area'\n};\nSymbols.registerSymbol = function (key, factory) {\n symbolFactories[\"symbol\".concat(_upperFirst(key))] = factory;\n};","import { path } from \"d3-path\";\nimport circle from \"./symbol/circle.js\";\nimport cross from \"./symbol/cross.js\";\nimport diamond from \"./symbol/diamond.js\";\nimport star from \"./symbol/star.js\";\nimport square from \"./symbol/square.js\";\nimport triangle from \"./symbol/triangle.js\";\nimport wye from \"./symbol/wye.js\";\nimport constant from \"./constant.js\";\nexport var symbols = [circle, cross, diamond, square, star, triangle, wye];\nexport default function (type, size) {\n var context = null;\n type = typeof type === \"function\" ? type : constant(type || circle);\n size = typeof size === \"function\" ? size : constant(size === undefined ? 64 : +size);\n function symbol() {\n var buffer;\n if (!context) context = buffer = path();\n type.apply(this, arguments).draw(context, +size.apply(this, arguments));\n if (buffer) return context = null, buffer + \"\" || null;\n }\n symbol.type = function (_) {\n return arguments.length ? (type = typeof _ === \"function\" ? _ : constant(_), symbol) : type;\n };\n symbol.size = function (_) {\n return arguments.length ? (size = typeof _ === \"function\" ? _ : constant(+_), symbol) : size;\n };\n symbol.context = function (_) {\n return arguments.length ? (context = _ == null ? null : _, symbol) : context;\n };\n return symbol;\n}","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n}\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}\nfunction _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n return _possibleConstructorReturn(this, result);\n };\n}\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n return _assertThisInitialized(self);\n}\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}\nfunction _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\n/**\n * @fileOverview Default Legend Content\n */\nimport React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport { Surface } from '../container/Surface';\nimport { Symbols } from '../shape/Symbols';\nimport { adaptEventsOfChild } from '../util/types';\nvar SIZE = 32;\nexport var DefaultLegendContent = /*#__PURE__*/function (_PureComponent) {\n _inherits(DefaultLegendContent, _PureComponent);\n var _super = _createSuper(DefaultLegendContent);\n function DefaultLegendContent() {\n _classCallCheck(this, DefaultLegendContent);\n return _super.apply(this, arguments);\n }\n _createClass(DefaultLegendContent, [{\n key: \"renderIcon\",\n value:\n /**\n * Render the path of icon\n * @param {Object} data Data of each legend item\n * @return {String} Path element\n */\n function renderIcon(data) {\n var inactiveColor = this.props.inactiveColor;\n var halfSize = SIZE / 2;\n var sixthSize = SIZE / 6;\n var thirdSize = SIZE / 3;\n var color = data.inactive ? inactiveColor : data.color;\n if (data.type === 'plainline') {\n return /*#__PURE__*/React.createElement(\"line\", {\n strokeWidth: 4,\n fill: \"none\",\n stroke: color,\n strokeDasharray: data.payload.strokeDasharray,\n x1: 0,\n y1: halfSize,\n x2: SIZE,\n y2: halfSize,\n className: \"recharts-legend-icon\"\n });\n }\n if (data.type === 'line') {\n return /*#__PURE__*/React.createElement(\"path\", {\n strokeWidth: 4,\n fill: \"none\",\n stroke: color,\n d: \"M0,\".concat(halfSize, \"h\").concat(thirdSize, \"\\n A\").concat(sixthSize, \",\").concat(sixthSize, \",0,1,1,\").concat(2 * thirdSize, \",\").concat(halfSize, \"\\n H\").concat(SIZE, \"M\").concat(2 * thirdSize, \",\").concat(halfSize, \"\\n A\").concat(sixthSize, \",\").concat(sixthSize, \",0,1,1,\").concat(thirdSize, \",\").concat(halfSize),\n className: \"recharts-legend-icon\"\n });\n }\n if (data.type === 'rect') {\n return /*#__PURE__*/React.createElement(\"path\", {\n stroke: \"none\",\n fill: color,\n d: \"M0,\".concat(SIZE / 8, \"h\").concat(SIZE, \"v\").concat(SIZE * 3 / 4, \"h\").concat(-SIZE, \"z\"),\n className: \"recharts-legend-icon\"\n });\n }\n if ( /*#__PURE__*/React.isValidElement(data.legendIcon)) {\n var iconProps = _objectSpread({}, data);\n delete iconProps.legendIcon;\n return /*#__PURE__*/React.cloneElement(data.legendIcon, iconProps);\n }\n return /*#__PURE__*/React.createElement(Symbols, {\n fill: color,\n cx: halfSize,\n cy: halfSize,\n size: SIZE,\n sizeType: \"diameter\",\n type: data.type\n });\n }\n /**\n * Draw items of legend\n * @return {ReactElement} Items\n */\n }, {\n key: \"renderItems\",\n value: function renderItems() {\n var _this = this;\n var _this$props = this.props,\n payload = _this$props.payload,\n iconSize = _this$props.iconSize,\n layout = _this$props.layout,\n formatter = _this$props.formatter,\n inactiveColor = _this$props.inactiveColor;\n var viewBox = {\n x: 0,\n y: 0,\n width: SIZE,\n height: SIZE\n };\n var itemStyle = {\n display: layout === 'horizontal' ? 'inline-block' : 'block',\n marginRight: 10\n };\n var svgStyle = {\n display: 'inline-block',\n verticalAlign: 'middle',\n marginRight: 4\n };\n return payload.map(function (entry, i) {\n var _classNames;\n var finalFormatter = entry.formatter || formatter;\n var className = classNames((_classNames = {\n 'recharts-legend-item': true\n }, _defineProperty(_classNames, \"legend-item-\".concat(i), true), _defineProperty(_classNames, \"inactive\", entry.inactive), _classNames));\n if (entry.type === 'none') {\n return null;\n }\n var color = entry.inactive ? inactiveColor : entry.color;\n return /*#__PURE__*/React.createElement(\"li\", _extends({\n className: className,\n style: itemStyle,\n key: \"legend-item-\".concat(i) // eslint-disable-line react/no-array-index-key\n }, adaptEventsOfChild(_this.props, entry, i)), /*#__PURE__*/React.createElement(Surface, {\n width: iconSize,\n height: iconSize,\n viewBox: viewBox,\n style: svgStyle\n }, _this.renderIcon(entry)), /*#__PURE__*/React.createElement(\"span\", {\n className: \"recharts-legend-item-text\",\n style: {\n color: color\n }\n }, finalFormatter ? finalFormatter(entry.value, entry, i) : entry.value));\n });\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props2 = this.props,\n payload = _this$props2.payload,\n layout = _this$props2.layout,\n align = _this$props2.align;\n if (!payload || !payload.length) {\n return null;\n }\n var finalStyle = {\n padding: 0,\n margin: 0,\n textAlign: layout === 'horizontal' ? align : 'left'\n };\n return /*#__PURE__*/React.createElement(\"ul\", {\n className: \"recharts-default-legend\",\n style: finalStyle\n }, this.renderItems());\n }\n }]);\n return DefaultLegendContent;\n}(PureComponent);\nDefaultLegendContent.displayName = 'Legend';\nDefaultLegendContent.defaultProps = {\n iconSize: 14,\n layout: 'horizontal',\n align: 'center',\n verticalAlign: 'middle',\n inactiveColor: '#ccc'\n};","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nimport _isFunction from \"lodash/isFunction\";\nimport _uniqBy from \"lodash/uniqBy\";\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n}\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}\nfunction _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n return _possibleConstructorReturn(this, result);\n };\n}\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n return _assertThisInitialized(self);\n}\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}\nfunction _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\n\n/**\n * @fileOverview Legend\n */\nimport React, { PureComponent } from 'react';\nimport { DefaultLegendContent } from './DefaultLegendContent';\nimport { isNumber } from '../util/DataUtils';\nfunction defaultUniqBy(entry) {\n return entry.value;\n}\nfunction getUniqPayload(option, payload) {\n if (option === true) {\n return _uniqBy(payload, defaultUniqBy);\n }\n if (_isFunction(option)) {\n return _uniqBy(payload, option);\n }\n return payload;\n}\nfunction renderContent(content, props) {\n if ( /*#__PURE__*/React.isValidElement(content)) {\n return /*#__PURE__*/React.cloneElement(content, props);\n }\n if (_isFunction(content)) {\n return /*#__PURE__*/React.createElement(content, props);\n }\n var ref = props.ref,\n otherProps = _objectWithoutProperties(props, [\"ref\"]);\n return /*#__PURE__*/React.createElement(DefaultLegendContent, otherProps);\n}\nvar EPS = 1;\nexport var Legend = /*#__PURE__*/function (_PureComponent) {\n _inherits(Legend, _PureComponent);\n var _super = _createSuper(Legend);\n function Legend() {\n var _this;\n _classCallCheck(this, Legend);\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n _this = _super.call.apply(_super, [this].concat(args));\n _this.wrapperNode = void 0;\n _this.state = {\n boxWidth: -1,\n boxHeight: -1\n };\n return _this;\n }\n _createClass(Legend, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n this.updateBBox();\n }\n }, {\n key: \"componentDidUpdate\",\n value: function componentDidUpdate() {\n this.updateBBox();\n }\n }, {\n key: \"getBBox\",\n value: function getBBox() {\n if (this.wrapperNode && this.wrapperNode.getBoundingClientRect) {\n return this.wrapperNode.getBoundingClientRect();\n }\n return null;\n }\n }, {\n key: \"getBBoxSnapshot\",\n value: function getBBoxSnapshot() {\n var _this$state = this.state,\n boxWidth = _this$state.boxWidth,\n boxHeight = _this$state.boxHeight;\n if (boxWidth >= 0 && boxHeight >= 0) {\n return {\n width: boxWidth,\n height: boxHeight\n };\n }\n return null;\n }\n }, {\n key: \"getDefaultPosition\",\n value: function getDefaultPosition(style) {\n var _this$props = this.props,\n layout = _this$props.layout,\n align = _this$props.align,\n verticalAlign = _this$props.verticalAlign,\n margin = _this$props.margin,\n chartWidth = _this$props.chartWidth,\n chartHeight = _this$props.chartHeight;\n var hPos, vPos;\n if (!style || (style.left === undefined || style.left === null) && (style.right === undefined || style.right === null)) {\n if (align === 'center' && layout === 'vertical') {\n var _box = this.getBBoxSnapshot() || {\n width: 0\n };\n hPos = {\n left: ((chartWidth || 0) - _box.width) / 2\n };\n } else {\n hPos = align === 'right' ? {\n right: margin && margin.right || 0\n } : {\n left: margin && margin.left || 0\n };\n }\n }\n if (!style || (style.top === undefined || style.top === null) && (style.bottom === undefined || style.bottom === null)) {\n if (verticalAlign === 'middle') {\n var _box2 = this.getBBoxSnapshot() || {\n height: 0\n };\n vPos = {\n top: ((chartHeight || 0) - _box2.height) / 2\n };\n } else {\n vPos = verticalAlign === 'bottom' ? {\n bottom: margin && margin.bottom || 0\n } : {\n top: margin && margin.top || 0\n };\n }\n }\n return _objectSpread(_objectSpread({}, hPos), vPos);\n }\n }, {\n key: \"updateBBox\",\n value: function updateBBox() {\n var _this$state2 = this.state,\n boxWidth = _this$state2.boxWidth,\n boxHeight = _this$state2.boxHeight;\n var onBBoxUpdate = this.props.onBBoxUpdate;\n if (this.wrapperNode && this.wrapperNode.getBoundingClientRect) {\n var _box3 = this.wrapperNode.getBoundingClientRect();\n if (Math.abs(_box3.width - boxWidth) > EPS || Math.abs(_box3.height - boxHeight) > EPS) {\n this.setState({\n boxWidth: _box3.width,\n boxHeight: _box3.height\n }, function () {\n if (onBBoxUpdate) {\n onBBoxUpdate(_box3);\n }\n });\n }\n } else if (boxWidth !== -1 || boxHeight !== -1) {\n this.setState({\n boxWidth: -1,\n boxHeight: -1\n }, function () {\n if (onBBoxUpdate) {\n onBBoxUpdate(null);\n }\n });\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this2 = this;\n var _this$props2 = this.props,\n content = _this$props2.content,\n width = _this$props2.width,\n height = _this$props2.height,\n wrapperStyle = _this$props2.wrapperStyle,\n payloadUniqBy = _this$props2.payloadUniqBy,\n payload = _this$props2.payload;\n var outerStyle = _objectSpread(_objectSpread({\n position: 'absolute',\n width: width || 'auto',\n height: height || 'auto'\n }, this.getDefaultPosition(wrapperStyle)), wrapperStyle);\n return /*#__PURE__*/React.createElement(\"div\", {\n className: \"recharts-legend-wrapper\",\n style: outerStyle,\n ref: function ref(node) {\n _this2.wrapperNode = node;\n }\n }, renderContent(content, _objectSpread(_objectSpread({}, this.props), {}, {\n payload: getUniqPayload(payloadUniqBy, payload)\n })));\n }\n }], [{\n key: \"getWithHeight\",\n value: function getWithHeight(item, chartWidth) {\n var layout = item.props.layout;\n if (layout === 'vertical' && isNumber(item.props.height)) {\n return {\n height: item.props.height\n };\n }\n if (layout === 'horizontal') {\n return {\n width: item.props.width || chartWidth\n };\n }\n return null;\n }\n }]);\n return Legend;\n}(PureComponent);\nLegend.displayName = 'Legend';\nLegend.defaultProps = {\n iconSize: 14,\n layout: 'horizontal',\n align: 'center',\n verticalAlign: 'bottom'\n};","export default function () {}","function _point(that, x, y) {\n that._context.bezierCurveTo((2 * that._x0 + that._x1) / 3, (2 * that._y0 + that._y1) / 3, (that._x0 + 2 * that._x1) / 3, (that._y0 + 2 * that._y1) / 3, (that._x0 + 4 * that._x1 + x) / 6, (that._y0 + 4 * that._y1 + y) / 6);\n}\nexport { _point as point };\nexport function Basis(context) {\n this._context = context;\n}\nBasis.prototype = {\n areaStart: function areaStart() {\n this._line = 0;\n },\n areaEnd: function areaEnd() {\n this._line = NaN;\n },\n lineStart: function lineStart() {\n this._x0 = this._x1 = this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function lineEnd() {\n switch (this._point) {\n case 3:\n _point(this, this._x1, this._y1);\n // proceed\n case 2:\n this._context.lineTo(this._x1, this._y1);\n break;\n }\n if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function point(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0:\n this._point = 1;\n this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n break;\n case 1:\n this._point = 2;\n break;\n case 2:\n this._point = 3;\n this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6);\n // proceed\n default:\n _point(this, x, y);\n break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\nexport default function (context) {\n return new Basis(context);\n}","import noop from \"../noop.js\";\nimport { point as _point } from \"./basis.js\";\nfunction BasisClosed(context) {\n this._context = context;\n}\nBasisClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function lineStart() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;\n this._point = 0;\n },\n lineEnd: function lineEnd() {\n switch (this._point) {\n case 1:\n {\n this._context.moveTo(this._x2, this._y2);\n this._context.closePath();\n break;\n }\n case 2:\n {\n this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);\n this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);\n this._context.closePath();\n break;\n }\n case 3:\n {\n this.point(this._x2, this._y2);\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n break;\n }\n }\n },\n point: function point(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0:\n this._point = 1;\n this._x2 = x, this._y2 = y;\n break;\n case 1:\n this._point = 2;\n this._x3 = x, this._y3 = y;\n break;\n case 2:\n this._point = 3;\n this._x4 = x, this._y4 = y;\n this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6);\n break;\n default:\n _point(this, x, y);\n break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\nexport default function (context) {\n return new BasisClosed(context);\n}","import { point as _point } from \"./basis.js\";\nfunction BasisOpen(context) {\n this._context = context;\n}\nBasisOpen.prototype = {\n areaStart: function areaStart() {\n this._line = 0;\n },\n areaEnd: function areaEnd() {\n this._line = NaN;\n },\n lineStart: function lineStart() {\n this._x0 = this._x1 = this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function lineEnd() {\n if (this._line || this._line !== 0 && this._point === 3) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function point(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0:\n this._point = 1;\n break;\n case 1:\n this._point = 2;\n break;\n case 2:\n this._point = 3;\n var x0 = (this._x0 + 4 * this._x1 + x) / 6,\n y0 = (this._y0 + 4 * this._y1 + y) / 6;\n this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0);\n break;\n case 3:\n this._point = 4;\n // proceed\n default:\n _point(this, x, y);\n break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\nexport default function (context) {\n return new BasisOpen(context);\n}","import noop from \"../noop.js\";\nfunction LinearClosed(context) {\n this._context = context;\n}\nLinearClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function lineStart() {\n this._point = 0;\n },\n lineEnd: function lineEnd() {\n if (this._point) this._context.closePath();\n },\n point: function point(x, y) {\n x = +x, y = +y;\n if (this._point) this._context.lineTo(x, y);else this._point = 1, this._context.moveTo(x, y);\n }\n};\nexport default function (context) {\n return new LinearClosed(context);\n}","function Linear(context) {\n this._context = context;\n}\nLinear.prototype = {\n areaStart: function areaStart() {\n this._line = 0;\n },\n areaEnd: function areaEnd() {\n this._line = NaN;\n },\n lineStart: function lineStart() {\n this._point = 0;\n },\n lineEnd: function lineEnd() {\n if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function point(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0:\n this._point = 1;\n this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n break;\n case 1:\n this._point = 2;\n // proceed\n default:\n this._context.lineTo(x, y);\n break;\n }\n }\n};\nexport default function (context) {\n return new Linear(context);\n}","function sign(x) {\n return x < 0 ? -1 : 1;\n}\n\n// Calculate the slopes of the tangents (Hermite-type interpolation) based on\n// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\n// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\n// NOV(II), P. 443, 1990.\nfunction slope3(that, x2, y2) {\n var h0 = that._x1 - that._x0,\n h1 = x2 - that._x1,\n s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),\n s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),\n p = (s0 * h1 + s1 * h0) / (h0 + h1);\n return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n}\n\n// Calculate a one-sided slope.\nfunction slope2(that, t) {\n var h = that._x1 - that._x0;\n return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n}\n\n// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\n// \"you can express cubic Hermite interpolation in terms of cubic Bézier curves\n// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1\".\nfunction _point(that, t0, t1) {\n var x0 = that._x0,\n y0 = that._y0,\n x1 = that._x1,\n y1 = that._y1,\n dx = (x1 - x0) / 3;\n that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n}\nfunction MonotoneX(context) {\n this._context = context;\n}\nMonotoneX.prototype = {\n areaStart: function areaStart() {\n this._line = 0;\n },\n areaEnd: function areaEnd() {\n this._line = NaN;\n },\n lineStart: function lineStart() {\n this._x0 = this._x1 = this._y0 = this._y1 = this._t0 = NaN;\n this._point = 0;\n },\n lineEnd: function lineEnd() {\n switch (this._point) {\n case 2:\n this._context.lineTo(this._x1, this._y1);\n break;\n case 3:\n _point(this, this._t0, slope2(this, this._t0));\n break;\n }\n if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function point(x, y) {\n var t1 = NaN;\n x = +x, y = +y;\n if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n switch (this._point) {\n case 0:\n this._point = 1;\n this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n break;\n case 1:\n this._point = 2;\n break;\n case 2:\n this._point = 3;\n _point(this, slope2(this, t1 = slope3(this, x, y)), t1);\n break;\n default:\n _point(this, this._t0, t1 = slope3(this, x, y));\n break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n this._t0 = t1;\n }\n};\nfunction MonotoneY(context) {\n this._context = new ReflectContext(context);\n}\n(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function (x, y) {\n MonotoneX.prototype.point.call(this, y, x);\n};\nfunction ReflectContext(context) {\n this._context = context;\n}\nReflectContext.prototype = {\n moveTo: function moveTo(x, y) {\n this._context.moveTo(y, x);\n },\n closePath: function closePath() {\n this._context.closePath();\n },\n lineTo: function lineTo(x, y) {\n this._context.lineTo(y, x);\n },\n bezierCurveTo: function bezierCurveTo(x1, y1, x2, y2, x, y) {\n this._context.bezierCurveTo(y1, x1, y2, x2, y, x);\n }\n};\nexport function monotoneX(context) {\n return new MonotoneX(context);\n}\nexport function monotoneY(context) {\n return new MonotoneY(context);\n}","function Natural(context) {\n this._context = context;\n}\nNatural.prototype = {\n areaStart: function areaStart() {\n this._line = 0;\n },\n areaEnd: function areaEnd() {\n this._line = NaN;\n },\n lineStart: function lineStart() {\n this._x = [];\n this._y = [];\n },\n lineEnd: function lineEnd() {\n var x = this._x,\n y = this._y,\n n = x.length;\n if (n) {\n this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);\n if (n === 2) {\n this._context.lineTo(x[1], y[1]);\n } else {\n var px = controlPoints(x),\n py = controlPoints(y);\n for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {\n this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);\n }\n }\n }\n if (this._line || this._line !== 0 && n === 1) this._context.closePath();\n this._line = 1 - this._line;\n this._x = this._y = null;\n },\n point: function point(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\n// See https://www.particleincell.com/2012/bezier-splines/ for derivation.\nfunction controlPoints(x) {\n var i,\n n = x.length - 1,\n m,\n a = new Array(n),\n b = new Array(n),\n r = new Array(n);\n a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];\n for (i = 1; i < n - 1; ++i) {\n a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];\n }\n a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];\n for (i = 1; i < n; ++i) {\n m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];\n }\n a[n - 1] = r[n - 1] / b[n - 1];\n for (i = n - 2; i >= 0; --i) {\n a[i] = (r[i] - a[i + 1]) / b[i];\n }\n b[n - 1] = (x[n] + a[n - 1]) / 2;\n for (i = 0; i < n - 1; ++i) {\n b[i] = 2 * x[i + 1] - a[i + 1];\n }\n return [a, b];\n}\nexport default function (context) {\n return new Natural(context);\n}","function Step(context, t) {\n this._context = context;\n this._t = t;\n}\nStep.prototype = {\n areaStart: function areaStart() {\n this._line = 0;\n },\n areaEnd: function areaEnd() {\n this._line = NaN;\n },\n lineStart: function lineStart() {\n this._x = this._y = NaN;\n this._point = 0;\n },\n lineEnd: function lineEnd() {\n if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);\n if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;\n },\n point: function point(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0:\n this._point = 1;\n this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n break;\n case 1:\n this._point = 2;\n // proceed\n default:\n {\n if (this._t <= 0) {\n this._context.lineTo(this._x, y);\n this._context.lineTo(x, y);\n } else {\n var x1 = this._x * (1 - this._t) + x * this._t;\n this._context.lineTo(x1, this._y);\n this._context.lineTo(x1, y);\n }\n break;\n }\n }\n this._x = x, this._y = y;\n }\n};\nexport default function (context) {\n return new Step(context, 0.5);\n}\nexport function stepBefore(context) {\n return new Step(context, 0);\n}\nexport function stepAfter(context) {\n return new Step(context, 1);\n}","export var slice = Array.prototype.slice;\nexport default function (x) {\n return typeof x === \"object\" && \"length\" in x ? x // Array, TypedArray, NodeList, array-like\n : Array.from(x); // Map, Set, iterable, string, or anything else\n}","export function x(p) {\n return p[0];\n}\nexport function y(p) {\n return p[1];\n}","import { path } from \"d3-path\";\nimport array from \"./array.js\";\nimport constant from \"./constant.js\";\nimport curveLinear from \"./curve/linear.js\";\nimport { x as pointX, y as pointY } from \"./point.js\";\nexport default function (x, y) {\n var defined = constant(true),\n context = null,\n curve = curveLinear,\n output = null;\n x = typeof x === \"function\" ? x : x === undefined ? pointX : constant(x);\n y = typeof y === \"function\" ? y : y === undefined ? pointY : constant(y);\n function line(data) {\n var i,\n n = (data = array(data)).length,\n d,\n defined0 = false,\n buffer;\n if (context == null) output = curve(buffer = path());\n for (i = 0; i <= n; ++i) {\n if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n if (defined0 = !defined0) output.lineStart();else output.lineEnd();\n }\n if (defined0) output.point(+x(d, i, data), +y(d, i, data));\n }\n if (buffer) return output = null, buffer + \"\" || null;\n }\n line.x = function (_) {\n return arguments.length ? (x = typeof _ === \"function\" ? _ : constant(+_), line) : x;\n };\n line.y = function (_) {\n return arguments.length ? (y = typeof _ === \"function\" ? _ : constant(+_), line) : y;\n };\n line.defined = function (_) {\n return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), line) : defined;\n };\n line.curve = function (_) {\n return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;\n };\n line.context = function (_) {\n return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;\n };\n return line;\n}","import { path } from \"d3-path\";\nimport array from \"./array.js\";\nimport constant from \"./constant.js\";\nimport curveLinear from \"./curve/linear.js\";\nimport line from \"./line.js\";\nimport { x as pointX, y as pointY } from \"./point.js\";\nexport default function (x0, y0, y1) {\n var x1 = null,\n defined = constant(true),\n context = null,\n curve = curveLinear,\n output = null;\n x0 = typeof x0 === \"function\" ? x0 : x0 === undefined ? pointX : constant(+x0);\n y0 = typeof y0 === \"function\" ? y0 : y0 === undefined ? constant(0) : constant(+y0);\n y1 = typeof y1 === \"function\" ? y1 : y1 === undefined ? pointY : constant(+y1);\n function area(data) {\n var i,\n j,\n k,\n n = (data = array(data)).length,\n d,\n defined0 = false,\n buffer,\n x0z = new Array(n),\n y0z = new Array(n);\n if (context == null) output = curve(buffer = path());\n for (i = 0; i <= n; ++i) {\n if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n if (defined0 = !defined0) {\n j = i;\n output.areaStart();\n output.lineStart();\n } else {\n output.lineEnd();\n output.lineStart();\n for (k = i - 1; k >= j; --k) {\n output.point(x0z[k], y0z[k]);\n }\n output.lineEnd();\n output.areaEnd();\n }\n }\n if (defined0) {\n x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);\n output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);\n }\n }\n if (buffer) return output = null, buffer + \"\" || null;\n }\n function arealine() {\n return line().defined(defined).curve(curve).context(context);\n }\n area.x = function (_) {\n return arguments.length ? (x0 = typeof _ === \"function\" ? _ : constant(+_), x1 = null, area) : x0;\n };\n area.x0 = function (_) {\n return arguments.length ? (x0 = typeof _ === \"function\" ? _ : constant(+_), area) : x0;\n };\n area.x1 = function (_) {\n return arguments.length ? (x1 = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), area) : x1;\n };\n area.y = function (_) {\n return arguments.length ? (y0 = typeof _ === \"function\" ? _ : constant(+_), y1 = null, area) : y0;\n };\n area.y0 = function (_) {\n return arguments.length ? (y0 = typeof _ === \"function\" ? _ : constant(+_), area) : y0;\n };\n area.y1 = function (_) {\n return arguments.length ? (y1 = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), area) : y1;\n };\n area.lineX0 = area.lineY0 = function () {\n return arealine().x(x0).y(y0);\n };\n area.lineY1 = function () {\n return arealine().x(x0).y(y1);\n };\n area.lineX1 = function () {\n return arealine().x(x1).y(y0);\n };\n area.defined = function (_) {\n return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), area) : defined;\n };\n area.curve = function (_) {\n return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;\n };\n area.context = function (_) {\n return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;\n };\n return area;\n}","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nimport _isArray from \"lodash/isArray\";\nimport _upperFirst from \"lodash/upperFirst\";\nimport _isFunction from \"lodash/isFunction\";\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n}\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}\nfunction _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n return _possibleConstructorReturn(this, result);\n };\n}\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n return _assertThisInitialized(self);\n}\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}\nfunction _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\n/**\n * @fileOverview Curve\n */\nimport React, { PureComponent } from 'react';\nimport { line as shapeLine, area as shapeArea, curveBasisClosed, curveBasisOpen, curveBasis, curveLinearClosed, curveLinear, curveMonotoneX, curveMonotoneY, curveNatural, curveStep, curveStepAfter, curveStepBefore } from 'd3-shape';\nimport classNames from 'classnames';\nimport { adaptEventHandlers, filterProps } from '../util/types';\nimport { isNumber } from '../util/DataUtils';\nvar CURVE_FACTORIES = {\n curveBasisClosed: curveBasisClosed,\n curveBasisOpen: curveBasisOpen,\n curveBasis: curveBasis,\n curveLinearClosed: curveLinearClosed,\n curveLinear: curveLinear,\n curveMonotoneX: curveMonotoneX,\n curveMonotoneY: curveMonotoneY,\n curveNatural: curveNatural,\n curveStep: curveStep,\n curveStepAfter: curveStepAfter,\n curveStepBefore: curveStepBefore\n};\nvar defined = function defined(p) {\n return p.x === +p.x && p.y === +p.y;\n};\nvar getX = function getX(p) {\n return p.x;\n};\nvar getY = function getY(p) {\n return p.y;\n};\nvar getCurveFactory = function getCurveFactory(type, layout) {\n if (_isFunction(type)) {\n return type;\n }\n var name = \"curve\".concat(_upperFirst(type));\n if (name === 'curveMonotone' && layout) {\n return CURVE_FACTORIES[\"\".concat(name).concat(layout === 'vertical' ? 'Y' : 'X')];\n }\n return CURVE_FACTORIES[name] || curveLinear;\n};\nexport var Curve = /*#__PURE__*/function (_PureComponent) {\n _inherits(Curve, _PureComponent);\n var _super = _createSuper(Curve);\n function Curve() {\n _classCallCheck(this, Curve);\n return _super.apply(this, arguments);\n }\n _createClass(Curve, [{\n key: \"getPath\",\n value:\n /**\n * Calculate the path of curve\n * @return {String} path\n */\n function getPath() {\n var _this$props = this.props,\n type = _this$props.type,\n points = _this$props.points,\n baseLine = _this$props.baseLine,\n layout = _this$props.layout,\n connectNulls = _this$props.connectNulls;\n var curveFactory = getCurveFactory(type, layout);\n var formatPoints = connectNulls ? points.filter(function (entry) {\n return defined(entry);\n }) : points;\n var lineFunction;\n if (_isArray(baseLine)) {\n var formatBaseLine = connectNulls ? baseLine.filter(function (base) {\n return defined(base);\n }) : baseLine;\n var areaPoints = formatPoints.map(function (entry, index) {\n return _objectSpread(_objectSpread({}, entry), {}, {\n base: formatBaseLine[index]\n });\n });\n if (layout === 'vertical') {\n lineFunction = shapeArea().y(getY).x1(getX).x0(function (d) {\n return d.base.x;\n });\n } else {\n lineFunction = shapeArea().x(getX).y1(getY).y0(function (d) {\n return d.base.y;\n });\n }\n lineFunction.defined(defined).curve(curveFactory);\n return lineFunction(areaPoints);\n }\n if (layout === 'vertical' && isNumber(baseLine)) {\n lineFunction = shapeArea().y(getY).x1(getX).x0(baseLine);\n } else if (isNumber(baseLine)) {\n lineFunction = shapeArea().x(getX).y1(getY).y0(baseLine);\n } else {\n lineFunction = shapeLine().x(getX).y(getY);\n }\n lineFunction.defined(defined).curve(curveFactory);\n return lineFunction(formatPoints);\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props2 = this.props,\n className = _this$props2.className,\n points = _this$props2.points,\n path = _this$props2.path,\n pathRef = _this$props2.pathRef;\n if ((!points || !points.length) && !path) {\n return null;\n }\n var realPath = points && points.length ? this.getPath() : path;\n return /*#__PURE__*/React.createElement(\"path\", _extends({}, filterProps(this.props), adaptEventHandlers(this.props), {\n className: classNames('recharts-curve', className),\n d: realPath,\n ref: pathRef\n }));\n }\n }]);\n return Curve;\n}(PureComponent);\nCurve.defaultProps = {\n type: 'linear',\n points: [],\n connectNulls: false\n};","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n}\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}\nfunction _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n return _possibleConstructorReturn(this, result);\n };\n}\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n return _assertThisInitialized(self);\n}\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}\nfunction _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\n/**\n * @fileOverview Cross\n */\nimport React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport { isNumber } from '../util/DataUtils';\nimport { filterProps } from '../util/types';\nexport var Cross = /*#__PURE__*/function (_PureComponent) {\n _inherits(Cross, _PureComponent);\n var _super = _createSuper(Cross);\n function Cross() {\n _classCallCheck(this, Cross);\n return _super.apply(this, arguments);\n }\n _createClass(Cross, [{\n key: \"render\",\n value: function render() {\n var _this$props = this.props,\n x = _this$props.x,\n y = _this$props.y,\n width = _this$props.width,\n height = _this$props.height,\n top = _this$props.top,\n left = _this$props.left,\n className = _this$props.className;\n if (!isNumber(x) || !isNumber(y) || !isNumber(width) || !isNumber(height) || !isNumber(top) || !isNumber(left)) {\n return null;\n }\n return /*#__PURE__*/React.createElement(\"path\", _extends({}, filterProps(this.props, true), {\n className: classNames('recharts-cross', className),\n d: Cross.getPath(x, y, width, height, top, left)\n }));\n }\n }], [{\n key: \"getPath\",\n value: function getPath(x, y, width, height, top, left) {\n return \"M\".concat(x, \",\").concat(top, \"v\").concat(height, \"M\").concat(left, \",\").concat(y, \"h\").concat(width);\n }\n }]);\n return Cross;\n}(PureComponent);\nCross.defaultProps = {\n x: 0,\n y: 0,\n top: 0,\n left: 0,\n width: 0,\n height: 0\n};","import _isNil from \"lodash/isNil\";\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n}\nfunction _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n return _arr;\n}\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\nimport { getPercentValue } from './DataUtils';\nimport { parseScale, checkDomainOfScale, getTicksOfScale } from './ChartUtils';\nexport var RADIAN = Math.PI / 180;\nexport var degreeToRadian = function degreeToRadian(angle) {\n return angle * Math.PI / 180;\n};\nexport var radianToDegree = function radianToDegree(angleInRadian) {\n return angleInRadian * 180 / Math.PI;\n};\nexport var polarToCartesian = function polarToCartesian(cx, cy, radius, angle) {\n return {\n x: cx + Math.cos(-RADIAN * angle) * radius,\n y: cy + Math.sin(-RADIAN * angle) * radius\n };\n};\nexport var getMaxRadius = function getMaxRadius(width, height) {\n var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n return Math.min(Math.abs(width - (offset.left || 0) - (offset.right || 0)), Math.abs(height - (offset.top || 0) - (offset.bottom || 0))) / 2;\n};\n/**\n * Calculate the scale function, position, width, height of axes\n * @param {Object} props Latest props\n * @param {Object} axisMap The configuration of axes\n * @param {Object} offset The offset of main part in the svg element\n * @param {Object} axisType The type of axes, radius-axis or angle-axis\n * @param {String} chartName The name of chart\n * @return {Object} Configuration\n */\n\nexport var formatAxisMap = function formatAxisMap(props, axisMap, offset, axisType, chartName) {\n var width = props.width,\n height = props.height;\n var startAngle = props.startAngle,\n endAngle = props.endAngle;\n var cx = getPercentValue(props.cx, width, width / 2);\n var cy = getPercentValue(props.cy, height, height / 2);\n var maxRadius = getMaxRadius(width, height, offset);\n var innerRadius = getPercentValue(props.innerRadius, maxRadius, 0);\n var outerRadius = getPercentValue(props.outerRadius, maxRadius, maxRadius * 0.8);\n var ids = Object.keys(axisMap);\n return ids.reduce(function (result, id) {\n var axis = axisMap[id];\n var domain = axis.domain,\n reversed = axis.reversed;\n var range;\n if (_isNil(axis.range)) {\n if (axisType === 'angleAxis') {\n range = [startAngle, endAngle];\n } else if (axisType === 'radiusAxis') {\n range = [innerRadius, outerRadius];\n }\n if (reversed) {\n range = [range[1], range[0]];\n }\n } else {\n range = axis.range;\n var _range = range;\n var _range2 = _slicedToArray(_range, 2);\n startAngle = _range2[0];\n endAngle = _range2[1];\n }\n var _parseScale = parseScale(axis, chartName),\n realScaleType = _parseScale.realScaleType,\n scale = _parseScale.scale;\n scale.domain(domain).range(range);\n checkDomainOfScale(scale);\n var ticks = getTicksOfScale(scale, _objectSpread(_objectSpread({}, axis), {}, {\n realScaleType: realScaleType\n }));\n var finalAxis = _objectSpread(_objectSpread(_objectSpread({}, axis), ticks), {}, {\n range: range,\n radius: outerRadius,\n realScaleType: realScaleType,\n scale: scale,\n cx: cx,\n cy: cy,\n innerRadius: innerRadius,\n outerRadius: outerRadius,\n startAngle: startAngle,\n endAngle: endAngle\n });\n return _objectSpread(_objectSpread({}, result), {}, _defineProperty({}, id, finalAxis));\n }, {});\n};\nexport var distanceBetweenPoints = function distanceBetweenPoints(point, anotherPoint) {\n var x1 = point.x,\n y1 = point.y;\n var x2 = anotherPoint.x,\n y2 = anotherPoint.y;\n return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));\n};\nexport var getAngleOfPoint = function getAngleOfPoint(_ref, _ref2) {\n var x = _ref.x,\n y = _ref.y;\n var cx = _ref2.cx,\n cy = _ref2.cy;\n var radius = distanceBetweenPoints({\n x: x,\n y: y\n }, {\n x: cx,\n y: cy\n });\n if (radius <= 0) {\n return {\n radius: radius\n };\n }\n var cos = (x - cx) / radius;\n var angleInRadian = Math.acos(cos);\n if (y > cy) {\n angleInRadian = 2 * Math.PI - angleInRadian;\n }\n return {\n radius: radius,\n angle: radianToDegree(angleInRadian),\n angleInRadian: angleInRadian\n };\n};\nexport var formatAngleOfSector = function formatAngleOfSector(_ref3) {\n var startAngle = _ref3.startAngle,\n endAngle = _ref3.endAngle;\n var startCnt = Math.floor(startAngle / 360);\n var endCnt = Math.floor(endAngle / 360);\n var min = Math.min(startCnt, endCnt);\n return {\n startAngle: startAngle - min * 360,\n endAngle: endAngle - min * 360\n };\n};\nvar reverseFormatAngleOfSetor = function reverseFormatAngleOfSetor(angle, _ref4) {\n var startAngle = _ref4.startAngle,\n endAngle = _ref4.endAngle;\n var startCnt = Math.floor(startAngle / 360);\n var endCnt = Math.floor(endAngle / 360);\n var min = Math.min(startCnt, endCnt);\n return angle + min * 360;\n};\nexport var inRangeOfSector = function inRangeOfSector(_ref5, sector) {\n var x = _ref5.x,\n y = _ref5.y;\n var _getAngleOfPoint = getAngleOfPoint({\n x: x,\n y: y\n }, sector),\n radius = _getAngleOfPoint.radius,\n angle = _getAngleOfPoint.angle;\n var innerRadius = sector.innerRadius,\n outerRadius = sector.outerRadius;\n if (radius < innerRadius || radius > outerRadius) {\n return false;\n }\n if (radius === 0) {\n return true;\n }\n var _formatAngleOfSector = formatAngleOfSector(sector),\n startAngle = _formatAngleOfSector.startAngle,\n endAngle = _formatAngleOfSector.endAngle;\n var formatAngle = angle;\n var inRange;\n if (startAngle <= endAngle) {\n while (formatAngle > endAngle) {\n formatAngle -= 360;\n }\n while (formatAngle < startAngle) {\n formatAngle += 360;\n }\n inRange = formatAngle >= startAngle && formatAngle <= endAngle;\n } else {\n while (formatAngle > startAngle) {\n formatAngle -= 360;\n }\n while (formatAngle < endAngle) {\n formatAngle += 360;\n }\n inRange = formatAngle >= endAngle && formatAngle <= startAngle;\n }\n if (inRange) {\n return _objectSpread(_objectSpread({}, sector), {}, {\n radius: radius,\n angle: reverseFormatAngleOfSetor(formatAngle, sector)\n });\n }\n return null;\n};","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n}\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}\nfunction _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n return _possibleConstructorReturn(this, result);\n };\n}\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n return _assertThisInitialized(self);\n}\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}\nfunction _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\n/**\n * @fileOverview Sector\n */\nimport React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport { filterProps } from '../util/types';\nimport { polarToCartesian, RADIAN } from '../util/PolarUtils';\nimport { getPercentValue, mathSign } from '../util/DataUtils';\nvar getDeltaAngle = function getDeltaAngle(startAngle, endAngle) {\n var sign = mathSign(endAngle - startAngle);\n var deltaAngle = Math.min(Math.abs(endAngle - startAngle), 359.999);\n return sign * deltaAngle;\n};\nvar getTangentCircle = function getTangentCircle(_ref) {\n var cx = _ref.cx,\n cy = _ref.cy,\n radius = _ref.radius,\n angle = _ref.angle,\n sign = _ref.sign,\n isExternal = _ref.isExternal,\n cornerRadius = _ref.cornerRadius,\n cornerIsExternal = _ref.cornerIsExternal;\n var centerRadius = cornerRadius * (isExternal ? 1 : -1) + radius;\n var theta = Math.asin(cornerRadius / centerRadius) / RADIAN;\n var centerAngle = cornerIsExternal ? angle : angle + sign * theta;\n var center = polarToCartesian(cx, cy, centerRadius, centerAngle); // The coordinate of point which is tangent to the circle\n\n var circleTangency = polarToCartesian(cx, cy, radius, centerAngle); // The coordinate of point which is tangent to the radius line\n\n var lineTangencyAngle = cornerIsExternal ? angle - sign * theta : angle;\n var lineTangency = polarToCartesian(cx, cy, centerRadius * Math.cos(theta * RADIAN), lineTangencyAngle);\n return {\n center: center,\n circleTangency: circleTangency,\n lineTangency: lineTangency,\n theta: theta\n };\n};\nvar getSectorPath = function getSectorPath(_ref2) {\n var cx = _ref2.cx,\n cy = _ref2.cy,\n innerRadius = _ref2.innerRadius,\n outerRadius = _ref2.outerRadius,\n startAngle = _ref2.startAngle,\n endAngle = _ref2.endAngle;\n var angle = getDeltaAngle(startAngle, endAngle); // When the angle of sector equals to 360, star point and end point coincide\n\n var tempEndAngle = startAngle + angle;\n var outerStartPoint = polarToCartesian(cx, cy, outerRadius, startAngle);\n var outerEndPoint = polarToCartesian(cx, cy, outerRadius, tempEndAngle);\n var path = \"M \".concat(outerStartPoint.x, \",\").concat(outerStartPoint.y, \"\\n A \").concat(outerRadius, \",\").concat(outerRadius, \",0,\\n \").concat(+(Math.abs(angle) > 180), \",\").concat(+(startAngle > tempEndAngle), \",\\n \").concat(outerEndPoint.x, \",\").concat(outerEndPoint.y, \"\\n \");\n if (innerRadius > 0) {\n var innerStartPoint = polarToCartesian(cx, cy, innerRadius, startAngle);\n var innerEndPoint = polarToCartesian(cx, cy, innerRadius, tempEndAngle);\n path += \"L \".concat(innerEndPoint.x, \",\").concat(innerEndPoint.y, \"\\n A \").concat(innerRadius, \",\").concat(innerRadius, \",0,\\n \").concat(+(Math.abs(angle) > 180), \",\").concat(+(startAngle <= tempEndAngle), \",\\n \").concat(innerStartPoint.x, \",\").concat(innerStartPoint.y, \" Z\");\n } else {\n path += \"L \".concat(cx, \",\").concat(cy, \" Z\");\n }\n return path;\n};\nvar getSectorWithCorner = function getSectorWithCorner(_ref3) {\n var cx = _ref3.cx,\n cy = _ref3.cy,\n innerRadius = _ref3.innerRadius,\n outerRadius = _ref3.outerRadius,\n cornerRadius = _ref3.cornerRadius,\n forceCornerRadius = _ref3.forceCornerRadius,\n cornerIsExternal = _ref3.cornerIsExternal,\n startAngle = _ref3.startAngle,\n endAngle = _ref3.endAngle;\n var sign = mathSign(endAngle - startAngle);\n var _getTangentCircle = getTangentCircle({\n cx: cx,\n cy: cy,\n radius: outerRadius,\n angle: startAngle,\n sign: sign,\n cornerRadius: cornerRadius,\n cornerIsExternal: cornerIsExternal\n }),\n soct = _getTangentCircle.circleTangency,\n solt = _getTangentCircle.lineTangency,\n sot = _getTangentCircle.theta;\n var _getTangentCircle2 = getTangentCircle({\n cx: cx,\n cy: cy,\n radius: outerRadius,\n angle: endAngle,\n sign: -sign,\n cornerRadius: cornerRadius,\n cornerIsExternal: cornerIsExternal\n }),\n eoct = _getTangentCircle2.circleTangency,\n eolt = _getTangentCircle2.lineTangency,\n eot = _getTangentCircle2.theta;\n var outerArcAngle = cornerIsExternal ? Math.abs(startAngle - endAngle) : Math.abs(startAngle - endAngle) - sot - eot;\n if (outerArcAngle < 0) {\n if (forceCornerRadius) {\n return \"M \".concat(solt.x, \",\").concat(solt.y, \"\\n a\").concat(cornerRadius, \",\").concat(cornerRadius, \",0,0,1,\").concat(cornerRadius * 2, \",0\\n a\").concat(cornerRadius, \",\").concat(cornerRadius, \",0,0,1,\").concat(-cornerRadius * 2, \",0\\n \");\n }\n return getSectorPath({\n cx: cx,\n cy: cy,\n innerRadius: innerRadius,\n outerRadius: outerRadius,\n startAngle: startAngle,\n endAngle: endAngle\n });\n }\n var path = \"M \".concat(solt.x, \",\").concat(solt.y, \"\\n A\").concat(cornerRadius, \",\").concat(cornerRadius, \",0,0,\").concat(+(sign < 0), \",\").concat(soct.x, \",\").concat(soct.y, \"\\n A\").concat(outerRadius, \",\").concat(outerRadius, \",0,\").concat(+(outerArcAngle > 180), \",\").concat(+(sign < 0), \",\").concat(eoct.x, \",\").concat(eoct.y, \"\\n A\").concat(cornerRadius, \",\").concat(cornerRadius, \",0,0,\").concat(+(sign < 0), \",\").concat(eolt.x, \",\").concat(eolt.y, \"\\n \");\n if (innerRadius > 0) {\n var _getTangentCircle3 = getTangentCircle({\n cx: cx,\n cy: cy,\n radius: innerRadius,\n angle: startAngle,\n sign: sign,\n isExternal: true,\n cornerRadius: cornerRadius,\n cornerIsExternal: cornerIsExternal\n }),\n sict = _getTangentCircle3.circleTangency,\n silt = _getTangentCircle3.lineTangency,\n sit = _getTangentCircle3.theta;\n var _getTangentCircle4 = getTangentCircle({\n cx: cx,\n cy: cy,\n radius: innerRadius,\n angle: endAngle,\n sign: -sign,\n isExternal: true,\n cornerRadius: cornerRadius,\n cornerIsExternal: cornerIsExternal\n }),\n eict = _getTangentCircle4.circleTangency,\n eilt = _getTangentCircle4.lineTangency,\n eit = _getTangentCircle4.theta;\n var innerArcAngle = cornerIsExternal ? Math.abs(startAngle - endAngle) : Math.abs(startAngle - endAngle) - sit - eit;\n if (innerArcAngle < 0 && cornerRadius === 0) {\n return \"\".concat(path, \"L\").concat(cx, \",\").concat(cy, \"Z\");\n }\n path += \"L\".concat(eilt.x, \",\").concat(eilt.y, \"\\n A\").concat(cornerRadius, \",\").concat(cornerRadius, \",0,0,\").concat(+(sign < 0), \",\").concat(eict.x, \",\").concat(eict.y, \"\\n A\").concat(innerRadius, \",\").concat(innerRadius, \",0,\").concat(+(innerArcAngle > 180), \",\").concat(+(sign > 0), \",\").concat(sict.x, \",\").concat(sict.y, \"\\n A\").concat(cornerRadius, \",\").concat(cornerRadius, \",0,0,\").concat(+(sign < 0), \",\").concat(silt.x, \",\").concat(silt.y, \"Z\");\n } else {\n path += \"L\".concat(cx, \",\").concat(cy, \"Z\");\n }\n return path;\n};\nexport var Sector = /*#__PURE__*/function (_PureComponent) {\n _inherits(Sector, _PureComponent);\n var _super = _createSuper(Sector);\n function Sector() {\n _classCallCheck(this, Sector);\n return _super.apply(this, arguments);\n }\n _createClass(Sector, [{\n key: \"render\",\n value: function render() {\n var _this$props = this.props,\n cx = _this$props.cx,\n cy = _this$props.cy,\n innerRadius = _this$props.innerRadius,\n outerRadius = _this$props.outerRadius,\n cornerRadius = _this$props.cornerRadius,\n forceCornerRadius = _this$props.forceCornerRadius,\n cornerIsExternal = _this$props.cornerIsExternal,\n startAngle = _this$props.startAngle,\n endAngle = _this$props.endAngle,\n className = _this$props.className;\n if (outerRadius < innerRadius || startAngle === endAngle) {\n return null;\n }\n var layerClass = classNames('recharts-sector', className);\n var deltaRadius = outerRadius - innerRadius;\n var cr = getPercentValue(cornerRadius, deltaRadius, 0, true);\n var path;\n if (cr > 0 && Math.abs(startAngle - endAngle) < 360) {\n path = getSectorWithCorner({\n cx: cx,\n cy: cy,\n innerRadius: innerRadius,\n outerRadius: outerRadius,\n cornerRadius: Math.min(cr, deltaRadius / 2),\n forceCornerRadius: forceCornerRadius,\n cornerIsExternal: cornerIsExternal,\n startAngle: startAngle,\n endAngle: endAngle\n });\n } else {\n path = getSectorPath({\n cx: cx,\n cy: cy,\n innerRadius: innerRadius,\n outerRadius: outerRadius,\n startAngle: startAngle,\n endAngle: endAngle\n });\n }\n return /*#__PURE__*/React.createElement(\"path\", _extends({}, filterProps(this.props, true), {\n className: layerClass,\n d: path\n }));\n }\n }]);\n return Sector;\n}(PureComponent);\nSector.defaultProps = {\n cx: 0,\n cy: 0,\n innerRadius: 0,\n outerRadius: 0,\n startAngle: 0,\n endAngle: 0,\n cornerRadius: 0,\n forceCornerRadius: false,\n cornerIsExternal: false\n};","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n}\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}\nfunction _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n return _possibleConstructorReturn(this, result);\n };\n}\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n return _assertThisInitialized(self);\n}\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}\nfunction _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\n/**\n * @fileOverview Dot\n */\nimport React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport { adaptEventHandlers, filterProps } from '../util/types';\nexport var Dot = /*#__PURE__*/function (_PureComponent) {\n _inherits(Dot, _PureComponent);\n var _super = _createSuper(Dot);\n function Dot() {\n _classCallCheck(this, Dot);\n return _super.apply(this, arguments);\n }\n _createClass(Dot, [{\n key: \"render\",\n value: function render() {\n var _this$props = this.props,\n cx = _this$props.cx,\n cy = _this$props.cy,\n r = _this$props.r,\n className = _this$props.className;\n var layerClass = classNames('recharts-dot', className);\n if (cx === +cx && cy === +cy && r === +r) {\n return /*#__PURE__*/React.createElement(\"circle\", _extends({}, filterProps(this.props), adaptEventHandlers(this.props), {\n className: layerClass,\n cx: cx,\n cy: cy,\n r: r\n }));\n }\n return null;\n }\n }]);\n return Dot;\n}(PureComponent);","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n}\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}\nfunction _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n return _possibleConstructorReturn(this, result);\n };\n}\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n return _assertThisInitialized(self);\n}\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}\nfunction _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\n/**\n * @fileOverview Rectangle\n */\nimport React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport Animate from 'react-smooth';\nimport { filterProps } from '../util/types';\nvar getRectanglePath = function getRectanglePath(x, y, width, height, radius) {\n var maxRadius = Math.min(Math.abs(width) / 2, Math.abs(height) / 2);\n var ySign = height >= 0 ? 1 : -1;\n var xSign = width >= 0 ? 1 : -1;\n var clockWise = height >= 0 && width >= 0 || height < 0 && width < 0 ? 1 : 0;\n var path;\n if (maxRadius > 0 && radius instanceof Array) {\n var newRadius = [0, 0, 0, 0];\n for (var i = 0, len = 4; i < len; i++) {\n newRadius[i] = radius[i] > maxRadius ? maxRadius : radius[i];\n }\n path = \"M\".concat(x, \",\").concat(y + ySign * newRadius[0]);\n if (newRadius[0] > 0) {\n path += \"A \".concat(newRadius[0], \",\").concat(newRadius[0], \",0,0,\").concat(clockWise, \",\").concat(x + xSign * newRadius[0], \",\").concat(y);\n }\n path += \"L \".concat(x + width - xSign * newRadius[1], \",\").concat(y);\n if (newRadius[1] > 0) {\n path += \"A \".concat(newRadius[1], \",\").concat(newRadius[1], \",0,0,\").concat(clockWise, \",\\n \").concat(x + width, \",\").concat(y + ySign * newRadius[1]);\n }\n path += \"L \".concat(x + width, \",\").concat(y + height - ySign * newRadius[2]);\n if (newRadius[2] > 0) {\n path += \"A \".concat(newRadius[2], \",\").concat(newRadius[2], \",0,0,\").concat(clockWise, \",\\n \").concat(x + width - xSign * newRadius[2], \",\").concat(y + height);\n }\n path += \"L \".concat(x + xSign * newRadius[3], \",\").concat(y + height);\n if (newRadius[3] > 0) {\n path += \"A \".concat(newRadius[3], \",\").concat(newRadius[3], \",0,0,\").concat(clockWise, \",\\n \").concat(x, \",\").concat(y + height - ySign * newRadius[3]);\n }\n path += 'Z';\n } else if (maxRadius > 0 && radius === +radius && radius > 0) {\n var _newRadius = Math.min(maxRadius, radius);\n path = \"M \".concat(x, \",\").concat(y + ySign * _newRadius, \"\\n A \").concat(_newRadius, \",\").concat(_newRadius, \",0,0,\").concat(clockWise, \",\").concat(x + xSign * _newRadius, \",\").concat(y, \"\\n L \").concat(x + width - xSign * _newRadius, \",\").concat(y, \"\\n A \").concat(_newRadius, \",\").concat(_newRadius, \",0,0,\").concat(clockWise, \",\").concat(x + width, \",\").concat(y + ySign * _newRadius, \"\\n L \").concat(x + width, \",\").concat(y + height - ySign * _newRadius, \"\\n A \").concat(_newRadius, \",\").concat(_newRadius, \",0,0,\").concat(clockWise, \",\").concat(x + width - xSign * _newRadius, \",\").concat(y + height, \"\\n L \").concat(x + xSign * _newRadius, \",\").concat(y + height, \"\\n A \").concat(_newRadius, \",\").concat(_newRadius, \",0,0,\").concat(clockWise, \",\").concat(x, \",\").concat(y + height - ySign * _newRadius, \" Z\");\n } else {\n path = \"M \".concat(x, \",\").concat(y, \" h \").concat(width, \" v \").concat(height, \" h \").concat(-width, \" Z\");\n }\n return path;\n};\nexport var isInRectangle = function isInRectangle(point, rect) {\n if (!point || !rect) {\n return false;\n }\n var px = point.x,\n py = point.y;\n var x = rect.x,\n y = rect.y,\n width = rect.width,\n height = rect.height;\n if (Math.abs(width) > 0 && Math.abs(height) > 0) {\n var minX = Math.min(x, x + width);\n var maxX = Math.max(x, x + width);\n var minY = Math.min(y, y + height);\n var maxY = Math.max(y, y + height);\n return px >= minX && px <= maxX && py >= minY && py <= maxY;\n }\n return false;\n};\nexport var Rectangle = /*#__PURE__*/function (_PureComponent) {\n _inherits(Rectangle, _PureComponent);\n var _super = _createSuper(Rectangle);\n function Rectangle() {\n var _this;\n _classCallCheck(this, Rectangle);\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n _this = _super.call.apply(_super, [this].concat(args));\n _this.state = {\n totalLength: -1\n };\n _this.node = void 0;\n return _this;\n }\n _createClass(Rectangle, [{\n key: \"componentDidMount\",\n value: /* eslint-disable react/no-did-mount-set-state */\n function componentDidMount() {\n if (this.node && this.node.getTotalLength) {\n try {\n var totalLength = this.node.getTotalLength();\n if (totalLength) {\n this.setState({\n totalLength: totalLength\n });\n }\n } catch (err) {// calculate total length error\n }\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this2 = this;\n var _this$props = this.props,\n x = _this$props.x,\n y = _this$props.y,\n width = _this$props.width,\n height = _this$props.height,\n radius = _this$props.radius,\n className = _this$props.className;\n var totalLength = this.state.totalLength;\n var _this$props2 = this.props,\n animationEasing = _this$props2.animationEasing,\n animationDuration = _this$props2.animationDuration,\n animationBegin = _this$props2.animationBegin,\n isAnimationActive = _this$props2.isAnimationActive,\n isUpdateAnimationActive = _this$props2.isUpdateAnimationActive;\n if (x !== +x || y !== +y || width !== +width || height !== +height || width === 0 || height === 0) {\n return null;\n }\n var layerClass = classNames('recharts-rectangle', className);\n if (!isUpdateAnimationActive) {\n return /*#__PURE__*/React.createElement(\"path\", _extends({}, filterProps(this.props, true), {\n className: layerClass,\n d: getRectanglePath(x, y, width, height, radius)\n }));\n }\n return /*#__PURE__*/React.createElement(Animate, {\n canBegin: totalLength > 0,\n from: {\n width: width,\n height: height,\n x: x,\n y: y\n },\n to: {\n width: width,\n height: height,\n x: x,\n y: y\n },\n duration: animationDuration,\n animationEasing: animationEasing,\n isActive: isUpdateAnimationActive\n }, function (_ref) {\n var currWidth = _ref.width,\n currHeight = _ref.height,\n currX = _ref.x,\n currY = _ref.y;\n return /*#__PURE__*/React.createElement(Animate, {\n canBegin: totalLength > 0,\n from: \"0px \".concat(totalLength === -1 ? 1 : totalLength, \"px\"),\n to: \"\".concat(totalLength, \"px 0px\"),\n attributeName: \"strokeDasharray\",\n begin: animationBegin,\n duration: animationDuration,\n isActive: isAnimationActive,\n easing: animationEasing\n }, /*#__PURE__*/React.createElement(\"path\", _extends({}, filterProps(_this2.props, true), {\n className: layerClass,\n d: getRectanglePath(currX, currY, currWidth, currHeight, radius),\n ref: function ref(node) {\n _this2.node = node;\n }\n })));\n });\n }\n }]);\n return Rectangle;\n}(PureComponent);\nRectangle.defaultProps = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n // The radius of border\n // The radius of four corners when radius is a number\n // The radius of left-top, right-top, right-bottom, left-bottom when radius is an array\n radius: 0,\n isAnimationActive: false,\n isUpdateAnimationActive: false,\n animationBegin: 0,\n animationDuration: 1500,\n animationEasing: 'ease'\n};","export function shallowEqual(a, b) {\n /* eslint-disable no-restricted-syntax */\n for (var key in a) {\n if ({}.hasOwnProperty.call(a, key) && (!{}.hasOwnProperty.call(b, key) || a[key] !== b[key])) {\n return false;\n }\n }\n for (var _key in b) {\n if ({}.hasOwnProperty.call(b, _key) && !{}.hasOwnProperty.call(a, _key)) {\n return false;\n }\n }\n return true;\n}","import _isString from \"lodash/isString\";\nimport _get from \"lodash/get\";\nimport _isNil from \"lodash/isNil\";\nimport _isArray from \"lodash/isArray\";\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nimport { Children } from 'react';\nimport { isFragment } from 'react-is';\nimport { isNumber } from './DataUtils';\nimport { shallowEqual } from './ShallowEqual';\nvar REACT_BROWSER_EVENT_MAP = {\n click: 'onClick',\n mousedown: 'onMouseDown',\n mouseup: 'onMouseUp',\n mouseover: 'onMouseOver',\n mousemove: 'onMouseMove',\n mouseout: 'onMouseOut',\n mouseenter: 'onMouseEnter',\n mouseleave: 'onMouseLeave',\n touchcancel: 'onTouchCancel',\n touchend: 'onTouchEnd',\n touchmove: 'onTouchMove',\n touchstart: 'onTouchStart'\n};\nexport var SCALE_TYPES = ['auto', 'linear', 'pow', 'sqrt', 'log', 'identity', 'time', 'band', 'point', 'ordinal', 'quantile', 'quantize', 'utc', 'sequential', 'threshold'];\nexport var LEGEND_TYPES = ['plainline', 'line', 'square', 'rect', 'circle', 'cross', 'diamond', 'star', 'triangle', 'wye', 'none'];\nexport var TOOLTIP_TYPES = ['none'];\n/**\n * Get the display name of a component\n * @param {Object} Comp Specified Component\n * @return {String} Display name of Component\n */\n\nexport var getDisplayName = function getDisplayName(Comp) {\n if (typeof Comp === 'string') {\n return Comp;\n }\n if (!Comp) {\n return '';\n }\n return Comp.displayName || Comp.name || 'Component';\n}; // `toArray` gets called multiple times during the render\n// so we can memoize last invocation (since reference to `children` is the same)\n\nvar lastChildren = null;\nvar lastResult = null;\nexport var toArray = function toArray(children) {\n if (children === lastChildren && _isArray(lastResult)) {\n return lastResult;\n }\n var result = [];\n Children.forEach(children, function (child) {\n if (_isNil(child)) return;\n if (isFragment(child)) {\n result = result.concat(toArray(child.props.children));\n } else {\n result.push(child);\n }\n });\n lastResult = result;\n lastChildren = children;\n return result;\n};\n/*\n * Find and return all matched children by type. `type` can be a React element class or\n * string\n */\n\nexport var findAllByType = function findAllByType(children, type) {\n var result = [];\n var types = [];\n if (_isArray(type)) {\n types = type.map(function (t) {\n return getDisplayName(t);\n });\n } else {\n types = [getDisplayName(type)];\n }\n toArray(children).forEach(function (child) {\n var childType = _get(child, 'type.displayName') || _get(child, 'type.name');\n if (types.indexOf(childType) !== -1) {\n result.push(child);\n }\n });\n return result;\n};\n/*\n * Return the first matched child by type, return null otherwise.\n * `type` can be a React element class or string.\n */\n\nexport var findChildByType = function findChildByType(children, type) {\n var result = findAllByType(children, type);\n return result && result[0];\n};\n/*\n * Create a new array of children excluding the ones matched the type\n */\n\nexport var withoutType = function withoutType(children, type) {\n var newChildren = [];\n var types;\n if (_isArray(type)) {\n types = type.map(function (t) {\n return getDisplayName(t);\n });\n } else {\n types = [getDisplayName(type)];\n }\n toArray(children).forEach(function (child) {\n var displayName = _get(child, 'type.displayName');\n if (displayName && types.indexOf(displayName) !== -1) {\n return;\n }\n newChildren.push(child);\n });\n return newChildren;\n};\n/**\n * validate the width and height props of a chart element\n * @param {Object} el A chart element\n * @return {Boolean} true If the props width and height are number, and greater than 0\n */\n\nexport var validateWidthHeight = function validateWidthHeight(el) {\n if (!el || !el.props) {\n return false;\n }\n var _el$props = el.props,\n width = _el$props.width,\n height = _el$props.height;\n if (!isNumber(width) || width <= 0 || !isNumber(height) || height <= 0) {\n return false;\n }\n return true;\n};\nvar SVG_TAGS = ['a', 'altGlyph', 'altGlyphDef', 'altGlyphItem', 'animate', 'animateColor', 'animateMotion', 'animateTransform', 'circle', 'clipPath', 'color-profile', 'cursor', 'defs', 'desc', 'ellipse', 'feBlend', 'feColormatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence', 'filter', 'font', 'font-face', 'font-face-format', 'font-face-name', 'font-face-url', 'foreignObject', 'g', 'glyph', 'glyphRef', 'hkern', 'image', 'line', 'lineGradient', 'marker', 'mask', 'metadata', 'missing-glyph', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'script', 'set', 'stop', 'style', 'svg', 'switch', 'symbol', 'text', 'textPath', 'title', 'tref', 'tspan', 'use', 'view', 'vkern'];\nvar isSvgElement = function isSvgElement(child) {\n return child && child.type && _isString(child.type) && SVG_TAGS.indexOf(child.type) >= 0;\n};\n/**\n * Filter all the svg elements of children\n * @param {Array} children The children of a react element\n * @return {Array} All the svg elements\n */\n\nexport var filterSvgElements = function filterSvgElements(children) {\n var svgElements = [];\n toArray(children).forEach(function (entry) {\n if (isSvgElement(entry)) {\n svgElements.push(entry);\n }\n });\n return svgElements;\n};\n/**\n * Wether props of children changed\n * @param {Object} nextChildren The latest children\n * @param {Object} prevChildren The prev children\n * @return {Boolean} equal or not\n */\n\nexport var isChildrenEqual = function isChildrenEqual(nextChildren, prevChildren) {\n if (nextChildren === prevChildren) {\n return true;\n }\n var count = Children.count(nextChildren);\n if (count !== Children.count(prevChildren)) {\n return false;\n }\n if (count === 0) {\n return true;\n }\n if (count === 1) {\n // eslint-disable-next-line no-use-before-define,@typescript-eslint/no-use-before-define\n return isSingleChildEqual(_isArray(nextChildren) ? nextChildren[0] : nextChildren, _isArray(prevChildren) ? prevChildren[0] : prevChildren);\n }\n for (var i = 0; i < count; i++) {\n var nextChild = nextChildren[i];\n var prevChild = prevChildren[i];\n if (_isArray(nextChild) || _isArray(prevChild)) {\n if (!isChildrenEqual(nextChild, prevChild)) {\n return false;\n } // eslint-disable-next-line no-use-before-define,@typescript-eslint/no-use-before-define\n } else if (!isSingleChildEqual(nextChild, prevChild)) {\n return false;\n }\n }\n return true;\n};\nexport var isSingleChildEqual = function isSingleChildEqual(nextChild, prevChild) {\n if (_isNil(nextChild) && _isNil(prevChild)) {\n return true;\n }\n if (!_isNil(nextChild) && !_isNil(prevChild)) {\n var _ref = nextChild.props || {},\n nextChildren = _ref.children,\n nextProps = _objectWithoutProperties(_ref, [\"children\"]);\n var _ref2 = prevChild.props || {},\n prevChildren = _ref2.children,\n prevProps = _objectWithoutProperties(_ref2, [\"children\"]);\n if (nextChildren && prevChildren) {\n // eslint-disable-next-line no-use-before-define\n return shallowEqual(nextProps, prevProps) && isChildrenEqual(nextChildren, prevChildren);\n }\n if (!nextChildren && !prevChildren) {\n return shallowEqual(nextProps, prevProps);\n }\n return false;\n }\n return false;\n};\nexport var renderByOrder = function renderByOrder(children, renderMap) {\n var elements = [];\n var record = {};\n toArray(children).forEach(function (child, index) {\n if (isSvgElement(child)) {\n elements.push(child);\n } else if (child) {\n var displayName = getDisplayName(child.type);\n var _ref3 = renderMap[displayName] || {},\n handler = _ref3.handler,\n once = _ref3.once;\n if (handler && (!once || !record[displayName])) {\n var results = handler(child, displayName, index);\n elements.push(results);\n record[displayName] = true;\n }\n }\n });\n return elements;\n};\nexport var getReactEventByType = function getReactEventByType(e) {\n var type = e && e.type;\n if (type && REACT_BROWSER_EVENT_MAP[type]) {\n return REACT_BROWSER_EVENT_MAP[type];\n }\n return null;\n};\nexport var parseChildIndex = function parseChildIndex(child, children) {\n return toArray(children).indexOf(child);\n};","function ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n}\nimport { Global } from './Global';\nvar stringCache = {\n widthCache: {},\n cacheCount: 0\n};\nvar MAX_CACHE_NUM = 2000;\nvar SPAN_STYLE = {\n position: 'absolute',\n top: '-20000px',\n left: 0,\n padding: 0,\n margin: 0,\n border: 'none',\n whiteSpace: 'pre'\n};\nvar STYLE_LIST = ['minWidth', 'maxWidth', 'width', 'minHeight', 'maxHeight', 'height', 'top', 'left', 'fontSize', 'lineHeight', 'padding', 'margin', 'paddingLeft', 'paddingRight', 'paddingTop', 'paddingBottom', 'marginLeft', 'marginRight', 'marginTop', 'marginBottom'];\nvar MEASUREMENT_SPAN_ID = 'recharts_measurement_span';\nfunction autoCompleteStyle(name, value) {\n if (STYLE_LIST.indexOf(name) >= 0 && value === +value) {\n return \"\".concat(value, \"px\");\n }\n return value;\n}\nfunction camelToMiddleLine(text) {\n var strs = text.split('');\n var formatStrs = strs.reduce(function (result, entry) {\n if (entry === entry.toUpperCase()) {\n return [].concat(_toConsumableArray(result), ['-', entry.toLowerCase()]);\n }\n return [].concat(_toConsumableArray(result), [entry]);\n }, []);\n return formatStrs.join('');\n}\nexport var getStyleString = function getStyleString(style) {\n return Object.keys(style).reduce(function (result, s) {\n return \"\".concat(result).concat(camelToMiddleLine(s), \":\").concat(autoCompleteStyle(s, style[s]), \";\");\n }, '');\n};\nexport var getStringSize = function getStringSize(text) {\n var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n if (text === undefined || text === null || Global.isSsr) {\n return {\n width: 0,\n height: 0\n };\n }\n var str = \"\".concat(text);\n var styleString = getStyleString(style);\n var cacheKey = \"\".concat(str, \"-\").concat(styleString);\n if (stringCache.widthCache[cacheKey]) {\n return stringCache.widthCache[cacheKey];\n }\n try {\n var measurementSpan = document.getElementById(MEASUREMENT_SPAN_ID);\n if (!measurementSpan) {\n measurementSpan = document.createElement('span');\n measurementSpan.setAttribute('id', MEASUREMENT_SPAN_ID);\n measurementSpan.setAttribute('aria-hidden', 'true');\n document.body.appendChild(measurementSpan);\n } // Need to use CSS Object Model (CSSOM) to be able to comply with Content Security Policy (CSP)\n // https://en.wikipedia.org/wiki/Content_Security_Policy\n\n var measurementSpanStyle = _objectSpread(_objectSpread({}, SPAN_STYLE), style);\n Object.keys(measurementSpanStyle).map(function (styleKey) {\n measurementSpan.style[styleKey] = measurementSpanStyle[styleKey];\n return styleKey;\n });\n measurementSpan.textContent = str;\n var rect = measurementSpan.getBoundingClientRect();\n var result = {\n width: rect.width,\n height: rect.height\n };\n stringCache.widthCache[cacheKey] = result;\n if (++stringCache.cacheCount > MAX_CACHE_NUM) {\n stringCache.cacheCount = 0;\n stringCache.widthCache = {};\n }\n return result;\n } catch (e) {\n return {\n width: 0,\n height: 0\n };\n }\n};\nexport var getOffset = function getOffset(el) {\n var html = el.ownerDocument.documentElement;\n var box = {\n top: 0,\n left: 0\n }; // If we don't have gBCR, just use 0,0 rather than error\n // BlackBerry 5, iOS 3 (original iPhone)\n\n if (typeof el.getBoundingClientRect !== 'undefined') {\n box = el.getBoundingClientRect();\n }\n return {\n top: box.top + window.pageYOffset - html.clientTop,\n left: box.left + window.pageXOffset - html.clientLeft\n };\n};\n/**\n * Calculate coordinate of cursor in chart\n * @param {Object} event Event object\n * @param {Object} offset The offset of main part in the svg element\n * @return {Object} {chartX, chartY}\n */\n\nexport var calculateChartCoordinate = function calculateChartCoordinate(event, offset) {\n return {\n chartX: Math.round(event.pageX - offset.left),\n chartY: Math.round(event.pageY - offset.top)\n };\n};","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nimport _isNil from \"lodash/isNil\";\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n}\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}\nfunction _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n return _possibleConstructorReturn(this, result);\n };\n}\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n return _assertThisInitialized(self);\n}\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}\nfunction _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n}\nfunction _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n return _arr;\n}\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nimport React, { Component } from 'react';\nimport reduceCSSCalc from 'reduce-css-calc';\nimport classNames from 'classnames';\nimport { isNumber, isNumOrStr } from '../util/DataUtils';\nimport { Global } from '../util/Global';\nimport { filterProps } from '../util/types';\nimport { getStringSize } from '../util/DOMUtils';\nvar BREAKING_SPACES = /[ \\f\\n\\r\\t\\v\\u2028\\u2029]+/;\nvar calculateWordWidths = function calculateWordWidths(props) {\n try {\n var words = [];\n if (!_isNil(props.children)) {\n if (props.breakAll) {\n words = props.children.toString().split('');\n } else {\n words = props.children.toString().split(BREAKING_SPACES);\n }\n }\n var wordsWithComputedWidth = words.map(function (word) {\n return {\n word: word,\n width: getStringSize(word, props.style).width\n };\n });\n var spaceWidth = props.breakAll ? 0 : getStringSize(\"\\xA0\", props.style).width;\n return {\n wordsWithComputedWidth: wordsWithComputedWidth,\n spaceWidth: spaceWidth\n };\n } catch (e) {\n return null;\n }\n};\nvar calculateWordsByLines = function calculateWordsByLines(props, initialWordsWithComputedWith, spaceWidth, lineWidth, scaleToFit) {\n var shouldLimitLines = isNumber(props.maxLines);\n var text = props.children;\n var calculate = function calculate() {\n var words = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n return words.reduce(function (result, _ref) {\n var word = _ref.word,\n width = _ref.width;\n var currentLine = result[result.length - 1];\n if (currentLine && (lineWidth == null || scaleToFit || currentLine.width + width + spaceWidth < lineWidth)) {\n // Word can be added to an existing line\n currentLine.words.push(word);\n currentLine.width += width + spaceWidth;\n } else {\n // Add first word to line or word is too long to scaleToFit on existing line\n var newLine = {\n words: [word],\n width: width\n };\n result.push(newLine);\n }\n return result;\n }, []);\n };\n var originalResult = calculate(initialWordsWithComputedWith);\n var findLongestLine = function findLongestLine(words) {\n return words.reduce(function (a, b) {\n return a.width > b.width ? a : b;\n });\n };\n if (!shouldLimitLines) {\n return originalResult;\n }\n var suffix = '…';\n var checkOverflow = function checkOverflow(index) {\n var tempText = text.slice(0, index);\n var words = calculateWordWidths(_objectSpread(_objectSpread({}, props), {}, {\n children: tempText + suffix\n })).wordsWithComputedWidth;\n var result = calculate(words);\n var doesOverflow = result.length > props.maxLines || findLongestLine(result).width > lineWidth;\n return [doesOverflow, result];\n };\n var start = 0;\n var end = text.length - 1;\n var iterations = 0;\n var trimmedResult;\n while (start <= end && iterations <= text.length - 1) {\n var middle = Math.floor((start + end) / 2);\n var prev = middle - 1;\n var _checkOverflow = checkOverflow(prev),\n _checkOverflow2 = _slicedToArray(_checkOverflow, 2),\n doesPrevOverflow = _checkOverflow2[0],\n result = _checkOverflow2[1];\n var _checkOverflow3 = checkOverflow(middle),\n _checkOverflow4 = _slicedToArray(_checkOverflow3, 1),\n doesMiddleOverflow = _checkOverflow4[0];\n if (!doesPrevOverflow && !doesMiddleOverflow) {\n start = middle + 1;\n }\n if (doesPrevOverflow && doesMiddleOverflow) {\n end = middle - 1;\n }\n if (!doesPrevOverflow && doesMiddleOverflow) {\n trimmedResult = result;\n break;\n }\n iterations++;\n } // Fallback to originalResult (result without trimming) if we cannot find the\n // where to trim. This should not happen :tm:\n\n return trimmedResult || originalResult;\n};\nvar getWordsWithoutCalculate = function getWordsWithoutCalculate(children) {\n var words = !_isNil(children) ? children.toString().split(BREAKING_SPACES) : [];\n return [{\n words: words\n }];\n};\nvar getWordsByLines = function getWordsByLines(props, needCalculate) {\n // Only perform calculations if using features that require them (multiline, scaleToFit)\n if ((props.width || props.scaleToFit) && !Global.isSsr) {\n var wordsWithComputedWidth, spaceWidth;\n if (needCalculate) {\n var wordWidths = calculateWordWidths(props);\n if (wordWidths) {\n var wcw = wordWidths.wordsWithComputedWidth,\n sw = wordWidths.spaceWidth;\n wordsWithComputedWidth = wcw;\n spaceWidth = sw;\n } else {\n return getWordsWithoutCalculate(props.children);\n }\n return calculateWordsByLines(props, wordsWithComputedWidth, spaceWidth, props.width, props.scaleToFit);\n }\n }\n return getWordsWithoutCalculate(props.children);\n};\nexport var Text = /*#__PURE__*/function (_Component) {\n _inherits(Text, _Component);\n var _super = _createSuper(Text);\n function Text() {\n var _this;\n _classCallCheck(this, Text);\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n _this = _super.call.apply(_super, [this].concat(args));\n _this.state = {};\n return _this;\n }\n _createClass(Text, [{\n key: \"render\",\n value: function render() {\n var _this$props = this.props,\n dx = _this$props.dx,\n dy = _this$props.dy,\n textAnchor = _this$props.textAnchor,\n verticalAnchor = _this$props.verticalAnchor,\n scaleToFit = _this$props.scaleToFit,\n angle = _this$props.angle,\n lineHeight = _this$props.lineHeight,\n capHeight = _this$props.capHeight,\n className = _this$props.className,\n breakAll = _this$props.breakAll,\n textProps = _objectWithoutProperties(_this$props, [\"dx\", \"dy\", \"textAnchor\", \"verticalAnchor\", \"scaleToFit\", \"angle\", \"lineHeight\", \"capHeight\", \"className\", \"breakAll\"]);\n var wordsByLines = this.state.wordsByLines;\n if (!isNumOrStr(textProps.x) || !isNumOrStr(textProps.y)) {\n return null;\n }\n var x = textProps.x + (isNumber(dx) ? dx : 0);\n var y = textProps.y + (isNumber(dy) ? dy : 0);\n var startDy;\n switch (verticalAnchor) {\n case 'start':\n startDy = reduceCSSCalc(\"calc(\".concat(capHeight, \")\"));\n break;\n case 'middle':\n startDy = reduceCSSCalc(\"calc(\".concat((wordsByLines.length - 1) / 2, \" * -\").concat(lineHeight, \" + (\").concat(capHeight, \" / 2))\"));\n break;\n default:\n startDy = reduceCSSCalc(\"calc(\".concat(wordsByLines.length - 1, \" * -\").concat(lineHeight, \")\"));\n break;\n }\n var transforms = [];\n if (scaleToFit) {\n var lineWidth = wordsByLines[0].width;\n var width = this.props.width;\n transforms.push(\"scale(\".concat((isNumber(width) ? width / lineWidth : 1) / lineWidth, \")\"));\n }\n if (angle) {\n transforms.push(\"rotate(\".concat(angle, \", \").concat(x, \", \").concat(y, \")\"));\n }\n if (transforms.length) {\n textProps.transform = transforms.join(' ');\n }\n return /*#__PURE__*/React.createElement(\"text\", _extends({}, filterProps(textProps, true), {\n x: x,\n y: y,\n className: classNames('recharts-text', className),\n textAnchor: textAnchor\n }), wordsByLines.map(function (line, index) {\n return /*#__PURE__*/(\n // eslint-disable-next-line react/no-array-index-key\n React.createElement(\"tspan\", {\n x: x,\n dy: index === 0 ? startDy : lineHeight,\n key: index\n }, line.words.join(breakAll ? '' : ' '))\n );\n }));\n }\n }], [{\n key: \"getDerivedStateFromProps\",\n value: function getDerivedStateFromProps(nextProps, prevState) {\n if (nextProps.width !== prevState.prevWidth || nextProps.scaleToFit !== prevState.prevScaleToFit || nextProps.children !== prevState.prevChildren || nextProps.style !== prevState.prevStyle || nextProps.breakAll !== prevState.prevBreakAll) {\n var needCalculate = nextProps.children !== prevState.prevChildren || nextProps.style !== prevState.prevStyle || nextProps.breakAll !== prevState.prevBreakAll;\n return {\n prevWidth: nextProps.width,\n prevScaleToFit: nextProps.scaleToFit,\n prevChildren: nextProps.children,\n prevStyle: nextProps.style,\n wordsByLines: getWordsByLines(nextProps, needCalculate)\n };\n }\n return null;\n }\n }]);\n return Text;\n}(Component);\nText.defaultProps = {\n x: 0,\n y: 0,\n lineHeight: '1em',\n capHeight: '0.71em',\n // Magic number from d3\n scaleToFit: false,\n textAnchor: 'start',\n verticalAnchor: 'end' // Maintain compat with existing charts / default SVG behavior\n};","import _isObject from \"lodash/isObject\";\nimport _isFunction from \"lodash/isFunction\";\nimport _isNil from \"lodash/isNil\";\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nimport React, { cloneElement, isValidElement, createElement } from 'react';\nimport classNames from 'classnames';\nimport { Text } from './Text';\nimport { findAllByType } from '../util/ReactUtils';\nimport { isNumOrStr, isNumber, isPercent, getPercentValue, uniqueId, mathSign } from '../util/DataUtils';\nimport { polarToCartesian } from '../util/PolarUtils';\nimport { filterProps } from '../util/types';\nvar getLabel = function getLabel(props) {\n var value = props.value,\n formatter = props.formatter;\n var label = _isNil(props.children) ? value : props.children;\n if (_isFunction(formatter)) {\n return formatter(label);\n }\n return label;\n};\nvar getDeltaAngle = function getDeltaAngle(startAngle, endAngle) {\n var sign = mathSign(endAngle - startAngle);\n var deltaAngle = Math.min(Math.abs(endAngle - startAngle), 360);\n return sign * deltaAngle;\n};\nvar renderRadialLabel = function renderRadialLabel(labelProps, label, attrs) {\n var position = labelProps.position,\n viewBox = labelProps.viewBox,\n offset = labelProps.offset,\n className = labelProps.className;\n var _ref = viewBox,\n cx = _ref.cx,\n cy = _ref.cy,\n innerRadius = _ref.innerRadius,\n outerRadius = _ref.outerRadius,\n startAngle = _ref.startAngle,\n endAngle = _ref.endAngle,\n clockWise = _ref.clockWise;\n var radius = (innerRadius + outerRadius) / 2;\n var deltaAngle = getDeltaAngle(startAngle, endAngle);\n var sign = deltaAngle >= 0 ? 1 : -1;\n var labelAngle, direction;\n if (position === 'insideStart') {\n labelAngle = startAngle + sign * offset;\n direction = clockWise;\n } else if (position === 'insideEnd') {\n labelAngle = endAngle - sign * offset;\n direction = !clockWise;\n } else if (position === 'end') {\n labelAngle = endAngle + sign * offset;\n direction = clockWise;\n }\n direction = deltaAngle <= 0 ? direction : !direction;\n var startPoint = polarToCartesian(cx, cy, radius, labelAngle);\n var endPoint = polarToCartesian(cx, cy, radius, labelAngle + (direction ? 1 : -1) * 359);\n var path = \"M\".concat(startPoint.x, \",\").concat(startPoint.y, \"\\n A\").concat(radius, \",\").concat(radius, \",0,1,\").concat(direction ? 0 : 1, \",\\n \").concat(endPoint.x, \",\").concat(endPoint.y);\n var id = _isNil(labelProps.id) ? uniqueId('recharts-radial-line-') : labelProps.id;\n return /*#__PURE__*/React.createElement(\"text\", _extends({}, attrs, {\n dominantBaseline: \"central\",\n className: classNames('recharts-radial-bar-label', className)\n }), /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"path\", {\n id: id,\n d: path\n })), /*#__PURE__*/React.createElement(\"textPath\", {\n xlinkHref: \"#\".concat(id)\n }, label));\n};\nvar getAttrsOfPolarLabel = function getAttrsOfPolarLabel(props) {\n var viewBox = props.viewBox,\n offset = props.offset,\n position = props.position;\n var _ref2 = viewBox,\n cx = _ref2.cx,\n cy = _ref2.cy,\n innerRadius = _ref2.innerRadius,\n outerRadius = _ref2.outerRadius,\n startAngle = _ref2.startAngle,\n endAngle = _ref2.endAngle;\n var midAngle = (startAngle + endAngle) / 2;\n if (position === 'outside') {\n var _polarToCartesian = polarToCartesian(cx, cy, outerRadius + offset, midAngle),\n _x = _polarToCartesian.x,\n _y = _polarToCartesian.y;\n return {\n x: _x,\n y: _y,\n textAnchor: _x >= cx ? 'start' : 'end',\n verticalAnchor: 'middle'\n };\n }\n if (position === 'center') {\n return {\n x: cx,\n y: cy,\n textAnchor: 'middle',\n verticalAnchor: 'middle'\n };\n }\n if (position === 'centerTop') {\n return {\n x: cx,\n y: cy,\n textAnchor: 'middle',\n verticalAnchor: 'start'\n };\n }\n if (position === 'centerBottom') {\n return {\n x: cx,\n y: cy,\n textAnchor: 'middle',\n verticalAnchor: 'end'\n };\n }\n var r = (innerRadius + outerRadius) / 2;\n var _polarToCartesian2 = polarToCartesian(cx, cy, r, midAngle),\n x = _polarToCartesian2.x,\n y = _polarToCartesian2.y;\n return {\n x: x,\n y: y,\n textAnchor: 'middle',\n verticalAnchor: 'middle'\n };\n};\nvar getAttrsOfCartesianLabel = function getAttrsOfCartesianLabel(props) {\n var viewBox = props.viewBox,\n parentViewBox = props.parentViewBox,\n offset = props.offset,\n position = props.position;\n var _ref3 = viewBox,\n x = _ref3.x,\n y = _ref3.y,\n width = _ref3.width,\n height = _ref3.height; // Define vertical offsets and position inverts based on the value being positive or negative\n\n var verticalSign = height >= 0 ? 1 : -1;\n var verticalOffset = verticalSign * offset;\n var verticalEnd = verticalSign > 0 ? 'end' : 'start';\n var verticalStart = verticalSign > 0 ? 'start' : 'end'; // Define horizontal offsets and position inverts based on the value being positive or negative\n\n var horizontalSign = width >= 0 ? 1 : -1;\n var horizontalOffset = horizontalSign * offset;\n var horizontalEnd = horizontalSign > 0 ? 'end' : 'start';\n var horizontalStart = horizontalSign > 0 ? 'start' : 'end';\n if (position === 'top') {\n var attrs = {\n x: x + width / 2,\n y: y - verticalSign * offset,\n textAnchor: 'middle',\n verticalAnchor: verticalEnd\n };\n return _objectSpread(_objectSpread({}, attrs), parentViewBox ? {\n height: Math.max(y - parentViewBox.y, 0),\n width: width\n } : {});\n }\n if (position === 'bottom') {\n var _attrs = {\n x: x + width / 2,\n y: y + height + verticalOffset,\n textAnchor: 'middle',\n verticalAnchor: verticalStart\n };\n return _objectSpread(_objectSpread({}, _attrs), parentViewBox ? {\n height: Math.max(parentViewBox.y + parentViewBox.height - (y + height), 0),\n width: width\n } : {});\n }\n if (position === 'left') {\n var _attrs2 = {\n x: x - horizontalOffset,\n y: y + height / 2,\n textAnchor: horizontalEnd,\n verticalAnchor: 'middle'\n };\n return _objectSpread(_objectSpread({}, _attrs2), parentViewBox ? {\n width: Math.max(_attrs2.x - parentViewBox.x, 0),\n height: height\n } : {});\n }\n if (position === 'right') {\n var _attrs3 = {\n x: x + width + horizontalOffset,\n y: y + height / 2,\n textAnchor: horizontalStart,\n verticalAnchor: 'middle'\n };\n return _objectSpread(_objectSpread({}, _attrs3), parentViewBox ? {\n width: Math.max(parentViewBox.x + parentViewBox.width - _attrs3.x, 0),\n height: height\n } : {});\n }\n var sizeAttrs = parentViewBox ? {\n width: width,\n height: height\n } : {};\n if (position === 'insideLeft') {\n return _objectSpread({\n x: x + horizontalOffset,\n y: y + height / 2,\n textAnchor: horizontalStart,\n verticalAnchor: 'middle'\n }, sizeAttrs);\n }\n if (position === 'insideRight') {\n return _objectSpread({\n x: x + width - horizontalOffset,\n y: y + height / 2,\n textAnchor: horizontalEnd,\n verticalAnchor: 'middle'\n }, sizeAttrs);\n }\n if (position === 'insideTop') {\n return _objectSpread({\n x: x + width / 2,\n y: y + verticalOffset,\n textAnchor: 'middle',\n verticalAnchor: verticalStart\n }, sizeAttrs);\n }\n if (position === 'insideBottom') {\n return _objectSpread({\n x: x + width / 2,\n y: y + height - verticalOffset,\n textAnchor: 'middle',\n verticalAnchor: verticalEnd\n }, sizeAttrs);\n }\n if (position === 'insideTopLeft') {\n return _objectSpread({\n x: x + horizontalOffset,\n y: y + verticalOffset,\n textAnchor: horizontalStart,\n verticalAnchor: verticalStart\n }, sizeAttrs);\n }\n if (position === 'insideTopRight') {\n return _objectSpread({\n x: x + width - horizontalOffset,\n y: y + verticalOffset,\n textAnchor: horizontalEnd,\n verticalAnchor: verticalStart\n }, sizeAttrs);\n }\n if (position === 'insideBottomLeft') {\n return _objectSpread({\n x: x + horizontalOffset,\n y: y + height - verticalOffset,\n textAnchor: horizontalStart,\n verticalAnchor: verticalEnd\n }, sizeAttrs);\n }\n if (position === 'insideBottomRight') {\n return _objectSpread({\n x: x + width - horizontalOffset,\n y: y + height - verticalOffset,\n textAnchor: horizontalEnd,\n verticalAnchor: verticalEnd\n }, sizeAttrs);\n }\n if (_isObject(position) && (isNumber(position.x) || isPercent(position.x)) && (isNumber(position.y) || isPercent(position.y))) {\n return _objectSpread({\n x: x + getPercentValue(position.x, width),\n y: y + getPercentValue(position.y, height),\n textAnchor: 'end',\n verticalAnchor: 'end'\n }, sizeAttrs);\n }\n return _objectSpread({\n x: x + width / 2,\n y: y + height / 2,\n textAnchor: 'middle',\n verticalAnchor: 'middle'\n }, sizeAttrs);\n};\nvar isPolar = function isPolar(viewBox) {\n return isNumber(viewBox.cx);\n};\nexport function Label(props) {\n var viewBox = props.viewBox,\n position = props.position,\n value = props.value,\n children = props.children,\n content = props.content,\n _props$className = props.className,\n className = _props$className === void 0 ? '' : _props$className,\n textBreakAll = props.textBreakAll;\n if (!viewBox || _isNil(value) && _isNil(children) && ! /*#__PURE__*/isValidElement(content) && !_isFunction(content)) {\n return null;\n }\n if ( /*#__PURE__*/isValidElement(content)) {\n return /*#__PURE__*/cloneElement(content, props);\n }\n var label;\n if (_isFunction(content)) {\n label = /*#__PURE__*/createElement(content, props);\n if ( /*#__PURE__*/isValidElement(label)) {\n return label;\n }\n } else {\n label = getLabel(props);\n }\n var isPolarLabel = isPolar(viewBox);\n var attrs = filterProps(props, true);\n if (isPolarLabel && (position === 'insideStart' || position === 'insideEnd' || position === 'end')) {\n return renderRadialLabel(props, label, attrs);\n }\n var positionAttrs = isPolarLabel ? getAttrsOfPolarLabel(props) : getAttrsOfCartesianLabel(props);\n return /*#__PURE__*/React.createElement(Text, _extends({\n className: classNames('recharts-label', className)\n }, attrs, positionAttrs, {\n breakAll: textBreakAll\n }), label);\n}\nLabel.displayName = 'Label';\nLabel.defaultProps = {\n offset: 5\n};\nvar parseViewBox = function parseViewBox(props) {\n var cx = props.cx,\n cy = props.cy,\n angle = props.angle,\n startAngle = props.startAngle,\n endAngle = props.endAngle,\n r = props.r,\n radius = props.radius,\n innerRadius = props.innerRadius,\n outerRadius = props.outerRadius,\n x = props.x,\n y = props.y,\n top = props.top,\n left = props.left,\n width = props.width,\n height = props.height,\n clockWise = props.clockWise,\n labelViewBox = props.labelViewBox;\n if (labelViewBox) {\n return labelViewBox;\n }\n if (isNumber(width) && isNumber(height)) {\n if (isNumber(x) && isNumber(y)) {\n return {\n x: x,\n y: y,\n width: width,\n height: height\n };\n }\n if (isNumber(top) && isNumber(left)) {\n return {\n x: top,\n y: left,\n width: width,\n height: height\n };\n }\n }\n if (isNumber(x) && isNumber(y)) {\n return {\n x: x,\n y: y,\n width: 0,\n height: 0\n };\n }\n if (isNumber(cx) && isNumber(cy)) {\n return {\n cx: cx,\n cy: cy,\n startAngle: startAngle || angle || 0,\n endAngle: endAngle || angle || 0,\n innerRadius: innerRadius || 0,\n outerRadius: outerRadius || radius || r || 0,\n clockWise: clockWise\n };\n }\n if (props.viewBox) {\n return props.viewBox;\n }\n return {};\n};\nvar parseLabel = function parseLabel(label, viewBox) {\n if (!label) {\n return null;\n }\n if (label === true) {\n return /*#__PURE__*/React.createElement(Label, {\n key: \"label-implicit\",\n viewBox: viewBox\n });\n }\n if (isNumOrStr(label)) {\n return /*#__PURE__*/React.createElement(Label, {\n key: \"label-implicit\",\n viewBox: viewBox,\n value: label\n });\n }\n if ( /*#__PURE__*/isValidElement(label)) {\n if (label.type === Label) {\n return /*#__PURE__*/cloneElement(label, {\n key: 'label-implicit',\n viewBox: viewBox\n });\n }\n return /*#__PURE__*/React.createElement(Label, {\n key: \"label-implicit\",\n content: label,\n viewBox: viewBox\n });\n }\n if (_isFunction(label)) {\n return /*#__PURE__*/React.createElement(Label, {\n key: \"label-implicit\",\n content: label,\n viewBox: viewBox\n });\n }\n if (_isObject(label)) {\n return /*#__PURE__*/React.createElement(Label, _extends({\n viewBox: viewBox\n }, label, {\n key: \"label-implicit\"\n }));\n }\n return null;\n};\nvar renderCallByParent = function renderCallByParent(parentProps, viewBox) {\n var checkPropsLabel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n if (!parentProps || !parentProps.children && checkPropsLabel && !parentProps.label) {\n return null;\n }\n var children = parentProps.children;\n var parentViewBox = parseViewBox(parentProps);\n var explicitChildren = findAllByType(children, Label.displayName).map(function (child, index) {\n return /*#__PURE__*/cloneElement(child, {\n viewBox: viewBox || parentViewBox,\n key: \"label-\".concat(index)\n });\n });\n if (!checkPropsLabel) {\n return explicitChildren;\n }\n var implicitLabel = parseLabel(parentProps.label, viewBox || parentViewBox);\n return [implicitLabel].concat(_toConsumableArray(explicitChildren));\n};\nLabel.parseViewBox = parseViewBox;\nLabel.renderCallByParent = renderCallByParent;","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nimport _get from \"lodash/get\";\nimport _isFunction from \"lodash/isFunction\";\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n}\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}\nfunction _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n return _possibleConstructorReturn(this, result);\n };\n}\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n return _assertThisInitialized(self);\n}\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}\nfunction _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\n/**\n * @fileOverview Cartesian Axis\n */\nimport React, { Component } from 'react';\nimport classNames from 'classnames';\nimport { shallowEqual } from '../util/ShallowEqual';\nimport { getStringSize } from '../util/DOMUtils';\nimport { Layer } from '../container/Layer';\nimport { Text } from '../component/Text';\nimport { Label } from '../component/Label';\nimport { Global } from '../util/Global';\nimport { isNumber, mathSign } from '../util/DataUtils';\nimport { filterProps, adaptEventsOfChild } from '../util/types';\nexport var CartesianAxis = /*#__PURE__*/function (_Component) {\n _inherits(CartesianAxis, _Component);\n var _super = _createSuper(CartesianAxis);\n function CartesianAxis(props) {\n var _this;\n _classCallCheck(this, CartesianAxis);\n _this = _super.call(this, props);\n _this.layerReference = void 0;\n _this.state = {\n fontSize: '',\n letterSpacing: ''\n };\n return _this;\n } // todo Array\n\n _createClass(CartesianAxis, [{\n key: \"shouldComponentUpdate\",\n value: function shouldComponentUpdate(_ref, nextState) {\n var viewBox = _ref.viewBox,\n restProps = _objectWithoutProperties(_ref, [\"viewBox\"]);\n\n // props.viewBox is sometimes generated every time -\n // check that specially as object equality is likely to fail\n var _this$props = this.props,\n viewBoxOld = _this$props.viewBox,\n restPropsOld = _objectWithoutProperties(_this$props, [\"viewBox\"]);\n return !shallowEqual(viewBox, viewBoxOld) || !shallowEqual(restProps, restPropsOld) || !shallowEqual(nextState, this.state);\n }\n }, {\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var htmlLayer = this.layerReference;\n if (!htmlLayer) return;\n var tick = htmlLayer.getElementsByClassName('recharts-cartesian-axis-tick-value')[0];\n if (tick) {\n this.setState({\n fontSize: window.getComputedStyle(tick).fontSize,\n letterSpacing: window.getComputedStyle(tick).letterSpacing\n });\n }\n }\n /**\n * Calculate the coordinates of endpoints in ticks\n * @param {Object} data The data of a simple tick\n * @return {Object} (x1, y1): The coordinate of endpoint close to tick text\n * (x2, y2): The coordinate of endpoint close to axis\n */\n }, {\n key: \"getTickLineCoord\",\n value: function getTickLineCoord(data) {\n var _this$props2 = this.props,\n x = _this$props2.x,\n y = _this$props2.y,\n width = _this$props2.width,\n height = _this$props2.height,\n orientation = _this$props2.orientation,\n tickSize = _this$props2.tickSize,\n mirror = _this$props2.mirror,\n tickMargin = _this$props2.tickMargin;\n var x1, x2, y1, y2, tx, ty;\n var sign = mirror ? -1 : 1;\n var finalTickSize = data.tickSize || tickSize;\n var tickCoord = isNumber(data.tickCoord) ? data.tickCoord : data.coordinate;\n switch (orientation) {\n case 'top':\n x1 = x2 = data.coordinate;\n y2 = y + +!mirror * height;\n y1 = y2 - sign * finalTickSize;\n ty = y1 - sign * tickMargin;\n tx = tickCoord;\n break;\n case 'left':\n y1 = y2 = data.coordinate;\n x2 = x + +!mirror * width;\n x1 = x2 - sign * finalTickSize;\n tx = x1 - sign * tickMargin;\n ty = tickCoord;\n break;\n case 'right':\n y1 = y2 = data.coordinate;\n x2 = x + +mirror * width;\n x1 = x2 + sign * finalTickSize;\n tx = x1 + sign * tickMargin;\n ty = tickCoord;\n break;\n default:\n x1 = x2 = data.coordinate;\n y2 = y + +mirror * height;\n y1 = y2 + sign * finalTickSize;\n ty = y1 + sign * tickMargin;\n tx = tickCoord;\n break;\n }\n return {\n line: {\n x1: x1,\n y1: y1,\n x2: x2,\n y2: y2\n },\n tick: {\n x: tx,\n y: ty\n }\n };\n }\n }, {\n key: \"getTickTextAnchor\",\n value: function getTickTextAnchor() {\n var _this$props3 = this.props,\n orientation = _this$props3.orientation,\n mirror = _this$props3.mirror;\n var textAnchor;\n switch (orientation) {\n case 'left':\n textAnchor = mirror ? 'start' : 'end';\n break;\n case 'right':\n textAnchor = mirror ? 'end' : 'start';\n break;\n default:\n textAnchor = 'middle';\n break;\n }\n return textAnchor;\n }\n }, {\n key: \"getTickVerticalAnchor\",\n value: function getTickVerticalAnchor() {\n var _this$props4 = this.props,\n orientation = _this$props4.orientation,\n mirror = _this$props4.mirror;\n var verticalAnchor = 'end';\n switch (orientation) {\n case 'left':\n case 'right':\n verticalAnchor = 'middle';\n break;\n case 'top':\n verticalAnchor = mirror ? 'start' : 'end';\n break;\n default:\n verticalAnchor = mirror ? 'end' : 'start';\n break;\n }\n return verticalAnchor;\n }\n }, {\n key: \"renderAxisLine\",\n value: function renderAxisLine() {\n var _this$props5 = this.props,\n x = _this$props5.x,\n y = _this$props5.y,\n width = _this$props5.width,\n height = _this$props5.height,\n orientation = _this$props5.orientation,\n mirror = _this$props5.mirror,\n axisLine = _this$props5.axisLine;\n var props = _objectSpread(_objectSpread(_objectSpread({}, filterProps(this.props)), filterProps(axisLine)), {}, {\n fill: 'none'\n });\n if (orientation === 'top' || orientation === 'bottom') {\n var needHeight = +(orientation === 'top' && !mirror || orientation === 'bottom' && mirror);\n props = _objectSpread(_objectSpread({}, props), {}, {\n x1: x,\n y1: y + needHeight * height,\n x2: x + width,\n y2: y + needHeight * height\n });\n } else {\n var needWidth = +(orientation === 'left' && !mirror || orientation === 'right' && mirror);\n props = _objectSpread(_objectSpread({}, props), {}, {\n x1: x + needWidth * width,\n y1: y,\n x2: x + needWidth * width,\n y2: y + height\n });\n }\n return /*#__PURE__*/React.createElement(\"line\", _extends({}, props, {\n className: classNames('recharts-cartesian-axis-line', _get(axisLine, 'className'))\n }));\n }\n }, {\n key: \"renderTicks\",\n value:\n /**\n * render the ticks\n * @param {Array} ticks The ticks to actually render (overrides what was passed in props)\n * @param {string} fontSize Fontsize to consider for tick spacing\n * @param {string} letterSpacing Letterspacing to consider for tick spacing\n * @return {ReactComponent} renderedTicks\n */\n function renderTicks(ticks, fontSize, letterSpacing) {\n var _this2 = this;\n var _this$props6 = this.props,\n tickLine = _this$props6.tickLine,\n stroke = _this$props6.stroke,\n tick = _this$props6.tick,\n tickFormatter = _this$props6.tickFormatter,\n unit = _this$props6.unit;\n var finalTicks = CartesianAxis.getTicks(_objectSpread(_objectSpread({}, this.props), {}, {\n ticks: ticks\n }), fontSize, letterSpacing);\n var textAnchor = this.getTickTextAnchor();\n var verticalAnchor = this.getTickVerticalAnchor();\n var axisProps = filterProps(this.props);\n var customTickProps = filterProps(tick);\n var tickLineProps = _objectSpread(_objectSpread({}, axisProps), {}, {\n fill: 'none'\n }, filterProps(tickLine));\n var items = finalTicks.map(function (entry, i) {\n var _this2$getTickLineCoo = _this2.getTickLineCoord(entry),\n lineCoord = _this2$getTickLineCoo.line,\n tickCoord = _this2$getTickLineCoo.tick;\n var tickProps = _objectSpread(_objectSpread(_objectSpread(_objectSpread({\n textAnchor: textAnchor,\n verticalAnchor: verticalAnchor\n }, axisProps), {}, {\n stroke: 'none',\n fill: stroke\n }, customTickProps), tickCoord), {}, {\n index: i,\n payload: entry,\n visibleTicksCount: finalTicks.length,\n tickFormatter: tickFormatter\n });\n return /*#__PURE__*/React.createElement(Layer, _extends({\n className: \"recharts-cartesian-axis-tick\",\n key: \"tick-\".concat(i) // eslint-disable-line react/no-array-index-key\n }, adaptEventsOfChild(_this2.props, entry, i)), tickLine && /*#__PURE__*/React.createElement(\"line\", _extends({}, tickLineProps, lineCoord, {\n className: classNames('recharts-cartesian-axis-tick-line', _get(tickLine, 'className'))\n })), tick && CartesianAxis.renderTickItem(tick, tickProps, \"\".concat(_isFunction(tickFormatter) ? tickFormatter(entry.value, i) : entry.value).concat(unit || '')));\n });\n return /*#__PURE__*/React.createElement(\"g\", {\n className: \"recharts-cartesian-axis-ticks\"\n }, items);\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this3 = this;\n var _this$props7 = this.props,\n axisLine = _this$props7.axisLine,\n width = _this$props7.width,\n height = _this$props7.height,\n ticksGenerator = _this$props7.ticksGenerator,\n className = _this$props7.className,\n hide = _this$props7.hide;\n if (hide) {\n return null;\n }\n var _this$props8 = this.props,\n ticks = _this$props8.ticks,\n noTicksProps = _objectWithoutProperties(_this$props8, [\"ticks\"]);\n var finalTicks = ticks;\n if (_isFunction(ticksGenerator)) {\n finalTicks = ticks && ticks.length > 0 ? ticksGenerator(this.props) : ticksGenerator(noTicksProps);\n }\n if (width <= 0 || height <= 0 || !finalTicks || !finalTicks.length) {\n return null;\n }\n return /*#__PURE__*/React.createElement(Layer, {\n className: classNames('recharts-cartesian-axis', className),\n ref: function ref(_ref2) {\n _this3.layerReference = _ref2;\n }\n }, axisLine && this.renderAxisLine(), this.renderTicks(finalTicks, this.state.fontSize, this.state.letterSpacing), Label.renderCallByParent(this.props));\n }\n }], [{\n key: \"getTicks\",\n value: function getTicks(props, fontSize, letterSpacing) {\n var tick = props.tick,\n ticks = props.ticks,\n viewBox = props.viewBox,\n minTickGap = props.minTickGap,\n orientation = props.orientation,\n interval = props.interval,\n tickFormatter = props.tickFormatter,\n unit = props.unit;\n if (!ticks || !ticks.length || !tick) {\n return [];\n }\n if (isNumber(interval) || Global.isSsr) {\n return CartesianAxis.getNumberIntervalTicks(ticks, typeof interval === 'number' && isNumber(interval) ? interval : 0);\n }\n if (interval === 'preserveStartEnd') {\n return CartesianAxis.getTicksStart({\n ticks: ticks,\n tickFormatter: tickFormatter,\n viewBox: viewBox,\n orientation: orientation,\n minTickGap: minTickGap,\n unit: unit,\n fontSize: fontSize,\n letterSpacing: letterSpacing\n }, true);\n }\n if (interval === 'preserveStart') {\n return CartesianAxis.getTicksStart({\n ticks: ticks,\n tickFormatter: tickFormatter,\n viewBox: viewBox,\n orientation: orientation,\n minTickGap: minTickGap,\n unit: unit,\n fontSize: fontSize,\n letterSpacing: letterSpacing\n });\n }\n return CartesianAxis.getTicksEnd({\n ticks: ticks,\n tickFormatter: tickFormatter,\n viewBox: viewBox,\n orientation: orientation,\n minTickGap: minTickGap,\n unit: unit,\n fontSize: fontSize,\n letterSpacing: letterSpacing\n });\n }\n }, {\n key: \"getNumberIntervalTicks\",\n value: function getNumberIntervalTicks(ticks, interval) {\n return ticks.filter(function (entry, i) {\n return i % (interval + 1) === 0;\n });\n }\n }, {\n key: \"getTicksStart\",\n value: function getTicksStart(_ref3, preserveEnd) {\n var ticks = _ref3.ticks,\n tickFormatter = _ref3.tickFormatter,\n viewBox = _ref3.viewBox,\n orientation = _ref3.orientation,\n minTickGap = _ref3.minTickGap,\n unit = _ref3.unit,\n fontSize = _ref3.fontSize,\n letterSpacing = _ref3.letterSpacing;\n var x = viewBox.x,\n y = viewBox.y,\n width = viewBox.width,\n height = viewBox.height;\n var sizeKey = orientation === 'top' || orientation === 'bottom' ? 'width' : 'height';\n var result = (ticks || []).slice(); // we need add the width of 'unit' only when sizeKey === 'width'\n\n var unitSize = unit && sizeKey === 'width' ? getStringSize(unit, {\n fontSize: fontSize,\n letterSpacing: letterSpacing\n })[sizeKey] : 0;\n var len = result.length;\n var sign = len >= 2 ? mathSign(result[1].coordinate - result[0].coordinate) : 1;\n var start, end;\n if (sign === 1) {\n start = sizeKey === 'width' ? x : y;\n end = sizeKey === 'width' ? x + width : y + height;\n } else {\n start = sizeKey === 'width' ? x + width : y + height;\n end = sizeKey === 'width' ? x : y;\n }\n if (preserveEnd) {\n // Try to guarantee the tail to be displayed\n var tail = ticks[len - 1];\n var tailContent = _isFunction(tickFormatter) ? tickFormatter(tail.value, len - 1) : tail.value;\n var tailSize = getStringSize(tailContent, {\n fontSize: fontSize,\n letterSpacing: letterSpacing\n })[sizeKey] + unitSize;\n var tailGap = sign * (tail.coordinate + sign * tailSize / 2 - end);\n result[len - 1] = tail = _objectSpread(_objectSpread({}, tail), {}, {\n tickCoord: tailGap > 0 ? tail.coordinate - tailGap * sign : tail.coordinate\n });\n var isTailShow = sign * (tail.tickCoord - sign * tailSize / 2 - start) >= 0 && sign * (tail.tickCoord + sign * tailSize / 2 - end) <= 0;\n if (isTailShow) {\n end = tail.tickCoord - sign * (tailSize / 2 + minTickGap);\n result[len - 1] = _objectSpread(_objectSpread({}, tail), {}, {\n isShow: true\n });\n }\n }\n var count = preserveEnd ? len - 1 : len;\n for (var i = 0; i < count; i++) {\n var entry = result[i];\n var content = _isFunction(tickFormatter) ? tickFormatter(entry.value, i) : entry.value;\n var size = getStringSize(content, {\n fontSize: fontSize,\n letterSpacing: letterSpacing\n })[sizeKey] + unitSize;\n if (i === 0) {\n var gap = sign * (entry.coordinate - sign * size / 2 - start);\n result[i] = entry = _objectSpread(_objectSpread({}, entry), {}, {\n tickCoord: gap < 0 ? entry.coordinate - gap * sign : entry.coordinate\n });\n } else {\n result[i] = entry = _objectSpread(_objectSpread({}, entry), {}, {\n tickCoord: entry.coordinate\n });\n }\n var isShow = sign * (entry.tickCoord - sign * size / 2 - start) >= 0 && sign * (entry.tickCoord + sign * size / 2 - end) <= 0;\n if (isShow) {\n start = entry.tickCoord + sign * (size / 2 + minTickGap);\n result[i] = _objectSpread(_objectSpread({}, entry), {}, {\n isShow: true\n });\n }\n }\n return result.filter(function (entry) {\n return entry.isShow;\n });\n }\n }, {\n key: \"getTicksEnd\",\n value: function getTicksEnd(_ref4) {\n var ticks = _ref4.ticks,\n tickFormatter = _ref4.tickFormatter,\n viewBox = _ref4.viewBox,\n orientation = _ref4.orientation,\n minTickGap = _ref4.minTickGap,\n unit = _ref4.unit,\n fontSize = _ref4.fontSize,\n letterSpacing = _ref4.letterSpacing;\n var x = viewBox.x,\n y = viewBox.y,\n width = viewBox.width,\n height = viewBox.height;\n var sizeKey = orientation === 'top' || orientation === 'bottom' ? 'width' : 'height'; // we need add the width of 'unit' only when sizeKey === 'width'\n\n var unitSize = unit && sizeKey === 'width' ? getStringSize(unit, {\n fontSize: fontSize,\n letterSpacing: letterSpacing\n })[sizeKey] : 0;\n var result = (ticks || []).slice();\n var len = result.length;\n var sign = len >= 2 ? mathSign(result[1].coordinate - result[0].coordinate) : 1;\n var start, end;\n if (sign === 1) {\n start = sizeKey === 'width' ? x : y;\n end = sizeKey === 'width' ? x + width : y + height;\n } else {\n start = sizeKey === 'width' ? x + width : y + height;\n end = sizeKey === 'width' ? x : y;\n }\n for (var i = len - 1; i >= 0; i--) {\n var entry = result[i];\n var content = _isFunction(tickFormatter) ? tickFormatter(entry.value, len - i - 1) : entry.value;\n var size = getStringSize(content, {\n fontSize: fontSize,\n letterSpacing: letterSpacing\n })[sizeKey] + unitSize;\n if (i === len - 1) {\n var gap = sign * (entry.coordinate + sign * size / 2 - end);\n result[i] = entry = _objectSpread(_objectSpread({}, entry), {}, {\n tickCoord: gap > 0 ? entry.coordinate - gap * sign : entry.coordinate\n });\n } else {\n result[i] = entry = _objectSpread(_objectSpread({}, entry), {}, {\n tickCoord: entry.coordinate\n });\n }\n var isShow = sign * (entry.tickCoord - sign * size / 2 - start) >= 0 && sign * (entry.tickCoord + sign * size / 2 - end) <= 0;\n if (isShow) {\n end = entry.tickCoord - sign * (size / 2 + minTickGap);\n result[i] = _objectSpread(_objectSpread({}, entry), {}, {\n isShow: true\n });\n }\n }\n return result.filter(function (entry) {\n return entry.isShow;\n });\n }\n }, {\n key: \"renderTickItem\",\n value: function renderTickItem(option, props, value) {\n var tickItem;\n if ( /*#__PURE__*/React.isValidElement(option)) {\n tickItem = /*#__PURE__*/React.cloneElement(option, props);\n } else if (_isFunction(option)) {\n tickItem = option(props);\n } else {\n tickItem = /*#__PURE__*/React.createElement(Text, _extends({}, props, {\n className: \"recharts-cartesian-axis-tick-value\"\n }), value);\n }\n return tickItem;\n }\n }]);\n return CartesianAxis;\n}(Component);\nCartesianAxis.displayName = 'CartesianAxis';\nCartesianAxis.defaultProps = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n viewBox: {\n x: 0,\n y: 0,\n width: 0,\n height: 0\n },\n // The orientation of axis\n orientation: 'bottom',\n // The ticks\n ticks: [],\n stroke: '#666',\n tickLine: true,\n axisLine: true,\n tick: true,\n mirror: false,\n minTickGap: 5,\n // The width or height of tick\n tickSize: 6,\n tickMargin: 2,\n interval: 'preserveEnd'\n};","export default function (start, stop, step) {\n start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n var i = -1,\n n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\n range = new Array(n);\n while (++i < n) {\n range[i] = start + i * step;\n }\n return range;\n}","export function initRange(domain, range) {\n switch (arguments.length) {\n case 0:\n break;\n case 1:\n this.range(domain);\n break;\n default:\n this.range(range).domain(domain);\n break;\n }\n return this;\n}\nexport function initInterpolator(domain, interpolator) {\n switch (arguments.length) {\n case 0:\n break;\n case 1:\n {\n if (typeof domain === \"function\") this.interpolator(domain);else this.range(domain);\n break;\n }\n default:\n {\n this.domain(domain);\n if (typeof interpolator === \"function\") this.interpolator(interpolator);else this.range(interpolator);\n break;\n }\n }\n return this;\n}","function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\nimport { initRange } from \"./init.js\";\nexport var implicit = Symbol(\"implicit\");\nexport default function ordinal() {\n var index = new Map(),\n domain = [],\n range = [],\n unknown = implicit;\n function scale(d) {\n var key = d + \"\",\n i = index.get(key);\n if (!i) {\n if (unknown !== implicit) return unknown;\n index.set(key, i = domain.push(d));\n }\n return range[(i - 1) % range.length];\n }\n scale.domain = function (_) {\n if (!arguments.length) return domain.slice();\n domain = [], index = new Map();\n var _iterator = _createForOfIteratorHelper(_),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var value = _step.value;\n var key = value + \"\";\n if (index.has(key)) continue;\n index.set(key, domain.push(value));\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n return scale;\n };\n scale.range = function (_) {\n return arguments.length ? (range = Array.from(_), scale) : range.slice();\n };\n scale.unknown = function (_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n scale.copy = function () {\n return ordinal(domain, range).unknown(unknown);\n };\n initRange.apply(scale, arguments);\n return scale;\n}","import _slicedToArray from \"/home/runner/work/ohjelmointi-23/ohjelmointi-23/node_modules/@babel/runtime/helpers/esm/slicedToArray.js\";\nimport { range as sequence } from \"d3-array\";\nimport { initRange } from \"./init.js\";\nimport ordinal from \"./ordinal.js\";\nexport default function band() {\n var scale = ordinal().unknown(undefined),\n domain = scale.domain,\n ordinalRange = scale.range,\n r0 = 0,\n r1 = 1,\n step,\n bandwidth,\n round = false,\n paddingInner = 0,\n paddingOuter = 0,\n align = 0.5;\n delete scale.unknown;\n function rescale() {\n var n = domain().length,\n reverse = r1 < r0,\n start = reverse ? r1 : r0,\n stop = reverse ? r0 : r1;\n step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);\n if (round) step = Math.floor(step);\n start += (stop - start - step * (n - paddingInner)) * align;\n bandwidth = step * (1 - paddingInner);\n if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);\n var values = sequence(n).map(function (i) {\n return start + step * i;\n });\n return ordinalRange(reverse ? values.reverse() : values);\n }\n scale.domain = function (_) {\n return arguments.length ? (domain(_), rescale()) : domain();\n };\n scale.range = function (_) {\n var _ref;\n return arguments.length ? ((_ref = _slicedToArray(_, 2), r0 = _ref[0], r1 = _ref[1]), r0 = +r0, r1 = +r1, rescale()) : [r0, r1];\n };\n scale.rangeRound = function (_) {\n var _ref2;\n return (_ref2 = _slicedToArray(_, 2), r0 = _ref2[0], r1 = _ref2[1]), r0 = +r0, r1 = +r1, round = true, rescale();\n };\n scale.bandwidth = function () {\n return bandwidth;\n };\n scale.step = function () {\n return step;\n };\n scale.round = function (_) {\n return arguments.length ? (round = !!_, rescale()) : round;\n };\n scale.padding = function (_) {\n return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner;\n };\n scale.paddingInner = function (_) {\n return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner;\n };\n scale.paddingOuter = function (_) {\n return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter;\n };\n scale.align = function (_) {\n return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;\n };\n scale.copy = function () {\n return band(domain(), [r0, r1]).round(round).paddingInner(paddingInner).paddingOuter(paddingOuter).align(align);\n };\n return initRange.apply(rescale(), arguments);\n}\nfunction pointish(scale) {\n var copy = scale.copy;\n scale.padding = scale.paddingOuter;\n delete scale.paddingInner;\n delete scale.paddingOuter;\n scale.copy = function () {\n return pointish(copy());\n };\n return scale;\n}\nexport function point() {\n return pointish(band.apply(null, arguments).paddingInner(1));\n}","function _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n}\nvar identity = function identity(i) {\n return i;\n};\nexport var PLACE_HOLDER = {\n '@@functional/placeholder': true\n};\nvar isPlaceHolder = function isPlaceHolder(val) {\n return val === PLACE_HOLDER;\n};\nvar curry0 = function curry0(fn) {\n return function _curried() {\n if (arguments.length === 0 || arguments.length === 1 && isPlaceHolder(arguments.length <= 0 ? undefined : arguments[0])) {\n return _curried;\n }\n return fn.apply(void 0, arguments);\n };\n};\nvar curryN = function curryN(n, fn) {\n if (n === 1) {\n return fn;\n }\n return curry0(function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n var argsLength = args.filter(function (arg) {\n return arg !== PLACE_HOLDER;\n }).length;\n if (argsLength >= n) {\n return fn.apply(void 0, args);\n }\n return curryN(n - argsLength, curry0(function () {\n for (var _len2 = arguments.length, restArgs = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n restArgs[_key2] = arguments[_key2];\n }\n var newArgs = args.map(function (arg) {\n return isPlaceHolder(arg) ? restArgs.shift() : arg;\n });\n return fn.apply(void 0, _toConsumableArray(newArgs).concat(restArgs));\n }));\n });\n};\nexport var curry = function curry(fn) {\n return curryN(fn.length, fn);\n};\nexport var range = function range(begin, end) {\n var arr = [];\n for (var i = begin; i < end; ++i) {\n arr[i - begin] = i;\n }\n return arr;\n};\nexport var map = curry(function (fn, arr) {\n if (Array.isArray(arr)) {\n return arr.map(fn);\n }\n return Object.keys(arr).map(function (key) {\n return arr[key];\n }).map(fn);\n});\nexport var compose = function compose() {\n for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n if (!args.length) {\n return identity;\n }\n var fns = args.reverse(); // first function can receive multiply arguments\n\n var firstFn = fns[0];\n var tailsFn = fns.slice(1);\n return function () {\n return tailsFn.reduce(function (res, fn) {\n return fn(res);\n }, firstFn.apply(void 0, arguments));\n };\n};\nexport var reverse = function reverse(arr) {\n if (Array.isArray(arr)) {\n return arr.reverse();\n } // can be string\n\n return arr.split('').reverse.join('');\n};\nexport var memoize = function memoize(fn) {\n var lastArgs = null;\n var lastResult = null;\n return function () {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n if (lastArgs && args.every(function (val, i) {\n return val === lastArgs[i];\n })) {\n return lastResult;\n }\n lastArgs = args;\n lastResult = fn.apply(void 0, args);\n return lastResult;\n };\n};","/**\n * @fileOverview 一些公用的运算方法\n * @author xile611\n * @date 2015-09-17\n */\nimport Decimal from 'decimal.js-light';\nimport { curry } from './utils';\n/**\n * 获取数值的位数\n * 其中绝对值属于区间[0.1, 1), 得到的值为0\n * 绝对值属于区间[0.01, 0.1),得到的位数为 -1\n * 绝对值属于区间[0.001, 0.01),得到的位数为 -2\n *\n * @param {Number} value 数值\n * @return {Integer} 位数\n */\n\nfunction getDigitCount(value) {\n var result;\n if (value === 0) {\n result = 1;\n } else {\n result = Math.floor(new Decimal(value).abs().log(10).toNumber()) + 1;\n }\n return result;\n}\n/**\n * 按照固定的步长获取[start, end)这个区间的数据\n * 并且需要处理js计算精度的问题\n *\n * @param {Decimal} start 起点\n * @param {Decimal} end 终点,不包含该值\n * @param {Decimal} step 步长\n * @return {Array} 若干数值\n */\n\nfunction rangeStep(start, end, step) {\n var num = new Decimal(start);\n var i = 0;\n var result = []; // magic number to prevent infinite loop\n\n while (num.lt(end) && i < 100000) {\n result.push(num.toNumber());\n num = num.add(step);\n i++;\n }\n return result;\n}\n/**\n * 对数值进行线性插值\n *\n * @param {Number} a 定义域的极点\n * @param {Number} b 定义域的极点\n * @param {Number} t [0, 1]内的某个值\n * @return {Number} 定义域内的某个值\n */\n\nvar interpolateNumber = curry(function (a, b, t) {\n var newA = +a;\n var newB = +b;\n return newA + t * (newB - newA);\n});\n/**\n * 线性插值的逆运算\n *\n * @param {Number} a 定义域的极点\n * @param {Number} b 定义域的极点\n * @param {Number} x 可以认为是插值后的一个输出值\n * @return {Number} 当x在 a ~ b这个范围内时,返回值属于[0, 1]\n */\n\nvar uninterpolateNumber = curry(function (a, b, x) {\n var diff = b - +a;\n diff = diff || Infinity;\n return (x - a) / diff;\n});\n/**\n * 线性插值的逆运算,并且有截断的操作\n *\n * @param {Number} a 定义域的极点\n * @param {Number} b 定义域的极点\n * @param {Number} x 可以认为是插值后的一个输出值\n * @return {Number} 当x在 a ~ b这个区间内时,返回值属于[0, 1],\n * 当x不在 a ~ b这个区间时,会截断到 a ~ b 这个区间\n */\n\nvar uninterpolateTruncation = curry(function (a, b, x) {\n var diff = b - +a;\n diff = diff || Infinity;\n return Math.max(0, Math.min(1, (x - a) / diff));\n});\nexport default {\n rangeStep: rangeStep,\n getDigitCount: getDigitCount,\n interpolateNumber: interpolateNumber,\n uninterpolateNumber: uninterpolateNumber,\n uninterpolateTruncation: uninterpolateTruncation\n};","function _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n}\nfunction _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n return _arr;\n}\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\n/**\n * @fileOverview calculate tick values of scale\n * @author xile611, arcthur\n * @date 2015-09-17\n */\nimport Decimal from 'decimal.js-light';\nimport { compose, range, memoize, map, reverse } from './util/utils';\nimport Arithmetic from './util/arithmetic';\n/**\n * Calculate a interval of a minimum value and a maximum value\n *\n * @param {Number} min The minimum value\n * @param {Number} max The maximum value\n * @return {Array} An interval\n */\n\nfunction getValidInterval(_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n min = _ref2[0],\n max = _ref2[1];\n var validMin = min,\n validMax = max; // exchange\n\n if (min > max) {\n validMin = max;\n validMax = min;\n }\n return [validMin, validMax];\n}\n/**\n * Calculate the step which is easy to understand between ticks, like 10, 20, 25\n *\n * @param {Decimal} roughStep The rough step calculated by deviding the\n * difference by the tickCount\n * @param {Boolean} allowDecimals Allow the ticks to be decimals or not\n * @param {Integer} correctionFactor A correction factor\n * @return {Decimal} The step which is easy to understand between two ticks\n */\n\nfunction getFormatStep(roughStep, allowDecimals, correctionFactor) {\n if (roughStep.lte(0)) {\n return new Decimal(0);\n }\n var digitCount = Arithmetic.getDigitCount(roughStep.toNumber()); // The ratio between the rough step and the smallest number which has a bigger\n // order of magnitudes than the rough step\n\n var digitCountValue = new Decimal(10).pow(digitCount);\n var stepRatio = roughStep.div(digitCountValue); // When an integer and a float multiplied, the accuracy of result may be wrong\n\n var stepRatioScale = digitCount !== 1 ? 0.05 : 0.1;\n var amendStepRatio = new Decimal(Math.ceil(stepRatio.div(stepRatioScale).toNumber())).add(correctionFactor).mul(stepRatioScale);\n var formatStep = amendStepRatio.mul(digitCountValue);\n return allowDecimals ? formatStep : new Decimal(Math.ceil(formatStep));\n}\n/**\n * calculate the ticks when the minimum value equals to the maximum value\n *\n * @param {Number} value The minimum valuue which is also the maximum value\n * @param {Integer} tickCount The count of ticks\n * @param {Boolean} allowDecimals Allow the ticks to be decimals or not\n * @return {Array} ticks\n */\n\nfunction getTickOfSingleValue(value, tickCount, allowDecimals) {\n var step = 1; // calculate the middle value of ticks\n\n var middle = new Decimal(value);\n if (!middle.isint() && allowDecimals) {\n var absVal = Math.abs(value);\n if (absVal < 1) {\n // The step should be a float number when the difference is smaller than 1\n step = new Decimal(10).pow(Arithmetic.getDigitCount(value) - 1);\n middle = new Decimal(Math.floor(middle.div(step).toNumber())).mul(step);\n } else if (absVal > 1) {\n // Return the maximum integer which is smaller than 'value' when 'value' is greater than 1\n middle = new Decimal(Math.floor(value));\n }\n } else if (value === 0) {\n middle = new Decimal(Math.floor((tickCount - 1) / 2));\n } else if (!allowDecimals) {\n middle = new Decimal(Math.floor(value));\n }\n var middleIndex = Math.floor((tickCount - 1) / 2);\n var fn = compose(map(function (n) {\n return middle.add(new Decimal(n - middleIndex).mul(step)).toNumber();\n }), range);\n return fn(0, tickCount);\n}\n/**\n * Calculate the step\n *\n * @param {Number} min The minimum value of an interval\n * @param {Number} max The maximum value of an interval\n * @param {Integer} tickCount The count of ticks\n * @param {Boolean} allowDecimals Allow the ticks to be decimals or not\n * @param {Number} correctionFactor A correction factor\n * @return {Object} The step, minimum value of ticks, maximum value of ticks\n */\n\nfunction calculateStep(min, max, tickCount, allowDecimals) {\n var correctionFactor = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;\n\n // dirty hack (for recharts' test)\n if (!Number.isFinite((max - min) / (tickCount - 1))) {\n return {\n step: new Decimal(0),\n tickMin: new Decimal(0),\n tickMax: new Decimal(0)\n };\n } // The step which is easy to understand between two ticks\n\n var step = getFormatStep(new Decimal(max).sub(min).div(tickCount - 1), allowDecimals, correctionFactor); // A medial value of ticks\n\n var middle; // When 0 is inside the interval, 0 should be a tick\n\n if (min <= 0 && max >= 0) {\n middle = new Decimal(0);\n } else {\n // calculate the middle value\n middle = new Decimal(min).add(max).div(2); // minus modulo value\n\n middle = middle.sub(new Decimal(middle).mod(step));\n }\n var belowCount = Math.ceil(middle.sub(min).div(step).toNumber());\n var upCount = Math.ceil(new Decimal(max).sub(middle).div(step).toNumber());\n var scaleCount = belowCount + upCount + 1;\n if (scaleCount > tickCount) {\n // When more ticks need to cover the interval, step should be bigger.\n return calculateStep(min, max, tickCount, allowDecimals, correctionFactor + 1);\n }\n if (scaleCount < tickCount) {\n // When less ticks can cover the interval, we should add some additional ticks\n upCount = max > 0 ? upCount + (tickCount - scaleCount) : upCount;\n belowCount = max > 0 ? belowCount : belowCount + (tickCount - scaleCount);\n }\n return {\n step: step,\n tickMin: middle.sub(new Decimal(belowCount).mul(step)),\n tickMax: middle.add(new Decimal(upCount).mul(step))\n };\n}\n/**\n * Calculate the ticks of an interval, the count of ticks will be guraranteed\n *\n * @param {Number} min, max min: The minimum value, max: The maximum value\n * @param {Integer} tickCount The count of ticks\n * @param {Boolean} allowDecimals Allow the ticks to be decimals or not\n * @return {Array} ticks\n */\n\nfunction getNiceTickValuesFn(_ref3) {\n var _ref4 = _slicedToArray(_ref3, 2),\n min = _ref4[0],\n max = _ref4[1];\n var tickCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 6;\n var allowDecimals = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n // More than two ticks should be return\n var count = Math.max(tickCount, 2);\n var _getValidInterval = getValidInterval([min, max]),\n _getValidInterval2 = _slicedToArray(_getValidInterval, 2),\n cormin = _getValidInterval2[0],\n cormax = _getValidInterval2[1];\n if (cormin === -Infinity || cormax === Infinity) {\n var _values = cormax === Infinity ? [cormin].concat(_toConsumableArray(range(0, tickCount - 1).map(function () {\n return Infinity;\n }))) : [].concat(_toConsumableArray(range(0, tickCount - 1).map(function () {\n return -Infinity;\n })), [cormax]);\n return min > max ? reverse(_values) : _values;\n }\n if (cormin === cormax) {\n return getTickOfSingleValue(cormin, tickCount, allowDecimals);\n } // Get the step between two ticks\n\n var _calculateStep = calculateStep(cormin, cormax, count, allowDecimals),\n step = _calculateStep.step,\n tickMin = _calculateStep.tickMin,\n tickMax = _calculateStep.tickMax;\n var values = Arithmetic.rangeStep(tickMin, tickMax.add(new Decimal(0.1).mul(step)), step);\n return min > max ? reverse(values) : values;\n}\n/**\n * Calculate the ticks of an interval, the count of ticks won't be guraranteed\n *\n * @param {Number} min, max min: The minimum value, max: The maximum value\n * @param {Integer} tickCount The count of ticks\n * @param {Boolean} allowDecimals Allow the ticks to be decimals or not\n * @return {Array} ticks\n */\n\nfunction getTickValuesFn(_ref5) {\n var _ref6 = _slicedToArray(_ref5, 2),\n min = _ref6[0],\n max = _ref6[1];\n var tickCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 6;\n var allowDecimals = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n // More than two ticks should be return\n var count = Math.max(tickCount, 2);\n var _getValidInterval3 = getValidInterval([min, max]),\n _getValidInterval4 = _slicedToArray(_getValidInterval3, 2),\n cormin = _getValidInterval4[0],\n cormax = _getValidInterval4[1];\n if (cormin === -Infinity || cormax === Infinity) {\n return [min, max];\n }\n if (cormin === cormax) {\n return getTickOfSingleValue(cormin, tickCount, allowDecimals);\n }\n var step = getFormatStep(new Decimal(cormax).sub(cormin).div(count - 1), allowDecimals, 0);\n var fn = compose(map(function (n) {\n return new Decimal(cormin).add(new Decimal(n).mul(step)).toNumber();\n }), range);\n var values = fn(0, count).filter(function (entry) {\n return entry >= cormin && entry <= cormax;\n });\n return min > max ? reverse(values) : values;\n}\n/**\n * Calculate the ticks of an interval, the count of ticks won't be guraranteed,\n * but the domain will be guaranteed\n *\n * @param {Number} min, max min: The minimum value, max: The maximum value\n * @param {Integer} tickCount The count of ticks\n * @param {Boolean} allowDecimals Allow the ticks to be decimals or not\n * @return {Array} ticks\n */\n\nfunction getTickValuesFixedDomainFn(_ref7, tickCount) {\n var _ref8 = _slicedToArray(_ref7, 2),\n min = _ref8[0],\n max = _ref8[1];\n var allowDecimals = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n // More than two ticks should be return\n var _getValidInterval5 = getValidInterval([min, max]),\n _getValidInterval6 = _slicedToArray(_getValidInterval5, 2),\n cormin = _getValidInterval6[0],\n cormax = _getValidInterval6[1];\n if (cormin === -Infinity || cormax === Infinity) {\n return [min, max];\n }\n if (cormin === cormax) {\n return [cormin];\n }\n var count = Math.max(tickCount, 2);\n var step = getFormatStep(new Decimal(cormax).sub(cormin).div(count - 1), allowDecimals, 0);\n var values = [].concat(_toConsumableArray(Arithmetic.rangeStep(new Decimal(cormin), new Decimal(cormax).sub(new Decimal(0.99).mul(step)), step)), [cormax]);\n return min > max ? reverse(values) : values;\n}\nexport var getNiceTickValues = memoize(getNiceTickValuesFn);\nexport var getTickValues = memoize(getTickValuesFn);\nexport var getTickValuesFixedDomain = memoize(getTickValuesFixedDomainFn);","var e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\nexport default function (start, stop, count) {\n var reverse,\n i = -1,\n n,\n ticks,\n step;\n stop = +stop, start = +start, count = +count;\n if (start === stop && count > 0) return [start];\n if (reverse = stop < start) n = start, start = stop, stop = n;\n if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];\n if (step > 0) {\n var r0 = Math.round(start / step),\n r1 = Math.round(stop / step);\n if (r0 * step < start) ++r0;\n if (r1 * step > stop) --r1;\n ticks = new Array(n = r1 - r0 + 1);\n while (++i < n) {\n ticks[i] = (r0 + i) * step;\n }\n } else {\n step = -step;\n var _r = Math.round(start * step),\n _r2 = Math.round(stop * step);\n if (_r / step < start) ++_r;\n if (_r2 / step > stop) --_r2;\n ticks = new Array(n = _r2 - _r + 1);\n while (++i < n) {\n ticks[i] = (_r + i) / step;\n }\n }\n if (reverse) ticks.reverse();\n return ticks;\n}\nexport function tickIncrement(start, stop, count) {\n var step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log(step) / Math.LN10),\n error = step / Math.pow(10, power);\n return power >= 0 ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);\n}\nexport function tickStep(start, stop, count) {\n var step0 = Math.abs(stop - start) / Math.max(0, count),\n step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),\n error = step0 / step1;\n if (error >= e10) step1 *= 10;else if (error >= e5) step1 *= 5;else if (error >= e2) step1 *= 2;\n return stop < start ? -step1 : step1;\n}","export default function (a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}","import ascending from \"./ascending.js\";\nexport default function (f) {\n var delta = f;\n var compare = f;\n if (f.length === 1) {\n delta = function delta(d, x) {\n return f(d) - x;\n };\n compare = ascendingComparator(f);\n }\n function left(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) < 0) lo = mid + 1;else hi = mid;\n }\n return lo;\n }\n function right(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) > 0) hi = mid;else lo = mid + 1;\n }\n return lo;\n }\n function center(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n var i = left(a, x, lo, hi - 1);\n return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;\n }\n return {\n left: left,\n center: center,\n right: right\n };\n}\nfunction ascendingComparator(f) {\n return function (d, x) {\n return ascending(f(d), x);\n };\n}","import _regeneratorRuntime from \"/home/runner/work/ohjelmointi-23/ohjelmointi-23/node_modules/@babel/runtime/regenerator/index.js\";\nvar _marked = /*#__PURE__*/_regeneratorRuntime.mark(numbers);\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\nexport default function (x) {\n return x === null ? NaN : +x;\n}\nexport function numbers(values, valueof) {\n var _iterator, _step, value, index, _iterator2, _step2, _value;\n return _regeneratorRuntime.wrap(function numbers$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n if (!(valueof === undefined)) {\n _context.next = 21;\n break;\n }\n _iterator = _createForOfIteratorHelper(values);\n _context.prev = 2;\n _iterator.s();\n case 4:\n if ((_step = _iterator.n()).done) {\n _context.next = 11;\n break;\n }\n value = _step.value;\n if (!(value != null && (value = +value) >= value)) {\n _context.next = 9;\n break;\n }\n _context.next = 9;\n return value;\n case 9:\n _context.next = 4;\n break;\n case 11:\n _context.next = 16;\n break;\n case 13:\n _context.prev = 13;\n _context.t0 = _context[\"catch\"](2);\n _iterator.e(_context.t0);\n case 16:\n _context.prev = 16;\n _iterator.f();\n return _context.finish(16);\n case 19:\n _context.next = 40;\n break;\n case 21:\n index = -1;\n _iterator2 = _createForOfIteratorHelper(values);\n _context.prev = 23;\n _iterator2.s();\n case 25:\n if ((_step2 = _iterator2.n()).done) {\n _context.next = 32;\n break;\n }\n _value = _step2.value;\n if (!((_value = valueof(_value, ++index, values)) != null && (_value = +_value) >= _value)) {\n _context.next = 30;\n break;\n }\n _context.next = 30;\n return _value;\n case 30:\n _context.next = 25;\n break;\n case 32:\n _context.next = 37;\n break;\n case 34:\n _context.prev = 34;\n _context.t1 = _context[\"catch\"](23);\n _iterator2.e(_context.t1);\n case 37:\n _context.prev = 37;\n _iterator2.f();\n return _context.finish(37);\n case 40:\n case \"end\":\n return _context.stop();\n }\n }\n }, _marked, null, [[2, 13, 16, 19], [23, 34, 37, 40]]);\n}","import ascending from \"./ascending.js\";\nimport bisector from \"./bisector.js\";\nimport number from \"./number.js\";\nvar ascendingBisect = bisector(ascending);\nexport var bisectRight = ascendingBisect.right;\nexport var bisectLeft = ascendingBisect.left;\nexport var bisectCenter = bisector(number).center;\nexport default bisectRight;","export default function (constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) {\n prototype[key] = definition[key];\n }\n return prototype;\n}","import define, { extend } from \"./define.js\";\nexport function Color() {}\nvar _darker = 0.7;\nexport { _darker as darker };\nvar _brighter = 1 / _darker;\nexport { _brighter as brighter };\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(\"^rgb\\\\(\" + [reI, reI, reI] + \"\\\\)$\"),\n reRgbPercent = new RegExp(\"^rgb\\\\(\" + [reP, reP, reP] + \"\\\\)$\"),\n reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [reI, reI, reI, reN] + \"\\\\)$\"),\n reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [reP, reP, reP, reN] + \"\\\\)$\"),\n reHslPercent = new RegExp(\"^hsl\\\\(\" + [reN, reP, reP] + \"\\\\)$\"),\n reHslaPercent = new RegExp(\"^hsla\\\\(\" + [reN, reP, reP, reN] + \"\\\\)$\");\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\ndefine(Color, color, {\n copy: function copy(channels) {\n return Object.assign(new this.constructor(), this, channels);\n },\n displayable: function displayable() {\n return this.rgb().displayable();\n },\n hex: color_formatHex,\n // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\nexport default function color(format) {\n var m, l;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb(m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, (m & 0xf) << 4 | m & 0xf, 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba(m >> 12 & 0xf | m >> 8 & 0xf0, m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, ((m & 0xf) << 4 | m & 0xf) / 0xff) // #f000\n : null // invalid hex\n ) : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0) : null;\n}\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb();\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\ndefine(Rgb, rgb, extend(Color, {\n brighter: function brighter(k) {\n k = k == null ? _brighter : Math.pow(_brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker: function darker(k) {\n k = k == null ? _darker : Math.pow(_darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb: function rgb() {\n return this;\n },\n displayable: function displayable() {\n return -0.5 <= this.r && this.r < 255.5 && -0.5 <= this.g && this.g < 255.5 && -0.5 <= this.b && this.b < 255.5 && 0 <= this.opacity && this.opacity <= 1;\n },\n hex: rgb_formatHex,\n // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\nfunction rgb_formatHex() {\n return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n}\nfunction rgb_formatRgb() {\n var a = this.opacity;\n a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n return (a === 1 ? \"rgb(\" : \"rgba(\") + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + (a === 1 ? \")\" : \", \" + a + \")\");\n}\nfunction hex(value) {\n value = Math.max(0, Math.min(255, Math.round(value) || 0));\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;else if (l <= 0 || l >= 1) h = s = NaN;else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl();\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;else if (g === max) h = (b - r) / s + 2;else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\ndefine(Hsl, hsl, extend(Color, {\n brighter: function brighter(k) {\n k = k == null ? _brighter : Math.pow(_brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker: function darker(k) {\n k = k == null ? _darker : Math.pow(_darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb: function rgb() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), hsl2rgb(h, m1, m2), hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), this.opacity);\n },\n displayable: function displayable() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && 0 <= this.l && this.l <= 1 && 0 <= this.opacity && this.opacity <= 1;\n },\n formatHsl: function formatHsl() {\n var a = this.opacity;\n a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n return (a === 1 ? \"hsl(\" : \"hsla(\") + (this.h || 0) + \", \" + (this.s || 0) * 100 + \"%, \" + (this.l || 0) * 100 + \"%\" + (a === 1 ? \")\" : \", \" + a + \")\");\n }\n}));\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255;\n}","export function basis(t1, v0, v1, v2, v3) {\n var t2 = t1 * t1,\n t3 = t2 * t1;\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + (4 - 6 * t2 + 3 * t3) * v1 + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + t3 * v3) / 6;\n}\nexport default function (values) {\n var n = values.length - 1;\n return function (t) {\n var i = t <= 0 ? t = 0 : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n v1 = values[i],\n v2 = values[i + 1],\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}","export default (function (x) {\n return function () {\n return x;\n };\n});","import constant from \"./constant.js\";\nfunction linear(a, d) {\n return function (t) {\n return a + t * d;\n };\n}\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function (t) {\n return Math.pow(a + t * b, y);\n };\n}\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function (a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}","import { rgb as colorRgb } from \"d3-color\";\nimport basis from \"./basis.js\";\nimport basisClosed from \"./basisClosed.js\";\nimport nogamma, { gamma } from \"./color.js\";\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function (t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n rgb.gamma = rgbGamma;\n return rgb;\n})(1);\nfunction rgbSpline(spline) {\n return function (colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i,\n color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function (t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);","import { basis } from \"./basis.js\";\nexport default function (values) {\n var n = values.length;\n return function (t) {\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n v0 = values[(i + n - 1) % n],\n v1 = values[i % n],\n v2 = values[(i + 1) % n],\n v3 = values[(i + 2) % n];\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}","import value from \"./value.js\";\nimport numberArray, { isNumberArray } from \"./numberArray.js\";\nexport default function (a, b) {\n return (isNumberArray(b) ? numberArray : genericArray)(a, b);\n}\nexport function genericArray(a, b) {\n var nb = b ? b.length : 0,\n na = a ? Math.min(nb, a.length) : 0,\n x = new Array(na),\n c = new Array(nb),\n i;\n for (i = 0; i < na; ++i) {\n x[i] = value(a[i], b[i]);\n }\n for (; i < nb; ++i) {\n c[i] = b[i];\n }\n return function (t) {\n for (i = 0; i < na; ++i) {\n c[i] = x[i](t);\n }\n return c;\n };\n}","export default function (a, b) {\n var d = new Date();\n return a = +a, b = +b, function (t) {\n return d.setTime(a * (1 - t) + b * t), d;\n };\n}","export default function (a, b) {\n return a = +a, b = +b, function (t) {\n return a * (1 - t) + b * t;\n };\n}","import value from \"./value.js\";\nexport default function (a, b) {\n var i = {},\n c = {},\n k;\n if (a === null || typeof a !== \"object\") a = {};\n if (b === null || typeof b !== \"object\") b = {};\n for (k in b) {\n if (k in a) {\n i[k] = value(a[k], b[k]);\n } else {\n c[k] = b[k];\n }\n }\n return function (t) {\n for (k in i) {\n c[k] = i[k](t);\n }\n return c;\n };\n}","import number from \"./number.js\";\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\nfunction zero(b) {\n return function () {\n return b;\n };\n}\nfunction one(b) {\n return function (t) {\n return b(t) + \"\";\n };\n}\nexport default function (a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0,\n // scan index for next number in b\n am,\n // current match in a\n bm,\n // current match in b\n bs,\n // string preceding current number in b, if any\n i = -1,\n // index in s\n s = [],\n // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a)) && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) {\n // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) {\n // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else {\n // interpolate non-matching numbers\n s[++i] = null;\n q.push({\n i: i,\n x: number(am, bm)\n });\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? q[0] ? one(q[0].x) : zero(b) : (b = q.length, function (t) {\n for (var i = 0, o; i < b; ++i) {\n s[(o = q[i]).i] = o.x(t);\n }\n return s.join(\"\");\n });\n}","export default function (a, b) {\n if (!b) b = [];\n var n = a ? Math.min(b.length, a.length) : 0,\n c = b.slice(),\n i;\n return function (t) {\n for (i = 0; i < n; ++i) {\n c[i] = a[i] * (1 - t) + b[i] * t;\n }\n return c;\n };\n}\nexport function isNumberArray(x) {\n return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}","import { color } from \"d3-color\";\nimport rgb from \"./rgb.js\";\nimport { genericArray } from \"./array.js\";\nimport date from \"./date.js\";\nimport number from \"./number.js\";\nimport object from \"./object.js\";\nimport string from \"./string.js\";\nimport constant from \"./constant.js\";\nimport numberArray, { isNumberArray } from \"./numberArray.js\";\nexport default function (a, b) {\n var t = typeof b,\n c;\n return b == null || t === \"boolean\" ? constant(b) : (t === \"number\" ? number : t === \"string\" ? (c = color(b)) ? (b = c, rgb) : string : b instanceof color ? rgb : b instanceof Date ? date : isNumberArray(b) ? numberArray : Array.isArray(b) ? genericArray : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object : number)(a, b);\n}","export default function (a, b) {\n return a = +a, b = +b, function (t) {\n return Math.round(a * (1 - t) + b * t);\n };\n}","export default function number(x) {\n return +x;\n}","import { bisect } from \"d3-array\";\nimport { interpolate as interpolateValue, interpolateNumber, interpolateRound } from \"d3-interpolate\";\nimport constant from \"./constant.js\";\nimport number from \"./number.js\";\nvar unit = [0, 1];\nexport function identity(x) {\n return x;\n}\nfunction normalize(a, b) {\n return (b -= a = +a) ? function (x) {\n return (x - a) / b;\n } : constant(isNaN(b) ? NaN : 0.5);\n}\nfunction clamper(a, b) {\n var t;\n if (a > b) t = a, a = b, b = t;\n return function (x) {\n return Math.max(a, Math.min(b, x));\n };\n}\n\n// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].\nfunction bimap(domain, range, interpolate) {\n var d0 = domain[0],\n d1 = domain[1],\n r0 = range[0],\n r1 = range[1];\n if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);\n return function (x) {\n return r0(d0(x));\n };\n}\nfunction polymap(domain, range, interpolate) {\n var j = Math.min(domain.length, range.length) - 1,\n d = new Array(j),\n r = new Array(j),\n i = -1;\n\n // Reverse descending domains.\n if (domain[j] < domain[0]) {\n domain = domain.slice().reverse();\n range = range.slice().reverse();\n }\n while (++i < j) {\n d[i] = normalize(domain[i], domain[i + 1]);\n r[i] = interpolate(range[i], range[i + 1]);\n }\n return function (x) {\n var i = bisect(domain, x, 1, j) - 1;\n return r[i](d[i](x));\n };\n}\nexport function copy(source, target) {\n return target.domain(source.domain()).range(source.range()).interpolate(source.interpolate()).clamp(source.clamp()).unknown(source.unknown());\n}\nexport function transformer() {\n var domain = unit,\n range = unit,\n interpolate = interpolateValue,\n transform,\n untransform,\n unknown,\n clamp = identity,\n piecewise,\n output,\n input;\n function rescale() {\n var n = Math.min(domain.length, range.length);\n if (clamp !== identity) clamp = clamper(domain[0], domain[n - 1]);\n piecewise = n > 2 ? polymap : bimap;\n output = input = null;\n return scale;\n }\n function scale(x) {\n return x == null || isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));\n }\n scale.invert = function (y) {\n return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));\n };\n scale.domain = function (_) {\n return arguments.length ? (domain = Array.from(_, number), rescale()) : domain.slice();\n };\n scale.range = function (_) {\n return arguments.length ? (range = Array.from(_), rescale()) : range.slice();\n };\n scale.rangeRound = function (_) {\n return range = Array.from(_), interpolate = interpolateRound, rescale();\n };\n scale.clamp = function (_) {\n return arguments.length ? (clamp = _ ? true : identity, rescale()) : clamp !== identity;\n };\n scale.interpolate = function (_) {\n return arguments.length ? (interpolate = _, rescale()) : interpolate;\n };\n scale.unknown = function (_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n return function (t, u) {\n transform = t, untransform = u;\n return rescale();\n };\n}\nexport default function continuous() {\n return transformer()(identity, identity);\n}","export default function constants(x) {\n return function () {\n return x;\n };\n}","// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\nexport default function formatSpecifier(specifier) {\n if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n var match;\n return new FormatSpecifier({\n fill: match[1],\n align: match[2],\n sign: match[3],\n symbol: match[4],\n zero: match[5],\n width: match[6],\n comma: match[7],\n precision: match[8] && match[8].slice(1),\n trim: match[9],\n type: match[10]\n });\n}\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nexport function FormatSpecifier(specifier) {\n this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n this.zero = !!specifier.zero;\n this.width = specifier.width === undefined ? undefined : +specifier.width;\n this.comma = !!specifier.comma;\n this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n this.trim = !!specifier.trim;\n this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\nFormatSpecifier.prototype.toString = function () {\n return this.fill + this.align + this.sign + this.symbol + (this.zero ? \"0\" : \"\") + (this.width === undefined ? \"\" : Math.max(1, this.width | 0)) + (this.comma ? \",\" : \"\") + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0)) + (this.trim ? \"~\" : \"\") + this.type;\n};","import { formatDecimalParts } from \"./formatDecimal.js\";\nexport var prefixExponent;\nexport default function (x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1],\n i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n n = coefficient.length;\n return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join(\"0\") : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i) : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}","export default function (x) {\n return Math.abs(x = Math.round(x)) >= 1e21 ? x.toLocaleString(\"en\").replace(/,/g, \"\") : x.toString(10);\n}\n\n// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimalParts(1.23) returns [\"123\", 0].\nexport function formatDecimalParts(x, p) {\n if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n var i,\n coefficient = x.slice(0, i);\n\n // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n return [coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, +x.slice(i + 1)];\n}","import { formatDecimalParts } from \"./formatDecimal.js\";\nexport default function (x) {\n return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN;\n}","import { formatDecimalParts } from \"./formatDecimal.js\";\nexport default function (x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1];\n return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1) : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}","import formatDecimal from \"./formatDecimal.js\";\nimport formatPrefixAuto from \"./formatPrefixAuto.js\";\nimport formatRounded from \"./formatRounded.js\";\nexport default {\n \"%\": function _(x, p) {\n return (x * 100).toFixed(p);\n },\n \"b\": function b(x) {\n return Math.round(x).toString(2);\n },\n \"c\": function c(x) {\n return x + \"\";\n },\n \"d\": formatDecimal,\n \"e\": function e(x, p) {\n return x.toExponential(p);\n },\n \"f\": function f(x, p) {\n return x.toFixed(p);\n },\n \"g\": function g(x, p) {\n return x.toPrecision(p);\n },\n \"o\": function o(x) {\n return Math.round(x).toString(8);\n },\n \"p\": function p(x, _p) {\n return formatRounded(x * 100, _p);\n },\n \"r\": formatRounded,\n \"s\": formatPrefixAuto,\n \"X\": function X(x) {\n return Math.round(x).toString(16).toUpperCase();\n },\n \"x\": function x(_x) {\n return Math.round(_x).toString(16);\n }\n};","export default function (x) {\n return x;\n}","import exponent from \"./exponent.js\";\nimport formatGroup from \"./formatGroup.js\";\nimport formatNumerals from \"./formatNumerals.js\";\nimport formatSpecifier from \"./formatSpecifier.js\";\nimport formatTrim from \"./formatTrim.js\";\nimport formatTypes from \"./formatTypes.js\";\nimport { prefixExponent } from \"./formatPrefixAuto.js\";\nimport identity from \"./identity.js\";\nvar map = Array.prototype.map,\n prefixes = [\"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\"];\nexport default function (locale) {\n var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + \"\"),\n currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\",\n currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\",\n decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\",\n numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)),\n percent = locale.percent === undefined ? \"%\" : locale.percent + \"\",\n minus = locale.minus === undefined ? \"−\" : locale.minus + \"\",\n nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n function newFormat(specifier) {\n specifier = formatSpecifier(specifier);\n var fill = specifier.fill,\n align = specifier.align,\n sign = specifier.sign,\n symbol = specifier.symbol,\n zero = specifier.zero,\n width = specifier.width,\n comma = specifier.comma,\n precision = specifier.precision,\n trim = specifier.trim,\n type = specifier.type;\n\n // The \"n\" type is an alias for \",g\".\n if (type === \"n\") comma = true, type = \"g\";\n\n // The \"\" type, and any invalid type, is an alias for \".12~g\".\n else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\n\n // If zero fill is specified, padding goes after sign and before digits.\n if (zero || fill === \"0\" && align === \"=\") zero = true, fill = \"0\", align = \"=\";\n\n // Compute the prefix and suffix.\n // For SI-prefix, the suffix is lazily computed.\n var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\";\n\n // What format function should we use?\n // Is this an integer type?\n // Can this type generate exponential notation?\n var formatType = formatTypes[type],\n maybeSuffix = /[defgprs%]/.test(type);\n\n // Set the default precision if not specified,\n // or clamp the specified precision to the supported range.\n // For significant precision, it must be in [1, 21].\n // For fixed precision, it must be in [0, 20].\n precision = precision === undefined ? 6 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision));\n function format(value) {\n var valuePrefix = prefix,\n valueSuffix = suffix,\n i,\n n,\n c;\n if (type === \"c\") {\n valueSuffix = formatType(value) + valueSuffix;\n value = \"\";\n } else {\n value = +value;\n\n // Determine the sign. -0 is not less than 0, but 1 / -0 is!\n var valueNegative = value < 0 || 1 / value < 0;\n\n // Perform the initial formatting.\n value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n\n // Trim insignificant zeros.\n if (trim) value = formatTrim(value);\n\n // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.\n if (valueNegative && +value === 0 && sign !== \"+\") valueNegative = false;\n\n // Compute the prefix and suffix.\n valuePrefix = (valueNegative ? sign === \"(\" ? sign : minus : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n valueSuffix = (type === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n\n // Break the formatted value into the integer “value” part that can be\n // grouped, and fractional or exponential “suffix” part that is not.\n if (maybeSuffix) {\n i = -1, n = value.length;\n while (++i < n) {\n if (c = value.charCodeAt(i), 48 > c || c > 57) {\n valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n value = value.slice(0, i);\n break;\n }\n }\n }\n }\n\n // If the fill character is not \"0\", grouping is applied before padding.\n if (comma && !zero) value = group(value, Infinity);\n\n // Compute the padding.\n var length = valuePrefix.length + value.length + valueSuffix.length,\n padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n\n // If the fill character is \"0\", grouping is applied after padding.\n if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n\n // Reconstruct the final output based on the desired alignment.\n switch (align) {\n case \"<\":\n value = valuePrefix + value + valueSuffix + padding;\n break;\n case \"=\":\n value = valuePrefix + padding + value + valueSuffix;\n break;\n case \"^\":\n value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length);\n break;\n default:\n value = padding + valuePrefix + value + valueSuffix;\n break;\n }\n return numerals(value);\n }\n format.toString = function () {\n return specifier + \"\";\n };\n return format;\n }\n function formatPrefix(specifier, value) {\n var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)),\n e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n k = Math.pow(10, -e),\n prefix = prefixes[8 + e / 3];\n return function (value) {\n return f(k * value) + prefix;\n };\n }\n return {\n format: newFormat,\n formatPrefix: formatPrefix\n };\n}","import formatLocale from \"./locale.js\";\nvar locale;\nexport var format;\nexport var formatPrefix;\ndefaultLocale({\n thousands: \",\",\n grouping: [3],\n currency: [\"$\", \"\"]\n});\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n format = locale.format;\n formatPrefix = locale.formatPrefix;\n return locale;\n}","export default function (grouping, thousands) {\n return function (value, width) {\n var i = value.length,\n t = [],\n j = 0,\n g = grouping[0],\n length = 0;\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = grouping[j = (j + 1) % grouping.length];\n }\n return t.reverse().join(thousands);\n };\n}","export default function (numerals) {\n return function (value) {\n return value.replace(/[0-9]/g, function (i) {\n return numerals[+i];\n });\n };\n}","// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nexport default function (s) {\n out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n switch (s[i]) {\n case \".\":\n i0 = i1 = i;\n break;\n case \"0\":\n if (i0 === 0) i0 = i;\n i1 = i;\n break;\n default:\n if (!+s[i]) break out;\n if (i0 > 0) i0 = 0;\n break;\n }\n }\n return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}","import { tickStep } from \"d3-array\";\nimport { format, formatPrefix, formatSpecifier, precisionFixed, precisionPrefix, precisionRound } from \"d3-format\";\nexport default function tickFormat(start, stop, count, specifier) {\n var step = tickStep(start, stop, count),\n precision;\n specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n switch (specifier.type) {\n case \"s\":\n {\n var value = Math.max(Math.abs(start), Math.abs(stop));\n if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;\n return formatPrefix(specifier, value);\n }\n case \"\":\n case \"e\":\n case \"g\":\n case \"p\":\n case \"r\":\n {\n if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n break;\n }\n case \"f\":\n case \"%\":\n {\n if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n break;\n }\n }\n return format(specifier);\n}","import exponent from \"./exponent.js\";\nexport default function (step, value) {\n return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n}","import exponent from \"./exponent.js\";\nexport default function (step, max) {\n step = Math.abs(step), max = Math.abs(max) - step;\n return Math.max(0, exponent(max) - exponent(step)) + 1;\n}","import exponent from \"./exponent.js\";\nexport default function (step) {\n return Math.max(0, -exponent(Math.abs(step)));\n}","import { ticks, tickIncrement } from \"d3-array\";\nimport continuous, { copy } from \"./continuous.js\";\nimport { initRange } from \"./init.js\";\nimport tickFormat from \"./tickFormat.js\";\nexport function linearish(scale) {\n var domain = scale.domain;\n scale.ticks = function (count) {\n var d = domain();\n return ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n };\n scale.tickFormat = function (count, specifier) {\n var d = domain();\n return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);\n };\n scale.nice = function (count) {\n if (count == null) count = 10;\n var d = domain();\n var i0 = 0;\n var i1 = d.length - 1;\n var start = d[i0];\n var stop = d[i1];\n var prestep;\n var step;\n var maxIter = 10;\n if (stop < start) {\n step = start, start = stop, stop = step;\n step = i0, i0 = i1, i1 = step;\n }\n while (maxIter-- > 0) {\n step = tickIncrement(start, stop, count);\n if (step === prestep) {\n d[i0] = start;\n d[i1] = stop;\n return domain(d);\n } else if (step > 0) {\n start = Math.floor(start / step) * step;\n stop = Math.ceil(stop / step) * step;\n } else if (step < 0) {\n start = Math.ceil(start * step) / step;\n stop = Math.floor(stop * step) / step;\n } else {\n break;\n }\n prestep = step;\n }\n return scale;\n };\n return scale;\n}\nexport default function linear() {\n var scale = continuous();\n scale.copy = function () {\n return copy(scale, linear());\n };\n initRange.apply(scale, arguments);\n return linearish(scale);\n}","import { linearish } from \"./linear.js\";\nimport number from \"./number.js\";\nexport default function identity(domain) {\n var unknown;\n function scale(x) {\n return x == null || isNaN(x = +x) ? unknown : x;\n }\n scale.invert = scale;\n scale.domain = scale.range = function (_) {\n return arguments.length ? (domain = Array.from(_, number), scale) : domain.slice();\n };\n scale.unknown = function (_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n scale.copy = function () {\n return identity(domain).unknown(unknown);\n };\n domain = arguments.length ? Array.from(domain, number) : [0, 1];\n return linearish(scale);\n}","export default function nice(domain, interval) {\n domain = domain.slice();\n var i0 = 0,\n i1 = domain.length - 1,\n x0 = domain[i0],\n x1 = domain[i1],\n t;\n if (x1 < x0) {\n t = i0, i0 = i1, i1 = t;\n t = x0, x0 = x1, x1 = t;\n }\n domain[i0] = interval.floor(x0);\n domain[i1] = interval.ceil(x1);\n return domain;\n}","import { ticks } from \"d3-array\";\nimport { format } from \"d3-format\";\nimport nice from \"./nice.js\";\nimport { copy, transformer } from \"./continuous.js\";\nimport { initRange } from \"./init.js\";\nfunction transformLog(x) {\n return Math.log(x);\n}\nfunction transformExp(x) {\n return Math.exp(x);\n}\nfunction transformLogn(x) {\n return -Math.log(-x);\n}\nfunction transformExpn(x) {\n return -Math.exp(-x);\n}\nfunction pow10(x) {\n return isFinite(x) ? +(\"1e\" + x) : x < 0 ? 0 : x;\n}\nfunction powp(base) {\n return base === 10 ? pow10 : base === Math.E ? Math.exp : function (x) {\n return Math.pow(base, x);\n };\n}\nfunction logp(base) {\n return base === Math.E ? Math.log : base === 10 && Math.log10 || base === 2 && Math.log2 || (base = Math.log(base), function (x) {\n return Math.log(x) / base;\n });\n}\nfunction reflect(f) {\n return function (x) {\n return -f(-x);\n };\n}\nexport function loggish(transform) {\n var scale = transform(transformLog, transformExp),\n domain = scale.domain,\n base = 10,\n logs,\n pows;\n function rescale() {\n logs = logp(base), pows = powp(base);\n if (domain()[0] < 0) {\n logs = reflect(logs), pows = reflect(pows);\n transform(transformLogn, transformExpn);\n } else {\n transform(transformLog, transformExp);\n }\n return scale;\n }\n scale.base = function (_) {\n return arguments.length ? (base = +_, rescale()) : base;\n };\n scale.domain = function (_) {\n return arguments.length ? (domain(_), rescale()) : domain();\n };\n scale.ticks = function (count) {\n var d = domain(),\n u = d[0],\n v = d[d.length - 1],\n r;\n if (r = v < u) i = u, u = v, v = i;\n var i = logs(u),\n j = logs(v),\n p,\n k,\n t,\n n = count == null ? 10 : +count,\n z = [];\n if (!(base % 1) && j - i < n) {\n i = Math.floor(i), j = Math.ceil(j);\n if (u > 0) for (; i <= j; ++i) {\n for (k = 1, p = pows(i); k < base; ++k) {\n t = p * k;\n if (t < u) continue;\n if (t > v) break;\n z.push(t);\n }\n } else for (; i <= j; ++i) {\n for (k = base - 1, p = pows(i); k >= 1; --k) {\n t = p * k;\n if (t < u) continue;\n if (t > v) break;\n z.push(t);\n }\n }\n if (z.length * 2 < n) z = ticks(u, v, n);\n } else {\n z = ticks(i, j, Math.min(j - i, n)).map(pows);\n }\n return r ? z.reverse() : z;\n };\n scale.tickFormat = function (count, specifier) {\n if (specifier == null) specifier = base === 10 ? \".0e\" : \",\";\n if (typeof specifier !== \"function\") specifier = format(specifier);\n if (count === Infinity) return specifier;\n if (count == null) count = 10;\n var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?\n return function (d) {\n var i = d / pows(Math.round(logs(d)));\n if (i * base < base - 0.5) i *= base;\n return i <= k ? specifier(d) : \"\";\n };\n };\n scale.nice = function () {\n return domain(nice(domain(), {\n floor: function floor(x) {\n return pows(Math.floor(logs(x)));\n },\n ceil: function ceil(x) {\n return pows(Math.ceil(logs(x)));\n }\n }));\n };\n return scale;\n}\nexport default function log() {\n var scale = loggish(transformer()).domain([1, 10]);\n scale.copy = function () {\n return copy(scale, log()).base(scale.base());\n };\n initRange.apply(scale, arguments);\n return scale;\n}","import { linearish } from \"./linear.js\";\nimport { copy, transformer } from \"./continuous.js\";\nimport { initRange } from \"./init.js\";\nfunction transformSymlog(c) {\n return function (x) {\n return Math.sign(x) * Math.log1p(Math.abs(x / c));\n };\n}\nfunction transformSymexp(c) {\n return function (x) {\n return Math.sign(x) * Math.expm1(Math.abs(x)) * c;\n };\n}\nexport function symlogish(transform) {\n var c = 1,\n scale = transform(transformSymlog(c), transformSymexp(c));\n scale.constant = function (_) {\n return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c;\n };\n return linearish(scale);\n}\nexport default function symlog() {\n var scale = symlogish(transformer());\n scale.copy = function () {\n return copy(scale, symlog()).constant(scale.constant());\n };\n return initRange.apply(scale, arguments);\n}","import { linearish } from \"./linear.js\";\nimport { copy, identity, transformer } from \"./continuous.js\";\nimport { initRange } from \"./init.js\";\nfunction transformPow(exponent) {\n return function (x) {\n return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);\n };\n}\nfunction transformSqrt(x) {\n return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x);\n}\nfunction transformSquare(x) {\n return x < 0 ? -x * x : x * x;\n}\nexport function powish(transform) {\n var scale = transform(identity, identity),\n exponent = 1;\n function rescale() {\n return exponent === 1 ? transform(identity, identity) : exponent === 0.5 ? transform(transformSqrt, transformSquare) : transform(transformPow(exponent), transformPow(1 / exponent));\n }\n scale.exponent = function (_) {\n return arguments.length ? (exponent = +_, rescale()) : exponent;\n };\n return linearish(scale);\n}\nexport default function pow() {\n var scale = powish(transformer());\n scale.copy = function () {\n return copy(scale, pow()).exponent(scale.exponent());\n };\n initRange.apply(scale, arguments);\n return scale;\n}\nexport function sqrt() {\n return pow.apply(null, arguments).exponent(0.5);\n}","import continuous from \"./continuous.js\";\nimport { initRange } from \"./init.js\";\nimport { linearish } from \"./linear.js\";\nimport number from \"./number.js\";\nfunction square(x) {\n return Math.sign(x) * x * x;\n}\nfunction unsquare(x) {\n return Math.sign(x) * Math.sqrt(Math.abs(x));\n}\nexport default function radial() {\n var squared = continuous(),\n range = [0, 1],\n round = false,\n unknown;\n function scale(x) {\n var y = unsquare(squared(x));\n return isNaN(y) ? unknown : round ? Math.round(y) : y;\n }\n scale.invert = function (y) {\n return squared.invert(square(y));\n };\n scale.domain = function (_) {\n return arguments.length ? (squared.domain(_), scale) : squared.domain();\n };\n scale.range = function (_) {\n return arguments.length ? (squared.range((range = Array.from(_, number)).map(square)), scale) : range.slice();\n };\n scale.rangeRound = function (_) {\n return scale.range(_).round(true);\n };\n scale.round = function (_) {\n return arguments.length ? (round = !!_, scale) : round;\n };\n scale.clamp = function (_) {\n return arguments.length ? (squared.clamp(_), scale) : squared.clamp();\n };\n scale.unknown = function (_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n scale.copy = function () {\n return radial(squared.domain(), range).round(round).clamp(squared.clamp()).unknown(unknown);\n };\n initRange.apply(scale, arguments);\n return linearish(scale);\n}","function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\nexport default function max(values, valueof) {\n var max;\n if (valueof === undefined) {\n var _iterator = _createForOfIteratorHelper(values),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var value = _step.value;\n if (value != null && (max < value || max === undefined && value >= value)) {\n max = value;\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n } else {\n var index = -1;\n var _iterator2 = _createForOfIteratorHelper(values),\n _step2;\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var _value = _step2.value;\n if ((_value = valueof(_value, ++index, values)) != null && (max < _value || max === undefined && _value >= _value)) {\n max = _value;\n }\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n return max;\n}","function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\nexport default function min(values, valueof) {\n var min;\n if (valueof === undefined) {\n var _iterator = _createForOfIteratorHelper(values),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var value = _step.value;\n if (value != null && (min > value || min === undefined && value >= value)) {\n min = value;\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n } else {\n var index = -1;\n var _iterator2 = _createForOfIteratorHelper(values),\n _step2;\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var _value = _step2.value;\n if ((_value = valueof(_value, ++index, values)) != null && (min > _value || min === undefined && _value >= _value)) {\n min = _value;\n }\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n return min;\n}","import ascending from \"./ascending.js\";\n\n// Based on https://github.com/mourner/quickselect\n// ISC license, Copyright 2018 Vladimir Agafonkin.\nexport default function quickselect(array, k) {\n var left = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var right = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : array.length - 1;\n var compare = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : ascending;\n while (right > left) {\n if (right - left > 600) {\n var n = right - left + 1;\n var m = k - left + 1;\n var z = Math.log(n);\n var s = 0.5 * Math.exp(2 * z / 3);\n var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);\n var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));\n var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));\n quickselect(array, k, newLeft, newRight, compare);\n }\n var t = array[k];\n var i = left;\n var j = right;\n swap(array, left, k);\n if (compare(array[right], t) > 0) swap(array, left, right);\n while (i < j) {\n swap(array, i, j), ++i, --j;\n while (compare(array[i], t) < 0) {\n ++i;\n }\n while (compare(array[j], t) > 0) {\n --j;\n }\n }\n if (compare(array[left], t) === 0) swap(array, left, j);else ++j, swap(array, j, right);\n if (j <= k) left = j + 1;\n if (k <= j) right = j - 1;\n }\n return array;\n}\nfunction swap(array, i, j) {\n var t = array[i];\n array[i] = array[j];\n array[j] = t;\n}","import max from \"./max.js\";\nimport min from \"./min.js\";\nimport quickselect from \"./quickselect.js\";\nimport number, { numbers } from \"./number.js\";\nexport default function quantile(values, p, valueof) {\n values = Float64Array.from(numbers(values, valueof));\n if (!(n = values.length)) return;\n if ((p = +p) <= 0 || n < 2) return min(values);\n if (p >= 1) return max(values);\n var n,\n i = (n - 1) * p,\n i0 = Math.floor(i),\n value0 = max(quickselect(values, i0).subarray(0, i0 + 1)),\n value1 = min(values.subarray(i0 + 1));\n return value0 + (value1 - value0) * (i - i0);\n}\nexport function quantileSorted(values, p) {\n var valueof = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : number;\n if (!(n = values.length)) return;\n if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);\n if (p >= 1) return +valueof(values[n - 1], n - 1, values);\n var n,\n i = (n - 1) * p,\n i0 = Math.floor(i),\n value0 = +valueof(values[i0], i0, values),\n value1 = +valueof(values[i0 + 1], i0 + 1, values);\n return value0 + (value1 - value0) * (i - i0);\n}","function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\nimport { ascending, bisect, quantileSorted as threshold } from \"d3-array\";\nimport { initRange } from \"./init.js\";\nexport default function quantile() {\n var domain = [],\n range = [],\n thresholds = [],\n unknown;\n function rescale() {\n var i = 0,\n n = Math.max(1, range.length);\n thresholds = new Array(n - 1);\n while (++i < n) {\n thresholds[i - 1] = threshold(domain, i / n);\n }\n return scale;\n }\n function scale(x) {\n return x == null || isNaN(x = +x) ? unknown : range[bisect(thresholds, x)];\n }\n scale.invertExtent = function (y) {\n var i = range.indexOf(y);\n return i < 0 ? [NaN, NaN] : [i > 0 ? thresholds[i - 1] : domain[0], i < thresholds.length ? thresholds[i] : domain[domain.length - 1]];\n };\n scale.domain = function (_) {\n if (!arguments.length) return domain.slice();\n domain = [];\n var _iterator = _createForOfIteratorHelper(_),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var d = _step.value;\n if (d != null && !isNaN(d = +d)) domain.push(d);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n domain.sort(ascending);\n return rescale();\n };\n scale.range = function (_) {\n return arguments.length ? (range = Array.from(_), rescale()) : range.slice();\n };\n scale.unknown = function (_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n scale.quantiles = function () {\n return thresholds.slice();\n };\n scale.copy = function () {\n return quantile().domain(domain).range(range).unknown(unknown);\n };\n return initRange.apply(scale, arguments);\n}","import _slicedToArray from \"/home/runner/work/ohjelmointi-23/ohjelmointi-23/node_modules/@babel/runtime/helpers/esm/slicedToArray.js\";\nimport { bisect } from \"d3-array\";\nimport { linearish } from \"./linear.js\";\nimport { initRange } from \"./init.js\";\nexport default function quantize() {\n var x0 = 0,\n x1 = 1,\n n = 1,\n domain = [0.5],\n range = [0, 1],\n unknown;\n function scale(x) {\n return x != null && x <= x ? range[bisect(domain, x, 0, n)] : unknown;\n }\n function rescale() {\n var i = -1;\n domain = new Array(n);\n while (++i < n) {\n domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);\n }\n return scale;\n }\n scale.domain = function (_) {\n var _ref;\n return arguments.length ? ((_ref = _slicedToArray(_, 2), x0 = _ref[0], x1 = _ref[1]), x0 = +x0, x1 = +x1, rescale()) : [x0, x1];\n };\n scale.range = function (_) {\n return arguments.length ? (n = (range = Array.from(_)).length - 1, rescale()) : range.slice();\n };\n scale.invertExtent = function (y) {\n var i = range.indexOf(y);\n return i < 0 ? [NaN, NaN] : i < 1 ? [x0, domain[0]] : i >= n ? [domain[n - 1], x1] : [domain[i - 1], domain[i]];\n };\n scale.unknown = function (_) {\n return arguments.length ? (unknown = _, scale) : scale;\n };\n scale.thresholds = function () {\n return domain.slice();\n };\n scale.copy = function () {\n return quantize().domain([x0, x1]).range(range).unknown(unknown);\n };\n return initRange.apply(linearish(scale), arguments);\n}","import { bisect } from \"d3-array\";\nimport { initRange } from \"./init.js\";\nexport default function threshold() {\n var domain = [0.5],\n range = [0, 1],\n unknown,\n n = 1;\n function scale(x) {\n return x != null && x <= x ? range[bisect(domain, x, 0, n)] : unknown;\n }\n scale.domain = function (_) {\n return arguments.length ? (domain = Array.from(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();\n };\n scale.range = function (_) {\n return arguments.length ? (range = Array.from(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();\n };\n scale.invertExtent = function (y) {\n var i = range.indexOf(y);\n return [domain[i - 1], domain[i]];\n };\n scale.unknown = function (_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n scale.copy = function () {\n return threshold().domain(domain).range(range).unknown(unknown);\n };\n return initRange.apply(scale, arguments);\n}","export var durationSecond = 1000;\nexport var durationMinute = durationSecond * 60;\nexport var durationHour = durationMinute * 60;\nexport var durationDay = durationHour * 24;\nexport var durationWeek = durationDay * 7;\nexport var durationMonth = durationDay * 30;\nexport var durationYear = durationDay * 365;","var t0 = new Date(),\n t1 = new Date();\nexport default function newInterval(floori, offseti, count, field) {\n function interval(date) {\n return floori(date = arguments.length === 0 ? new Date() : new Date(+date)), date;\n }\n interval.floor = function (date) {\n return floori(date = new Date(+date)), date;\n };\n interval.ceil = function (date) {\n return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n };\n interval.round = function (date) {\n var d0 = interval(date),\n d1 = interval.ceil(date);\n return date - d0 < d1 - date ? d0 : d1;\n };\n interval.offset = function (date, step) {\n return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n };\n interval.range = function (start, stop, step) {\n var range = [],\n previous;\n start = interval.ceil(start);\n step = step == null ? 1 : Math.floor(step);\n if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n do {\n range.push(previous = new Date(+start)), offseti(start, step), floori(start);\n } while (previous < start && start < stop);\n return range;\n };\n interval.filter = function (test) {\n return newInterval(function (date) {\n if (date >= date) while (floori(date), !test(date)) {\n date.setTime(date - 1);\n }\n }, function (date, step) {\n if (date >= date) {\n if (step < 0) while (++step <= 0) {\n while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty\n } else while (--step >= 0) {\n while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty\n }\n }\n });\n };\n\n if (count) {\n interval.count = function (start, end) {\n t0.setTime(+start), t1.setTime(+end);\n floori(t0), floori(t1);\n return Math.floor(count(t0, t1));\n };\n interval.every = function (step) {\n step = Math.floor(step);\n return !isFinite(step) || !(step > 0) ? null : !(step > 1) ? interval : interval.filter(field ? function (d) {\n return field(d) % step === 0;\n } : function (d) {\n return interval.count(0, d) % step === 0;\n });\n };\n }\n return interval;\n}","import interval from \"./interval.js\";\nvar millisecond = interval(function () {\n // noop\n}, function (date, step) {\n date.setTime(+date + step);\n}, function (start, end) {\n return end - start;\n});\n\n// An optimized implementation for this simple case.\nmillisecond.every = function (k) {\n k = Math.floor(k);\n if (!isFinite(k) || !(k > 0)) return null;\n if (!(k > 1)) return millisecond;\n return interval(function (date) {\n date.setTime(Math.floor(date / k) * k);\n }, function (date, step) {\n date.setTime(+date + step * k);\n }, function (start, end) {\n return (end - start) / k;\n });\n};\nexport default millisecond;\nexport var milliseconds = millisecond.range;","import interval from \"./interval.js\";\nimport { durationSecond } from \"./duration.js\";\nvar second = interval(function (date) {\n date.setTime(date - date.getMilliseconds());\n}, function (date, step) {\n date.setTime(+date + step * durationSecond);\n}, function (start, end) {\n return (end - start) / durationSecond;\n}, function (date) {\n return date.getUTCSeconds();\n});\nexport default second;\nexport var seconds = second.range;","import interval from \"./interval.js\";\nimport { durationMinute, durationSecond } from \"./duration.js\";\nvar minute = interval(function (date) {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond);\n}, function (date, step) {\n date.setTime(+date + step * durationMinute);\n}, function (start, end) {\n return (end - start) / durationMinute;\n}, function (date) {\n return date.getMinutes();\n});\nexport default minute;\nexport var minutes = minute.range;","import interval from \"./interval.js\";\nimport { durationHour, durationMinute, durationSecond } from \"./duration.js\";\nvar hour = interval(function (date) {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute);\n}, function (date, step) {\n date.setTime(+date + step * durationHour);\n}, function (start, end) {\n return (end - start) / durationHour;\n}, function (date) {\n return date.getHours();\n});\nexport default hour;\nexport var hours = hour.range;","import interval from \"./interval.js\";\nimport { durationDay, durationMinute } from \"./duration.js\";\nvar day = interval(function (date) {\n return date.setHours(0, 0, 0, 0);\n}, function (date, step) {\n return date.setDate(date.getDate() + step);\n}, function (start, end) {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;\n}, function (date) {\n return date.getDate() - 1;\n});\nexport default day;\nexport var days = day.range;","import interval from \"./interval.js\";\nimport { durationMinute, durationWeek } from \"./duration.js\";\nfunction weekday(i) {\n return interval(function (date) {\n date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n date.setHours(0, 0, 0, 0);\n }, function (date, step) {\n date.setDate(date.getDate() + step * 7);\n }, function (start, end) {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;\n });\n}\nexport var sunday = weekday(0);\nexport var monday = weekday(1);\nexport var tuesday = weekday(2);\nexport var wednesday = weekday(3);\nexport var thursday = weekday(4);\nexport var friday = weekday(5);\nexport var saturday = weekday(6);\nexport var sundays = sunday.range;\nexport var mondays = monday.range;\nexport var tuesdays = tuesday.range;\nexport var wednesdays = wednesday.range;\nexport var thursdays = thursday.range;\nexport var fridays = friday.range;\nexport var saturdays = saturday.range;","import interval from \"./interval.js\";\nvar month = interval(function (date) {\n date.setDate(1);\n date.setHours(0, 0, 0, 0);\n}, function (date, step) {\n date.setMonth(date.getMonth() + step);\n}, function (start, end) {\n return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n}, function (date) {\n return date.getMonth();\n});\nexport default month;\nexport var months = month.range;","import interval from \"./interval.js\";\nvar year = interval(function (date) {\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n}, function (date, step) {\n date.setFullYear(date.getFullYear() + step);\n}, function (start, end) {\n return end.getFullYear() - start.getFullYear();\n}, function (date) {\n return date.getFullYear();\n});\n\n// An optimized implementation for this simple case.\nyear.every = function (k) {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : interval(function (date) {\n date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n }, function (date, step) {\n date.setFullYear(date.getFullYear() + step * k);\n });\n};\nexport default year;\nexport var years = year.range;","import interval from \"./interval.js\";\nimport { durationMinute } from \"./duration.js\";\nvar utcMinute = interval(function (date) {\n date.setUTCSeconds(0, 0);\n}, function (date, step) {\n date.setTime(+date + step * durationMinute);\n}, function (start, end) {\n return (end - start) / durationMinute;\n}, function (date) {\n return date.getUTCMinutes();\n});\nexport default utcMinute;\nexport var utcMinutes = utcMinute.range;","import interval from \"./interval.js\";\nimport { durationHour } from \"./duration.js\";\nvar utcHour = interval(function (date) {\n date.setUTCMinutes(0, 0, 0);\n}, function (date, step) {\n date.setTime(+date + step * durationHour);\n}, function (start, end) {\n return (end - start) / durationHour;\n}, function (date) {\n return date.getUTCHours();\n});\nexport default utcHour;\nexport var utcHours = utcHour.range;","import interval from \"./interval.js\";\nimport { durationDay } from \"./duration.js\";\nvar utcDay = interval(function (date) {\n date.setUTCHours(0, 0, 0, 0);\n}, function (date, step) {\n date.setUTCDate(date.getUTCDate() + step);\n}, function (start, end) {\n return (end - start) / durationDay;\n}, function (date) {\n return date.getUTCDate() - 1;\n});\nexport default utcDay;\nexport var utcDays = utcDay.range;","import interval from \"./interval.js\";\nimport { durationWeek } from \"./duration.js\";\nfunction utcWeekday(i) {\n return interval(function (date) {\n date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n date.setUTCHours(0, 0, 0, 0);\n }, function (date, step) {\n date.setUTCDate(date.getUTCDate() + step * 7);\n }, function (start, end) {\n return (end - start) / durationWeek;\n });\n}\nexport var utcSunday = utcWeekday(0);\nexport var utcMonday = utcWeekday(1);\nexport var utcTuesday = utcWeekday(2);\nexport var utcWednesday = utcWeekday(3);\nexport var utcThursday = utcWeekday(4);\nexport var utcFriday = utcWeekday(5);\nexport var utcSaturday = utcWeekday(6);\nexport var utcSundays = utcSunday.range;\nexport var utcMondays = utcMonday.range;\nexport var utcTuesdays = utcTuesday.range;\nexport var utcWednesdays = utcWednesday.range;\nexport var utcThursdays = utcThursday.range;\nexport var utcFridays = utcFriday.range;\nexport var utcSaturdays = utcSaturday.range;","import interval from \"./interval.js\";\nvar utcMonth = interval(function (date) {\n date.setUTCDate(1);\n date.setUTCHours(0, 0, 0, 0);\n}, function (date, step) {\n date.setUTCMonth(date.getUTCMonth() + step);\n}, function (start, end) {\n return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n}, function (date) {\n return date.getUTCMonth();\n});\nexport default utcMonth;\nexport var utcMonths = utcMonth.range;","import interval from \"./interval.js\";\nvar utcYear = interval(function (date) {\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n}, function (date, step) {\n date.setUTCFullYear(date.getUTCFullYear() + step);\n}, function (start, end) {\n return end.getUTCFullYear() - start.getUTCFullYear();\n}, function (date) {\n return date.getUTCFullYear();\n});\n\n// An optimized implementation for this simple case.\nutcYear.every = function (k) {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : interval(function (date) {\n date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n }, function (date, step) {\n date.setUTCFullYear(date.getUTCFullYear() + step * k);\n });\n};\nexport default utcYear;\nexport var utcYears = utcYear.range;","import _slicedToArray from \"/home/runner/work/ohjelmointi-23/ohjelmointi-23/node_modules/@babel/runtime/helpers/esm/slicedToArray.js\";\nimport { bisector, tickStep } from \"d3-array\";\nimport { durationDay, durationHour, durationMinute, durationMonth, durationSecond, durationWeek, durationYear } from \"./duration.js\";\nimport millisecond from \"./millisecond.js\";\nimport second from \"./second.js\";\nimport minute from \"./minute.js\";\nimport hour from \"./hour.js\";\nimport day from \"./day.js\";\nimport { sunday as week } from \"./week.js\";\nimport month from \"./month.js\";\nimport year from \"./year.js\";\nimport utcMinute from \"./utcMinute.js\";\nimport utcHour from \"./utcHour.js\";\nimport utcDay from \"./utcDay.js\";\nimport { utcSunday as utcWeek } from \"./utcWeek.js\";\nimport utcMonth from \"./utcMonth.js\";\nimport utcYear from \"./utcYear.js\";\nfunction ticker(year, month, week, day, hour, minute) {\n var tickIntervals = [[second, 1, durationSecond], [second, 5, 5 * durationSecond], [second, 15, 15 * durationSecond], [second, 30, 30 * durationSecond], [minute, 1, durationMinute], [minute, 5, 5 * durationMinute], [minute, 15, 15 * durationMinute], [minute, 30, 30 * durationMinute], [hour, 1, durationHour], [hour, 3, 3 * durationHour], [hour, 6, 6 * durationHour], [hour, 12, 12 * durationHour], [day, 1, durationDay], [day, 2, 2 * durationDay], [week, 1, durationWeek], [month, 1, durationMonth], [month, 3, 3 * durationMonth], [year, 1, durationYear]];\n function ticks(start, stop, count) {\n var reverse = stop < start;\n if (reverse) {\n var _ref = [stop, start];\n start = _ref[0];\n stop = _ref[1];\n }\n var interval = count && typeof count.range === \"function\" ? count : tickInterval(start, stop, count);\n var ticks = interval ? interval.range(start, +stop + 1) : []; // inclusive stop\n return reverse ? ticks.reverse() : ticks;\n }\n function tickInterval(start, stop, count) {\n var target = Math.abs(stop - start) / count;\n var i = bisector(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 3),\n step = _ref3[2];\n return step;\n }).right(tickIntervals, target);\n if (i === tickIntervals.length) return year.every(tickStep(start / durationYear, stop / durationYear, count));\n if (i === 0) return millisecond.every(Math.max(tickStep(start, stop, count), 1));\n var _tickIntervals = _slicedToArray(tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i], 2),\n t = _tickIntervals[0],\n step = _tickIntervals[1];\n return t.every(step);\n }\n return [ticks, tickInterval];\n}\nvar _ticker = ticker(utcYear, utcMonth, utcWeek, utcDay, utcHour, utcMinute),\n _ticker2 = _slicedToArray(_ticker, 2),\n utcTicks = _ticker2[0],\n utcTickInterval = _ticker2[1];\nvar _ticker3 = ticker(year, month, week, day, hour, minute),\n _ticker4 = _slicedToArray(_ticker3, 2),\n timeTicks = _ticker4[0],\n timeTickInterval = _ticker4[1];\nexport { utcTicks, utcTickInterval, timeTicks, timeTickInterval };","import { timeDay, timeSunday, timeMonday, timeThursday, timeYear, utcDay, utcSunday, utcMonday, utcThursday, utcYear } from \"d3-time\";\nfunction localDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n date.setFullYear(d.y);\n return date;\n }\n return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n}\nfunction utcDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n date.setUTCFullYear(d.y);\n return date;\n }\n return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n}\nfunction newDate(y, m, d) {\n return {\n y: y,\n m: m,\n d: d,\n H: 0,\n M: 0,\n S: 0,\n L: 0\n };\n}\nexport default function formatLocale(locale) {\n var locale_dateTime = locale.dateTime,\n locale_date = locale.date,\n locale_time = locale.time,\n locale_periods = locale.periods,\n locale_weekdays = locale.days,\n locale_shortWeekdays = locale.shortDays,\n locale_months = locale.months,\n locale_shortMonths = locale.shortMonths;\n var periodRe = formatRe(locale_periods),\n periodLookup = formatLookup(locale_periods),\n weekdayRe = formatRe(locale_weekdays),\n weekdayLookup = formatLookup(locale_weekdays),\n shortWeekdayRe = formatRe(locale_shortWeekdays),\n shortWeekdayLookup = formatLookup(locale_shortWeekdays),\n monthRe = formatRe(locale_months),\n monthLookup = formatLookup(locale_months),\n shortMonthRe = formatRe(locale_shortMonths),\n shortMonthLookup = formatLookup(locale_shortMonths);\n var formats = {\n \"a\": formatShortWeekday,\n \"A\": formatWeekday,\n \"b\": formatShortMonth,\n \"B\": formatMonth,\n \"c\": null,\n \"d\": formatDayOfMonth,\n \"e\": formatDayOfMonth,\n \"f\": formatMicroseconds,\n \"g\": formatYearISO,\n \"G\": formatFullYearISO,\n \"H\": formatHour24,\n \"I\": formatHour12,\n \"j\": formatDayOfYear,\n \"L\": formatMilliseconds,\n \"m\": formatMonthNumber,\n \"M\": formatMinutes,\n \"p\": formatPeriod,\n \"q\": formatQuarter,\n \"Q\": formatUnixTimestamp,\n \"s\": formatUnixTimestampSeconds,\n \"S\": formatSeconds,\n \"u\": formatWeekdayNumberMonday,\n \"U\": formatWeekNumberSunday,\n \"V\": formatWeekNumberISO,\n \"w\": formatWeekdayNumberSunday,\n \"W\": formatWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatYear,\n \"Y\": formatFullYear,\n \"Z\": formatZone,\n \"%\": formatLiteralPercent\n };\n var utcFormats = {\n \"a\": formatUTCShortWeekday,\n \"A\": formatUTCWeekday,\n \"b\": formatUTCShortMonth,\n \"B\": formatUTCMonth,\n \"c\": null,\n \"d\": formatUTCDayOfMonth,\n \"e\": formatUTCDayOfMonth,\n \"f\": formatUTCMicroseconds,\n \"g\": formatUTCYearISO,\n \"G\": formatUTCFullYearISO,\n \"H\": formatUTCHour24,\n \"I\": formatUTCHour12,\n \"j\": formatUTCDayOfYear,\n \"L\": formatUTCMilliseconds,\n \"m\": formatUTCMonthNumber,\n \"M\": formatUTCMinutes,\n \"p\": formatUTCPeriod,\n \"q\": formatUTCQuarter,\n \"Q\": formatUnixTimestamp,\n \"s\": formatUnixTimestampSeconds,\n \"S\": formatUTCSeconds,\n \"u\": formatUTCWeekdayNumberMonday,\n \"U\": formatUTCWeekNumberSunday,\n \"V\": formatUTCWeekNumberISO,\n \"w\": formatUTCWeekdayNumberSunday,\n \"W\": formatUTCWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatUTCYear,\n \"Y\": formatUTCFullYear,\n \"Z\": formatUTCZone,\n \"%\": formatLiteralPercent\n };\n var parses = {\n \"a\": parseShortWeekday,\n \"A\": parseWeekday,\n \"b\": parseShortMonth,\n \"B\": parseMonth,\n \"c\": parseLocaleDateTime,\n \"d\": parseDayOfMonth,\n \"e\": parseDayOfMonth,\n \"f\": parseMicroseconds,\n \"g\": parseYear,\n \"G\": parseFullYear,\n \"H\": parseHour24,\n \"I\": parseHour24,\n \"j\": parseDayOfYear,\n \"L\": parseMilliseconds,\n \"m\": parseMonthNumber,\n \"M\": parseMinutes,\n \"p\": parsePeriod,\n \"q\": parseQuarter,\n \"Q\": parseUnixTimestamp,\n \"s\": parseUnixTimestampSeconds,\n \"S\": parseSeconds,\n \"u\": parseWeekdayNumberMonday,\n \"U\": parseWeekNumberSunday,\n \"V\": parseWeekNumberISO,\n \"w\": parseWeekdayNumberSunday,\n \"W\": parseWeekNumberMonday,\n \"x\": parseLocaleDate,\n \"X\": parseLocaleTime,\n \"y\": parseYear,\n \"Y\": parseFullYear,\n \"Z\": parseZone,\n \"%\": parseLiteralPercent\n };\n\n // These recursive directive definitions must be deferred.\n formats.x = newFormat(locale_date, formats);\n formats.X = newFormat(locale_time, formats);\n formats.c = newFormat(locale_dateTime, formats);\n utcFormats.x = newFormat(locale_date, utcFormats);\n utcFormats.X = newFormat(locale_time, utcFormats);\n utcFormats.c = newFormat(locale_dateTime, utcFormats);\n function newFormat(specifier, formats) {\n return function (date) {\n var string = [],\n i = -1,\n j = 0,\n n = specifier.length,\n c,\n pad,\n format;\n if (!(date instanceof Date)) date = new Date(+date);\n while (++i < n) {\n if (specifier.charCodeAt(i) === 37) {\n string.push(specifier.slice(j, i));\n if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);else pad = c === \"e\" ? \" \" : \"0\";\n if (format = formats[c]) c = format(date, pad);\n string.push(c);\n j = i + 1;\n }\n }\n string.push(specifier.slice(j, i));\n return string.join(\"\");\n };\n }\n function newParse(specifier, Z) {\n return function (string) {\n var d = newDate(1900, undefined, 1),\n i = parseSpecifier(d, specifier, string += \"\", 0),\n week,\n day;\n if (i != string.length) return null;\n\n // If a UNIX timestamp is specified, return it.\n if (\"Q\" in d) return new Date(d.Q);\n if (\"s\" in d) return new Date(d.s * 1000 + (\"L\" in d ? d.L : 0));\n\n // If this is utcParse, never use the local timezone.\n if (Z && !(\"Z\" in d)) d.Z = 0;\n\n // The am-pm flag is 0 for AM, and 1 for PM.\n if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n\n // If the month was not specified, inherit from the quarter.\n if (d.m === undefined) d.m = \"q\" in d ? d.q : 0;\n\n // Convert day-of-week and week-of-year to day-of-year.\n if (\"V\" in d) {\n if (d.V < 1 || d.V > 53) return null;\n if (!(\"w\" in d)) d.w = 1;\n if (\"Z\" in d) {\n week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay();\n week = day > 4 || day === 0 ? utcMonday.ceil(week) : utcMonday(week);\n week = utcDay.offset(week, (d.V - 1) * 7);\n d.y = week.getUTCFullYear();\n d.m = week.getUTCMonth();\n d.d = week.getUTCDate() + (d.w + 6) % 7;\n } else {\n week = localDate(newDate(d.y, 0, 1)), day = week.getDay();\n week = day > 4 || day === 0 ? timeMonday.ceil(week) : timeMonday(week);\n week = timeDay.offset(week, (d.V - 1) * 7);\n d.y = week.getFullYear();\n d.m = week.getMonth();\n d.d = week.getDate() + (d.w + 6) % 7;\n }\n } else if (\"W\" in d || \"U\" in d) {\n if (!(\"w\" in d)) d.w = \"u\" in d ? d.u % 7 : \"W\" in d ? 1 : 0;\n day = \"Z\" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay();\n d.m = 0;\n d.d = \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n }\n\n // If a time zone is specified, all fields are interpreted as UTC and then\n // offset according to the specified time zone.\n if (\"Z\" in d) {\n d.H += d.Z / 100 | 0;\n d.M += d.Z % 100;\n return utcDate(d);\n }\n\n // Otherwise, all fields are in local time.\n return localDate(d);\n };\n }\n function parseSpecifier(d, specifier, string, j) {\n var i = 0,\n n = specifier.length,\n m = string.length,\n c,\n parse;\n while (i < n) {\n if (j >= m) return -1;\n c = specifier.charCodeAt(i++);\n if (c === 37) {\n c = specifier.charAt(i++);\n parse = parses[c in pads ? specifier.charAt(i++) : c];\n if (!parse || (j = parse(d, string, j)) < 0) return -1;\n } else if (c != string.charCodeAt(j++)) {\n return -1;\n }\n }\n return j;\n }\n function parsePeriod(d, string, i) {\n var n = periodRe.exec(string.slice(i));\n return n ? (d.p = periodLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n function parseShortWeekday(d, string, i) {\n var n = shortWeekdayRe.exec(string.slice(i));\n return n ? (d.w = shortWeekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n function parseWeekday(d, string, i) {\n var n = weekdayRe.exec(string.slice(i));\n return n ? (d.w = weekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n function parseShortMonth(d, string, i) {\n var n = shortMonthRe.exec(string.slice(i));\n return n ? (d.m = shortMonthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n function parseMonth(d, string, i) {\n var n = monthRe.exec(string.slice(i));\n return n ? (d.m = monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n function parseLocaleDateTime(d, string, i) {\n return parseSpecifier(d, locale_dateTime, string, i);\n }\n function parseLocaleDate(d, string, i) {\n return parseSpecifier(d, locale_date, string, i);\n }\n function parseLocaleTime(d, string, i) {\n return parseSpecifier(d, locale_time, string, i);\n }\n function formatShortWeekday(d) {\n return locale_shortWeekdays[d.getDay()];\n }\n function formatWeekday(d) {\n return locale_weekdays[d.getDay()];\n }\n function formatShortMonth(d) {\n return locale_shortMonths[d.getMonth()];\n }\n function formatMonth(d) {\n return locale_months[d.getMonth()];\n }\n function formatPeriod(d) {\n return locale_periods[+(d.getHours() >= 12)];\n }\n function formatQuarter(d) {\n return 1 + ~~(d.getMonth() / 3);\n }\n function formatUTCShortWeekday(d) {\n return locale_shortWeekdays[d.getUTCDay()];\n }\n function formatUTCWeekday(d) {\n return locale_weekdays[d.getUTCDay()];\n }\n function formatUTCShortMonth(d) {\n return locale_shortMonths[d.getUTCMonth()];\n }\n function formatUTCMonth(d) {\n return locale_months[d.getUTCMonth()];\n }\n function formatUTCPeriod(d) {\n return locale_periods[+(d.getUTCHours() >= 12)];\n }\n function formatUTCQuarter(d) {\n return 1 + ~~(d.getUTCMonth() / 3);\n }\n return {\n format: function format(specifier) {\n var f = newFormat(specifier += \"\", formats);\n f.toString = function () {\n return specifier;\n };\n return f;\n },\n parse: function parse(specifier) {\n var p = newParse(specifier += \"\", false);\n p.toString = function () {\n return specifier;\n };\n return p;\n },\n utcFormat: function utcFormat(specifier) {\n var f = newFormat(specifier += \"\", utcFormats);\n f.toString = function () {\n return specifier;\n };\n return f;\n },\n utcParse: function utcParse(specifier) {\n var p = newParse(specifier += \"\", true);\n p.toString = function () {\n return specifier;\n };\n return p;\n }\n };\n}\nvar pads = {\n \"-\": \"\",\n \"_\": \" \",\n \"0\": \"0\"\n },\n numberRe = /^\\s*\\d+/,\n // note: ignores next directive\n percentRe = /^%/,\n requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\nfunction pad(value, fill, width) {\n var sign = value < 0 ? \"-\" : \"\",\n string = (sign ? -value : value) + \"\",\n length = string.length;\n return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n}\nfunction requote(s) {\n return s.replace(requoteRe, \"\\\\$&\");\n}\nfunction formatRe(names) {\n return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n}\nfunction formatLookup(names) {\n return new Map(names.map(function (name, i) {\n return [name.toLowerCase(), i];\n }));\n}\nfunction parseWeekdayNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.w = +n[0], i + n[0].length) : -1;\n}\nfunction parseWeekdayNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.u = +n[0], i + n[0].length) : -1;\n}\nfunction parseWeekNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.U = +n[0], i + n[0].length) : -1;\n}\nfunction parseWeekNumberISO(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.V = +n[0], i + n[0].length) : -1;\n}\nfunction parseWeekNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.W = +n[0], i + n[0].length) : -1;\n}\nfunction parseFullYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 4));\n return n ? (d.y = +n[0], i + n[0].length) : -1;\n}\nfunction parseYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;\n}\nfunction parseZone(d, string, i) {\n var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string.slice(i, i + 6));\n return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n}\nfunction parseQuarter(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1;\n}\nfunction parseMonthNumber(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n}\nfunction parseDayOfMonth(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.d = +n[0], i + n[0].length) : -1;\n}\nfunction parseDayOfYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n}\nfunction parseHour24(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.H = +n[0], i + n[0].length) : -1;\n}\nfunction parseMinutes(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.M = +n[0], i + n[0].length) : -1;\n}\nfunction parseSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.S = +n[0], i + n[0].length) : -1;\n}\nfunction parseMilliseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.L = +n[0], i + n[0].length) : -1;\n}\nfunction parseMicroseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 6));\n return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;\n}\nfunction parseLiteralPercent(d, string, i) {\n var n = percentRe.exec(string.slice(i, i + 1));\n return n ? i + n[0].length : -1;\n}\nfunction parseUnixTimestamp(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.Q = +n[0], i + n[0].length) : -1;\n}\nfunction parseUnixTimestampSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.s = +n[0], i + n[0].length) : -1;\n}\nfunction formatDayOfMonth(d, p) {\n return pad(d.getDate(), p, 2);\n}\nfunction formatHour24(d, p) {\n return pad(d.getHours(), p, 2);\n}\nfunction formatHour12(d, p) {\n return pad(d.getHours() % 12 || 12, p, 2);\n}\nfunction formatDayOfYear(d, p) {\n return pad(1 + timeDay.count(timeYear(d), d), p, 3);\n}\nfunction formatMilliseconds(d, p) {\n return pad(d.getMilliseconds(), p, 3);\n}\nfunction formatMicroseconds(d, p) {\n return formatMilliseconds(d, p) + \"000\";\n}\nfunction formatMonthNumber(d, p) {\n return pad(d.getMonth() + 1, p, 2);\n}\nfunction formatMinutes(d, p) {\n return pad(d.getMinutes(), p, 2);\n}\nfunction formatSeconds(d, p) {\n return pad(d.getSeconds(), p, 2);\n}\nfunction formatWeekdayNumberMonday(d) {\n var day = d.getDay();\n return day === 0 ? 7 : day;\n}\nfunction formatWeekNumberSunday(d, p) {\n return pad(timeSunday.count(timeYear(d) - 1, d), p, 2);\n}\nfunction dISO(d) {\n var day = d.getDay();\n return day >= 4 || day === 0 ? timeThursday(d) : timeThursday.ceil(d);\n}\nfunction formatWeekNumberISO(d, p) {\n d = dISO(d);\n return pad(timeThursday.count(timeYear(d), d) + (timeYear(d).getDay() === 4), p, 2);\n}\nfunction formatWeekdayNumberSunday(d) {\n return d.getDay();\n}\nfunction formatWeekNumberMonday(d, p) {\n return pad(timeMonday.count(timeYear(d) - 1, d), p, 2);\n}\nfunction formatYear(d, p) {\n return pad(d.getFullYear() % 100, p, 2);\n}\nfunction formatYearISO(d, p) {\n d = dISO(d);\n return pad(d.getFullYear() % 100, p, 2);\n}\nfunction formatFullYear(d, p) {\n return pad(d.getFullYear() % 10000, p, 4);\n}\nfunction formatFullYearISO(d, p) {\n var day = d.getDay();\n d = day >= 4 || day === 0 ? timeThursday(d) : timeThursday.ceil(d);\n return pad(d.getFullYear() % 10000, p, 4);\n}\nfunction formatZone(d) {\n var z = d.getTimezoneOffset();\n return (z > 0 ? \"-\" : (z *= -1, \"+\")) + pad(z / 60 | 0, \"0\", 2) + pad(z % 60, \"0\", 2);\n}\nfunction formatUTCDayOfMonth(d, p) {\n return pad(d.getUTCDate(), p, 2);\n}\nfunction formatUTCHour24(d, p) {\n return pad(d.getUTCHours(), p, 2);\n}\nfunction formatUTCHour12(d, p) {\n return pad(d.getUTCHours() % 12 || 12, p, 2);\n}\nfunction formatUTCDayOfYear(d, p) {\n return pad(1 + utcDay.count(utcYear(d), d), p, 3);\n}\nfunction formatUTCMilliseconds(d, p) {\n return pad(d.getUTCMilliseconds(), p, 3);\n}\nfunction formatUTCMicroseconds(d, p) {\n return formatUTCMilliseconds(d, p) + \"000\";\n}\nfunction formatUTCMonthNumber(d, p) {\n return pad(d.getUTCMonth() + 1, p, 2);\n}\nfunction formatUTCMinutes(d, p) {\n return pad(d.getUTCMinutes(), p, 2);\n}\nfunction formatUTCSeconds(d, p) {\n return pad(d.getUTCSeconds(), p, 2);\n}\nfunction formatUTCWeekdayNumberMonday(d) {\n var dow = d.getUTCDay();\n return dow === 0 ? 7 : dow;\n}\nfunction formatUTCWeekNumberSunday(d, p) {\n return pad(utcSunday.count(utcYear(d) - 1, d), p, 2);\n}\nfunction UTCdISO(d) {\n var day = d.getUTCDay();\n return day >= 4 || day === 0 ? utcThursday(d) : utcThursday.ceil(d);\n}\nfunction formatUTCWeekNumberISO(d, p) {\n d = UTCdISO(d);\n return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);\n}\nfunction formatUTCWeekdayNumberSunday(d) {\n return d.getUTCDay();\n}\nfunction formatUTCWeekNumberMonday(d, p) {\n return pad(utcMonday.count(utcYear(d) - 1, d), p, 2);\n}\nfunction formatUTCYear(d, p) {\n return pad(d.getUTCFullYear() % 100, p, 2);\n}\nfunction formatUTCYearISO(d, p) {\n d = UTCdISO(d);\n return pad(d.getUTCFullYear() % 100, p, 2);\n}\nfunction formatUTCFullYear(d, p) {\n return pad(d.getUTCFullYear() % 10000, p, 4);\n}\nfunction formatUTCFullYearISO(d, p) {\n var day = d.getUTCDay();\n d = day >= 4 || day === 0 ? utcThursday(d) : utcThursday.ceil(d);\n return pad(d.getUTCFullYear() % 10000, p, 4);\n}\nfunction formatUTCZone() {\n return \"+0000\";\n}\nfunction formatLiteralPercent() {\n return \"%\";\n}\nfunction formatUnixTimestamp(d) {\n return +d;\n}\nfunction formatUnixTimestampSeconds(d) {\n return Math.floor(+d / 1000);\n}","import formatLocale from \"./locale.js\";\nvar locale;\nexport var timeFormat;\nexport var timeParse;\nexport var utcFormat;\nexport var utcParse;\ndefaultLocale({\n dateTime: \"%x, %X\",\n date: \"%-m/%-d/%Y\",\n time: \"%-I:%M:%S %p\",\n periods: [\"AM\", \"PM\"],\n days: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n shortDays: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n months: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n shortMonths: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n});\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n timeFormat = locale.format;\n timeParse = locale.parse;\n utcFormat = locale.utcFormat;\n utcParse = locale.utcParse;\n return locale;\n}","import { timeYear, timeMonth, timeWeek, timeDay, timeHour, timeMinute, timeSecond, timeTicks, timeTickInterval } from \"d3-time\";\nimport { timeFormat } from \"d3-time-format\";\nimport continuous, { copy } from \"./continuous.js\";\nimport { initRange } from \"./init.js\";\nimport nice from \"./nice.js\";\nfunction date(t) {\n return new Date(t);\n}\nfunction number(t) {\n return t instanceof Date ? +t : +new Date(+t);\n}\nexport function calendar(ticks, tickInterval, year, month, week, day, hour, minute, second, format) {\n var scale = continuous(),\n invert = scale.invert,\n domain = scale.domain;\n var formatMillisecond = format(\".%L\"),\n formatSecond = format(\":%S\"),\n formatMinute = format(\"%I:%M\"),\n formatHour = format(\"%I %p\"),\n formatDay = format(\"%a %d\"),\n formatWeek = format(\"%b %d\"),\n formatMonth = format(\"%B\"),\n formatYear = format(\"%Y\");\n function tickFormat(date) {\n return (second(date) < date ? formatMillisecond : minute(date) < date ? formatSecond : hour(date) < date ? formatMinute : day(date) < date ? formatHour : month(date) < date ? week(date) < date ? formatDay : formatWeek : year(date) < date ? formatMonth : formatYear)(date);\n }\n scale.invert = function (y) {\n return new Date(invert(y));\n };\n scale.domain = function (_) {\n return arguments.length ? domain(Array.from(_, number)) : domain().map(date);\n };\n scale.ticks = function (interval) {\n var d = domain();\n return ticks(d[0], d[d.length - 1], interval == null ? 10 : interval);\n };\n scale.tickFormat = function (count, specifier) {\n return specifier == null ? tickFormat : format(specifier);\n };\n scale.nice = function (interval) {\n var d = domain();\n if (!interval || typeof interval.range !== \"function\") interval = tickInterval(d[0], d[d.length - 1], interval == null ? 10 : interval);\n return interval ? domain(nice(d, interval)) : scale;\n };\n scale.copy = function () {\n return copy(scale, calendar(ticks, tickInterval, year, month, week, day, hour, minute, second, format));\n };\n return scale;\n}\nexport default function time() {\n return initRange.apply(calendar(timeTicks, timeTickInterval, timeYear, timeMonth, timeWeek, timeDay, timeHour, timeMinute, timeSecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments);\n}","import { utcYear, utcMonth, utcWeek, utcDay, utcHour, utcMinute, utcSecond, utcTicks, utcTickInterval } from \"d3-time\";\nimport { utcFormat } from \"d3-time-format\";\nimport { calendar } from \"./time.js\";\nimport { initRange } from \"./init.js\";\nexport default function utcTime() {\n return initRange.apply(calendar(utcTicks, utcTickInterval, utcYear, utcMonth, utcWeek, utcDay, utcHour, utcMinute, utcSecond, utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]), arguments);\n}","import _slicedToArray from \"/home/runner/work/ohjelmointi-23/ohjelmointi-23/node_modules/@babel/runtime/helpers/esm/slicedToArray.js\";\nimport { interpolate, interpolateRound } from \"d3-interpolate\";\nimport { identity } from \"./continuous.js\";\nimport { initInterpolator } from \"./init.js\";\nimport { linearish } from \"./linear.js\";\nimport { loggish } from \"./log.js\";\nimport { symlogish } from \"./symlog.js\";\nimport { powish } from \"./pow.js\";\nfunction transformer() {\n var x0 = 0,\n x1 = 1,\n t0,\n t1,\n k10,\n transform,\n interpolator = identity,\n clamp = false,\n unknown;\n function scale(x) {\n return x == null || isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x));\n }\n scale.domain = function (_) {\n var _ref;\n return arguments.length ? ((_ref = _slicedToArray(_, 2), x0 = _ref[0], x1 = _ref[1]), t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1];\n };\n scale.clamp = function (_) {\n return arguments.length ? (clamp = !!_, scale) : clamp;\n };\n scale.interpolator = function (_) {\n return arguments.length ? (interpolator = _, scale) : interpolator;\n };\n function range(interpolate) {\n return function (_) {\n var _ref2;\n var r0, r1;\n return arguments.length ? ((_ref2 = _slicedToArray(_, 2), r0 = _ref2[0], r1 = _ref2[1]), interpolator = interpolate(r0, r1), scale) : [interpolator(0), interpolator(1)];\n };\n }\n scale.range = range(interpolate);\n scale.rangeRound = range(interpolateRound);\n scale.unknown = function (_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n return function (t) {\n transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0);\n return scale;\n };\n}\nexport function copy(source, target) {\n return target.domain(source.domain()).interpolator(source.interpolator()).clamp(source.clamp()).unknown(source.unknown());\n}\nexport default function sequential() {\n var scale = linearish(transformer()(identity));\n scale.copy = function () {\n return copy(scale, sequential());\n };\n return initInterpolator.apply(scale, arguments);\n}\nexport function sequentialLog() {\n var scale = loggish(transformer()).domain([1, 10]);\n scale.copy = function () {\n return copy(scale, sequentialLog()).base(scale.base());\n };\n return initInterpolator.apply(scale, arguments);\n}\nexport function sequentialSymlog() {\n var scale = symlogish(transformer());\n scale.copy = function () {\n return copy(scale, sequentialSymlog()).constant(scale.constant());\n };\n return initInterpolator.apply(scale, arguments);\n}\nexport function sequentialPow() {\n var scale = powish(transformer());\n scale.copy = function () {\n return copy(scale, sequentialPow()).exponent(scale.exponent());\n };\n return initInterpolator.apply(scale, arguments);\n}\nexport function sequentialSqrt() {\n return sequentialPow.apply(null, arguments).exponent(0.5);\n}","function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\nimport { ascending, bisect, quantile } from \"d3-array\";\nimport { identity } from \"./continuous.js\";\nimport { initInterpolator } from \"./init.js\";\nexport default function sequentialQuantile() {\n var domain = [],\n interpolator = identity;\n function scale(x) {\n if (x != null && !isNaN(x = +x)) return interpolator((bisect(domain, x, 1) - 1) / (domain.length - 1));\n }\n scale.domain = function (_) {\n if (!arguments.length) return domain.slice();\n domain = [];\n var _iterator = _createForOfIteratorHelper(_),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var d = _step.value;\n if (d != null && !isNaN(d = +d)) domain.push(d);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n domain.sort(ascending);\n return scale;\n };\n scale.interpolator = function (_) {\n return arguments.length ? (interpolator = _, scale) : interpolator;\n };\n scale.range = function () {\n return domain.map(function (d, i) {\n return interpolator(i / (domain.length - 1));\n });\n };\n scale.quantiles = function (n) {\n return Array.from({\n length: n + 1\n }, function (_, i) {\n return quantile(domain, i / n);\n });\n };\n scale.copy = function () {\n return sequentialQuantile(interpolator).domain(domain);\n };\n return initInterpolator.apply(scale, arguments);\n}","import { default as value } from \"./value.js\";\nexport default function piecewise(interpolate, values) {\n if (values === undefined) values = interpolate, interpolate = value;\n var i = 0,\n n = values.length - 1,\n v = values[0],\n I = new Array(n < 0 ? 0 : n);\n while (i < n) {\n I[i] = interpolate(v, v = values[++i]);\n }\n return function (t) {\n var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n)));\n return I[i](t - i);\n };\n}","import _slicedToArray from \"/home/runner/work/ohjelmointi-23/ohjelmointi-23/node_modules/@babel/runtime/helpers/esm/slicedToArray.js\";\nimport { interpolate, interpolateRound, piecewise } from \"d3-interpolate\";\nimport { identity } from \"./continuous.js\";\nimport { initInterpolator } from \"./init.js\";\nimport { linearish } from \"./linear.js\";\nimport { loggish } from \"./log.js\";\nimport { copy } from \"./sequential.js\";\nimport { symlogish } from \"./symlog.js\";\nimport { powish } from \"./pow.js\";\nfunction transformer() {\n var x0 = 0,\n x1 = 0.5,\n x2 = 1,\n s = 1,\n t0,\n t1,\n t2,\n k10,\n k21,\n interpolator = identity,\n transform,\n clamp = false,\n unknown;\n function scale(x) {\n return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (s * x < s * t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x));\n }\n scale.domain = function (_) {\n var _ref;\n return arguments.length ? ((_ref = _slicedToArray(_, 3), x0 = _ref[0], x1 = _ref[1], x2 = _ref[2]), t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), t2 = transform(x2 = +x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1, scale) : [x0, x1, x2];\n };\n scale.clamp = function (_) {\n return arguments.length ? (clamp = !!_, scale) : clamp;\n };\n scale.interpolator = function (_) {\n return arguments.length ? (interpolator = _, scale) : interpolator;\n };\n function range(interpolate) {\n return function (_) {\n var _ref2;\n var r0, r1, r2;\n return arguments.length ? ((_ref2 = _slicedToArray(_, 3), r0 = _ref2[0], r1 = _ref2[1], r2 = _ref2[2]), interpolator = piecewise(interpolate, [r0, r1, r2]), scale) : [interpolator(0), interpolator(0.5), interpolator(1)];\n };\n }\n scale.range = range(interpolate);\n scale.rangeRound = range(interpolateRound);\n scale.unknown = function (_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n return function (t) {\n transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1;\n return scale;\n };\n}\nexport default function diverging() {\n var scale = linearish(transformer()(identity));\n scale.copy = function () {\n return copy(scale, diverging());\n };\n return initInterpolator.apply(scale, arguments);\n}\nexport function divergingLog() {\n var scale = loggish(transformer()).domain([0.1, 1, 10]);\n scale.copy = function () {\n return copy(scale, divergingLog()).base(scale.base());\n };\n return initInterpolator.apply(scale, arguments);\n}\nexport function divergingSymlog() {\n var scale = symlogish(transformer());\n scale.copy = function () {\n return copy(scale, divergingSymlog()).constant(scale.constant());\n };\n return initInterpolator.apply(scale, arguments);\n}\nexport function divergingPow() {\n var scale = powish(transformer());\n scale.copy = function () {\n return copy(scale, divergingPow()).exponent(scale.exponent());\n };\n return initInterpolator.apply(scale, arguments);\n}\nexport function divergingSqrt() {\n return divergingPow.apply(null, arguments).exponent(0.5);\n}","export default function (series, order) {\n if (!((n = series.length) > 1)) return;\n for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {\n s0 = s1, s1 = series[order[i]];\n for (j = 0; j < m; ++j) {\n s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];\n }\n }\n}","export default function (series) {\n var n = series.length,\n o = new Array(n);\n while (--n >= 0) {\n o[n] = n;\n }\n return o;\n}","function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\nimport array from \"./array.js\";\nimport constant from \"./constant.js\";\nimport offsetNone from \"./offset/none.js\";\nimport orderNone from \"./order/none.js\";\nfunction stackValue(d, key) {\n return d[key];\n}\nfunction stackSeries(key) {\n var series = [];\n series.key = key;\n return series;\n}\nexport default function () {\n var keys = constant([]),\n order = orderNone,\n offset = offsetNone,\n value = stackValue;\n function stack(data) {\n var sz = Array.from(keys.apply(this, arguments), stackSeries),\n i,\n n = sz.length,\n j = -1,\n oz;\n var _iterator = _createForOfIteratorHelper(data),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var d = _step.value;\n for (i = 0, ++j; i < n; ++i) {\n (sz[i][j] = [0, +value(d, sz[i].key, j, data)]).data = d;\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n for (i = 0, oz = array(order(sz)); i < n; ++i) {\n sz[oz[i]].index = i;\n }\n offset(sz, oz);\n return sz;\n }\n stack.keys = function (_) {\n return arguments.length ? (keys = typeof _ === \"function\" ? _ : constant(Array.from(_)), stack) : keys;\n };\n stack.value = function (_) {\n return arguments.length ? (value = typeof _ === \"function\" ? _ : constant(+_), stack) : value;\n };\n stack.order = function (_) {\n return arguments.length ? (order = _ == null ? orderNone : typeof _ === \"function\" ? _ : constant(Array.from(_)), stack) : order;\n };\n stack.offset = function (_) {\n return arguments.length ? (offset = _ == null ? offsetNone : _, stack) : offset;\n };\n return stack;\n}","import _isEqual from \"lodash/isEqual\";\nimport _sortBy from \"lodash/sortBy\";\nimport _isNaN from \"lodash/isNaN\";\nimport _upperFirst from \"lodash/upperFirst\";\nimport _isString from \"lodash/isString\";\nimport _isArray from \"lodash/isArray\";\nimport _max from \"lodash/max\";\nimport _min from \"lodash/min\";\nimport _flatMap from \"lodash/flatMap\";\nimport _isFunction from \"lodash/isFunction\";\nimport _get from \"lodash/get\";\nimport _isNil from \"lodash/isNil\";\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nimport { getNiceTickValues, getTickValuesFixedDomain } from 'recharts-scale';\nimport * as d3Scales from 'd3-scale';\nimport { stack as shapeStack, stackOrderNone, stackOffsetExpand, stackOffsetNone, stackOffsetSilhouette, stackOffsetWiggle } from 'd3-shape';\nimport { isNumOrStr, uniqueId, isNumber, getPercentValue, mathSign, findEntryInArray } from './DataUtils';\nimport { Legend } from '../component/Legend';\nimport { findAllByType, findChildByType, getDisplayName } from './ReactUtils'; // TODO: Cause of circular dependency. Needs refactor.\n// import { RadiusAxisProps, AngleAxisProps } from '../polar/types';\n\nimport { filterProps } from './types';\nexport function getValueByDataKey(obj, dataKey, defaultValue) {\n if (_isNil(obj) || _isNil(dataKey)) {\n return defaultValue;\n }\n if (isNumOrStr(dataKey)) {\n return _get(obj, dataKey, defaultValue);\n }\n if (_isFunction(dataKey)) {\n return dataKey(obj);\n }\n return defaultValue;\n}\n/**\n * Get domain of data by key\n * @param {Array} data The data displayed in the chart\n * @param {String} key The unique key of a group of data\n * @param {String} type The type of axis\n * @param {Boolean} filterNil Whether or not filter nil values\n * @return {Array} Domain of data\n */\n\nexport function getDomainOfDataByKey(data, key, type, filterNil) {\n var flattenData = _flatMap(data, function (entry) {\n return getValueByDataKey(entry, key);\n });\n if (type === 'number') {\n var domain = flattenData.filter(function (entry) {\n return isNumber(entry) || parseFloat(entry);\n });\n return domain.length ? [_min(domain), _max(domain)] : [Infinity, -Infinity];\n }\n var validateData = filterNil ? flattenData.filter(function (entry) {\n return !_isNil(entry);\n }) : flattenData; // 支持Date类型的x轴\n\n return validateData.map(function (entry) {\n return isNumOrStr(entry) || entry instanceof Date ? entry : '';\n });\n}\nexport var calculateActiveTickIndex = function calculateActiveTickIndex(coordinate) {\n var _ticks$length;\n var ticks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n var unsortedTicks = arguments.length > 2 ? arguments[2] : undefined;\n var axis = arguments.length > 3 ? arguments[3] : undefined;\n var index = -1;\n var len = (_ticks$length = ticks === null || ticks === void 0 ? void 0 : ticks.length) !== null && _ticks$length !== void 0 ? _ticks$length : 0;\n if (len > 1) {\n if (axis && axis.axisType === 'angleAxis' && Math.abs(Math.abs(axis.range[1] - axis.range[0]) - 360) <= 1e-6) {\n var range = axis.range; // ticks are distributed in a circle\n\n for (var i = 0; i < len; i++) {\n var before = i > 0 ? unsortedTicks[i - 1].coordinate : unsortedTicks[len - 1].coordinate;\n var cur = unsortedTicks[i].coordinate;\n var after = i >= len - 1 ? unsortedTicks[0].coordinate : unsortedTicks[i + 1].coordinate;\n var sameDirectionCoord = void 0;\n if (mathSign(cur - before) !== mathSign(after - cur)) {\n var diffInterval = [];\n if (mathSign(after - cur) === mathSign(range[1] - range[0])) {\n sameDirectionCoord = after;\n var curInRange = cur + range[1] - range[0];\n diffInterval[0] = Math.min(curInRange, (curInRange + before) / 2);\n diffInterval[1] = Math.max(curInRange, (curInRange + before) / 2);\n } else {\n sameDirectionCoord = before;\n var afterInRange = after + range[1] - range[0];\n diffInterval[0] = Math.min(cur, (afterInRange + cur) / 2);\n diffInterval[1] = Math.max(cur, (afterInRange + cur) / 2);\n }\n var sameInterval = [Math.min(cur, (sameDirectionCoord + cur) / 2), Math.max(cur, (sameDirectionCoord + cur) / 2)];\n if (coordinate > sameInterval[0] && coordinate <= sameInterval[1] || coordinate >= diffInterval[0] && coordinate <= diffInterval[1]) {\n index = unsortedTicks[i].index;\n break;\n }\n } else {\n var min = Math.min(before, after);\n var max = Math.max(before, after);\n if (coordinate > (min + cur) / 2 && coordinate <= (max + cur) / 2) {\n index = unsortedTicks[i].index;\n break;\n }\n }\n }\n } else {\n // ticks are distributed in a single direction\n for (var _i = 0; _i < len; _i++) {\n if (_i === 0 && coordinate <= (ticks[_i].coordinate + ticks[_i + 1].coordinate) / 2 || _i > 0 && _i < len - 1 && coordinate > (ticks[_i].coordinate + ticks[_i - 1].coordinate) / 2 && coordinate <= (ticks[_i].coordinate + ticks[_i + 1].coordinate) / 2 || _i === len - 1 && coordinate > (ticks[_i].coordinate + ticks[_i - 1].coordinate) / 2) {\n index = ticks[_i].index;\n break;\n }\n }\n }\n } else {\n index = 0;\n }\n return index;\n};\n/**\n * Get the main color of each graphic item\n * @param {ReactElement} item A graphic item\n * @return {String} Color\n */\n\nexport var getMainColorOfGraphicItem = function getMainColorOfGraphicItem(item) {\n var _ref = item,\n displayName = _ref.type.displayName; // TODO: check if displayName is valid.\n\n var _item$props = item.props,\n stroke = _item$props.stroke,\n fill = _item$props.fill;\n var result;\n switch (displayName) {\n case 'Line':\n result = stroke;\n break;\n case 'Area':\n case 'Radar':\n result = stroke && stroke !== 'none' ? stroke : fill;\n break;\n default:\n result = fill;\n break;\n }\n return result;\n};\nexport var getLegendProps = function getLegendProps(_ref2) {\n var children = _ref2.children,\n formattedGraphicalItems = _ref2.formattedGraphicalItems,\n legendWidth = _ref2.legendWidth,\n legendContent = _ref2.legendContent;\n var legendItem = findChildByType(children, Legend.displayName);\n if (!legendItem) {\n return null;\n }\n var legendData;\n if (legendItem.props && legendItem.props.payload) {\n legendData = legendItem.props && legendItem.props.payload;\n } else if (legendContent === 'children') {\n legendData = (formattedGraphicalItems || []).reduce(function (result, _ref3) {\n var item = _ref3.item,\n props = _ref3.props;\n var data = props.sectors || props.data || [];\n return result.concat(data.map(function (entry) {\n return {\n type: legendItem.props.iconType || item.props.legendType,\n value: entry.name,\n color: entry.fill,\n payload: entry\n };\n }));\n }, []);\n } else {\n legendData = (formattedGraphicalItems || []).map(function (_ref4) {\n var item = _ref4.item;\n var _item$props2 = item.props,\n dataKey = _item$props2.dataKey,\n name = _item$props2.name,\n legendType = _item$props2.legendType,\n hide = _item$props2.hide;\n return {\n inactive: hide,\n dataKey: dataKey,\n type: legendItem.props.iconType || legendType || 'square',\n color: getMainColorOfGraphicItem(item),\n value: name || dataKey,\n payload: item.props\n };\n });\n }\n return _objectSpread(_objectSpread(_objectSpread({}, legendItem.props), Legend.getWithHeight(legendItem, legendWidth)), {}, {\n payload: legendData,\n item: legendItem\n });\n};\n/**\n * Calculate the size of all groups for stacked bar graph\n * @param {Object} stackGroups The items grouped by axisId and stackId\n * @return {Object} The size of all groups\n */\n\nexport var getBarSizeList = function getBarSizeList(_ref5) {\n var globalSize = _ref5.barSize,\n _ref5$stackGroups = _ref5.stackGroups,\n stackGroups = _ref5$stackGroups === void 0 ? {} : _ref5$stackGroups;\n if (!stackGroups) {\n return {};\n }\n var result = {};\n var numericAxisIds = Object.keys(stackGroups);\n for (var i = 0, len = numericAxisIds.length; i < len; i++) {\n var sgs = stackGroups[numericAxisIds[i]].stackGroups;\n var stackIds = Object.keys(sgs);\n for (var j = 0, sLen = stackIds.length; j < sLen; j++) {\n var _sgs$stackIds$j = sgs[stackIds[j]],\n items = _sgs$stackIds$j.items,\n cateAxisId = _sgs$stackIds$j.cateAxisId;\n var barItems = items.filter(function (item) {\n return getDisplayName(item.type).indexOf('Bar') >= 0;\n });\n if (barItems && barItems.length) {\n var selfSize = barItems[0].props.barSize;\n var cateId = barItems[0].props[cateAxisId];\n if (!result[cateId]) {\n result[cateId] = [];\n }\n result[cateId].push({\n item: barItems[0],\n stackList: barItems.slice(1),\n barSize: _isNil(selfSize) ? globalSize : selfSize\n });\n }\n }\n }\n return result;\n};\n/**\n * Calculate the size of each bar and the gap between two bars\n * @param {Number} bandSize The size of each category\n * @param {sizeList} sizeList The size of all groups\n * @param {maxBarSize} maxBarSize The maximum size of bar\n * @return {Number} The size of each bar and the gap between two bars\n */\n\nexport var getBarPosition = function getBarPosition(_ref6) {\n var barGap = _ref6.barGap,\n barCategoryGap = _ref6.barCategoryGap,\n bandSize = _ref6.bandSize,\n _ref6$sizeList = _ref6.sizeList,\n sizeList = _ref6$sizeList === void 0 ? [] : _ref6$sizeList,\n maxBarSize = _ref6.maxBarSize;\n var len = sizeList.length;\n if (len < 1) return null;\n var realBarGap = getPercentValue(barGap, bandSize, 0, true);\n var result; // whether or not is barSize setted by user\n\n if (sizeList[0].barSize === +sizeList[0].barSize) {\n var useFull = false;\n var fullBarSize = bandSize / len;\n var sum = sizeList.reduce(function (res, entry) {\n return res + entry.barSize || 0;\n }, 0);\n sum += (len - 1) * realBarGap;\n if (sum >= bandSize) {\n sum -= (len - 1) * realBarGap;\n realBarGap = 0;\n }\n if (sum >= bandSize && fullBarSize > 0) {\n useFull = true;\n fullBarSize *= 0.9;\n sum = len * fullBarSize;\n }\n var offset = (bandSize - sum) / 2 >> 0;\n var prev = {\n offset: offset - realBarGap,\n size: 0\n };\n result = sizeList.reduce(function (res, entry) {\n var newRes = [].concat(_toConsumableArray(res), [{\n item: entry.item,\n position: {\n offset: prev.offset + prev.size + realBarGap,\n size: useFull ? fullBarSize : entry.barSize\n }\n }]);\n prev = newRes[newRes.length - 1].position;\n if (entry.stackList && entry.stackList.length) {\n entry.stackList.forEach(function (item) {\n newRes.push({\n item: item,\n position: prev\n });\n });\n }\n return newRes;\n }, []);\n } else {\n var _offset = getPercentValue(barCategoryGap, bandSize, 0, true);\n if (bandSize - 2 * _offset - (len - 1) * realBarGap <= 0) {\n realBarGap = 0;\n }\n var originalSize = (bandSize - 2 * _offset - (len - 1) * realBarGap) / len;\n if (originalSize > 1) {\n originalSize >>= 0;\n }\n var size = maxBarSize === +maxBarSize ? Math.min(originalSize, maxBarSize) : originalSize;\n result = sizeList.reduce(function (res, entry, i) {\n var newRes = [].concat(_toConsumableArray(res), [{\n item: entry.item,\n position: {\n offset: _offset + (originalSize + realBarGap) * i + (originalSize - size) / 2,\n size: size\n }\n }]);\n if (entry.stackList && entry.stackList.length) {\n entry.stackList.forEach(function (item) {\n newRes.push({\n item: item,\n position: newRes[newRes.length - 1].position\n });\n });\n }\n return newRes;\n }, []);\n }\n return result;\n};\nexport var appendOffsetOfLegend = function appendOffsetOfLegend(offset, items, props, legendBox) {\n var children = props.children,\n width = props.width,\n margin = props.margin;\n var legendWidth = width - (margin.left || 0) - (margin.right || 0); // const legendHeight = height - (margin.top || 0) - (margin.bottom || 0);\n\n var legendProps = getLegendProps({\n children: children,\n legendWidth: legendWidth\n });\n var newOffset = offset;\n if (legendProps) {\n var box = legendBox || {};\n var align = legendProps.align,\n verticalAlign = legendProps.verticalAlign,\n layout = legendProps.layout;\n if ((layout === 'vertical' || layout === 'horizontal' && verticalAlign === 'center') && isNumber(offset[align])) {\n newOffset = _objectSpread(_objectSpread({}, offset), {}, _defineProperty({}, align, newOffset[align] + (box.width || 0)));\n }\n if ((layout === 'horizontal' || layout === 'vertical' && align === 'center') && isNumber(offset[verticalAlign])) {\n newOffset = _objectSpread(_objectSpread({}, offset), {}, _defineProperty({}, verticalAlign, newOffset[verticalAlign] + (box.height || 0)));\n }\n }\n return newOffset;\n};\nvar isErrorBarRelevantForAxis = function isErrorBarRelevantForAxis(layout, axisType, direction) {\n if (_isNil(axisType)) {\n return true;\n }\n if (layout === 'horizontal') {\n return axisType === 'yAxis';\n }\n if (layout === 'vertical') {\n return axisType === 'xAxis';\n }\n if (direction === 'x') {\n return axisType === 'xAxis';\n }\n if (direction === 'y') {\n return axisType === 'yAxis';\n }\n return true;\n};\nexport var getDomainOfErrorBars = function getDomainOfErrorBars(data, item, dataKey, layout, axisType) {\n var children = item.props.children;\n var errorBars = findAllByType(children, 'ErrorBar').filter(function (errorBarChild) {\n return isErrorBarRelevantForAxis(layout, axisType, errorBarChild.props.direction);\n });\n if (errorBars && errorBars.length) {\n var keys = errorBars.map(function (errorBarChild) {\n return errorBarChild.props.dataKey;\n });\n return data.reduce(function (result, entry) {\n var entryValue = getValueByDataKey(entry, dataKey, 0);\n var mainValue = _isArray(entryValue) ? [_min(entryValue), _max(entryValue)] : [entryValue, entryValue];\n var errorDomain = keys.reduce(function (prevErrorArr, k) {\n var errorValue = getValueByDataKey(entry, k, 0);\n var lowerValue = mainValue[0] - Math.abs(_isArray(errorValue) ? errorValue[0] : errorValue);\n var upperValue = mainValue[1] + Math.abs(_isArray(errorValue) ? errorValue[1] : errorValue);\n return [Math.min(lowerValue, prevErrorArr[0]), Math.max(upperValue, prevErrorArr[1])];\n }, [Infinity, -Infinity]);\n return [Math.min(errorDomain[0], result[0]), Math.max(errorDomain[1], result[1])];\n }, [Infinity, -Infinity]);\n }\n return null;\n};\nexport var parseErrorBarsOfAxis = function parseErrorBarsOfAxis(data, items, dataKey, axisType, layout) {\n var domains = items.map(function (item) {\n return getDomainOfErrorBars(data, item, dataKey, layout, axisType);\n }).filter(function (entry) {\n return !_isNil(entry);\n });\n if (domains && domains.length) {\n return domains.reduce(function (result, entry) {\n return [Math.min(result[0], entry[0]), Math.max(result[1], entry[1])];\n }, [Infinity, -Infinity]);\n }\n return null;\n};\n/**\n * Get domain of data by the configuration of item element\n * @param {Array} data The data displayed in the chart\n * @param {Array} items The instances of item\n * @param {String} type The type of axis, number - Number Axis, category - Category Axis\n * @param {LayoutType} layout The type of layout\n * @param {Boolean} filterNil Whether or not filter nil values\n * @return {Array} Domain\n */\n\nexport var getDomainOfItemsWithSameAxis = function getDomainOfItemsWithSameAxis(data, items, type, layout, filterNil) {\n var domains = items.map(function (item) {\n var dataKey = item.props.dataKey;\n if (type === 'number' && dataKey) {\n return getDomainOfErrorBars(data, item, dataKey, layout) || getDomainOfDataByKey(data, dataKey, type, filterNil);\n }\n return getDomainOfDataByKey(data, dataKey, type, filterNil);\n });\n if (type === 'number') {\n // Calculate the domain of number axis\n return domains.reduce(function (result, entry) {\n return [Math.min(result[0], entry[0]), Math.max(result[1], entry[1])];\n }, [Infinity, -Infinity]);\n }\n var tag = {}; // Get the union set of category axis\n\n return domains.reduce(function (result, entry) {\n for (var i = 0, len = entry.length; i < len; i++) {\n if (!tag[entry[i]]) {\n tag[entry[i]] = true;\n result.push(entry[i]);\n }\n }\n return result;\n }, []);\n};\nexport var isCategoricalAxis = function isCategoricalAxis(layout, axisType) {\n return layout === 'horizontal' && axisType === 'xAxis' || layout === 'vertical' && axisType === 'yAxis' || layout === 'centric' && axisType === 'angleAxis' || layout === 'radial' && axisType === 'radiusAxis';\n};\n/**\n * Calculate the Coordinates of grid\n * @param {Array} ticks The ticks in axis\n * @param {Number} min The minimun value of axis\n * @param {Number} max The maximun value of axis\n * @return {Array} Coordinates\n */\n\nexport var getCoordinatesOfGrid = function getCoordinatesOfGrid(ticks, min, max) {\n var hasMin, hasMax;\n var values = ticks.map(function (entry) {\n if (entry.coordinate === min) {\n hasMin = true;\n }\n if (entry.coordinate === max) {\n hasMax = true;\n }\n return entry.coordinate;\n });\n if (!hasMin) {\n values.push(min);\n }\n if (!hasMax) {\n values.push(max);\n }\n return values;\n};\n/**\n * Get the ticks of an axis\n * @param {Object} axis The configuration of an axis\n * @param {Boolean} isGrid Whether or not are the ticks in grid\n * @param {Boolean} isAll Return the ticks of all the points or not\n * @return {Array} Ticks\n */\n\nexport var getTicksOfAxis = function getTicksOfAxis(axis, isGrid, isAll) {\n if (!axis) return null;\n var scale = axis.scale;\n var duplicateDomain = axis.duplicateDomain,\n type = axis.type,\n range = axis.range;\n var offsetForBand = axis.realScaleType === 'scaleBand' ? scale.bandwidth() / 2 : 2;\n var offset = (isGrid || isAll) && type === 'category' && scale.bandwidth ? scale.bandwidth() / offsetForBand : 0;\n offset = axis.axisType === 'angleAxis' ? mathSign(range[0] - range[1]) * 2 * offset : offset; // The ticks setted by user should only affect the ticks adjacent to axis line\n\n if (isGrid && (axis.ticks || axis.niceTicks)) {\n return (axis.ticks || axis.niceTicks).map(function (entry) {\n var scaleContent = duplicateDomain ? duplicateDomain.indexOf(entry) : entry;\n return {\n coordinate: scale(scaleContent) + offset,\n value: entry,\n offset: offset\n };\n });\n } // When axis is a categorial axis, but the type of axis is number or the scale of axis is not \"auto\"\n\n if (axis.isCategorical && axis.categoricalDomain) {\n return axis.categoricalDomain.map(function (entry, index) {\n return {\n coordinate: scale(entry) + offset,\n value: entry,\n index: index,\n offset: offset\n };\n });\n }\n if (scale.ticks && !isAll) {\n return scale.ticks(axis.tickCount).map(function (entry) {\n return {\n coordinate: scale(entry) + offset,\n value: entry,\n offset: offset\n };\n });\n } // When axis has duplicated text, serial numbers are used to generate scale\n\n return scale.domain().map(function (entry, index) {\n return {\n coordinate: scale(entry) + offset,\n value: duplicateDomain ? duplicateDomain[entry] : entry,\n index: index,\n offset: offset\n };\n });\n};\n/**\n * combine the handlers\n * @param {Function} defaultHandler Internal private handler\n * @param {Function} parentHandler Handler function specified in parent component\n * @param {Function} childHandler Handler function specified in child component\n * @return {Function} The combined handler\n */\n\nexport var combineEventHandlers = function combineEventHandlers(defaultHandler, parentHandler, childHandler) {\n var customizedHandler;\n if (_isFunction(childHandler)) {\n customizedHandler = childHandler;\n } else if (_isFunction(parentHandler)) {\n customizedHandler = parentHandler;\n }\n if (_isFunction(defaultHandler) || customizedHandler) {\n return function (arg1, arg2, arg3, arg4) {\n if (_isFunction(defaultHandler)) {\n defaultHandler(arg1, arg2, arg3, arg4);\n }\n if (_isFunction(customizedHandler)) {\n customizedHandler(arg1, arg2, arg3, arg4);\n }\n };\n }\n return null;\n};\n/**\n * Parse the scale function of axis\n * @param {Object} axis The option of axis\n * @param {String} chartType The displayName of chart\n * @param {Boolean} hasBar if it has a bar\n * @return {Function} The scale function\n */\n\nexport var parseScale = function parseScale(axis, chartType, hasBar) {\n var scale = axis.scale,\n type = axis.type,\n layout = axis.layout,\n axisType = axis.axisType;\n if (scale === 'auto') {\n if (layout === 'radial' && axisType === 'radiusAxis') {\n return {\n scale: d3Scales.scaleBand(),\n realScaleType: 'band'\n };\n }\n if (layout === 'radial' && axisType === 'angleAxis') {\n return {\n scale: d3Scales.scaleLinear(),\n realScaleType: 'linear'\n };\n }\n if (type === 'category' && chartType && (chartType.indexOf('LineChart') >= 0 || chartType.indexOf('AreaChart') >= 0 || chartType.indexOf('ComposedChart') >= 0 && !hasBar)) {\n return {\n scale: d3Scales.scalePoint(),\n realScaleType: 'point'\n };\n }\n if (type === 'category') {\n return {\n scale: d3Scales.scaleBand(),\n realScaleType: 'band'\n };\n }\n return {\n scale: d3Scales.scaleLinear(),\n realScaleType: 'linear'\n };\n }\n if (_isString(scale)) {\n var name = \"scale\".concat(_upperFirst(scale));\n return {\n scale: (d3Scales[name] || d3Scales.scalePoint)(),\n realScaleType: d3Scales[name] ? name : 'point'\n };\n }\n return _isFunction(scale) ? {\n scale: scale\n } : {\n scale: d3Scales.scalePoint(),\n realScaleType: 'point'\n };\n};\nvar EPS = 1e-4;\nexport var checkDomainOfScale = function checkDomainOfScale(scale) {\n var domain = scale.domain();\n if (!domain || domain.length <= 2) {\n return;\n }\n var len = domain.length;\n var range = scale.range();\n var min = Math.min(range[0], range[1]) - EPS;\n var max = Math.max(range[0], range[1]) + EPS;\n var first = scale(domain[0]);\n var last = scale(domain[len - 1]);\n if (first < min || first > max || last < min || last > max) {\n scale.domain([domain[0], domain[len - 1]]);\n }\n};\nexport var findPositionOfBar = function findPositionOfBar(barPosition, child) {\n if (!barPosition) {\n return null;\n }\n for (var i = 0, len = barPosition.length; i < len; i++) {\n if (barPosition[i].item === child) {\n return barPosition[i].position;\n }\n }\n return null;\n};\nexport var truncateByDomain = function truncateByDomain(value, domain) {\n if (!domain || domain.length !== 2 || !isNumber(domain[0]) || !isNumber(domain[1])) {\n return value;\n }\n var min = Math.min(domain[0], domain[1]);\n var max = Math.max(domain[0], domain[1]);\n var result = [value[0], value[1]];\n if (!isNumber(value[0]) || value[0] < min) {\n result[0] = min;\n }\n if (!isNumber(value[1]) || value[1] > max) {\n result[1] = max;\n }\n if (result[0] > max) {\n result[0] = max;\n }\n if (result[1] < min) {\n result[1] = min;\n }\n return result;\n};\n/* eslint no-param-reassign: 0 */\n\nexport var offsetSign = function offsetSign(series) {\n var n = series.length;\n if (n <= 0) {\n return;\n }\n for (var j = 0, m = series[0].length; j < m; ++j) {\n var positive = 0;\n var negative = 0;\n for (var i = 0; i < n; ++i) {\n var value = _isNaN(series[i][j][1]) ? series[i][j][0] : series[i][j][1];\n /* eslint-disable prefer-destructuring */\n\n if (value >= 0) {\n series[i][j][0] = positive;\n series[i][j][1] = positive + value;\n positive = series[i][j][1];\n } else {\n series[i][j][0] = negative;\n series[i][j][1] = negative + value;\n negative = series[i][j][1];\n }\n /* eslint-enable prefer-destructuring */\n }\n }\n};\n/* eslint no-param-reassign: 0 */\n\nexport var offsetPositive = function offsetPositive(series) {\n var n = series.length;\n if (n <= 0) {\n return;\n }\n for (var j = 0, m = series[0].length; j < m; ++j) {\n var positive = 0;\n for (var i = 0; i < n; ++i) {\n var value = _isNaN(series[i][j][1]) ? series[i][j][0] : series[i][j][1];\n /* eslint-disable prefer-destructuring */\n\n if (value >= 0) {\n series[i][j][0] = positive;\n series[i][j][1] = positive + value;\n positive = series[i][j][1];\n } else {\n series[i][j][0] = 0;\n series[i][j][1] = 0;\n }\n /* eslint-enable prefer-destructuring */\n }\n }\n};\n\nvar STACK_OFFSET_MAP = {\n sign: offsetSign,\n expand: stackOffsetExpand,\n none: stackOffsetNone,\n silhouette: stackOffsetSilhouette,\n wiggle: stackOffsetWiggle,\n positive: offsetPositive\n};\nexport var getStackedData = function getStackedData(data, stackItems, offsetType) {\n var dataKeys = stackItems.map(function (item) {\n return item.props.dataKey;\n });\n var stack = shapeStack().keys(dataKeys).value(function (d, key) {\n return +getValueByDataKey(d, key, 0);\n }).order(stackOrderNone).offset(STACK_OFFSET_MAP[offsetType]);\n return stack(data);\n};\nexport var getStackGroupsByAxisId = function getStackGroupsByAxisId(data, _items, numericAxisId, cateAxisId, offsetType, reverseStackOrder) {\n if (!data) {\n return null;\n } // reversing items to affect render order (for layering)\n\n var items = reverseStackOrder ? _items.reverse() : _items;\n var stackGroups = items.reduce(function (result, item) {\n var _item$props3 = item.props,\n stackId = _item$props3.stackId,\n hide = _item$props3.hide;\n if (hide) {\n return result;\n }\n var axisId = item.props[numericAxisId];\n var parentGroup = result[axisId] || {\n hasStack: false,\n stackGroups: {}\n };\n if (isNumOrStr(stackId)) {\n var childGroup = parentGroup.stackGroups[stackId] || {\n numericAxisId: numericAxisId,\n cateAxisId: cateAxisId,\n items: []\n };\n childGroup.items.push(item);\n parentGroup.hasStack = true;\n parentGroup.stackGroups[stackId] = childGroup;\n } else {\n parentGroup.stackGroups[uniqueId('_stackId_')] = {\n numericAxisId: numericAxisId,\n cateAxisId: cateAxisId,\n items: [item]\n };\n }\n return _objectSpread(_objectSpread({}, result), {}, _defineProperty({}, axisId, parentGroup));\n }, {});\n return Object.keys(stackGroups).reduce(function (result, axisId) {\n var group = stackGroups[axisId];\n if (group.hasStack) {\n group.stackGroups = Object.keys(group.stackGroups).reduce(function (res, stackId) {\n var g = group.stackGroups[stackId];\n return _objectSpread(_objectSpread({}, res), {}, _defineProperty({}, stackId, {\n numericAxisId: numericAxisId,\n cateAxisId: cateAxisId,\n items: g.items,\n stackedData: getStackedData(data, g.items, offsetType)\n }));\n }, {});\n }\n return _objectSpread(_objectSpread({}, result), {}, _defineProperty({}, axisId, group));\n }, {});\n};\n/**\n * get domain of ticks\n * @param {Array} ticks Ticks of axis\n * @param {String} type The type of axis\n * @return {Array} domain\n */\n\nexport var calculateDomainOfTicks = function calculateDomainOfTicks(ticks, type) {\n if (type === 'number') {\n return [_min(ticks), _max(ticks)];\n }\n return ticks;\n};\n/**\n * Configure the scale function of axis\n * @param {Object} scale The scale function\n * @param {Object} opts The configuration of axis\n * @return {Object} null\n */\n\nexport var getTicksOfScale = function getTicksOfScale(scale, opts) {\n var realScaleType = opts.realScaleType,\n type = opts.type,\n tickCount = opts.tickCount,\n originalDomain = opts.originalDomain,\n allowDecimals = opts.allowDecimals;\n var scaleType = realScaleType || opts.scale;\n if (scaleType !== 'auto' && scaleType !== 'linear') {\n return null;\n }\n if (tickCount && type === 'number' && originalDomain && (originalDomain[0] === 'auto' || originalDomain[1] === 'auto')) {\n // Calculate the ticks by the number of grid when the axis is a number axis\n var domain = scale.domain();\n if (!domain.length) {\n return null;\n }\n var tickValues = getNiceTickValues(domain, tickCount, allowDecimals);\n scale.domain(calculateDomainOfTicks(tickValues, type));\n return {\n niceTicks: tickValues\n };\n }\n if (tickCount && type === 'number') {\n var _domain = scale.domain();\n var _tickValues = getTickValuesFixedDomain(_domain, tickCount, allowDecimals);\n return {\n niceTicks: _tickValues\n };\n }\n return null;\n};\nexport var getCateCoordinateOfLine = function getCateCoordinateOfLine(_ref7) {\n var axis = _ref7.axis,\n ticks = _ref7.ticks,\n bandSize = _ref7.bandSize,\n entry = _ref7.entry,\n index = _ref7.index,\n dataKey = _ref7.dataKey;\n if (axis.type === 'category') {\n // find coordinate of category axis by the value of category\n if (!axis.allowDuplicatedCategory && axis.dataKey && !_isNil(entry[axis.dataKey])) {\n var matchedTick = findEntryInArray(ticks, 'value', entry[axis.dataKey]);\n if (matchedTick) {\n return matchedTick.coordinate + bandSize / 2;\n }\n }\n return ticks[index] ? ticks[index].coordinate + bandSize / 2 : null;\n }\n var value = getValueByDataKey(entry, !_isNil(dataKey) ? dataKey : axis.dataKey);\n return !_isNil(value) ? axis.scale(value) : null;\n};\nexport var getCateCoordinateOfBar = function getCateCoordinateOfBar(_ref8) {\n var axis = _ref8.axis,\n ticks = _ref8.ticks,\n offset = _ref8.offset,\n bandSize = _ref8.bandSize,\n entry = _ref8.entry,\n index = _ref8.index;\n if (axis.type === 'category') {\n return ticks[index] ? ticks[index].coordinate + offset : null;\n }\n var value = getValueByDataKey(entry, axis.dataKey, axis.domain[index]);\n return !_isNil(value) ? axis.scale(value) - bandSize / 2 + offset : null;\n};\nexport var getBaseValueOfBar = function getBaseValueOfBar(_ref9) {\n var numericAxis = _ref9.numericAxis;\n var domain = numericAxis.scale.domain();\n if (numericAxis.type === 'number') {\n var min = Math.min(domain[0], domain[1]);\n var max = Math.max(domain[0], domain[1]);\n if (min <= 0 && max >= 0) {\n return 0;\n }\n if (max < 0) {\n return max;\n }\n return min;\n }\n return domain[0];\n};\nexport var getStackedDataOfItem = function getStackedDataOfItem(item, stackGroups) {\n var stackId = item.props.stackId;\n if (isNumOrStr(stackId)) {\n var group = stackGroups[stackId];\n if (group && group.items.length) {\n var itemIndex = -1;\n for (var i = 0, len = group.items.length; i < len; i++) {\n if (group.items[i] === item) {\n itemIndex = i;\n break;\n }\n }\n return itemIndex >= 0 ? group.stackedData[itemIndex] : null;\n }\n }\n return null;\n};\nvar getDomainOfSingle = function getDomainOfSingle(data) {\n return data.reduce(function (result, entry) {\n return [_min(entry.concat([result[0]]).filter(isNumber)), _max(entry.concat([result[1]]).filter(isNumber))];\n }, [Infinity, -Infinity]);\n};\nexport var getDomainOfStackGroups = function getDomainOfStackGroups(stackGroups, startIndex, endIndex) {\n return Object.keys(stackGroups).reduce(function (result, stackId) {\n var group = stackGroups[stackId];\n var stackedData = group.stackedData;\n var domain = stackedData.reduce(function (res, entry) {\n var s = getDomainOfSingle(entry.slice(startIndex, endIndex + 1));\n return [Math.min(res[0], s[0]), Math.max(res[1], s[1])];\n }, [Infinity, -Infinity]);\n return [Math.min(domain[0], result[0]), Math.max(domain[1], result[1])];\n }, [Infinity, -Infinity]).map(function (result) {\n return result === Infinity || result === -Infinity ? 0 : result;\n });\n};\nexport var MIN_VALUE_REG = /^dataMin[\\s]*-[\\s]*([0-9]+([.]{1}[0-9]+){0,1})$/;\nexport var MAX_VALUE_REG = /^dataMax[\\s]*\\+[\\s]*([0-9]+([.]{1}[0-9]+){0,1})$/;\nexport var parseSpecifiedDomain = function parseSpecifiedDomain(specifiedDomain, dataDomain, allowDataOverflow) {\n if (_isFunction(specifiedDomain)) {\n return specifiedDomain(dataDomain, allowDataOverflow);\n }\n if (!_isArray(specifiedDomain)) {\n return dataDomain;\n }\n var domain = [];\n /* eslint-disable prefer-destructuring */\n\n if (isNumber(specifiedDomain[0])) {\n domain[0] = allowDataOverflow ? specifiedDomain[0] : Math.min(specifiedDomain[0], dataDomain[0]);\n } else if (MIN_VALUE_REG.test(specifiedDomain[0])) {\n var value = +MIN_VALUE_REG.exec(specifiedDomain[0])[1];\n domain[0] = dataDomain[0] - value;\n } else if (_isFunction(specifiedDomain[0])) {\n domain[0] = specifiedDomain[0](dataDomain[0]);\n } else {\n domain[0] = dataDomain[0];\n }\n if (isNumber(specifiedDomain[1])) {\n domain[1] = allowDataOverflow ? specifiedDomain[1] : Math.max(specifiedDomain[1], dataDomain[1]);\n } else if (MAX_VALUE_REG.test(specifiedDomain[1])) {\n var _value = +MAX_VALUE_REG.exec(specifiedDomain[1])[1];\n domain[1] = dataDomain[1] + _value;\n } else if (_isFunction(specifiedDomain[1])) {\n domain[1] = specifiedDomain[1](dataDomain[1]);\n } else {\n domain[1] = dataDomain[1];\n }\n /* eslint-enable prefer-destructuring */\n\n return domain;\n};\n/**\n * Calculate the size between two category\n * @param {Object} axis The options of axis\n * @param {Array} ticks The ticks of axis\n * @param {Boolean} isBar if items in axis are bars\n * @return {Number} Size\n */\n\nexport var getBandSizeOfAxis = function getBandSizeOfAxis(axis, ticks, isBar) {\n if (axis && axis.scale && axis.scale.bandwidth) {\n var bandWidth = axis.scale.bandwidth();\n if (!isBar || bandWidth > 0) {\n return bandWidth;\n }\n }\n if (axis && ticks && ticks.length >= 2) {\n var orderedTicks = _sortBy(ticks, function (o) {\n return o.coordinate;\n });\n var bandSize = Infinity;\n for (var i = 1, len = orderedTicks.length; i < len; i++) {\n var cur = orderedTicks[i];\n var prev = orderedTicks[i - 1];\n bandSize = Math.min((cur.coordinate || 0) - (prev.coordinate || 0), bandSize);\n }\n return bandSize === Infinity ? 0 : bandSize;\n }\n return isBar ? undefined : 0;\n};\n/**\n * parse the domain of a category axis when a domain is specified\n * @param {Array} specifiedDomain The domain specified by users\n * @param {Array} calculatedDomain The domain calculated by dateKey\n * @param {ReactElement} axisChild The axis element\n * @returns {Array} domains\n */\n\nexport var parseDomainOfCategoryAxis = function parseDomainOfCategoryAxis(specifiedDomain, calculatedDomain, axisChild) {\n if (!specifiedDomain || !specifiedDomain.length) {\n return calculatedDomain;\n }\n if (_isEqual(specifiedDomain, _get(axisChild, 'type.defaultProps.domain'))) {\n return calculatedDomain;\n }\n return specifiedDomain;\n};\nexport var getTooltipItem = function getTooltipItem(graphicalItem, payload) {\n var _graphicalItem$props = graphicalItem.props,\n dataKey = _graphicalItem$props.dataKey,\n name = _graphicalItem$props.name,\n unit = _graphicalItem$props.unit,\n formatter = _graphicalItem$props.formatter,\n tooltipType = _graphicalItem$props.tooltipType,\n chartType = _graphicalItem$props.chartType;\n return _objectSpread(_objectSpread({}, filterProps(graphicalItem)), {}, {\n dataKey: dataKey,\n unit: unit,\n formatter: formatter,\n name: name || dataKey,\n color: getMainColorOfGraphicItem(graphicalItem),\n value: getValueByDataKey(payload, dataKey),\n type: tooltipType,\n payload: payload,\n chartType: chartType\n });\n};","import none from \"./none.js\";\nexport default function (series, order) {\n if (!((n = series.length) > 0)) return;\n for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {\n for (y = i = 0; i < n; ++i) {\n y += series[i][j][1] || 0;\n }\n if (y) for (i = 0; i < n; ++i) {\n series[i][j][1] /= y;\n }\n }\n none(series, order);\n}","import none from \"./none.js\";\nexport default function (series, order) {\n if (!((n = series.length) > 0)) return;\n for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {\n for (var i = 0, y = 0; i < n; ++i) {\n y += series[i][j][1] || 0;\n }\n s0[j][1] += s0[j][0] = -y / 2;\n }\n none(series, order);\n}","import none from \"./none.js\";\nexport default function (series, order) {\n if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;\n for (var y = 0, j = 1, s0, m, n; j < m; ++j) {\n for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {\n var si = series[order[i]],\n sij0 = si[j][1] || 0,\n sij1 = si[j - 1][1] || 0,\n s3 = (sij0 - sij1) / 2;\n for (var k = 0; k < i; ++k) {\n var sk = series[order[k]],\n skj0 = sk[j][1] || 0,\n skj1 = sk[j - 1][1] || 0;\n s3 += skj0 - skj1;\n }\n s1 += sij0, s2 += s3 * sij0;\n }\n s0[j - 1][1] += s0[j - 1][0] = y;\n if (s1) y -= s2 / s1;\n }\n s0[j - 1][1] += s0[j - 1][0] = y;\n none(series, order);\n}","function ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nvar PREFIX_LIST = ['Webkit', 'Moz', 'O', 'ms'];\nexport var generatePrefixStyle = function generatePrefixStyle(name, value) {\n if (!name) {\n return null;\n }\n var camelName = name.replace(/(\\w)/, function (v) {\n return v.toUpperCase();\n });\n var result = PREFIX_LIST.reduce(function (res, entry) {\n return _objectSpread(_objectSpread({}, res), {}, _defineProperty({}, entry + camelName, value));\n }, {});\n result[name] = value;\n return result;\n};","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nimport _isFunction from \"lodash/isFunction\";\nimport _range from \"lodash/range\";\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n}\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}\nfunction _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n return _possibleConstructorReturn(this, result);\n };\n}\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n return _assertThisInitialized(self);\n}\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}\nfunction _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\n/**\n * @fileOverview Brush\n */\nimport React, { PureComponent, Children } from 'react';\nimport classNames from 'classnames';\nimport { scalePoint } from 'd3-scale';\nimport { Layer } from '../container/Layer';\nimport { Text } from '../component/Text';\nimport { getValueByDataKey } from '../util/ChartUtils';\nimport { isNumber } from '../util/DataUtils';\nimport { generatePrefixStyle } from '../util/CssPrefixUtils';\nimport { filterProps } from '../util/types';\nvar createScale = function createScale(_ref) {\n var data = _ref.data,\n startIndex = _ref.startIndex,\n endIndex = _ref.endIndex,\n x = _ref.x,\n width = _ref.width,\n travellerWidth = _ref.travellerWidth;\n if (!data || !data.length) {\n return {};\n }\n var len = data.length;\n var scale = scalePoint().domain(_range(0, len)).range([x, x + width - travellerWidth]);\n var scaleValues = scale.domain().map(function (entry) {\n return scale(entry);\n });\n return {\n isTextActive: false,\n isSlideMoving: false,\n isTravellerMoving: false,\n startX: scale(startIndex),\n endX: scale(endIndex),\n scale: scale,\n scaleValues: scaleValues\n };\n};\nvar isTouch = function isTouch(e) {\n return e.changedTouches && !!e.changedTouches.length;\n};\nexport var Brush = /*#__PURE__*/function (_PureComponent) {\n _inherits(Brush, _PureComponent);\n var _super = _createSuper(Brush);\n function Brush(props) {\n var _this;\n _classCallCheck(this, Brush);\n _this = _super.call(this, props);\n _this.leaveTimer = void 0;\n _this.travellerDragStartHandlers = void 0;\n _this.handleDrag = function (e) {\n if (_this.leaveTimer) {\n clearTimeout(_this.leaveTimer);\n _this.leaveTimer = null;\n }\n if (_this.state.isTravellerMoving) {\n _this.handleTravellerMove(e);\n } else if (_this.state.isSlideMoving) {\n _this.handleSlideDrag(e);\n }\n };\n _this.handleTouchMove = function (e) {\n if (e.changedTouches != null && e.changedTouches.length > 0) {\n _this.handleDrag(e.changedTouches[0]);\n }\n };\n _this.handleDragEnd = function () {\n _this.setState({\n isTravellerMoving: false,\n isSlideMoving: false\n });\n _this.detachDragEndListener();\n };\n _this.handleLeaveWrapper = function () {\n if (_this.state.isTravellerMoving || _this.state.isSlideMoving) {\n _this.leaveTimer = window.setTimeout(_this.handleDragEnd, _this.props.leaveTimeOut);\n }\n };\n _this.handleEnterSlideOrTraveller = function () {\n _this.setState({\n isTextActive: true\n });\n };\n _this.handleLeaveSlideOrTraveller = function () {\n _this.setState({\n isTextActive: false\n });\n };\n _this.handleSlideDragStart = function (e) {\n var event = isTouch(e) ? e.changedTouches[0] : e;\n _this.setState({\n isTravellerMoving: false,\n isSlideMoving: true,\n slideMoveStartX: event.pageX\n });\n _this.attachDragEndListener();\n };\n _this.travellerDragStartHandlers = {\n startX: _this.handleTravellerDragStart.bind(_assertThisInitialized(_this), 'startX'),\n endX: _this.handleTravellerDragStart.bind(_assertThisInitialized(_this), 'endX')\n };\n _this.state = {};\n return _this;\n }\n _createClass(Brush, [{\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n if (this.leaveTimer) {\n clearTimeout(this.leaveTimer);\n this.leaveTimer = null;\n }\n this.detachDragEndListener();\n }\n }, {\n key: \"getIndex\",\n value: function getIndex(_ref2) {\n var startX = _ref2.startX,\n endX = _ref2.endX;\n var scaleValues = this.state.scaleValues;\n var _this$props = this.props,\n gap = _this$props.gap,\n data = _this$props.data;\n var lastIndex = data.length - 1;\n var min = Math.min(startX, endX);\n var max = Math.max(startX, endX);\n var minIndex = Brush.getIndexInRange(scaleValues, min);\n var maxIndex = Brush.getIndexInRange(scaleValues, max);\n return {\n startIndex: minIndex - minIndex % gap,\n endIndex: maxIndex === lastIndex ? lastIndex : maxIndex - maxIndex % gap\n };\n }\n }, {\n key: \"getTextOfTick\",\n value: function getTextOfTick(index) {\n var _this$props2 = this.props,\n data = _this$props2.data,\n tickFormatter = _this$props2.tickFormatter,\n dataKey = _this$props2.dataKey;\n var text = getValueByDataKey(data[index], dataKey, index);\n return _isFunction(tickFormatter) ? tickFormatter(text, index) : text;\n }\n }, {\n key: \"attachDragEndListener\",\n value: function attachDragEndListener() {\n window.addEventListener('mouseup', this.handleDragEnd, true);\n window.addEventListener('touchend', this.handleDragEnd, true);\n }\n }, {\n key: \"detachDragEndListener\",\n value: function detachDragEndListener() {\n window.removeEventListener('mouseup', this.handleDragEnd, true);\n window.removeEventListener('touchend', this.handleDragEnd, true);\n }\n }, {\n key: \"handleSlideDrag\",\n value: function handleSlideDrag(e) {\n var _this$state = this.state,\n slideMoveStartX = _this$state.slideMoveStartX,\n startX = _this$state.startX,\n endX = _this$state.endX;\n var _this$props3 = this.props,\n x = _this$props3.x,\n width = _this$props3.width,\n travellerWidth = _this$props3.travellerWidth,\n startIndex = _this$props3.startIndex,\n endIndex = _this$props3.endIndex,\n onChange = _this$props3.onChange;\n var delta = e.pageX - slideMoveStartX;\n if (delta > 0) {\n delta = Math.min(delta, x + width - travellerWidth - endX, x + width - travellerWidth - startX);\n } else if (delta < 0) {\n delta = Math.max(delta, x - startX, x - endX);\n }\n var newIndex = this.getIndex({\n startX: startX + delta,\n endX: endX + delta\n });\n if ((newIndex.startIndex !== startIndex || newIndex.endIndex !== endIndex) && onChange) {\n onChange(newIndex);\n }\n this.setState({\n startX: startX + delta,\n endX: endX + delta,\n slideMoveStartX: e.pageX\n });\n }\n }, {\n key: \"handleTravellerDragStart\",\n value: function handleTravellerDragStart(id, e) {\n var event = isTouch(e) ? e.changedTouches[0] : e;\n this.setState({\n isSlideMoving: false,\n isTravellerMoving: true,\n movingTravellerId: id,\n brushMoveStartX: event.pageX\n });\n this.attachDragEndListener();\n }\n }, {\n key: \"handleTravellerMove\",\n value: function handleTravellerMove(e) {\n var _this$setState;\n var _this$state2 = this.state,\n brushMoveStartX = _this$state2.brushMoveStartX,\n movingTravellerId = _this$state2.movingTravellerId,\n endX = _this$state2.endX,\n startX = _this$state2.startX;\n var prevValue = this.state[movingTravellerId];\n var _this$props4 = this.props,\n x = _this$props4.x,\n width = _this$props4.width,\n travellerWidth = _this$props4.travellerWidth,\n onChange = _this$props4.onChange,\n gap = _this$props4.gap,\n data = _this$props4.data;\n var params = {\n startX: this.state.startX,\n endX: this.state.endX\n };\n var delta = e.pageX - brushMoveStartX;\n if (delta > 0) {\n delta = Math.min(delta, x + width - travellerWidth - prevValue);\n } else if (delta < 0) {\n delta = Math.max(delta, x - prevValue);\n }\n params[movingTravellerId] = prevValue + delta;\n var newIndex = this.getIndex(params);\n var startIndex = newIndex.startIndex,\n endIndex = newIndex.endIndex;\n var isFullGap = function isFullGap() {\n var lastIndex = data.length - 1;\n if (movingTravellerId === 'startX' && (endX > startX ? startIndex % gap === 0 : endIndex % gap === 0) || endX < startX && endIndex === lastIndex || movingTravellerId === 'endX' && (endX > startX ? endIndex % gap === 0 : startIndex % gap === 0) || endX > startX && endIndex === lastIndex) {\n return true;\n }\n return false;\n };\n this.setState((_this$setState = {}, _defineProperty(_this$setState, movingTravellerId, prevValue + delta), _defineProperty(_this$setState, \"brushMoveStartX\", e.pageX), _this$setState), function () {\n if (onChange) {\n if (isFullGap()) {\n onChange(newIndex);\n }\n }\n });\n }\n }, {\n key: \"renderBackground\",\n value: function renderBackground() {\n var _this$props5 = this.props,\n x = _this$props5.x,\n y = _this$props5.y,\n width = _this$props5.width,\n height = _this$props5.height,\n fill = _this$props5.fill,\n stroke = _this$props5.stroke;\n return /*#__PURE__*/React.createElement(\"rect\", {\n stroke: stroke,\n fill: fill,\n x: x,\n y: y,\n width: width,\n height: height\n });\n }\n }, {\n key: \"renderPanorama\",\n value: function renderPanorama() {\n var _this$props6 = this.props,\n x = _this$props6.x,\n y = _this$props6.y,\n width = _this$props6.width,\n height = _this$props6.height,\n data = _this$props6.data,\n children = _this$props6.children,\n padding = _this$props6.padding;\n var chartElement = Children.only(children);\n if (!chartElement) {\n return null;\n }\n return /*#__PURE__*/React.cloneElement(chartElement, {\n x: x,\n y: y,\n width: width,\n height: height,\n margin: padding,\n compact: true,\n data: data\n });\n }\n }, {\n key: \"renderTravellerLayer\",\n value: function renderTravellerLayer(travellerX, id) {\n var _this$props7 = this.props,\n y = _this$props7.y,\n travellerWidth = _this$props7.travellerWidth,\n height = _this$props7.height,\n traveller = _this$props7.traveller;\n var x = Math.max(travellerX, this.props.x);\n var travellerProps = _objectSpread(_objectSpread({}, filterProps(this.props)), {}, {\n x: x,\n y: y,\n width: travellerWidth,\n height: height\n });\n return /*#__PURE__*/React.createElement(Layer, {\n className: \"recharts-brush-traveller\",\n onMouseEnter: this.handleEnterSlideOrTraveller,\n onMouseLeave: this.handleLeaveSlideOrTraveller,\n onMouseDown: this.travellerDragStartHandlers[id],\n onTouchStart: this.travellerDragStartHandlers[id],\n style: {\n cursor: 'col-resize'\n }\n }, Brush.renderTraveller(traveller, travellerProps));\n }\n }, {\n key: \"renderSlide\",\n value: function renderSlide(startX, endX) {\n var _this$props8 = this.props,\n y = _this$props8.y,\n height = _this$props8.height,\n stroke = _this$props8.stroke,\n travellerWidth = _this$props8.travellerWidth;\n var x = Math.min(startX, endX) + travellerWidth;\n var width = Math.max(Math.abs(endX - startX) - travellerWidth, 0);\n return /*#__PURE__*/React.createElement(\"rect\", {\n className: \"recharts-brush-slide\",\n onMouseEnter: this.handleEnterSlideOrTraveller,\n onMouseLeave: this.handleLeaveSlideOrTraveller,\n onMouseDown: this.handleSlideDragStart,\n onTouchStart: this.handleSlideDragStart,\n style: {\n cursor: 'move'\n },\n stroke: \"none\",\n fill: stroke,\n fillOpacity: 0.2,\n x: x,\n y: y,\n width: width,\n height: height\n });\n }\n }, {\n key: \"renderText\",\n value: function renderText() {\n var _this$props9 = this.props,\n startIndex = _this$props9.startIndex,\n endIndex = _this$props9.endIndex,\n y = _this$props9.y,\n height = _this$props9.height,\n travellerWidth = _this$props9.travellerWidth,\n stroke = _this$props9.stroke;\n var _this$state3 = this.state,\n startX = _this$state3.startX,\n endX = _this$state3.endX;\n var offset = 5;\n var attrs = {\n pointerEvents: 'none',\n fill: stroke\n };\n return /*#__PURE__*/React.createElement(Layer, {\n className: \"recharts-brush-texts\"\n }, /*#__PURE__*/React.createElement(Text, _extends({\n textAnchor: \"end\",\n verticalAnchor: \"middle\",\n x: Math.min(startX, endX) - offset,\n y: y + height / 2\n }, attrs), this.getTextOfTick(startIndex)), /*#__PURE__*/React.createElement(Text, _extends({\n textAnchor: \"start\",\n verticalAnchor: \"middle\",\n x: Math.max(startX, endX) + travellerWidth + offset,\n y: y + height / 2\n }, attrs), this.getTextOfTick(endIndex)));\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props10 = this.props,\n data = _this$props10.data,\n className = _this$props10.className,\n children = _this$props10.children,\n x = _this$props10.x,\n y = _this$props10.y,\n width = _this$props10.width,\n height = _this$props10.height,\n alwaysShowText = _this$props10.alwaysShowText;\n var _this$state4 = this.state,\n startX = _this$state4.startX,\n endX = _this$state4.endX,\n isTextActive = _this$state4.isTextActive,\n isSlideMoving = _this$state4.isSlideMoving,\n isTravellerMoving = _this$state4.isTravellerMoving;\n if (!data || !data.length || !isNumber(x) || !isNumber(y) || !isNumber(width) || !isNumber(height) || width <= 0 || height <= 0) {\n return null;\n }\n var layerClass = classNames('recharts-brush', className);\n var isPanoramic = React.Children.count(children) === 1;\n var style = generatePrefixStyle('userSelect', 'none');\n return /*#__PURE__*/React.createElement(Layer, {\n className: layerClass,\n onMouseMove: this.handleDrag,\n onMouseLeave: this.handleLeaveWrapper,\n onTouchMove: this.handleTouchMove,\n style: style\n }, this.renderBackground(), isPanoramic && this.renderPanorama(), this.renderSlide(startX, endX), this.renderTravellerLayer(startX, 'startX'), this.renderTravellerLayer(endX, 'endX'), (isTextActive || isSlideMoving || isTravellerMoving || alwaysShowText) && this.renderText());\n }\n }], [{\n key: \"renderDefaultTraveller\",\n value: function renderDefaultTraveller(props) {\n var x = props.x,\n y = props.y,\n width = props.width,\n height = props.height,\n stroke = props.stroke;\n var lineY = Math.floor(y + height / 2) - 1;\n return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(\"rect\", {\n x: x,\n y: y,\n width: width,\n height: height,\n fill: stroke,\n stroke: \"none\"\n }), /*#__PURE__*/React.createElement(\"line\", {\n x1: x + 1,\n y1: lineY,\n x2: x + width - 1,\n y2: lineY,\n fill: \"none\",\n stroke: \"#fff\"\n }), /*#__PURE__*/React.createElement(\"line\", {\n x1: x + 1,\n y1: lineY + 2,\n x2: x + width - 1,\n y2: lineY + 2,\n fill: \"none\",\n stroke: \"#fff\"\n }));\n }\n }, {\n key: \"renderTraveller\",\n value: function renderTraveller(option, props) {\n var rectangle;\n if ( /*#__PURE__*/React.isValidElement(option)) {\n rectangle = /*#__PURE__*/React.cloneElement(option, props);\n } else if (_isFunction(option)) {\n rectangle = option(props);\n } else {\n rectangle = Brush.renderDefaultTraveller(props);\n }\n return rectangle;\n }\n }, {\n key: \"getDerivedStateFromProps\",\n value: function getDerivedStateFromProps(nextProps, prevState) {\n var data = nextProps.data,\n width = nextProps.width,\n x = nextProps.x,\n travellerWidth = nextProps.travellerWidth,\n updateId = nextProps.updateId,\n startIndex = nextProps.startIndex,\n endIndex = nextProps.endIndex;\n if (data !== prevState.prevData || updateId !== prevState.prevUpdateId) {\n return _objectSpread({\n prevData: data,\n prevTravellerWidth: travellerWidth,\n prevUpdateId: updateId,\n prevX: x,\n prevWidth: width\n }, data && data.length ? createScale({\n data: data,\n width: width,\n x: x,\n travellerWidth: travellerWidth,\n startIndex: startIndex,\n endIndex: endIndex\n }) : {\n scale: null,\n scaleValues: null\n });\n }\n if (prevState.scale && (width !== prevState.prevWidth || x !== prevState.prevX || travellerWidth !== prevState.prevTravellerWidth)) {\n prevState.scale.range([x, x + width - travellerWidth]);\n var scaleValues = prevState.scale.domain().map(function (entry) {\n return prevState.scale(entry);\n });\n return {\n prevData: data,\n prevTravellerWidth: travellerWidth,\n prevUpdateId: updateId,\n prevX: x,\n prevWidth: width,\n startX: prevState.scale(nextProps.startIndex),\n endX: prevState.scale(nextProps.endIndex),\n scaleValues: scaleValues\n };\n }\n return null;\n }\n }, {\n key: \"getIndexInRange\",\n value: function getIndexInRange(range, x) {\n var len = range.length;\n var start = 0;\n var end = len - 1;\n while (end - start > 1) {\n var middle = Math.floor((start + end) / 2);\n if (range[middle] > x) {\n end = middle;\n } else {\n start = middle;\n }\n }\n return x >= range[end] ? end : start;\n }\n }]);\n return Brush;\n}(PureComponent);\nBrush.displayName = 'Brush';\nBrush.defaultProps = {\n height: 40,\n travellerWidth: 5,\n gap: 1,\n fill: '#fff',\n stroke: '#666',\n padding: {\n top: 1,\n right: 1,\n bottom: 1,\n left: 1\n },\n leaveTimeOut: 1000,\n alwaysShowText: false\n};","export var ifOverflowMatches = function ifOverflowMatches(props, value) {\n var alwaysShow = props.alwaysShow;\n var ifOverflow = props.ifOverflow;\n if (alwaysShow) {\n ifOverflow = 'extendDomain';\n }\n return ifOverflow === value;\n};","import _every from \"lodash/every\";\nimport _mapValues from \"lodash/mapValues\";\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nimport { getTicksOfScale, parseScale, checkDomainOfScale, getBandSizeOfAxis } from './ChartUtils';\nimport { findChildByType } from './ReactUtils';\nimport { getPercentValue } from './DataUtils';\n/**\n * Calculate the scale function, position, width, height of axes\n * @param {Object} props Latest props\n * @param {Object} axisMap The configuration of axes\n * @param {Object} offset The offset of main part in the svg element\n * @param {String} axisType The type of axes, x-axis or y-axis\n * @param {String} chartName The name of chart\n * @return {Object} Configuration\n */\n\nexport var formatAxisMap = function formatAxisMap(props, axisMap, offset, axisType, chartName) {\n var width = props.width,\n height = props.height,\n layout = props.layout,\n children = props.children;\n var ids = Object.keys(axisMap);\n var steps = {\n left: offset.left,\n leftMirror: offset.left,\n right: width - offset.right,\n rightMirror: width - offset.right,\n top: offset.top,\n topMirror: offset.top,\n bottom: height - offset.bottom,\n bottomMirror: height - offset.bottom\n };\n var hasBar = !!findChildByType(children, 'Bar');\n return ids.reduce(function (result, id) {\n var axis = axisMap[id];\n var orientation = axis.orientation,\n domain = axis.domain,\n _axis$padding = axis.padding,\n padding = _axis$padding === void 0 ? {} : _axis$padding,\n mirror = axis.mirror,\n reversed = axis.reversed;\n var offsetKey = \"\".concat(orientation).concat(mirror ? 'Mirror' : '');\n var calculatedPadding, range, x, y, needSpace;\n if (axis.type === 'number' && (axis.padding === 'gap' || axis.padding === 'no-gap')) {\n var diff = domain[1] - domain[0];\n var smallestDistanceBetweenValues = Infinity;\n var sortedValues = axis.categoricalDomain.sort();\n sortedValues.forEach(function (value, index) {\n if (index > 0) {\n smallestDistanceBetweenValues = Math.min((value || 0) - (sortedValues[index - 1] || 0), smallestDistanceBetweenValues);\n }\n });\n var smallestDistanceInPercent = smallestDistanceBetweenValues / diff;\n var rangeWidth = axis.layout === 'vertical' ? offset.height : offset.width;\n if (axis.padding === 'gap') {\n calculatedPadding = smallestDistanceInPercent * rangeWidth / 2;\n }\n if (axis.padding === 'no-gap') {\n var gap = getPercentValue(props.barCategoryGap, smallestDistanceInPercent * rangeWidth);\n var halfBand = smallestDistanceInPercent * rangeWidth / 2;\n calculatedPadding = halfBand - gap - (halfBand - gap) / rangeWidth * gap;\n }\n }\n if (axisType === 'xAxis') {\n range = [offset.left + (padding.left || 0) + (calculatedPadding || 0), offset.left + offset.width - (padding.right || 0) - (calculatedPadding || 0)];\n } else if (axisType === 'yAxis') {\n range = layout === 'horizontal' ? [offset.top + offset.height - (padding.bottom || 0), offset.top + (padding.top || 0)] : [offset.top + (padding.top || 0) + (calculatedPadding || 0), offset.top + offset.height - (padding.bottom || 0) - (calculatedPadding || 0)];\n } else {\n range = axis.range;\n }\n if (reversed) {\n range = [range[1], range[0]];\n }\n var _parseScale = parseScale(axis, chartName, hasBar),\n scale = _parseScale.scale,\n realScaleType = _parseScale.realScaleType;\n scale.domain(domain).range(range);\n checkDomainOfScale(scale);\n var ticks = getTicksOfScale(scale, _objectSpread(_objectSpread({}, axis), {}, {\n realScaleType: realScaleType\n }));\n if (axisType === 'xAxis') {\n needSpace = orientation === 'top' && !mirror || orientation === 'bottom' && mirror;\n x = offset.left;\n y = steps[offsetKey] - needSpace * axis.height;\n } else if (axisType === 'yAxis') {\n needSpace = orientation === 'left' && !mirror || orientation === 'right' && mirror;\n x = steps[offsetKey] - needSpace * axis.width;\n y = offset.top;\n }\n var finalAxis = _objectSpread(_objectSpread(_objectSpread({}, axis), ticks), {}, {\n realScaleType: realScaleType,\n x: x,\n y: y,\n scale: scale,\n width: axisType === 'xAxis' ? offset.width : axis.width,\n height: axisType === 'yAxis' ? offset.height : axis.height\n });\n finalAxis.bandSize = getBandSizeOfAxis(finalAxis, ticks);\n if (!axis.hide && axisType === 'xAxis') {\n steps[offsetKey] += (needSpace ? -1 : 1) * finalAxis.height;\n } else if (!axis.hide) {\n steps[offsetKey] += (needSpace ? -1 : 1) * finalAxis.width;\n }\n return _objectSpread(_objectSpread({}, result), {}, _defineProperty({}, id, finalAxis));\n }, {});\n};\nexport var rectWithPoints = function rectWithPoints(_ref, _ref2) {\n var x1 = _ref.x,\n y1 = _ref.y;\n var x2 = _ref2.x,\n y2 = _ref2.y;\n return {\n x: Math.min(x1, x2),\n y: Math.min(y1, y2),\n width: Math.abs(x2 - x1),\n height: Math.abs(y2 - y1)\n };\n};\n/**\n * Compute the x, y, width, and height of a box from two reference points.\n * @param {Object} coords x1, x2, y1, and y2\n * @return {Object} object\n */\n\nexport var rectWithCoords = function rectWithCoords(_ref3) {\n var x1 = _ref3.x1,\n y1 = _ref3.y1,\n x2 = _ref3.x2,\n y2 = _ref3.y2;\n return rectWithPoints({\n x: x1,\n y: y1\n }, {\n x: x2,\n y: y2\n });\n};\nexport var ScaleHelper = /*#__PURE__*/function () {\n function ScaleHelper(scale) {\n _classCallCheck(this, ScaleHelper);\n this.scale = void 0;\n this.scale = scale;\n }\n _createClass(ScaleHelper, [{\n key: \"domain\",\n get: function get() {\n return this.scale.domain;\n }\n }, {\n key: \"range\",\n get: function get() {\n return this.scale.range;\n }\n }, {\n key: \"rangeMin\",\n get: function get() {\n return this.range()[0];\n }\n }, {\n key: \"rangeMax\",\n get: function get() {\n return this.range()[1];\n }\n }, {\n key: \"bandwidth\",\n get: function get() {\n return this.scale.bandwidth;\n }\n }, {\n key: \"apply\",\n value: function apply(value) {\n var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n bandAware = _ref4.bandAware,\n position = _ref4.position;\n if (value === undefined) {\n return undefined;\n }\n if (position) {\n switch (position) {\n case 'start':\n {\n return this.scale(value);\n }\n case 'middle':\n {\n var offset = this.bandwidth ? this.bandwidth() / 2 : 0;\n return this.scale(value) + offset;\n }\n case 'end':\n {\n var _offset = this.bandwidth ? this.bandwidth() : 0;\n return this.scale(value) + _offset;\n }\n default:\n {\n return this.scale(value);\n }\n }\n }\n if (bandAware) {\n var _offset2 = this.bandwidth ? this.bandwidth() / 2 : 0;\n return this.scale(value) + _offset2;\n }\n return this.scale(value);\n }\n }, {\n key: \"isInRange\",\n value: function isInRange(value) {\n var range = this.range();\n var first = range[0];\n var last = range[range.length - 1];\n return first <= last ? value >= first && value <= last : value >= last && value <= first;\n }\n }], [{\n key: \"create\",\n value: function create(obj) {\n return new ScaleHelper(obj);\n }\n }]);\n return ScaleHelper;\n}();\nScaleHelper.EPS = 1e-4;\nexport var createLabeledScales = function createLabeledScales(options) {\n var scales = Object.keys(options).reduce(function (res, key) {\n return _objectSpread(_objectSpread({}, res), {}, _defineProperty({}, key, ScaleHelper.create(options[key])));\n }, {});\n return _objectSpread(_objectSpread({}, scales), {}, {\n apply: function apply(coord) {\n var _ref5 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n bandAware = _ref5.bandAware,\n position = _ref5.position;\n return _mapValues(coord, function (value, label) {\n return scales[label].apply(value, {\n bandAware: bandAware,\n position: position\n });\n });\n },\n isInRange: function isInRange(coord) {\n return _every(coord, function (value, label) {\n return scales[label].isInRange(value);\n });\n }\n });\n};","/* eslint no-console: 0 */\nvar isDev = process.env.NODE_ENV !== 'production';\nexport var warn = function warn(condition, format) {\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n if (isDev && typeof console !== 'undefined' && console.warn) {\n if (format === undefined) {\n console.warn('LogUtils requires an error message argument');\n }\n if (!condition) {\n if (format === undefined) {\n console.warn('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');\n } else {\n var argIndex = 0;\n console.warn(format.replace(/%s/g, function () {\n return args[argIndex++];\n }));\n }\n }\n }\n};","import _isFunction from \"lodash/isFunction\";\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\n\n/**\n * @fileOverview Reference Dot\n */\nimport React from 'react';\nimport classNames from 'classnames';\nimport { Layer } from '../container/Layer';\nimport { Dot } from '../shape/Dot';\nimport { Label } from '../component/Label';\nimport { isNumOrStr } from '../util/DataUtils';\nimport { ifOverflowMatches } from '../util/IfOverflowMatches';\nimport { createLabeledScales } from '../util/CartesianUtils';\nimport { warn } from '../util/LogUtils';\nimport { filterProps } from '../util/types';\nvar getCoordinate = function getCoordinate(props) {\n var x = props.x,\n y = props.y,\n xAxis = props.xAxis,\n yAxis = props.yAxis;\n var scales = createLabeledScales({\n x: xAxis.scale,\n y: yAxis.scale\n });\n var result = scales.apply({\n x: x,\n y: y\n }, {\n bandAware: true\n });\n if (ifOverflowMatches(props, 'discard') && !scales.isInRange(result)) {\n return null;\n }\n return result;\n};\nexport function ReferenceDot(props) {\n var x = props.x,\n y = props.y,\n r = props.r,\n alwaysShow = props.alwaysShow,\n clipPathId = props.clipPathId;\n var isX = isNumOrStr(x);\n var isY = isNumOrStr(y);\n warn(alwaysShow === undefined, 'The alwaysShow prop is deprecated. Please use ifOverflow=\"extendDomain\" instead.');\n if (!isX || !isY) {\n return null;\n }\n var coordinate = getCoordinate(props);\n if (!coordinate) {\n return null;\n }\n var cx = coordinate.x,\n cy = coordinate.y;\n var shape = props.shape,\n className = props.className;\n var clipPath = ifOverflowMatches(props, 'hidden') ? \"url(#\".concat(clipPathId, \")\") : undefined;\n var dotProps = _objectSpread(_objectSpread({\n clipPath: clipPath\n }, filterProps(props, true)), {}, {\n cx: cx,\n cy: cy\n });\n return /*#__PURE__*/React.createElement(Layer, {\n className: classNames('recharts-reference-dot', className)\n }, ReferenceDot.renderDot(shape, dotProps), Label.renderCallByParent(props, {\n x: cx - r,\n y: cy - r,\n width: 2 * r,\n height: 2 * r\n }));\n}\nReferenceDot.displayName = 'ReferenceDot';\nReferenceDot.defaultProps = {\n isFront: false,\n ifOverflow: 'discard',\n xAxisId: 0,\n yAxisId: 0,\n r: 10,\n fill: '#fff',\n stroke: '#ccc',\n fillOpacity: 1,\n strokeWidth: 1\n};\nReferenceDot.renderDot = function (option, props) {\n var dot;\n if ( /*#__PURE__*/React.isValidElement(option)) {\n dot = /*#__PURE__*/React.cloneElement(option, props);\n } else if (_isFunction(option)) {\n dot = option(props);\n } else {\n dot = /*#__PURE__*/React.createElement(Dot, _extends({}, props, {\n cx: props.cx,\n cy: props.cy,\n className: \"recharts-reference-dot-dot\"\n }));\n }\n return dot;\n};","import _some from \"lodash/some\";\nimport _isFunction from \"lodash/isFunction\";\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n}\nfunction _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n return _arr;\n}\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\n\n/**\n * @fileOverview Reference Line\n */\nimport React from 'react';\nimport classNames from 'classnames';\nimport { Layer } from '../container/Layer';\nimport { Label } from '../component/Label';\nimport { ifOverflowMatches } from '../util/IfOverflowMatches';\nimport { isNumOrStr } from '../util/DataUtils';\nimport { createLabeledScales, rectWithCoords } from '../util/CartesianUtils';\nimport { warn } from '../util/LogUtils';\nimport { filterProps } from '../util/types';\nvar renderLine = function renderLine(option, props) {\n var line;\n if ( /*#__PURE__*/React.isValidElement(option)) {\n line = /*#__PURE__*/React.cloneElement(option, props);\n } else if (_isFunction(option)) {\n line = option(props);\n } else {\n line = /*#__PURE__*/React.createElement(\"line\", _extends({}, props, {\n className: \"recharts-reference-line-line\"\n }));\n }\n return line;\n}; // TODO: ScaleHelper\n\nvar getEndPoints = function getEndPoints(scales, isFixedX, isFixedY, isSegment, props) {\n var _props$viewBox = props.viewBox,\n x = _props$viewBox.x,\n y = _props$viewBox.y,\n width = _props$viewBox.width,\n height = _props$viewBox.height,\n position = props.position;\n if (isFixedY) {\n var yCoord = props.y,\n orientation = props.yAxis.orientation;\n var coord = scales.y.apply(yCoord, {\n position: position\n });\n if (ifOverflowMatches(props, 'discard') && !scales.y.isInRange(coord)) {\n return null;\n }\n var points = [{\n x: x + width,\n y: coord\n }, {\n x: x,\n y: coord\n }];\n return orientation === 'left' ? points.reverse() : points;\n }\n if (isFixedX) {\n var xCoord = props.x,\n _orientation = props.xAxis.orientation;\n var _coord = scales.x.apply(xCoord, {\n position: position\n });\n if (ifOverflowMatches(props, 'discard') && !scales.x.isInRange(_coord)) {\n return null;\n }\n var _points = [{\n x: _coord,\n y: y + height\n }, {\n x: _coord,\n y: y\n }];\n return _orientation === 'top' ? _points.reverse() : _points;\n }\n if (isSegment) {\n var segment = props.segment;\n var _points2 = segment.map(function (p) {\n return scales.apply(p, {\n position: position\n });\n });\n if (ifOverflowMatches(props, 'discard') && _some(_points2, function (p) {\n return !scales.isInRange(p);\n })) {\n return null;\n }\n return _points2;\n }\n return null;\n};\nexport function ReferenceLine(props) {\n var fixedX = props.x,\n fixedY = props.y,\n segment = props.segment,\n xAxis = props.xAxis,\n yAxis = props.yAxis,\n shape = props.shape,\n className = props.className,\n alwaysShow = props.alwaysShow,\n clipPathId = props.clipPathId;\n warn(alwaysShow === undefined, 'The alwaysShow prop is deprecated. Please use ifOverflow=\"extendDomain\" instead.');\n var scales = createLabeledScales({\n x: xAxis.scale,\n y: yAxis.scale\n });\n var isX = isNumOrStr(fixedX);\n var isY = isNumOrStr(fixedY);\n var isSegment = segment && segment.length === 2;\n var endPoints = getEndPoints(scales, isX, isY, isSegment, props);\n if (!endPoints) {\n return null;\n }\n var _endPoints = _slicedToArray(endPoints, 2),\n _endPoints$ = _endPoints[0],\n x1 = _endPoints$.x,\n y1 = _endPoints$.y,\n _endPoints$2 = _endPoints[1],\n x2 = _endPoints$2.x,\n y2 = _endPoints$2.y;\n var clipPath = ifOverflowMatches(props, 'hidden') ? \"url(#\".concat(clipPathId, \")\") : undefined;\n var lineProps = _objectSpread(_objectSpread({\n clipPath: clipPath\n }, filterProps(props, true)), {}, {\n x1: x1,\n y1: y1,\n x2: x2,\n y2: y2\n });\n return /*#__PURE__*/React.createElement(Layer, {\n className: classNames('recharts-reference-line', className)\n }, renderLine(shape, lineProps), Label.renderCallByParent(props, rectWithCoords({\n x1: x1,\n y1: y1,\n x2: x2,\n y2: y2\n })));\n}\nReferenceLine.displayName = 'ReferenceLine';\nReferenceLine.defaultProps = {\n isFront: false,\n ifOverflow: 'discard',\n xAxisId: 0,\n yAxisId: 0,\n fill: 'none',\n stroke: '#ccc',\n fillOpacity: 1,\n strokeWidth: 1,\n position: 'middle'\n};","import _isFunction from \"lodash/isFunction\";\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\n\n/**\n * @fileOverview Reference Line\n */\nimport React from 'react';\nimport classNames from 'classnames';\nimport { Layer } from '../container/Layer';\nimport { Label } from '../component/Label';\nimport { createLabeledScales, rectWithPoints } from '../util/CartesianUtils';\nimport { ifOverflowMatches } from '../util/IfOverflowMatches';\nimport { isNumOrStr } from '../util/DataUtils';\nimport { warn } from '../util/LogUtils';\nimport { Rectangle } from '../shape/Rectangle';\nimport { filterProps } from '../util/types';\nvar getRect = function getRect(hasX1, hasX2, hasY1, hasY2, props) {\n var xValue1 = props.x1,\n xValue2 = props.x2,\n yValue1 = props.y1,\n yValue2 = props.y2,\n xAxis = props.xAxis,\n yAxis = props.yAxis;\n if (!xAxis || !yAxis) return null;\n var scales = createLabeledScales({\n x: xAxis.scale,\n y: yAxis.scale\n });\n var p1 = {\n x: hasX1 ? scales.x.apply(xValue1, {\n position: 'start'\n }) : scales.x.rangeMin,\n y: hasY1 ? scales.y.apply(yValue1, {\n position: 'start'\n }) : scales.y.rangeMin\n };\n var p2 = {\n x: hasX2 ? scales.x.apply(xValue2, {\n position: 'end'\n }) : scales.x.rangeMax,\n y: hasY2 ? scales.y.apply(yValue2, {\n position: 'end'\n }) : scales.y.rangeMax\n };\n if (ifOverflowMatches(props, 'discard') && (!scales.isInRange(p1) || !scales.isInRange(p2))) {\n return null;\n }\n return rectWithPoints(p1, p2);\n};\nexport function ReferenceArea(props) {\n var x1 = props.x1,\n x2 = props.x2,\n y1 = props.y1,\n y2 = props.y2,\n className = props.className,\n alwaysShow = props.alwaysShow,\n clipPathId = props.clipPathId;\n warn(alwaysShow === undefined, 'The alwaysShow prop is deprecated. Please use ifOverflow=\"extendDomain\" instead.');\n var hasX1 = isNumOrStr(x1);\n var hasX2 = isNumOrStr(x2);\n var hasY1 = isNumOrStr(y1);\n var hasY2 = isNumOrStr(y2);\n var shape = props.shape;\n if (!hasX1 && !hasX2 && !hasY1 && !hasY2 && !shape) {\n return null;\n }\n var rect = getRect(hasX1, hasX2, hasY1, hasY2, props);\n if (!rect && !shape) {\n return null;\n }\n var clipPath = ifOverflowMatches(props, 'hidden') ? \"url(#\".concat(clipPathId, \")\") : undefined;\n return /*#__PURE__*/React.createElement(Layer, {\n className: classNames('recharts-reference-area', className)\n }, ReferenceArea.renderRect(shape, _objectSpread(_objectSpread({\n clipPath: clipPath\n }, filterProps(props, true)), rect)), Label.renderCallByParent(props, rect));\n}\nReferenceArea.displayName = 'ReferenceArea';\nReferenceArea.defaultProps = {\n isFront: false,\n ifOverflow: 'discard',\n xAxisId: 0,\n yAxisId: 0,\n r: 10,\n fill: '#ccc',\n fillOpacity: 0.5,\n stroke: 'none',\n strokeWidth: 1\n};\nReferenceArea.renderRect = function (option, props) {\n var rect;\n if ( /*#__PURE__*/React.isValidElement(option)) {\n rect = /*#__PURE__*/React.cloneElement(option, props);\n } else if (_isFunction(option)) {\n rect = option(props);\n } else {\n rect = /*#__PURE__*/React.createElement(Rectangle, _extends({}, props, {\n className: \"recharts-reference-area-rect\"\n }));\n }\n return rect;\n};","import { ReferenceDot } from '../cartesian/ReferenceDot';\nimport { ReferenceLine } from '../cartesian/ReferenceLine';\nimport { ReferenceArea } from '../cartesian/ReferenceArea';\nimport { ifOverflowMatches } from './IfOverflowMatches';\nimport { findAllByType } from './ReactUtils';\nimport { isNumber } from './DataUtils';\nexport var detectReferenceElementsDomain = function detectReferenceElementsDomain(children, domain, axisId, axisType, specifiedTicks) {\n var lines = findAllByType(children, ReferenceLine.displayName);\n var dots = findAllByType(children, ReferenceDot.displayName);\n var elements = lines.concat(dots);\n var areas = findAllByType(children, ReferenceArea.displayName);\n var idKey = \"\".concat(axisType, \"Id\");\n var valueKey = axisType[0];\n var finalDomain = domain;\n if (elements.length) {\n finalDomain = elements.reduce(function (result, el) {\n if (el.props[idKey] === axisId && ifOverflowMatches(el.props, 'extendDomain') && isNumber(el.props[valueKey])) {\n var value = el.props[valueKey];\n return [Math.min(result[0], value), Math.max(result[1], value)];\n }\n return result;\n }, finalDomain);\n }\n if (areas.length) {\n var key1 = \"\".concat(valueKey, \"1\");\n var key2 = \"\".concat(valueKey, \"2\");\n finalDomain = areas.reduce(function (result, el) {\n if (el.props[idKey] === axisId && ifOverflowMatches(el.props, 'extendDomain') && isNumber(el.props[key1]) && isNumber(el.props[key2])) {\n var value1 = el.props[key1];\n var value2 = el.props[key2];\n return [Math.min(result[0], value1, value2), Math.max(result[1], value1, value2)];\n }\n return result;\n }, finalDomain);\n }\n if (specifiedTicks && specifiedTicks.length) {\n finalDomain = specifiedTicks.reduce(function (result, tick) {\n if (isNumber(tick)) {\n return [Math.min(result[0], tick), Math.max(result[1], tick)];\n }\n return result;\n }, finalDomain);\n }\n return finalDomain;\n};","import EventEmitter from 'eventemitter3';\nvar eventCenter = new EventEmitter();\nif (eventCenter.setMaxListeners) {\n eventCenter.setMaxListeners(10);\n}\nexport { eventCenter };\nexport var SYNC_EVENT = 'recharts.syncMouseEvents'; // eslint-disable-next-line no-redeclare","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nimport _every from \"lodash/every\";\nimport _find from \"lodash/find\";\nimport _isFunction from \"lodash/isFunction\";\nimport _throttle from \"lodash/throttle\";\nimport _sortBy from \"lodash/sortBy\";\nimport _get from \"lodash/get\";\nimport _range from \"lodash/range\";\nimport _isNil from \"lodash/isNil\";\nimport _isBoolean from \"lodash/isBoolean\";\nimport _isArray from \"lodash/isArray\";\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n return _arr;\n}\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n}\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}\nfunction _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n return _possibleConstructorReturn(this, result);\n };\n}\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n return _assertThisInitialized(self);\n}\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}\nfunction _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nimport React, { Component, cloneElement, isValidElement, createElement } from 'react';\nimport classNames from 'classnames';\nimport { Surface } from '../container/Surface';\nimport { Layer } from '../container/Layer';\nimport { Tooltip } from '../component/Tooltip';\nimport { Legend } from '../component/Legend';\nimport { Curve } from '../shape/Curve';\nimport { Cross } from '../shape/Cross';\nimport { Sector } from '../shape/Sector';\nimport { Dot } from '../shape/Dot';\nimport { isInRectangle, Rectangle } from '../shape/Rectangle';\nimport { findAllByType, findChildByType, getDisplayName, parseChildIndex, validateWidthHeight, isChildrenEqual, renderByOrder, getReactEventByType } from '../util/ReactUtils';\nimport { CartesianAxis } from '../cartesian/CartesianAxis';\nimport { Brush } from '../cartesian/Brush';\nimport { getOffset, calculateChartCoordinate } from '../util/DOMUtils';\nimport { getAnyElementOfObject, hasDuplicate, uniqueId, isNumber, findEntryInArray } from '../util/DataUtils';\nimport { calculateActiveTickIndex, getMainColorOfGraphicItem, getBarSizeList, getBarPosition, appendOffsetOfLegend, getLegendProps, combineEventHandlers, getTicksOfAxis, getCoordinatesOfGrid, getStackedDataOfItem, parseErrorBarsOfAxis, getBandSizeOfAxis, getStackGroupsByAxisId, isCategoricalAxis, getDomainOfItemsWithSameAxis, getDomainOfStackGroups, getDomainOfDataByKey, parseSpecifiedDomain, parseDomainOfCategoryAxis, getTooltipItem } from '../util/ChartUtils';\nimport { detectReferenceElementsDomain } from '../util/DetectReferenceElementsDomain';\nimport { inRangeOfSector, polarToCartesian } from '../util/PolarUtils';\nimport { shallowEqual } from '../util/ShallowEqual';\nimport { eventCenter, SYNC_EVENT } from '../util/Events';\nimport { filterProps, adaptEventHandlers } from '../util/types';\nvar ORIENT_MAP = {\n xAxis: ['bottom', 'top'],\n yAxis: ['left', 'right']\n};\nvar originCoordinate = {\n x: 0,\n y: 0\n}; // use legacy isFinite only if there is a problem (aka IE)\n// eslint-disable-next-line no-restricted-globals\n\nvar isFinit = Number.isFinite ? Number.isFinite : isFinite;\nvar defer =\n// eslint-disable-next-line no-nested-ternary\ntypeof requestAnimationFrame === 'function' ? requestAnimationFrame : typeof setImmediate === 'function' ? setImmediate : setTimeout;\nvar deferClear =\n// eslint-disable-next-line no-nested-ternary\ntypeof cancelAnimationFrame === 'function' ? cancelAnimationFrame : typeof clearImmediate === 'function' ? clearImmediate : clearTimeout;\nvar calculateTooltipPos = function calculateTooltipPos(rangeObj, layout) {\n if (layout === 'horizontal') {\n return rangeObj.x;\n }\n if (layout === 'vertical') {\n return rangeObj.y;\n }\n if (layout === 'centric') {\n return rangeObj.angle;\n }\n return rangeObj.radius;\n};\nvar getActiveCoordinate = function getActiveCoordinate(layout, tooltipTicks, activeIndex, rangeObj) {\n var entry = tooltipTicks.find(function (tick) {\n return tick && tick.index === activeIndex;\n });\n if (entry) {\n if (layout === 'horizontal') {\n return {\n x: entry.coordinate,\n y: rangeObj.y\n };\n }\n if (layout === 'vertical') {\n return {\n x: rangeObj.x,\n y: entry.coordinate\n };\n }\n if (layout === 'centric') {\n var _angle = entry.coordinate;\n var _radius = rangeObj.radius;\n return _objectSpread(_objectSpread(_objectSpread({}, rangeObj), polarToCartesian(rangeObj.cx, rangeObj.cy, _radius, _angle)), {}, {\n angle: _angle,\n radius: _radius\n });\n }\n var radius = entry.coordinate;\n var angle = rangeObj.angle;\n return _objectSpread(_objectSpread(_objectSpread({}, rangeObj), polarToCartesian(rangeObj.cx, rangeObj.cy, radius, angle)), {}, {\n angle: angle,\n radius: radius\n });\n }\n return originCoordinate;\n};\nvar getDisplayedData = function getDisplayedData(data, _ref, item) {\n var graphicalItems = _ref.graphicalItems,\n dataStartIndex = _ref.dataStartIndex,\n dataEndIndex = _ref.dataEndIndex;\n var itemsData = (graphicalItems || []).reduce(function (result, child) {\n var itemData = child.props.data;\n if (itemData && itemData.length) {\n return [].concat(_toConsumableArray(result), _toConsumableArray(itemData));\n }\n return result;\n }, []);\n if (itemsData && itemsData.length > 0) {\n return itemsData;\n }\n if (item && item.props && item.props.data && item.props.data.length > 0) {\n return item.props.data;\n }\n if (data && data.length && isNumber(dataStartIndex) && isNumber(dataEndIndex)) {\n return data.slice(dataStartIndex, dataEndIndex + 1);\n }\n return [];\n};\n/**\n * Get the content to be displayed in the tooltip\n * @param {Object} state Current state\n * @param {Array} chartData The data defined in chart\n * @param {Number} activeIndex Active index of data\n * @param {String} activeLabel Active label of data\n * @return {Array} The content of tooltip\n */\n\nvar getTooltipContent = function getTooltipContent(state, chartData, activeIndex, activeLabel) {\n var graphicalItems = state.graphicalItems,\n tooltipAxis = state.tooltipAxis;\n var displayedData = getDisplayedData(chartData, state);\n if (activeIndex < 0 || !graphicalItems || !graphicalItems.length || activeIndex >= displayedData.length) {\n return null;\n } // get data by activeIndex when the axis don't allow duplicated category\n\n return graphicalItems.reduce(function (result, child) {\n var hide = child.props.hide;\n if (hide) {\n return result;\n }\n var data = child.props.data;\n var payload;\n if (tooltipAxis.dataKey && !tooltipAxis.allowDuplicatedCategory) {\n // graphic child has data props\n var entries = data === undefined ? displayedData : data;\n payload = findEntryInArray(entries, tooltipAxis.dataKey, activeLabel);\n } else {\n payload = data && data[activeIndex] || displayedData[activeIndex];\n }\n if (!payload) {\n return result;\n }\n return [].concat(_toConsumableArray(result), [getTooltipItem(child, payload)]);\n }, []);\n};\n/**\n * Returns tooltip data based on a mouse position (as a parameter or in state)\n * @param {Object} state current state\n * @param {Array} chartData the data defined in chart\n * @param {String} layout The layout type of chart\n * @param {Object} rangeObj { x, y } coordinates\n * @return {Object} Tooltip data data\n */\n\nvar getTooltipData = function getTooltipData(state, chartData, layout, rangeObj) {\n var rangeData = rangeObj || {\n x: state.chartX,\n y: state.chartY\n };\n var pos = calculateTooltipPos(rangeData, layout);\n var ticks = state.orderedTooltipTicks,\n axis = state.tooltipAxis,\n tooltipTicks = state.tooltipTicks;\n var activeIndex = calculateActiveTickIndex(pos, ticks, tooltipTicks, axis);\n if (activeIndex >= 0 && tooltipTicks) {\n var activeLabel = tooltipTicks[activeIndex] && tooltipTicks[activeIndex].value;\n var activePayload = getTooltipContent(state, chartData, activeIndex, activeLabel);\n var activeCoordinate = getActiveCoordinate(layout, ticks, activeIndex, rangeData);\n return {\n activeTooltipIndex: activeIndex,\n activeLabel: activeLabel,\n activePayload: activePayload,\n activeCoordinate: activeCoordinate\n };\n }\n return null;\n};\n/**\n * Get the configuration of axis by the options of axis instance\n * @param {Object} props Latest props\n * @param {Array} axes The instance of axes\n * @param {Array} graphicalItems The instances of item\n * @param {String} axisType The type of axis, xAxis - x-axis, yAxis - y-axis\n * @param {String} axisIdKey The unique id of an axis\n * @param {Object} stackGroups The items grouped by axisId and stackId\n * @param {Number} dataStartIndex The start index of the data series when a brush is applied\n * @param {Number} dataEndIndex The end index of the data series when a brush is applied\n * @return {Object} Configuration\n */\n\nvar getAxisMapByAxes = function getAxisMapByAxes(props, _ref2) {\n var axes = _ref2.axes,\n graphicalItems = _ref2.graphicalItems,\n axisType = _ref2.axisType,\n axisIdKey = _ref2.axisIdKey,\n stackGroups = _ref2.stackGroups,\n dataStartIndex = _ref2.dataStartIndex,\n dataEndIndex = _ref2.dataEndIndex;\n var layout = props.layout,\n children = props.children,\n stackOffset = props.stackOffset;\n var isCategorical = isCategoricalAxis(layout, axisType); // Eliminate duplicated axes\n\n var axisMap = axes.reduce(function (result, child) {\n var _child$props = child.props,\n type = _child$props.type,\n dataKey = _child$props.dataKey,\n allowDataOverflow = _child$props.allowDataOverflow,\n allowDuplicatedCategory = _child$props.allowDuplicatedCategory,\n scale = _child$props.scale,\n ticks = _child$props.ticks;\n var axisId = child.props[axisIdKey];\n var displayedData = getDisplayedData(props.data, {\n graphicalItems: graphicalItems.filter(function (item) {\n return item.props[axisIdKey] === axisId;\n }),\n dataStartIndex: dataStartIndex,\n dataEndIndex: dataEndIndex\n });\n var len = displayedData.length;\n if (!result[axisId]) {\n var domain, duplicateDomain, categoricalDomain;\n if (dataKey) {\n // has dataKey in \n domain = getDomainOfDataByKey(displayedData, dataKey, type);\n if (type === 'category' && isCategorical) {\n // the field type is category data and this axis is catrgorical axis\n var duplicate = hasDuplicate(domain);\n if (allowDuplicatedCategory && duplicate) {\n duplicateDomain = domain; // When category axis has duplicated text, serial numbers are used to generate scale\n\n domain = _range(0, len);\n } else if (!allowDuplicatedCategory) {\n // remove duplicated category\n domain = parseDomainOfCategoryAxis(child.props.domain, domain, child).reduce(function (finalDomain, entry) {\n return finalDomain.indexOf(entry) >= 0 ? finalDomain : [].concat(_toConsumableArray(finalDomain), [entry]);\n }, []);\n }\n } else if (type === 'category') {\n // the field type is category data and this axis is numerical axis\n if (!allowDuplicatedCategory) {\n domain = parseDomainOfCategoryAxis(child.props.domain, domain, child).reduce(function (finalDomain, entry) {\n return finalDomain.indexOf(entry) >= 0 || entry === '' || _isNil(entry) ? finalDomain : [].concat(_toConsumableArray(finalDomain), [entry]);\n }, []);\n } else {\n // eliminate undefined or null or empty string\n domain = domain.filter(function (entry) {\n return entry !== '' && !_isNil(entry);\n });\n }\n } else if (type === 'number') {\n // the field type is numerical\n var errorBarsDomain = parseErrorBarsOfAxis(displayedData, graphicalItems.filter(function (item) {\n return item.props[axisIdKey] === axisId && !item.props.hide;\n }), dataKey, axisType, layout);\n if (errorBarsDomain) {\n domain = errorBarsDomain;\n }\n }\n if (isCategorical && (type === 'number' || scale !== 'auto')) {\n categoricalDomain = getDomainOfDataByKey(displayedData, dataKey, 'category');\n }\n } else if (isCategorical) {\n // the axis is a categorical axis\n domain = _range(0, len);\n } else if (stackGroups && stackGroups[axisId] && stackGroups[axisId].hasStack && type === 'number') {\n // when stackOffset is 'expand', the domain may be calculated as [0, 1.000000000002]\n domain = stackOffset === 'expand' ? [0, 1] : getDomainOfStackGroups(stackGroups[axisId].stackGroups, dataStartIndex, dataEndIndex);\n } else {\n domain = getDomainOfItemsWithSameAxis(displayedData, graphicalItems.filter(function (item) {\n return item.props[axisIdKey] === axisId && !item.props.hide;\n }), type, layout, true);\n }\n if (type === 'number') {\n // To detect wether there is any reference lines whose props alwaysShow is true\n domain = detectReferenceElementsDomain(children, domain, axisId, axisType, ticks);\n if (child.props.domain) {\n domain = parseSpecifiedDomain(child.props.domain, domain, allowDataOverflow);\n }\n } else if (type === 'category' && child.props.domain) {\n var axisDomain = child.props.domain;\n var isDomainValidate = domain.every(function (entry) {\n return axisDomain.indexOf(entry) >= 0;\n });\n if (isDomainValidate) {\n domain = axisDomain;\n }\n }\n return _objectSpread(_objectSpread({}, result), {}, _defineProperty({}, axisId, _objectSpread(_objectSpread({}, child.props), {}, {\n axisType: axisType,\n domain: domain,\n categoricalDomain: categoricalDomain,\n duplicateDomain: duplicateDomain,\n originalDomain: child.props.domain,\n isCategorical: isCategorical,\n layout: layout\n })));\n }\n return result;\n }, {});\n return axisMap;\n};\n/**\n * Get the configuration of axis by the options of item,\n * this kind of axis does not display in chart\n * @param {Object} props Latest props\n * @param {Array} graphicalItems The instances of item\n * @param {ReactElement} Axis Axis Component\n * @param {String} axisType The type of axis, xAxis - x-axis, yAxis - y-axis\n * @param {String} axisIdKey The unique id of an axis\n * @param {Object} stackGroups The items grouped by axisId and stackId\n * @param {Number} dataStartIndex The start index of the data series when a brush is applied\n * @param {Number} dataEndIndex The end index of the data series when a brush is applied\n * @return {Object} Configuration\n */\n\nvar getAxisMapByItems = function getAxisMapByItems(props, _ref3) {\n var graphicalItems = _ref3.graphicalItems,\n Axis = _ref3.Axis,\n axisType = _ref3.axisType,\n axisIdKey = _ref3.axisIdKey,\n stackGroups = _ref3.stackGroups,\n dataStartIndex = _ref3.dataStartIndex,\n dataEndIndex = _ref3.dataEndIndex;\n var layout = props.layout,\n children = props.children;\n var displayedData = getDisplayedData(props.data, {\n graphicalItems: graphicalItems,\n dataStartIndex: dataStartIndex,\n dataEndIndex: dataEndIndex\n });\n var len = displayedData.length;\n var isCategorical = isCategoricalAxis(layout, axisType);\n var index = -1; // The default type of x-axis is category axis,\n // The default contents of x-axis is the serial numbers of data\n // The default type of y-axis is number axis\n // The default contents of y-axis is the domain of data\n\n var axisMap = graphicalItems.reduce(function (result, child) {\n var axisId = child.props[axisIdKey];\n if (!result[axisId]) {\n index++;\n var domain;\n if (isCategorical) {\n domain = _range(0, len);\n } else if (stackGroups && stackGroups[axisId] && stackGroups[axisId].hasStack) {\n domain = getDomainOfStackGroups(stackGroups[axisId].stackGroups, dataStartIndex, dataEndIndex);\n domain = detectReferenceElementsDomain(children, domain, axisId, axisType);\n } else {\n domain = parseSpecifiedDomain(Axis.defaultProps.domain, getDomainOfItemsWithSameAxis(displayedData, graphicalItems.filter(function (item) {\n return item.props[axisIdKey] === axisId && !item.props.hide;\n }), 'number', layout), Axis.defaultProps.allowDataOverflow);\n domain = detectReferenceElementsDomain(children, domain, axisId, axisType);\n }\n return _objectSpread(_objectSpread({}, result), {}, _defineProperty({}, axisId, _objectSpread(_objectSpread({\n axisType: axisType\n }, Axis.defaultProps), {}, {\n hide: true,\n orientation: _get(ORIENT_MAP, \"\".concat(axisType, \".\").concat(index % 2), null),\n domain: domain,\n originalDomain: Axis.defaultProps.domain,\n isCategorical: isCategorical,\n layout: layout // specify scale when no Axis\n // scale: isCategorical ? 'band' : 'linear',\n })));\n }\n\n return result;\n }, {});\n return axisMap;\n};\n/**\n * Get the configuration of all x-axis or y-axis\n * @param {Object} props Latest props\n * @param {String} axisType The type of axis\n * @param {Array} graphicalItems The instances of item\n * @param {Object} stackGroups The items grouped by axisId and stackId\n * @param {Number} dataStartIndex The start index of the data series when a brush is applied\n * @param {Number} dataEndIndex The end index of the data series when a brush is applied\n * @return {Object} Configuration\n */\n\nvar getAxisMap = function getAxisMap(props, _ref4) {\n var _ref4$axisType = _ref4.axisType,\n axisType = _ref4$axisType === void 0 ? 'xAxis' : _ref4$axisType,\n AxisComp = _ref4.AxisComp,\n graphicalItems = _ref4.graphicalItems,\n stackGroups = _ref4.stackGroups,\n dataStartIndex = _ref4.dataStartIndex,\n dataEndIndex = _ref4.dataEndIndex;\n var children = props.children;\n var axisIdKey = \"\".concat(axisType, \"Id\"); // Get all the instance of Axis\n\n var axes = findAllByType(children, AxisComp);\n var axisMap = {};\n if (axes && axes.length) {\n axisMap = getAxisMapByAxes(props, {\n axes: axes,\n graphicalItems: graphicalItems,\n axisType: axisType,\n axisIdKey: axisIdKey,\n stackGroups: stackGroups,\n dataStartIndex: dataStartIndex,\n dataEndIndex: dataEndIndex\n });\n } else if (graphicalItems && graphicalItems.length) {\n axisMap = getAxisMapByItems(props, {\n Axis: AxisComp,\n graphicalItems: graphicalItems,\n axisType: axisType,\n axisIdKey: axisIdKey,\n stackGroups: stackGroups,\n dataStartIndex: dataStartIndex,\n dataEndIndex: dataEndIndex\n });\n }\n return axisMap;\n};\nvar tooltipTicksGenerator = function tooltipTicksGenerator(axisMap) {\n var axis = getAnyElementOfObject(axisMap);\n var tooltipTicks = getTicksOfAxis(axis, false, true);\n return {\n tooltipTicks: tooltipTicks,\n orderedTooltipTicks: _sortBy(tooltipTicks, function (o) {\n return o.coordinate;\n }),\n tooltipAxis: axis,\n tooltipAxisBandSize: getBandSizeOfAxis(axis, tooltipTicks)\n };\n};\n/**\n * Returns default, reset state for the categorical chart.\n * @param {Object} props Props object to use when creating the default state\n * @return {Object} Whole new state\n */\n\nvar createDefaultState = function createDefaultState(props) {\n var children = props.children,\n defaultShowTooltip = props.defaultShowTooltip;\n var brushItem = findChildByType(children, Brush.displayName);\n var startIndex = brushItem && brushItem.props && brushItem.props.startIndex || 0;\n var endIndex = brushItem && brushItem.props && brushItem.props.endIndex || props.data && props.data.length - 1 || 0;\n return {\n chartX: 0,\n chartY: 0,\n dataStartIndex: startIndex,\n dataEndIndex: endIndex,\n activeTooltipIndex: -1,\n isTooltipActive: !_isNil(defaultShowTooltip) ? defaultShowTooltip : false\n };\n};\nvar hasGraphicalBarItem = function hasGraphicalBarItem(graphicalItems) {\n if (!graphicalItems || !graphicalItems.length) {\n return false;\n }\n return graphicalItems.some(function (item) {\n var name = getDisplayName(item && item.type);\n return name && name.indexOf('Bar') >= 0;\n });\n};\nvar getAxisNameByLayout = function getAxisNameByLayout(layout) {\n if (layout === 'horizontal') {\n return {\n numericAxisName: 'yAxis',\n cateAxisName: 'xAxis'\n };\n }\n if (layout === 'vertical') {\n return {\n numericAxisName: 'xAxis',\n cateAxisName: 'yAxis'\n };\n }\n if (layout === 'centric') {\n return {\n numericAxisName: 'radiusAxis',\n cateAxisName: 'angleAxis'\n };\n }\n return {\n numericAxisName: 'angleAxis',\n cateAxisName: 'radiusAxis'\n };\n};\n/**\n * Calculate the offset of main part in the svg element\n * @param {Object} props Latest props\n * graphicalItems The instances of item\n * xAxisMap The configuration of x-axis\n * yAxisMap The configuration of y-axis\n * @param {Object} prevLegendBBox the boundary box of legend\n * @return {Object} The offset of main part in the svg element\n */\n\nvar calculateOffset = function calculateOffset(_ref5, prevLegendBBox) {\n var props = _ref5.props,\n graphicalItems = _ref5.graphicalItems,\n _ref5$xAxisMap = _ref5.xAxisMap,\n xAxisMap = _ref5$xAxisMap === void 0 ? {} : _ref5$xAxisMap,\n _ref5$yAxisMap = _ref5.yAxisMap,\n yAxisMap = _ref5$yAxisMap === void 0 ? {} : _ref5$yAxisMap;\n var width = props.width,\n height = props.height,\n children = props.children;\n var margin = props.margin || {};\n var brushItem = findChildByType(children, Brush.displayName);\n var legendItem = findChildByType(children, Legend.displayName);\n var offsetH = Object.keys(yAxisMap).reduce(function (result, id) {\n var entry = yAxisMap[id];\n var orientation = entry.orientation;\n if (!entry.mirror && !entry.hide) {\n return _objectSpread(_objectSpread({}, result), {}, _defineProperty({}, orientation, result[orientation] + entry.width));\n }\n return result;\n }, {\n left: margin.left || 0,\n right: margin.right || 0\n });\n var offsetV = Object.keys(xAxisMap).reduce(function (result, id) {\n var entry = xAxisMap[id];\n var orientation = entry.orientation;\n if (!entry.mirror && !entry.hide) {\n return _objectSpread(_objectSpread({}, result), {}, _defineProperty({}, orientation, _get(result, \"\".concat(orientation)) + entry.height));\n }\n return result;\n }, {\n top: margin.top || 0,\n bottom: margin.bottom || 0\n });\n var offset = _objectSpread(_objectSpread({}, offsetV), offsetH);\n var brushBottom = offset.bottom;\n if (brushItem) {\n offset.bottom += brushItem.props.height || Brush.defaultProps.height;\n }\n if (legendItem && prevLegendBBox) {\n offset = appendOffsetOfLegend(offset, graphicalItems, props, prevLegendBBox);\n }\n return _objectSpread(_objectSpread({\n brushBottom: brushBottom\n }, offset), {}, {\n width: width - offset.left - offset.right,\n height: height - offset.top - offset.bottom\n });\n};\nexport var generateCategoricalChart = function generateCategoricalChart(_ref6) {\n var _class, _temp;\n var chartName = _ref6.chartName,\n GraphicalChild = _ref6.GraphicalChild,\n _ref6$defaultTooltipE = _ref6.defaultTooltipEventType,\n defaultTooltipEventType = _ref6$defaultTooltipE === void 0 ? 'axis' : _ref6$defaultTooltipE,\n _ref6$validateTooltip = _ref6.validateTooltipEventTypes,\n validateTooltipEventTypes = _ref6$validateTooltip === void 0 ? ['axis'] : _ref6$validateTooltip,\n axisComponents = _ref6.axisComponents,\n legendContent = _ref6.legendContent,\n formatAxisMap = _ref6.formatAxisMap,\n defaultProps = _ref6.defaultProps;\n var getFormatItems = function getFormatItems(props, currentState) {\n var graphicalItems = currentState.graphicalItems,\n stackGroups = currentState.stackGroups,\n offset = currentState.offset,\n updateId = currentState.updateId,\n dataStartIndex = currentState.dataStartIndex,\n dataEndIndex = currentState.dataEndIndex;\n var barSize = props.barSize,\n layout = props.layout,\n barGap = props.barGap,\n barCategoryGap = props.barCategoryGap,\n globalMaxBarSize = props.maxBarSize;\n var _getAxisNameByLayout = getAxisNameByLayout(layout),\n numericAxisName = _getAxisNameByLayout.numericAxisName,\n cateAxisName = _getAxisNameByLayout.cateAxisName;\n var hasBar = hasGraphicalBarItem(graphicalItems);\n var sizeList = hasBar && getBarSizeList({\n barSize: barSize,\n stackGroups: stackGroups\n });\n var formattedItems = [];\n graphicalItems.forEach(function (item, index) {\n var displayedData = getDisplayedData(props.data, {\n dataStartIndex: dataStartIndex,\n dataEndIndex: dataEndIndex\n }, item);\n var _item$props = item.props,\n dataKey = _item$props.dataKey,\n childMaxBarSize = _item$props.maxBarSize;\n var numericAxisId = item.props[\"\".concat(numericAxisName, \"Id\")];\n var cateAxisId = item.props[\"\".concat(cateAxisName, \"Id\")];\n var axisObj = axisComponents.reduce(function (result, entry) {\n var _objectSpread6;\n var axisMap = currentState[\"\".concat(entry.axisType, \"Map\")];\n var id = item.props[\"\".concat(entry.axisType, \"Id\")];\n var axis = axisMap && axisMap[id];\n return _objectSpread(_objectSpread({}, result), {}, (_objectSpread6 = {}, _defineProperty(_objectSpread6, entry.axisType, axis), _defineProperty(_objectSpread6, \"\".concat(entry.axisType, \"Ticks\"), getTicksOfAxis(axis)), _objectSpread6));\n }, {});\n var cateAxis = axisObj[cateAxisName];\n var cateTicks = axisObj[\"\".concat(cateAxisName, \"Ticks\")];\n var stackedData = stackGroups && stackGroups[numericAxisId] && stackGroups[numericAxisId].hasStack && getStackedDataOfItem(item, stackGroups[numericAxisId].stackGroups);\n var itemIsBar = getDisplayName(item.type).indexOf('Bar') >= 0;\n var bandSize = getBandSizeOfAxis(cateAxis, cateTicks);\n var barPosition = [];\n if (itemIsBar) {\n var _ref7, _getBandSizeOfAxis;\n\n // 如果是bar,计算bar的位置\n var maxBarSize = _isNil(childMaxBarSize) ? globalMaxBarSize : childMaxBarSize;\n var barBandSize = (_ref7 = (_getBandSizeOfAxis = getBandSizeOfAxis(cateAxis, cateTicks, true)) !== null && _getBandSizeOfAxis !== void 0 ? _getBandSizeOfAxis : maxBarSize) !== null && _ref7 !== void 0 ? _ref7 : 0;\n barPosition = getBarPosition({\n barGap: barGap,\n barCategoryGap: barCategoryGap,\n bandSize: barBandSize !== bandSize ? barBandSize : bandSize,\n sizeList: sizeList[cateAxisId],\n maxBarSize: maxBarSize\n });\n if (barBandSize !== bandSize) {\n barPosition = barPosition.map(function (pos) {\n return _objectSpread(_objectSpread({}, pos), {}, {\n position: _objectSpread(_objectSpread({}, pos.position), {}, {\n offset: pos.position.offset - barBandSize / 2\n })\n });\n });\n }\n }\n var composedFn = item && item.type && item.type.getComposedData;\n if (composedFn) {\n var _objectSpread7;\n formattedItems.push({\n props: _objectSpread(_objectSpread({}, composedFn(_objectSpread(_objectSpread({}, axisObj), {}, {\n displayedData: displayedData,\n props: props,\n dataKey: dataKey,\n item: item,\n bandSize: bandSize,\n barPosition: barPosition,\n offset: offset,\n stackedData: stackedData,\n layout: layout,\n dataStartIndex: dataStartIndex,\n dataEndIndex: dataEndIndex\n }))), {}, (_objectSpread7 = {\n key: item.key || \"item-\".concat(index)\n }, _defineProperty(_objectSpread7, numericAxisName, axisObj[numericAxisName]), _defineProperty(_objectSpread7, cateAxisName, axisObj[cateAxisName]), _defineProperty(_objectSpread7, \"animationId\", updateId), _objectSpread7)),\n childIndex: parseChildIndex(item, props.children),\n item: item\n });\n }\n });\n return formattedItems;\n };\n /**\n * The AxisMaps are expensive to render on large data sets\n * so provide the ability to store them in state and only update them when necessary\n * they are dependent upon the start and end index of\n * the brush so it's important that this method is called _after_\n * the state is updated with any new start/end indices\n *\n * @param {Object} props The props object to be used for updating the axismaps\n * dataStartIndex: The start index of the data series when a brush is applied\n * dataEndIndex: The end index of the data series when a brush is applied\n * updateId: The update id\n * @param {Object} prevState Prev state\n * @return {Object} state New state to set\n */\n\n var updateStateOfAxisMapsOffsetAndStackGroups = function updateStateOfAxisMapsOffsetAndStackGroups(_ref8, prevState) {\n var props = _ref8.props,\n dataStartIndex = _ref8.dataStartIndex,\n dataEndIndex = _ref8.dataEndIndex,\n updateId = _ref8.updateId;\n if (!validateWidthHeight({\n props: props\n })) {\n return null;\n }\n var children = props.children,\n layout = props.layout,\n stackOffset = props.stackOffset,\n data = props.data,\n reverseStackOrder = props.reverseStackOrder;\n var _getAxisNameByLayout2 = getAxisNameByLayout(layout),\n numericAxisName = _getAxisNameByLayout2.numericAxisName,\n cateAxisName = _getAxisNameByLayout2.cateAxisName;\n var graphicalItems = findAllByType(children, GraphicalChild);\n var stackGroups = getStackGroupsByAxisId(data, graphicalItems, \"\".concat(numericAxisName, \"Id\"), \"\".concat(cateAxisName, \"Id\"), stackOffset, reverseStackOrder);\n var axisObj = axisComponents.reduce(function (result, entry) {\n var name = \"\".concat(entry.axisType, \"Map\");\n return _objectSpread(_objectSpread({}, result), {}, _defineProperty({}, name, getAxisMap(props, _objectSpread(_objectSpread({}, entry), {}, {\n graphicalItems: graphicalItems,\n stackGroups: entry.axisType === numericAxisName && stackGroups,\n dataStartIndex: dataStartIndex,\n dataEndIndex: dataEndIndex\n }))));\n }, {});\n var offset = calculateOffset(_objectSpread(_objectSpread({}, axisObj), {}, {\n props: props,\n graphicalItems: graphicalItems\n }), prevState === null || prevState === void 0 ? void 0 : prevState.legendBBox);\n Object.keys(axisObj).forEach(function (key) {\n axisObj[key] = formatAxisMap(props, axisObj[key], offset, key.replace('Map', ''), chartName);\n });\n var cateAxisMap = axisObj[\"\".concat(cateAxisName, \"Map\")];\n var ticksObj = tooltipTicksGenerator(cateAxisMap);\n var formattedGraphicalItems = getFormatItems(props, _objectSpread(_objectSpread({}, axisObj), {}, {\n dataStartIndex: dataStartIndex,\n dataEndIndex: dataEndIndex,\n updateId: updateId,\n graphicalItems: graphicalItems,\n stackGroups: stackGroups,\n offset: offset\n }));\n return _objectSpread(_objectSpread({\n formattedGraphicalItems: formattedGraphicalItems,\n graphicalItems: graphicalItems,\n offset: offset,\n stackGroups: stackGroups\n }, ticksObj), axisObj);\n };\n return _temp = _class = /*#__PURE__*/function (_Component) {\n _inherits(CategoricalChartWrapper, _Component);\n var _super = _createSuper(CategoricalChartWrapper);\n\n // todo join specific chart propTypes\n function CategoricalChartWrapper(_props) {\n var _this;\n _classCallCheck(this, CategoricalChartWrapper);\n _this = _super.call(this, _props);\n _this.uniqueChartId = void 0;\n _this.clipPathId = void 0;\n _this.legendInstance = void 0;\n _this.deferId = void 0;\n _this.container = void 0;\n _this.clearDeferId = function () {\n if (!_isNil(_this.deferId) && deferClear) {\n deferClear(_this.deferId);\n }\n _this.deferId = null;\n };\n _this.handleLegendBBoxUpdate = function (box) {\n if (box) {\n var _this$state = _this.state,\n dataStartIndex = _this$state.dataStartIndex,\n dataEndIndex = _this$state.dataEndIndex,\n updateId = _this$state.updateId;\n _this.setState(_objectSpread({\n legendBBox: box\n }, updateStateOfAxisMapsOffsetAndStackGroups({\n props: _this.props,\n dataStartIndex: dataStartIndex,\n dataEndIndex: dataEndIndex,\n updateId: updateId\n }, _objectSpread(_objectSpread({}, _this.state), {}, {\n legendBBox: box\n }))));\n }\n };\n _this.handleReceiveSyncEvent = function (cId, chartId, data) {\n var syncId = _this.props.syncId;\n if (syncId === cId && chartId !== _this.uniqueChartId) {\n _this.clearDeferId();\n _this.deferId = defer && defer(_this.applySyncEvent.bind(_assertThisInitialized(_this), data));\n }\n };\n _this.handleBrushChange = function (_ref9) {\n var startIndex = _ref9.startIndex,\n endIndex = _ref9.endIndex;\n\n // Only trigger changes if the extents of the brush have actually changed\n if (startIndex !== _this.state.dataStartIndex || endIndex !== _this.state.dataEndIndex) {\n var updateId = _this.state.updateId;\n _this.setState(function () {\n return _objectSpread({\n dataStartIndex: startIndex,\n dataEndIndex: endIndex\n }, updateStateOfAxisMapsOffsetAndStackGroups({\n props: _this.props,\n dataStartIndex: startIndex,\n dataEndIndex: endIndex,\n updateId: updateId\n }, _this.state));\n });\n _this.triggerSyncEvent({\n dataStartIndex: startIndex,\n dataEndIndex: endIndex\n });\n }\n };\n _this.handleMouseEnter = function (e) {\n var onMouseEnter = _this.props.onMouseEnter;\n var mouse = _this.getMouseInfo(e);\n if (mouse) {\n var _nextState = _objectSpread(_objectSpread({}, mouse), {}, {\n isTooltipActive: true\n });\n _this.setState(_nextState);\n _this.triggerSyncEvent(_nextState);\n if (_isFunction(onMouseEnter)) {\n onMouseEnter(_nextState, e);\n }\n }\n };\n _this.triggeredAfterMouseMove = function (e) {\n var onMouseMove = _this.props.onMouseMove;\n var mouse = _this.getMouseInfo(e);\n var nextState = mouse ? _objectSpread(_objectSpread({}, mouse), {}, {\n isTooltipActive: true\n }) : {\n isTooltipActive: false\n };\n _this.setState(nextState);\n _this.triggerSyncEvent(nextState);\n if (_isFunction(onMouseMove)) {\n onMouseMove(nextState, e);\n }\n };\n _this.handleItemMouseEnter = function (el) {\n _this.setState(function () {\n return {\n isTooltipActive: true,\n activeItem: el,\n activePayload: el.tooltipPayload,\n activeCoordinate: el.tooltipPosition || {\n x: el.cx,\n y: el.cy\n }\n };\n });\n };\n _this.handleItemMouseLeave = function () {\n _this.setState(function () {\n return {\n isTooltipActive: false\n };\n });\n };\n _this.handleMouseMove = function (e) {\n if (e && _isFunction(e.persist)) {\n e.persist();\n }\n _this.triggeredAfterMouseMove(e);\n };\n _this.handleMouseLeave = function (e) {\n var onMouseLeave = _this.props.onMouseLeave;\n var nextState = {\n isTooltipActive: false\n };\n _this.setState(nextState);\n _this.triggerSyncEvent(nextState);\n if (_isFunction(onMouseLeave)) {\n onMouseLeave(nextState, e);\n }\n _this.cancelThrottledTriggerAfterMouseMove();\n };\n _this.handleOuterEvent = function (e) {\n var eventName = getReactEventByType(e);\n var event = _get(_this.props, \"\".concat(eventName));\n if (eventName && _isFunction(event)) {\n var mouse;\n if (/.*touch.*/i.test(eventName)) {\n mouse = _this.getMouseInfo(e.changedTouches[0]);\n } else {\n mouse = _this.getMouseInfo(e);\n }\n var handler = event;\n handler(mouse, e);\n }\n };\n _this.handleClick = function (e) {\n var onClick = _this.props.onClick;\n var mouse = _this.getMouseInfo(e);\n if (mouse) {\n var _nextState2 = _objectSpread(_objectSpread({}, mouse), {}, {\n isTooltipActive: true\n });\n _this.setState(_nextState2);\n _this.triggerSyncEvent(_nextState2);\n if (_isFunction(onClick)) {\n onClick(_nextState2, e);\n }\n }\n };\n _this.handleMouseDown = function (e) {\n var onMouseDown = _this.props.onMouseDown;\n if (_isFunction(onMouseDown)) {\n var _nextState3 = _this.getMouseInfo(e);\n onMouseDown(_nextState3, e);\n }\n };\n _this.handleMouseUp = function (e) {\n var onMouseUp = _this.props.onMouseUp;\n if (_isFunction(onMouseUp)) {\n var _nextState4 = _this.getMouseInfo(e);\n onMouseUp(_nextState4, e);\n }\n };\n _this.handleTouchMove = function (e) {\n if (e.changedTouches != null && e.changedTouches.length > 0) {\n _this.handleMouseMove(e.changedTouches[0]);\n }\n };\n _this.handleTouchStart = function (e) {\n if (e.changedTouches != null && e.changedTouches.length > 0) {\n _this.handleMouseDown(e.changedTouches[0]);\n }\n };\n _this.handleTouchEnd = function (e) {\n if (e.changedTouches != null && e.changedTouches.length > 0) {\n _this.handleMouseUp(e.changedTouches[0]);\n }\n };\n _this.verticalCoordinatesGenerator = function (_ref10) {\n var xAxis = _ref10.xAxis,\n width = _ref10.width,\n height = _ref10.height,\n offset = _ref10.offset;\n return getCoordinatesOfGrid(CartesianAxis.getTicks(_objectSpread(_objectSpread(_objectSpread({}, CartesianAxis.defaultProps), xAxis), {}, {\n ticks: getTicksOfAxis(xAxis, true),\n viewBox: {\n x: 0,\n y: 0,\n width: width,\n height: height\n }\n })), offset.left, offset.left + offset.width);\n };\n _this.horizontalCoordinatesGenerator = function (_ref11) {\n var yAxis = _ref11.yAxis,\n width = _ref11.width,\n height = _ref11.height,\n offset = _ref11.offset;\n return getCoordinatesOfGrid(CartesianAxis.getTicks(_objectSpread(_objectSpread(_objectSpread({}, CartesianAxis.defaultProps), yAxis), {}, {\n ticks: getTicksOfAxis(yAxis, true),\n viewBox: {\n x: 0,\n y: 0,\n width: width,\n height: height\n }\n })), offset.top, offset.top + offset.height);\n };\n _this.axesTicksGenerator = function (axis) {\n return getTicksOfAxis(axis, true);\n };\n _this.renderCursor = function (element) {\n var _this$state2 = _this.state,\n isTooltipActive = _this$state2.isTooltipActive,\n activeCoordinate = _this$state2.activeCoordinate,\n activePayload = _this$state2.activePayload,\n offset = _this$state2.offset,\n activeTooltipIndex = _this$state2.activeTooltipIndex;\n var tooltipEventType = _this.getTooltipEventType();\n if (!element || !element.props.cursor || !isTooltipActive || !activeCoordinate || chartName !== 'ScatterChart' && tooltipEventType !== 'axis') {\n return null;\n }\n var layout = _this.props.layout;\n var restProps;\n var cursorComp = Curve;\n if (chartName === 'ScatterChart') {\n restProps = activeCoordinate;\n cursorComp = Cross;\n } else if (chartName === 'BarChart') {\n restProps = _this.getCursorRectangle();\n cursorComp = Rectangle;\n } else if (layout === 'radial') {\n var _this$getCursorPoints = _this.getCursorPoints(),\n cx = _this$getCursorPoints.cx,\n cy = _this$getCursorPoints.cy,\n radius = _this$getCursorPoints.radius,\n startAngle = _this$getCursorPoints.startAngle,\n endAngle = _this$getCursorPoints.endAngle;\n restProps = {\n cx: cx,\n cy: cy,\n startAngle: startAngle,\n endAngle: endAngle,\n innerRadius: radius,\n outerRadius: radius\n };\n cursorComp = Sector;\n } else {\n restProps = {\n points: _this.getCursorPoints()\n };\n cursorComp = Curve;\n }\n var key = element.key || '_recharts-cursor';\n var cursorProps = _objectSpread(_objectSpread(_objectSpread(_objectSpread({\n stroke: '#ccc',\n pointerEvents: 'none'\n }, offset), restProps), filterProps(element.props.cursor)), {}, {\n payload: activePayload,\n payloadIndex: activeTooltipIndex,\n key: key,\n className: 'recharts-tooltip-cursor'\n });\n return /*#__PURE__*/isValidElement(element.props.cursor) ? /*#__PURE__*/cloneElement(element.props.cursor, cursorProps) : /*#__PURE__*/createElement(cursorComp, cursorProps);\n };\n _this.renderPolarAxis = function (element, displayName, index) {\n var axisType = _get(element, 'type.axisType');\n var axisMap = _get(_this.state, \"\".concat(axisType, \"Map\"));\n var axisOption = axisMap[element.props[\"\".concat(axisType, \"Id\")]];\n return /*#__PURE__*/cloneElement(element, _objectSpread(_objectSpread({}, axisOption), {}, {\n className: axisType,\n key: element.key || \"\".concat(displayName, \"-\").concat(index),\n ticks: getTicksOfAxis(axisOption, true)\n }));\n };\n _this.renderXAxis = function (element, displayName, index) {\n var xAxisMap = _this.state.xAxisMap;\n var axisObj = xAxisMap[element.props.xAxisId];\n return _this.renderAxis(axisObj, element, displayName, index);\n };\n _this.renderYAxis = function (element, displayName, index) {\n var yAxisMap = _this.state.yAxisMap;\n var axisObj = yAxisMap[element.props.yAxisId];\n return _this.renderAxis(axisObj, element, displayName, index);\n };\n _this.renderGrid = function (element) {\n var _this$state3 = _this.state,\n xAxisMap = _this$state3.xAxisMap,\n yAxisMap = _this$state3.yAxisMap,\n offset = _this$state3.offset;\n var _this$props = _this.props,\n width = _this$props.width,\n height = _this$props.height;\n var xAxis = getAnyElementOfObject(xAxisMap);\n var yAxisWithFiniteDomain = _find(yAxisMap, function (axis) {\n return _every(axis.domain, isFinit);\n });\n var yAxis = yAxisWithFiniteDomain || getAnyElementOfObject(yAxisMap);\n var props = element.props || {};\n return /*#__PURE__*/cloneElement(element, {\n key: element.key || 'grid',\n x: isNumber(props.x) ? props.x : offset.left,\n y: isNumber(props.y) ? props.y : offset.top,\n width: isNumber(props.width) ? props.width : offset.width,\n height: isNumber(props.height) ? props.height : offset.height,\n xAxis: xAxis,\n yAxis: yAxis,\n offset: offset,\n chartWidth: width,\n chartHeight: height,\n verticalCoordinatesGenerator: props.verticalCoordinatesGenerator || _this.verticalCoordinatesGenerator,\n horizontalCoordinatesGenerator: props.horizontalCoordinatesGenerator || _this.horizontalCoordinatesGenerator\n });\n };\n _this.renderPolarGrid = function (element) {\n var _element$props = element.props,\n radialLines = _element$props.radialLines,\n polarAngles = _element$props.polarAngles,\n polarRadius = _element$props.polarRadius;\n var _this$state4 = _this.state,\n radiusAxisMap = _this$state4.radiusAxisMap,\n angleAxisMap = _this$state4.angleAxisMap;\n var radiusAxis = getAnyElementOfObject(radiusAxisMap);\n var angleAxis = getAnyElementOfObject(angleAxisMap);\n var cx = angleAxis.cx,\n cy = angleAxis.cy,\n innerRadius = angleAxis.innerRadius,\n outerRadius = angleAxis.outerRadius;\n return /*#__PURE__*/cloneElement(element, {\n polarAngles: _isArray(polarAngles) ? polarAngles : getTicksOfAxis(angleAxis, true).map(function (entry) {\n return entry.coordinate;\n }),\n polarRadius: _isArray(polarRadius) ? polarRadius : getTicksOfAxis(radiusAxis, true).map(function (entry) {\n return entry.coordinate;\n }),\n cx: cx,\n cy: cy,\n innerRadius: innerRadius,\n outerRadius: outerRadius,\n key: element.key || 'polar-grid',\n radialLines: radialLines\n });\n };\n _this.renderLegend = function () {\n var formattedGraphicalItems = _this.state.formattedGraphicalItems;\n var _this$props2 = _this.props,\n children = _this$props2.children,\n width = _this$props2.width,\n height = _this$props2.height;\n var margin = _this.props.margin || {};\n var legendWidth = width - (margin.left || 0) - (margin.right || 0);\n var props = getLegendProps({\n children: children,\n formattedGraphicalItems: formattedGraphicalItems,\n legendWidth: legendWidth,\n legendContent: legendContent\n });\n if (!props) {\n return null;\n }\n var item = props.item,\n otherProps = _objectWithoutProperties(props, [\"item\"]);\n return /*#__PURE__*/cloneElement(item, _objectSpread(_objectSpread({}, otherProps), {}, {\n chartWidth: width,\n chartHeight: height,\n margin: margin,\n ref: function ref(legend) {\n _this.legendInstance = legend;\n },\n onBBoxUpdate: _this.handleLegendBBoxUpdate\n }));\n };\n _this.renderTooltip = function () {\n var children = _this.props.children;\n var tooltipItem = findChildByType(children, Tooltip.displayName);\n if (!tooltipItem) {\n return null;\n }\n var _this$state5 = _this.state,\n isTooltipActive = _this$state5.isTooltipActive,\n activeCoordinate = _this$state5.activeCoordinate,\n activePayload = _this$state5.activePayload,\n activeLabel = _this$state5.activeLabel,\n offset = _this$state5.offset;\n return /*#__PURE__*/cloneElement(tooltipItem, {\n viewBox: _objectSpread(_objectSpread({}, offset), {}, {\n x: offset.left,\n y: offset.top\n }),\n active: isTooltipActive,\n label: activeLabel,\n payload: isTooltipActive ? activePayload : [],\n coordinate: activeCoordinate\n });\n };\n _this.renderBrush = function (element) {\n var _this$props3 = _this.props,\n margin = _this$props3.margin,\n data = _this$props3.data;\n var _this$state6 = _this.state,\n offset = _this$state6.offset,\n dataStartIndex = _this$state6.dataStartIndex,\n dataEndIndex = _this$state6.dataEndIndex,\n updateId = _this$state6.updateId; // TODO: update brush when children update\n\n return /*#__PURE__*/cloneElement(element, {\n key: element.key || '_recharts-brush',\n onChange: combineEventHandlers(_this.handleBrushChange, null, element.props.onChange),\n data: data,\n x: isNumber(element.props.x) ? element.props.x : offset.left,\n y: isNumber(element.props.y) ? element.props.y : offset.top + offset.height + offset.brushBottom - (margin.bottom || 0),\n width: isNumber(element.props.width) ? element.props.width : offset.width,\n startIndex: dataStartIndex,\n endIndex: dataEndIndex,\n updateId: \"brush-\".concat(updateId)\n });\n };\n _this.renderReferenceElement = function (element, displayName, index) {\n if (!element) {\n return null;\n }\n var _assertThisInitialize = _assertThisInitialized(_this),\n clipPathId = _assertThisInitialize.clipPathId;\n var _this$state7 = _this.state,\n xAxisMap = _this$state7.xAxisMap,\n yAxisMap = _this$state7.yAxisMap,\n offset = _this$state7.offset;\n var _element$props2 = element.props,\n xAxisId = _element$props2.xAxisId,\n yAxisId = _element$props2.yAxisId;\n return /*#__PURE__*/cloneElement(element, {\n key: element.key || \"\".concat(displayName, \"-\").concat(index),\n xAxis: xAxisMap[xAxisId],\n yAxis: yAxisMap[yAxisId],\n viewBox: {\n x: offset.left,\n y: offset.top,\n width: offset.width,\n height: offset.height\n },\n clipPathId: clipPathId\n });\n };\n _this.renderActivePoints = function (_ref12) {\n var item = _ref12.item,\n activePoint = _ref12.activePoint,\n basePoint = _ref12.basePoint,\n childIndex = _ref12.childIndex,\n isRange = _ref12.isRange;\n var result = [];\n var key = item.props.key;\n var _item$item$props = item.item.props,\n activeDot = _item$item$props.activeDot,\n dataKey = _item$item$props.dataKey;\n var dotProps = _objectSpread(_objectSpread({\n index: childIndex,\n dataKey: dataKey,\n cx: activePoint.x,\n cy: activePoint.y,\n r: 4,\n fill: getMainColorOfGraphicItem(item.item),\n strokeWidth: 2,\n stroke: '#fff',\n payload: activePoint.payload,\n value: activePoint.value,\n key: \"\".concat(key, \"-activePoint-\").concat(childIndex)\n }, filterProps(activeDot)), adaptEventHandlers(activeDot));\n result.push(CategoricalChartWrapper.renderActiveDot(activeDot, dotProps));\n if (basePoint) {\n result.push(CategoricalChartWrapper.renderActiveDot(activeDot, _objectSpread(_objectSpread({}, dotProps), {}, {\n cx: basePoint.x,\n cy: basePoint.y,\n key: \"\".concat(key, \"-basePoint-\").concat(childIndex)\n })));\n } else if (isRange) {\n result.push(null);\n }\n return result;\n };\n _this.renderGraphicChild = function (element, displayName, index) {\n var item = _this.filterFormatItem(element, displayName, index);\n if (!item) {\n return null;\n }\n var tooltipEventType = _this.getTooltipEventType();\n var _this$state8 = _this.state,\n isTooltipActive = _this$state8.isTooltipActive,\n tooltipAxis = _this$state8.tooltipAxis,\n activeTooltipIndex = _this$state8.activeTooltipIndex,\n activeLabel = _this$state8.activeLabel;\n var children = _this.props.children;\n var tooltipItem = findChildByType(children, Tooltip.displayName);\n var _item$props2 = item.props,\n points = _item$props2.points,\n isRange = _item$props2.isRange,\n baseLine = _item$props2.baseLine;\n var _item$item$props2 = item.item.props,\n activeDot = _item$item$props2.activeDot,\n hide = _item$item$props2.hide;\n var hasActive = !hide && isTooltipActive && tooltipItem && activeDot && activeTooltipIndex >= 0;\n var itemEvents = {};\n if (tooltipEventType !== 'axis' && tooltipItem && tooltipItem.props.trigger === 'click') {\n itemEvents = {\n onClick: combineEventHandlers(_this.handleItemMouseEnter, null, element.props.onCLick)\n };\n } else if (tooltipEventType !== 'axis') {\n itemEvents = {\n onMouseLeave: combineEventHandlers(_this.handleItemMouseLeave, null, element.props.onMouseLeave),\n onMouseEnter: combineEventHandlers(_this.handleItemMouseEnter, null, element.props.onMouseEnter)\n };\n }\n var graphicalItem = /*#__PURE__*/cloneElement(element, _objectSpread(_objectSpread({}, item.props), itemEvents));\n function findWithPayload(entry) {\n // TODO needs to verify dataKey is Function\n return typeof tooltipAxis.dataKey === 'function' ? tooltipAxis.dataKey(entry.payload) : null;\n }\n if (hasActive) {\n var activePoint, basePoint;\n if (tooltipAxis.dataKey && !tooltipAxis.allowDuplicatedCategory) {\n // number transform to string\n var specifiedKey = typeof tooltipAxis.dataKey === 'function' ? findWithPayload : 'payload.'.concat(tooltipAxis.dataKey.toString());\n activePoint = findEntryInArray(points, specifiedKey, activeLabel);\n basePoint = isRange && baseLine && findEntryInArray(baseLine, specifiedKey, activeLabel);\n } else {\n activePoint = points[activeTooltipIndex];\n basePoint = isRange && baseLine && baseLine[activeTooltipIndex];\n }\n if (!_isNil(activePoint)) {\n return [graphicalItem].concat(_toConsumableArray(_this.renderActivePoints({\n item: item,\n activePoint: activePoint,\n basePoint: basePoint,\n childIndex: activeTooltipIndex,\n isRange: isRange\n })));\n }\n }\n if (isRange) {\n return [graphicalItem, null, null];\n }\n return [graphicalItem, null];\n };\n _this.renderCustomized = function (element, displayName, index) {\n return /*#__PURE__*/cloneElement(element, _objectSpread(_objectSpread({\n key: \"recharts-customized-\".concat(index)\n }, _this.props), _this.state));\n };\n _this.uniqueChartId = _isNil(_props.id) ? uniqueId('recharts') : _props.id;\n _this.clipPathId = \"\".concat(_this.uniqueChartId, \"-clip\");\n if (_props.throttleDelay) {\n _this.triggeredAfterMouseMove = _throttle(_this.triggeredAfterMouseMove, _props.throttleDelay);\n }\n _this.state = {};\n return _this;\n }\n /* eslint-disable react/no-did-mount-set-state */\n\n _createClass(CategoricalChartWrapper, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n if (!_isNil(this.props.syncId)) {\n this.addListener();\n }\n }\n }, {\n key: \"componentDidUpdate\",\n value: function componentDidUpdate(prevProps) {\n // add syncId\n if (_isNil(prevProps.syncId) && !_isNil(this.props.syncId)) {\n this.addListener();\n } // remove syncId\n\n if (!_isNil(prevProps.syncId) && _isNil(this.props.syncId)) {\n this.removeListener();\n }\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n this.clearDeferId();\n if (!_isNil(this.props.syncId)) {\n this.removeListener();\n }\n this.cancelThrottledTriggerAfterMouseMove();\n }\n }, {\n key: \"cancelThrottledTriggerAfterMouseMove\",\n value: function cancelThrottledTriggerAfterMouseMove() {\n if (typeof this.triggeredAfterMouseMove.cancel === 'function') {\n this.triggeredAfterMouseMove.cancel();\n }\n }\n }, {\n key: \"getTooltipEventType\",\n value: function getTooltipEventType() {\n var tooltipItem = findChildByType(this.props.children, Tooltip.displayName);\n if (tooltipItem && _isBoolean(tooltipItem.props.shared)) {\n var eventType = tooltipItem.props.shared ? 'axis' : 'item';\n return validateTooltipEventTypes.indexOf(eventType) >= 0 ? eventType : defaultTooltipEventType;\n }\n return defaultTooltipEventType;\n }\n /**\n * Get the information of mouse in chart, return null when the mouse is not in the chart\n * @param {Object} event The event object\n * @return {Object} Mouse data\n */\n }, {\n key: \"getMouseInfo\",\n value: function getMouseInfo(event) {\n if (!this.container) {\n return null;\n }\n var containerOffset = getOffset(this.container);\n var e = calculateChartCoordinate(event, containerOffset);\n var rangeObj = this.inRange(e.chartX, e.chartY);\n if (!rangeObj) {\n return null;\n }\n var _this$state9 = this.state,\n xAxisMap = _this$state9.xAxisMap,\n yAxisMap = _this$state9.yAxisMap;\n var tooltipEventType = this.getTooltipEventType();\n if (tooltipEventType !== 'axis' && xAxisMap && yAxisMap) {\n var xScale = getAnyElementOfObject(xAxisMap).scale;\n var yScale = getAnyElementOfObject(yAxisMap).scale;\n var xValue = xScale && xScale.invert ? xScale.invert(e.chartX) : null;\n var yValue = yScale && yScale.invert ? yScale.invert(e.chartY) : null;\n return _objectSpread(_objectSpread({}, e), {}, {\n xValue: xValue,\n yValue: yValue\n });\n }\n var toolTipData = getTooltipData(this.state, this.props.data, this.props.layout, rangeObj);\n if (toolTipData) {\n return _objectSpread(_objectSpread({}, e), toolTipData);\n }\n return null;\n }\n }, {\n key: \"getCursorRectangle\",\n value: function getCursorRectangle() {\n var layout = this.props.layout;\n var _this$state10 = this.state,\n activeCoordinate = _this$state10.activeCoordinate,\n offset = _this$state10.offset,\n tooltipAxisBandSize = _this$state10.tooltipAxisBandSize;\n var halfSize = tooltipAxisBandSize / 2;\n return {\n stroke: 'none',\n fill: '#ccc',\n x: layout === 'horizontal' ? activeCoordinate.x - halfSize : offset.left + 0.5,\n y: layout === 'horizontal' ? offset.top + 0.5 : activeCoordinate.y - halfSize,\n width: layout === 'horizontal' ? tooltipAxisBandSize : offset.width - 1,\n height: layout === 'horizontal' ? offset.height - 1 : tooltipAxisBandSize\n };\n }\n }, {\n key: \"getCursorPoints\",\n value: function getCursorPoints() {\n var layout = this.props.layout;\n var _this$state11 = this.state,\n activeCoordinate = _this$state11.activeCoordinate,\n offset = _this$state11.offset;\n var x1, y1, x2, y2;\n if (layout === 'horizontal') {\n x1 = activeCoordinate.x;\n x2 = x1;\n y1 = offset.top;\n y2 = offset.top + offset.height;\n } else if (layout === 'vertical') {\n y1 = activeCoordinate.y;\n y2 = y1;\n x1 = offset.left;\n x2 = offset.left + offset.width;\n } else if (!_isNil(activeCoordinate.cx) || !_isNil(activeCoordinate.cy)) {\n if (layout === 'centric') {\n var cx = activeCoordinate.cx,\n cy = activeCoordinate.cy,\n innerRadius = activeCoordinate.innerRadius,\n outerRadius = activeCoordinate.outerRadius,\n angle = activeCoordinate.angle;\n var innerPoint = polarToCartesian(cx, cy, innerRadius, angle);\n var outerPoint = polarToCartesian(cx, cy, outerRadius, angle);\n x1 = innerPoint.x;\n y1 = innerPoint.y;\n x2 = outerPoint.x;\n y2 = outerPoint.y;\n } else {\n var _cx = activeCoordinate.cx,\n _cy = activeCoordinate.cy,\n radius = activeCoordinate.radius,\n startAngle = activeCoordinate.startAngle,\n endAngle = activeCoordinate.endAngle;\n var startPoint = polarToCartesian(_cx, _cy, radius, startAngle);\n var endPoint = polarToCartesian(_cx, _cy, radius, endAngle);\n return {\n points: [startPoint, endPoint],\n cx: _cx,\n cy: _cy,\n radius: radius,\n startAngle: startAngle,\n endAngle: endAngle\n };\n }\n }\n return [{\n x: x1,\n y: y1\n }, {\n x: x2,\n y: y2\n }];\n }\n }, {\n key: \"inRange\",\n value: function inRange(x, y) {\n var layout = this.props.layout;\n if (layout === 'horizontal' || layout === 'vertical') {\n var offset = this.state.offset;\n var isInRange = x >= offset.left && x <= offset.left + offset.width && y >= offset.top && y <= offset.top + offset.height;\n return isInRange ? {\n x: x,\n y: y\n } : null;\n }\n var _this$state12 = this.state,\n angleAxisMap = _this$state12.angleAxisMap,\n radiusAxisMap = _this$state12.radiusAxisMap;\n if (angleAxisMap && radiusAxisMap) {\n var angleAxis = getAnyElementOfObject(angleAxisMap);\n return inRangeOfSector({\n x: x,\n y: y\n }, angleAxis);\n }\n return null;\n }\n }, {\n key: \"parseEventsOfWrapper\",\n value: function parseEventsOfWrapper() {\n var children = this.props.children;\n var tooltipEventType = this.getTooltipEventType();\n var tooltipItem = findChildByType(children, Tooltip.displayName);\n var tooltipEvents = {};\n if (tooltipItem && tooltipEventType === 'axis') {\n if (tooltipItem.props.trigger === 'click') {\n tooltipEvents = {\n onClick: this.handleClick\n };\n } else {\n tooltipEvents = {\n onMouseEnter: this.handleMouseEnter,\n onMouseMove: this.handleMouseMove,\n onMouseLeave: this.handleMouseLeave,\n onTouchMove: this.handleTouchMove,\n onTouchStart: this.handleTouchStart,\n onTouchEnd: this.handleTouchEnd\n };\n }\n }\n var outerEvents = adaptEventHandlers(this.props, this.handleOuterEvent);\n return _objectSpread(_objectSpread({}, outerEvents), tooltipEvents);\n }\n /* eslint-disable no-underscore-dangle */\n }, {\n key: \"addListener\",\n value: function addListener() {\n eventCenter.on(SYNC_EVENT, this.handleReceiveSyncEvent);\n if (eventCenter.setMaxListeners && eventCenter._maxListeners) {\n eventCenter.setMaxListeners(eventCenter._maxListeners + 1);\n }\n }\n }, {\n key: \"removeListener\",\n value: function removeListener() {\n eventCenter.removeListener(SYNC_EVENT, this.handleReceiveSyncEvent);\n if (eventCenter.setMaxListeners && eventCenter._maxListeners) {\n eventCenter.setMaxListeners(eventCenter._maxListeners - 1);\n }\n }\n }, {\n key: \"triggerSyncEvent\",\n value: function triggerSyncEvent(data) {\n var syncId = this.props.syncId;\n if (!_isNil(syncId)) {\n eventCenter.emit(SYNC_EVENT, syncId, this.uniqueChartId, data);\n }\n }\n }, {\n key: \"applySyncEvent\",\n value: function applySyncEvent(data) {\n var _this$props4 = this.props,\n layout = _this$props4.layout,\n syncMethod = _this$props4.syncMethod;\n var updateId = this.state.updateId;\n var dataStartIndex = data.dataStartIndex,\n dataEndIndex = data.dataEndIndex;\n if (!_isNil(data.dataStartIndex) || !_isNil(data.dataEndIndex)) {\n this.setState(_objectSpread({\n dataStartIndex: dataStartIndex,\n dataEndIndex: dataEndIndex\n }, updateStateOfAxisMapsOffsetAndStackGroups({\n props: this.props,\n dataStartIndex: dataStartIndex,\n dataEndIndex: dataEndIndex,\n updateId: updateId\n }, this.state)));\n } else if (!_isNil(data.activeTooltipIndex)) {\n var chartX = data.chartX,\n chartY = data.chartY;\n var activeTooltipIndex = data.activeTooltipIndex;\n var _this$state13 = this.state,\n offset = _this$state13.offset,\n tooltipTicks = _this$state13.tooltipTicks;\n if (!offset) {\n return;\n }\n if (typeof syncMethod === 'function') {\n // Call a callback function. If there is an application specific algorithm\n activeTooltipIndex = syncMethod(tooltipTicks, data);\n } else if (syncMethod === 'value') {\n // Set activeTooltipIndex to the index with the same value as data.activeLabel\n // For loop instead of findIndex because the latter is very slow in some browsers\n activeTooltipIndex = -1; // in case we cannot find the element\n\n for (var i = 0; i < tooltipTicks.length; i++) {\n if (tooltipTicks[i].value === data.activeLabel) {\n activeTooltipIndex = i;\n break;\n }\n }\n }\n var viewBox = _objectSpread(_objectSpread({}, offset), {}, {\n x: offset.left,\n y: offset.top\n }); // When a categotical chart is combined with another chart, the value of chartX\n // and chartY may beyond the boundaries.\n\n var validateChartX = Math.min(chartX, viewBox.x + viewBox.width);\n var validateChartY = Math.min(chartY, viewBox.y + viewBox.height);\n var activeLabel = tooltipTicks[activeTooltipIndex] && tooltipTicks[activeTooltipIndex].value;\n var activePayload = getTooltipContent(this.state, this.props.data, activeTooltipIndex);\n var activeCoordinate = tooltipTicks[activeTooltipIndex] ? {\n x: layout === 'horizontal' ? tooltipTicks[activeTooltipIndex].coordinate : validateChartX,\n y: layout === 'horizontal' ? validateChartY : tooltipTicks[activeTooltipIndex].coordinate\n } : originCoordinate;\n this.setState(_objectSpread(_objectSpread({}, data), {}, {\n activeLabel: activeLabel,\n activeCoordinate: activeCoordinate,\n activePayload: activePayload,\n activeTooltipIndex: activeTooltipIndex\n }));\n } else {\n this.setState(data);\n }\n }\n }, {\n key: \"filterFormatItem\",\n value: function filterFormatItem(item, displayName, childIndex) {\n var formattedGraphicalItems = this.state.formattedGraphicalItems;\n for (var i = 0, len = formattedGraphicalItems.length; i < len; i++) {\n var entry = formattedGraphicalItems[i];\n if (entry.item === item || entry.props.key === item.key || displayName === getDisplayName(entry.item.type) && childIndex === entry.childIndex) {\n return entry;\n }\n }\n return null;\n }\n }, {\n key: \"renderAxis\",\n value:\n /**\n * Draw axis\n * @param {Object} axisOptions The options of axis\n * @param {Object} element The axis element\n * @param {String} displayName The display name of axis\n * @param {Number} index The index of element\n * @return {ReactElement} The instance of x-axes\n */\n function renderAxis(axisOptions, element, displayName, index) {\n var _this$props5 = this.props,\n width = _this$props5.width,\n height = _this$props5.height;\n return /*#__PURE__*/React.createElement(CartesianAxis, _extends({}, axisOptions, {\n className: \"recharts-\".concat(axisOptions.axisType, \" \").concat(axisOptions.axisType),\n key: element.key || \"\".concat(displayName, \"-\").concat(index),\n viewBox: {\n x: 0,\n y: 0,\n width: width,\n height: height\n },\n ticksGenerator: this.axesTicksGenerator\n }));\n }\n /**\n * Draw grid\n * @param {ReactElement} element the grid item\n * @return {ReactElement} The instance of grid\n */\n }, {\n key: \"renderClipPath\",\n value: function renderClipPath() {\n var clipPathId = this.clipPathId;\n var _this$state$offset = this.state.offset,\n left = _this$state$offset.left,\n top = _this$state$offset.top,\n height = _this$state$offset.height,\n width = _this$state$offset.width;\n return /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"clipPath\", {\n id: clipPathId\n }, /*#__PURE__*/React.createElement(\"rect\", {\n x: left,\n y: top,\n height: height,\n width: width\n })));\n }\n }, {\n key: \"getXScales\",\n value: function getXScales() {\n var xAxisMap = this.state.xAxisMap;\n return xAxisMap ? Object.entries(xAxisMap).reduce(function (res, _ref13) {\n var _ref14 = _slicedToArray(_ref13, 2),\n axisId = _ref14[0],\n axisProps = _ref14[1];\n return _objectSpread(_objectSpread({}, res), {}, _defineProperty({}, axisId, axisProps.scale));\n }, {}) : null;\n }\n }, {\n key: \"getYScales\",\n value: function getYScales() {\n var yAxisMap = this.state.yAxisMap;\n return yAxisMap ? Object.entries(yAxisMap).reduce(function (res, _ref15) {\n var _ref16 = _slicedToArray(_ref15, 2),\n axisId = _ref16[0],\n axisProps = _ref16[1];\n return _objectSpread(_objectSpread({}, res), {}, _defineProperty({}, axisId, axisProps.scale));\n }, {}) : null;\n }\n }, {\n key: \"getXScaleByAxisId\",\n value: function getXScaleByAxisId(axisId) {\n var _this$state$xAxisMap, _this$state$xAxisMap$;\n return (_this$state$xAxisMap = this.state.xAxisMap) === null || _this$state$xAxisMap === void 0 ? void 0 : (_this$state$xAxisMap$ = _this$state$xAxisMap[axisId]) === null || _this$state$xAxisMap$ === void 0 ? void 0 : _this$state$xAxisMap$.scale;\n }\n }, {\n key: \"getYScaleByAxisId\",\n value: function getYScaleByAxisId(axisId) {\n var _this$state$yAxisMap, _this$state$yAxisMap$;\n return (_this$state$yAxisMap = this.state.yAxisMap) === null || _this$state$yAxisMap === void 0 ? void 0 : (_this$state$yAxisMap$ = _this$state$yAxisMap[axisId]) === null || _this$state$yAxisMap$ === void 0 ? void 0 : _this$state$yAxisMap$.scale;\n }\n }, {\n key: \"getItemByXY\",\n value: function getItemByXY(chartXY) {\n var formattedGraphicalItems = this.state.formattedGraphicalItems;\n if (formattedGraphicalItems && formattedGraphicalItems.length) {\n for (var i = 0, len = formattedGraphicalItems.length; i < len; i++) {\n var graphicalItem = formattedGraphicalItems[i];\n var props = graphicalItem.props,\n item = graphicalItem.item;\n var itemDisplayName = getDisplayName(item.type);\n if (itemDisplayName === 'Bar') {\n var activeBarItem = (props.data || []).find(function (entry) {\n return isInRectangle(chartXY, entry);\n });\n if (activeBarItem) {\n return {\n graphicalItem: graphicalItem,\n payload: activeBarItem\n };\n }\n } else if (itemDisplayName === 'RadialBar') {\n var _activeBarItem = (props.data || []).find(function (entry) {\n return inRangeOfSector(chartXY, entry);\n });\n if (_activeBarItem) {\n return {\n graphicalItem: graphicalItem,\n payload: _activeBarItem\n };\n }\n }\n }\n }\n return null;\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this2 = this;\n if (!validateWidthHeight(this)) {\n return null;\n }\n var _this$props6 = this.props,\n children = _this$props6.children,\n className = _this$props6.className,\n width = _this$props6.width,\n height = _this$props6.height,\n style = _this$props6.style,\n compact = _this$props6.compact,\n title = _this$props6.title,\n desc = _this$props6.desc,\n others = _objectWithoutProperties(_this$props6, [\"children\", \"className\", \"width\", \"height\", \"style\", \"compact\", \"title\", \"desc\"]);\n var attrs = filterProps(others);\n var map = {\n CartesianGrid: {\n handler: this.renderGrid,\n once: true\n },\n ReferenceArea: {\n handler: this.renderReferenceElement\n },\n ReferenceLine: {\n handler: this.renderReferenceElement\n },\n ReferenceDot: {\n handler: this.renderReferenceElement\n },\n XAxis: {\n handler: this.renderXAxis\n },\n YAxis: {\n handler: this.renderYAxis\n },\n Brush: {\n handler: this.renderBrush,\n once: true\n },\n Bar: {\n handler: this.renderGraphicChild\n },\n Line: {\n handler: this.renderGraphicChild\n },\n Area: {\n handler: this.renderGraphicChild\n },\n Radar: {\n handler: this.renderGraphicChild\n },\n RadialBar: {\n handler: this.renderGraphicChild\n },\n Scatter: {\n handler: this.renderGraphicChild\n },\n Pie: {\n handler: this.renderGraphicChild\n },\n Funnel: {\n handler: this.renderGraphicChild\n },\n Tooltip: {\n handler: this.renderCursor,\n once: true\n },\n PolarGrid: {\n handler: this.renderPolarGrid,\n once: true\n },\n PolarAngleAxis: {\n handler: this.renderPolarAxis\n },\n PolarRadiusAxis: {\n handler: this.renderPolarAxis\n },\n Customized: {\n handler: this.renderCustomized\n }\n }; // The \"compact\" mode is mainly used as the panorama within Brush\n\n if (compact) {\n return /*#__PURE__*/React.createElement(Surface, _extends({}, attrs, {\n width: width,\n height: height,\n title: title,\n desc: desc\n }), this.renderClipPath(), renderByOrder(children, map));\n }\n var events = this.parseEventsOfWrapper();\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n className: classNames('recharts-wrapper', className),\n style: _objectSpread({\n position: 'relative',\n cursor: 'default',\n width: width,\n height: height\n }, style)\n }, events, {\n ref: function ref(node) {\n _this2.container = node;\n }\n }), /*#__PURE__*/React.createElement(Surface, _extends({}, attrs, {\n width: width,\n height: height,\n title: title,\n desc: desc\n }), this.renderClipPath(), renderByOrder(children, map)), this.renderLegend(), this.renderTooltip());\n }\n }]);\n return CategoricalChartWrapper;\n }(Component), _class.displayName = chartName, _class.defaultProps = _objectSpread({\n layout: 'horizontal',\n stackOffset: 'none',\n barCategoryGap: '10%',\n barGap: 4,\n margin: {\n top: 5,\n right: 5,\n bottom: 5,\n left: 5\n },\n reverseStackOrder: false,\n syncMethod: 'index'\n }, defaultProps), _class.getDerivedStateFromProps = function (nextProps, prevState) {\n var data = nextProps.data,\n children = nextProps.children,\n width = nextProps.width,\n height = nextProps.height,\n layout = nextProps.layout,\n stackOffset = nextProps.stackOffset,\n margin = nextProps.margin;\n if (_isNil(prevState.updateId)) {\n var defaultState = createDefaultState(nextProps);\n return _objectSpread(_objectSpread(_objectSpread({}, defaultState), {}, {\n updateId: 0\n }, updateStateOfAxisMapsOffsetAndStackGroups(_objectSpread(_objectSpread({\n props: nextProps\n }, defaultState), {}, {\n updateId: 0\n }), prevState)), {}, {\n prevData: data,\n prevWidth: width,\n prevHeight: height,\n prevLayout: layout,\n prevStackOffset: stackOffset,\n prevMargin: margin,\n prevChildren: children\n });\n }\n if (data !== prevState.prevData || width !== prevState.prevWidth || height !== prevState.prevHeight || layout !== prevState.prevLayout || stackOffset !== prevState.prevStackOffset || !shallowEqual(margin, prevState.prevMargin)) {\n var _defaultState = createDefaultState(nextProps); // Fixes https://github.com/recharts/recharts/issues/2143\n\n var keepFromPrevState = {\n // (chartX, chartY) are (0,0) in default state, but we want to keep the last mouse position to avoid\n // any flickering\n chartX: prevState.chartX,\n chartY: prevState.chartY,\n // The tooltip should stay active when it was active in the previous render. If this is not\n // the case, the tooltip disappears and immediately re-appears, causing a flickering effect\n isTooltipActive: prevState.isTooltipActive\n };\n var updatesToState = _objectSpread(_objectSpread({}, getTooltipData(prevState, data, layout)), {}, {\n updateId: prevState.updateId + 1\n });\n var newState = _objectSpread(_objectSpread(_objectSpread({}, _defaultState), keepFromPrevState), updatesToState);\n return _objectSpread(_objectSpread(_objectSpread({}, newState), updateStateOfAxisMapsOffsetAndStackGroups(_objectSpread({\n props: nextProps\n }, newState), prevState)), {}, {\n prevData: data,\n prevWidth: width,\n prevHeight: height,\n prevLayout: layout,\n prevStackOffset: stackOffset,\n prevMargin: margin,\n prevChildren: children\n });\n }\n if (!isChildrenEqual(children, prevState.prevChildren)) {\n // update configuration in chilren\n var hasGlobalData = !_isNil(data);\n var newUpdateId = hasGlobalData ? prevState.updateId : prevState.updateId + 1;\n return _objectSpread(_objectSpread({\n updateId: newUpdateId\n }, updateStateOfAxisMapsOffsetAndStackGroups(_objectSpread(_objectSpread({\n props: nextProps\n }, prevState), {}, {\n updateId: newUpdateId\n }), prevState)), {}, {\n prevChildren: children\n });\n }\n return null;\n }, _class.renderActiveDot = function (option, props) {\n var dot;\n if ( /*#__PURE__*/isValidElement(option)) {\n dot = /*#__PURE__*/cloneElement(option, props);\n } else if (_isFunction(option)) {\n dot = option(props);\n } else {\n dot = /*#__PURE__*/React.createElement(Dot, props);\n }\n return /*#__PURE__*/React.createElement(Layer, {\n className: \"recharts-active-dot\",\n key: props.key\n }, dot);\n }, _temp;\n};","function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n}\nfunction _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n return _arr;\n}\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\n\n/**\n * @fileOverview Render a group of error bar\n */\nimport React from 'react';\nimport { Layer } from '../container/Layer';\nimport { filterProps } from '../util/types';\nexport function ErrorBar(props) {\n var offset = props.offset,\n layout = props.layout,\n width = props.width,\n dataKey = props.dataKey,\n data = props.data,\n dataPointFormatter = props.dataPointFormatter,\n xAxis = props.xAxis,\n yAxis = props.yAxis,\n others = _objectWithoutProperties(props, [\"offset\", \"layout\", \"width\", \"dataKey\", \"data\", \"dataPointFormatter\", \"xAxis\", \"yAxis\"]);\n var svgProps = filterProps(others);\n var errorBars = data.map(function (entry, i) {\n var _dataPointFormatter = dataPointFormatter(entry, dataKey),\n x = _dataPointFormatter.x,\n y = _dataPointFormatter.y,\n value = _dataPointFormatter.value,\n errorVal = _dataPointFormatter.errorVal;\n if (!errorVal) {\n return null;\n }\n var lineCoordinates = [];\n var lowBound, highBound;\n if (Array.isArray(errorVal)) {\n var _errorVal = _slicedToArray(errorVal, 2);\n lowBound = _errorVal[0];\n highBound = _errorVal[1];\n } else {\n lowBound = highBound = errorVal;\n }\n if (layout === 'vertical') {\n // error bar for horizontal charts, the y is fixed, x is a range value\n var scale = xAxis.scale;\n var yMid = y + offset;\n var yMin = yMid + width;\n var yMax = yMid - width;\n var xMin = scale(value - lowBound);\n var xMax = scale(value + highBound); // the right line of |--|\n\n lineCoordinates.push({\n x1: xMax,\n y1: yMin,\n x2: xMax,\n y2: yMax\n }); // the middle line of |--|\n\n lineCoordinates.push({\n x1: xMin,\n y1: yMid,\n x2: xMax,\n y2: yMid\n }); // the left line of |--|\n\n lineCoordinates.push({\n x1: xMin,\n y1: yMin,\n x2: xMin,\n y2: yMax\n });\n } else if (layout === 'horizontal') {\n // error bar for horizontal charts, the x is fixed, y is a range value\n var _scale = yAxis.scale;\n var xMid = x + offset;\n var _xMin = xMid - width;\n var _xMax = xMid + width;\n var _yMin = _scale(value - lowBound);\n var _yMax = _scale(value + highBound); // the top line\n\n lineCoordinates.push({\n x1: _xMin,\n y1: _yMax,\n x2: _xMax,\n y2: _yMax\n }); // the middle line\n\n lineCoordinates.push({\n x1: xMid,\n y1: _yMin,\n x2: xMid,\n y2: _yMax\n }); // the bottom line\n\n lineCoordinates.push({\n x1: _xMin,\n y1: _yMin,\n x2: _xMax,\n y2: _yMin\n });\n }\n return /*#__PURE__*/(\n // eslint-disable-next-line react/no-array-index-key\n React.createElement(Layer, _extends({\n className: \"recharts-errorBar\",\n key: \"bar-\".concat(i)\n }, svgProps), lineCoordinates.map(function (coordinates, index) {\n return /*#__PURE__*/(\n // eslint-disable-next-line react/no-array-index-key\n React.createElement(\"line\", _extends({}, coordinates, {\n key: \"line-\".concat(index)\n }))\n );\n }))\n );\n });\n return /*#__PURE__*/React.createElement(Layer, {\n className: \"recharts-errorBars\"\n }, errorBars);\n}\nErrorBar.defaultProps = {\n stroke: 'black',\n strokeWidth: 1.5,\n width: 5,\n offset: 0,\n layout: 'horizontal'\n};\nErrorBar.displayName = 'ErrorBar';","/**\n * @fileOverview Cross\n */\nexport var Cell = function Cell(_props) {\n return null;\n};\nCell.displayName = 'Cell';","import _isObject from \"lodash/isObject\";\nimport _isFunction from \"lodash/isFunction\";\nimport _isNil from \"lodash/isNil\";\nimport _last from \"lodash/last\";\nimport _isArray from \"lodash/isArray\";\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n return arr2;\n}\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nimport React, { cloneElement } from 'react';\nimport { Label } from './Label';\nimport { Layer } from '../container/Layer';\nimport { findAllByType } from '../util/ReactUtils';\nimport { getValueByDataKey } from '../util/ChartUtils';\nimport { filterProps } from '../util/types';\nvar defaultProps = {\n valueAccessor: function valueAccessor(entry) {\n return _isArray(entry.value) ? _last(entry.value) : entry.value;\n }\n};\nexport function LabelList(props) {\n var data = props.data,\n valueAccessor = props.valueAccessor,\n dataKey = props.dataKey,\n clockWise = props.clockWise,\n id = props.id,\n textBreakAll = props.textBreakAll,\n others = _objectWithoutProperties(props, [\"data\", \"valueAccessor\", \"dataKey\", \"clockWise\", \"id\", \"textBreakAll\"]);\n if (!data || !data.length) {\n return null;\n }\n return /*#__PURE__*/React.createElement(Layer, {\n className: \"recharts-label-list\"\n }, data.map(function (entry, index) {\n var value = _isNil(dataKey) ? valueAccessor(entry, index) : getValueByDataKey(entry && entry.payload, dataKey);\n var idProps = _isNil(id) ? {} : {\n id: \"\".concat(id, \"-\").concat(index)\n };\n return /*#__PURE__*/React.createElement(Label, _extends({}, filterProps(entry, true), others, idProps, {\n parentViewBox: entry.parentViewBox,\n index: index,\n value: value,\n textBreakAll: textBreakAll,\n viewBox: Label.parseViewBox(_isNil(clockWise) ? entry : _objectSpread(_objectSpread({}, entry), {}, {\n clockWise: clockWise\n })),\n key: \"label-\".concat(index) // eslint-disable-line react/no-array-index-key\n }));\n }));\n}\n\nLabelList.displayName = 'LabelList';\nfunction parseLabelList(label, data) {\n if (!label) {\n return null;\n }\n if (label === true) {\n return /*#__PURE__*/React.createElement(LabelList, {\n key: \"labelList-implicit\",\n data: data\n });\n }\n if ( /*#__PURE__*/React.isValidElement(label) || _isFunction(label)) {\n return /*#__PURE__*/React.createElement(LabelList, {\n key: \"labelList-implicit\",\n data: data,\n content: label\n });\n }\n if (_isObject(label)) {\n return /*#__PURE__*/React.createElement(LabelList, _extends({\n data: data\n }, label, {\n key: \"labelList-implicit\"\n }));\n }\n return null;\n}\nfunction renderCallByParent(parentProps, data) {\n var ckeckPropsLabel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n if (!parentProps || !parentProps.children && ckeckPropsLabel && !parentProps.label) {\n return null;\n }\n var children = parentProps.children;\n var explicitChilren = findAllByType(children, LabelList.displayName).map(function (child, index) {\n return /*#__PURE__*/cloneElement(child, {\n data: data,\n key: \"labelList-\".concat(index)\n });\n });\n if (!ckeckPropsLabel) {\n return explicitChilren;\n }\n var implicitLabelList = parseLabelList(parentProps.label, data);\n return [implicitLabelList].concat(_toConsumableArray(explicitChilren));\n}\nLabelList.renderCallByParent = renderCallByParent;\nLabelList.defaultProps = defaultProps;","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n return _typeof(obj);\n}\nimport _isNil from \"lodash/isNil\";\nimport _isEqual from \"lodash/isEqual\";\nimport _isFunction from \"lodash/isFunction\";\nimport _isArray from \"lodash/isArray\";\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n return target;\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n}\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}\nfunction _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n return _possibleConstructorReturn(this, result);\n };\n}\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n return _assertThisInitialized(self);\n}\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}\nfunction _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\n/**\n * @fileOverview Render a group of bar\n */\nimport React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport Animate from 'react-smooth';\nimport { Rectangle } from '../shape/Rectangle';\nimport { Layer } from '../container/Layer';\nimport { ErrorBar } from './ErrorBar';\nimport { Cell } from '../component/Cell';\nimport { LabelList } from '../component/LabelList';\nimport { uniqueId, mathSign, interpolateNumber } from '../util/DataUtils';\nimport { findAllByType } from '../util/ReactUtils';\nimport { Global } from '../util/Global';\nimport { getCateCoordinateOfBar, getValueByDataKey, truncateByDomain, getBaseValueOfBar, findPositionOfBar, getTooltipItem } from '../util/ChartUtils';\nimport { filterProps, adaptEventsOfChild } from '../util/types';\nexport var Bar = /*#__PURE__*/function (_PureComponent) {\n _inherits(Bar, _PureComponent);\n var _super = _createSuper(Bar);\n function Bar() {\n var _this;\n _classCallCheck(this, Bar);\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n _this = _super.call.apply(_super, [this].concat(args));\n _this.state = {\n isAnimationFinished: false\n };\n _this.id = uniqueId('recharts-bar-');\n _this.handleAnimationEnd = function () {\n var onAnimationEnd = _this.props.onAnimationEnd;\n _this.setState({\n isAnimationFinished: true\n });\n if (onAnimationEnd) {\n onAnimationEnd();\n }\n };\n _this.handleAnimationStart = function () {\n var onAnimationStart = _this.props.onAnimationStart;\n _this.setState({\n isAnimationFinished: false\n });\n if (onAnimationStart) {\n onAnimationStart();\n }\n };\n return _this;\n }\n _createClass(Bar, [{\n key: \"renderRectanglesStatically\",\n value: function renderRectanglesStatically(data) {\n var _this2 = this;\n var shape = this.props.shape;\n var baseProps = filterProps(this.props);\n return data && data.map(function (entry, i) {\n var props = _objectSpread(_objectSpread(_objectSpread({}, baseProps), entry), {}, {\n index: i\n });\n return /*#__PURE__*/React.createElement(Layer, _extends({\n className: \"recharts-bar-rectangle\"\n }, adaptEventsOfChild(_this2.props, entry, i), {\n key: \"rectangle-\".concat(i) // eslint-disable-line react/no-array-index-key\n }), Bar.renderRectangle(shape, props));\n });\n }\n }, {\n key: \"renderRectanglesWithAnimation\",\n value: function renderRectanglesWithAnimation() {\n var _this3 = this;\n var _this$props = this.props,\n data = _this$props.data,\n layout = _this$props.layout,\n isAnimationActive = _this$props.isAnimationActive,\n animationBegin = _this$props.animationBegin,\n animationDuration = _this$props.animationDuration,\n animationEasing = _this$props.animationEasing,\n animationId = _this$props.animationId;\n var prevData = this.state.prevData;\n return /*#__PURE__*/React.createElement(Animate, {\n begin: animationBegin,\n duration: animationDuration,\n isActive: isAnimationActive,\n easing: animationEasing,\n from: {\n t: 0\n },\n to: {\n t: 1\n },\n key: \"bar-\".concat(animationId),\n onAnimationEnd: this.handleAnimationEnd,\n onAnimationStart: this.handleAnimationStart\n }, function (_ref) {\n var t = _ref.t;\n var stepData = data.map(function (entry, index) {\n var prev = prevData && prevData[index];\n if (prev) {\n var interpolatorX = interpolateNumber(prev.x, entry.x);\n var interpolatorY = interpolateNumber(prev.y, entry.y);\n var interpolatorWidth = interpolateNumber(prev.width, entry.width);\n var interpolatorHeight = interpolateNumber(prev.height, entry.height);\n return _objectSpread(_objectSpread({}, entry), {}, {\n x: interpolatorX(t),\n y: interpolatorY(t),\n width: interpolatorWidth(t),\n height: interpolatorHeight(t)\n });\n }\n if (layout === 'horizontal') {\n var _interpolatorHeight = interpolateNumber(0, entry.height);\n var h = _interpolatorHeight(t);\n return _objectSpread(_objectSpread({}, entry), {}, {\n y: entry.y + entry.height - h,\n height: h\n });\n }\n var interpolator = interpolateNumber(0, entry.width);\n var w = interpolator(t);\n return _objectSpread(_objectSpread({}, entry), {}, {\n width: w\n });\n });\n return /*#__PURE__*/React.createElement(Layer, null, _this3.renderRectanglesStatically(stepData));\n });\n }\n }, {\n key: \"renderRectangles\",\n value: function renderRectangles() {\n var _this$props2 = this.props,\n data = _this$props2.data,\n isAnimationActive = _this$props2.isAnimationActive;\n var prevData = this.state.prevData;\n if (isAnimationActive && data && data.length && (!prevData || !_isEqual(prevData, data))) {\n return this.renderRectanglesWithAnimation();\n }\n return this.renderRectanglesStatically(data);\n }\n }, {\n key: \"renderBackground\",\n value: function renderBackground() {\n var _this4 = this;\n var data = this.props.data;\n var backgroundProps = filterProps(this.props.background);\n return data.map(function (entry, i) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var value = entry.value,\n background = entry.background,\n rest = _objectWithoutProperties(entry, [\"value\", \"background\"]);\n if (!background) {\n return null;\n }\n var props = _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({}, rest), {}, {\n fill: '#eee'\n }, background), backgroundProps), adaptEventsOfChild(_this4.props, entry, i)), {}, {\n index: i,\n key: \"background-bar-\".concat(i),\n className: 'recharts-bar-background-rectangle'\n });\n return Bar.renderRectangle(_this4.props.background, props);\n });\n }\n }, {\n key: \"renderErrorBar\",\n value: function renderErrorBar() {\n if (this.props.isAnimationActive && !this.state.isAnimationFinished) {\n return null;\n }\n var _this$props3 = this.props,\n data = _this$props3.data,\n xAxis = _this$props3.xAxis,\n yAxis = _this$props3.yAxis,\n layout = _this$props3.layout,\n children = _this$props3.children;\n var errorBarItems = findAllByType(children, ErrorBar.displayName);\n if (!errorBarItems) {\n return null;\n }\n var offset = layout === 'vertical' ? data[0].height / 2 : data[0].width / 2;\n function dataPointFormatter(dataPoint, dataKey) {\n return {\n x: dataPoint.x,\n y: dataPoint.y,\n value: dataPoint.value,\n errorVal: getValueByDataKey(dataPoint, dataKey)\n };\n }\n return errorBarItems.map(function (item, i) {\n return /*#__PURE__*/React.cloneElement(item, {\n key: \"error-bar-\".concat(i),\n // eslint-disable-line react/no-array-index-key\n data: data,\n xAxis: xAxis,\n yAxis: yAxis,\n layout: layout,\n offset: offset,\n dataPointFormatter: dataPointFormatter\n });\n });\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this$props4 = this.props,\n hide = _this$props4.hide,\n data = _this$props4.data,\n className = _this$props4.className,\n xAxis = _this$props4.xAxis,\n yAxis = _this$props4.yAxis,\n left = _this$props4.left,\n top = _this$props4.top,\n width = _this$props4.width,\n height = _this$props4.height,\n isAnimationActive = _this$props4.isAnimationActive,\n background = _this$props4.background,\n id = _this$props4.id;\n if (hide || !data || !data.length) {\n return null;\n }\n var isAnimationFinished = this.state.isAnimationFinished;\n var layerClass = classNames('recharts-bar', className);\n var needClip = xAxis && xAxis.allowDataOverflow || yAxis && yAxis.allowDataOverflow;\n var clipPathId = _isNil(id) ? this.id : id;\n return /*#__PURE__*/React.createElement(Layer, {\n className: layerClass\n }, needClip ? /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"clipPath\", {\n id: \"clipPath-\".concat(clipPathId)\n }, /*#__PURE__*/React.createElement(\"rect\", {\n x: left,\n y: top,\n width: width,\n height: height\n }))) : null, /*#__PURE__*/React.createElement(Layer, {\n className: \"recharts-bar-rectangles\",\n clipPath: needClip ? \"url(#clipPath-\".concat(clipPathId, \")\") : null\n }, background ? this.renderBackground() : null, this.renderRectangles()), this.renderErrorBar(), (!isAnimationActive || isAnimationFinished) && LabelList.renderCallByParent(this.props, data));\n }\n }], [{\n key: \"getDerivedStateFromProps\",\n value: function getDerivedStateFromProps(nextProps, prevState) {\n if (nextProps.animationId !== prevState.prevAnimationId) {\n return {\n prevAnimationId: nextProps.animationId,\n curData: nextProps.data,\n prevData: prevState.curData\n };\n }\n if (nextProps.data !== prevState.curData) {\n return {\n curData: nextProps.data\n };\n }\n return null;\n }\n }, {\n key: \"renderRectangle\",\n value: function renderRectangle(option, props) {\n var rectangle;\n if ( /*#__PURE__*/React.isValidElement(option)) {\n rectangle = /*#__PURE__*/React.cloneElement(option, props);\n } else if (_isFunction(option)) {\n rectangle = option(props);\n } else {\n rectangle = /*#__PURE__*/React.createElement(Rectangle, props);\n }\n return rectangle;\n }\n }]);\n return Bar;\n}(PureComponent);\nBar.displayName = 'Bar';\nBar.defaultProps = {\n xAxisId: 0,\n yAxisId: 0,\n legendType: 'rect',\n minPointSize: 0,\n hide: false,\n // data of bar\n data: [],\n layout: 'vertical',\n isAnimationActive: !Global.isSsr,\n animationBegin: 0,\n animationDuration: 400,\n animationEasing: 'ease'\n};\nBar.getComposedData = function (_ref2) {\n var props = _ref2.props,\n item = _ref2.item,\n barPosition = _ref2.barPosition,\n bandSize = _ref2.bandSize,\n xAxis = _ref2.xAxis,\n yAxis = _ref2.yAxis,\n xAxisTicks = _ref2.xAxisTicks,\n yAxisTicks = _ref2.yAxisTicks,\n stackedData = _ref2.stackedData,\n dataStartIndex = _ref2.dataStartIndex,\n displayedData = _ref2.displayedData,\n offset = _ref2.offset;\n var pos = findPositionOfBar(barPosition, item);\n if (!pos) {\n return null;\n }\n var layout = props.layout;\n var _item$props = item.props,\n dataKey = _item$props.dataKey,\n children = _item$props.children,\n minPointSize = _item$props.minPointSize;\n var numericAxis = layout === 'horizontal' ? yAxis : xAxis;\n var stackedDomain = stackedData ? numericAxis.scale.domain() : null;\n var baseValue = getBaseValueOfBar({\n numericAxis: numericAxis\n });\n var cells = findAllByType(children, Cell.displayName);\n var rects = displayedData.map(function (entry, index) {\n var value, x, y, width, height, background;\n if (stackedData) {\n value = truncateByDomain(stackedData[dataStartIndex + index], stackedDomain);\n } else {\n value = getValueByDataKey(entry, dataKey);\n if (!_isArray(value)) {\n value = [baseValue, value];\n }\n }\n if (layout === 'horizontal') {\n x = getCateCoordinateOfBar({\n axis: xAxis,\n ticks: xAxisTicks,\n bandSize: bandSize,\n offset: pos.offset,\n entry: entry,\n index: index\n });\n y = yAxis.scale(value[1]);\n width = pos.size;\n height = yAxis.scale(value[0]) - yAxis.scale(value[1]);\n background = {\n x: x,\n y: yAxis.y,\n width: width,\n height: yAxis.height\n };\n if (Math.abs(minPointSize) > 0 && Math.abs(height) < Math.abs(minPointSize)) {\n var delta = mathSign(height || minPointSize) * (Math.abs(minPointSize) - Math.abs(height));\n y -= delta;\n height += delta;\n }\n } else {\n x = xAxis.scale(value[0]);\n y = getCateCoordinateOfBar({\n axis: yAxis,\n ticks: yAxisTicks,\n bandSize: bandSize,\n offset: pos.offset,\n entry: entry,\n index: index\n });\n width = xAxis.scale(value[1]) - xAxis.scale(value[0]);\n height = pos.size;\n background = {\n x: xAxis.x,\n y: y,\n width: xAxis.width,\n height: height\n };\n if (Math.abs(minPointSize) > 0 && Math.abs(width) < Math.abs(minPointSize)) {\n var _delta = mathSign(width || minPointSize) * (Math.abs(minPointSize) - Math.abs(width));\n width += _delta;\n }\n }\n return _objectSpread(_objectSpread(_objectSpread({}, entry), {}, {\n x: x,\n y: y,\n width: width,\n height: height,\n value: stackedData ? value : value[1],\n payload: entry,\n background: background\n }, cells && cells[index] && cells[index].props), {}, {\n tooltipPayload: [getTooltipItem(item, entry)],\n tooltipPosition: {\n x: x + width / 2,\n y: y + height / 2\n }\n });\n });\n return _objectSpread({\n data: rects,\n layout: layout\n }, offset);\n};","/**\n * @fileOverview X Axis\n */\n\n/** Define of XAxis props */\nexport var XAxis = function XAxis() {\n return null;\n};\nXAxis.displayName = 'XAxis';\nXAxis.defaultProps = {\n allowDecimals: true,\n hide: false,\n orientation: 'bottom',\n width: 0,\n height: 30,\n mirror: false,\n xAxisId: 0,\n tickCount: 5,\n type: 'category',\n domain: [0, 'auto'],\n padding: {\n left: 0,\n right: 0\n },\n allowDataOverflow: false,\n scale: 'auto',\n reversed: false,\n allowDuplicatedCategory: true\n};","/**\n * @fileOverview Y Axis\n */\nexport var YAxis = function YAxis() {\n return null;\n};\nYAxis.displayName = 'YAxis';\nYAxis.defaultProps = {\n allowDuplicatedCategory: true,\n allowDecimals: true,\n hide: false,\n orientation: 'left',\n width: 60,\n height: 0,\n mirror: false,\n yAxisId: 0,\n tickCount: 5,\n type: 'number',\n domain: [0, 'auto'],\n padding: {\n top: 0,\n bottom: 0\n },\n allowDataOverflow: false,\n scale: 'auto',\n reversed: false\n};","/**\n * @fileOverview Bar Chart\n */\nimport { generateCategoricalChart } from './generateCategoricalChart';\nimport { Bar } from '../cartesian/Bar';\nimport { XAxis } from '../cartesian/XAxis';\nimport { YAxis } from '../cartesian/YAxis';\nimport { formatAxisMap } from '../util/CartesianUtils';\nexport var BarChart = generateCategoricalChart({\n chartName: 'BarChart',\n GraphicalChild: Bar,\n defaultTooltipEventType: 'axis',\n validateTooltipEventTypes: ['axis', 'item'],\n axisComponents: [{\n axisType: 'xAxis',\n AxisComp: XAxis\n }, {\n axisType: 'yAxis',\n AxisComp: YAxis\n }],\n formatAxisMap: formatAxisMap\n});","import React from \"react\"\nimport withSimpleErrorBoundary from \"../../util/withSimpleErrorBoundary\"\nimport styled from \"styled-components\"\nimport { SMALL_MEDIUM_BREAKPOINT } from \"../../util/constants\"\nimport { withTranslation } from \"react-i18next\"\n\nconst StyledTooltip = styled.div`\n background: white;\n border-radius: 0.25rem;\n padding: 0.5rem;\n p {\n margin-bottom: 0 !important;\n font-size: 0.9rem;\n }\n @media only screen and (max-width: ${SMALL_MEDIUM_BREAKPOINT}) {\n p {\n font-size: 0.75rem;\n }\n }\n`\n\nconst CustomTooltip = (props) => {\n if (!props.active) {\n return null\n }\n\n return (\n \n

\n {props.t(\"gotPoints\")}: {props.payload?.[0].payload.n_points}\n

\n

\n {props.t(\"maxPoints\")}: {props.payload?.[0].payload.max_points}\n

\n
\n )\n}\n\nexport default withTranslation(\"points-balloon\")(\n withSimpleErrorBoundary(CustomTooltip),\n)\n","import React from \"react\"\nimport withSimpleErrorBoundary from \"../../util/withSimpleErrorBoundary\"\nimport styled from \"styled-components\"\nimport { BarChart, Bar, XAxis, YAxis, LabelList, Tooltip } from \"recharts\"\nimport { improveGroupName } from \"../../util/strings\"\nimport CustomTooltip from \"./CustomTooltip\"\nimport { SMALL_MEDIUM_BREAKPOINT } from \"../../util/constants\"\nimport { withTranslation } from \"react-i18next\"\n\nconst PartProgressContainer = styled.div`\n margin-bottom: 0.5rem;\n`\n\n// eslint-disable-next-line no-unused-vars\nconst SmallP = styled.p`\n font-size: 0.8rem;\n`\n\n// eslint-disable-next-line no-unused-vars\nconst LargeP = styled.p`\n font-size: 1rem;\n`\n\nconst StyledBarChart = styled(BarChart)`\n margin: 0 auto;\n @media only screen and (max-width: ${SMALL_MEDIUM_BREAKPOINT}) {\n font-size: 0.75rem;\n }\n`\n\nconst CustomLabel = ({ x, y, stroke, value }) => {\n return (\n \n {value}%\n \n )\n}\n\nconst PartProgress = ({ name, data, appliesForStudyRight, t }) => {\n var BAR_CHART_WIDTH = 375\n var BAR_CHART_Y_AXIS_WIDTH = 152\n\n if (window.innerWidth < SMALL_MEDIUM_BREAKPOINT.slice(0, -2)) {\n BAR_CHART_WIDTH = 300\n BAR_CHART_Y_AXIS_WIDTH = 110\n }\n\n const allChartData = Object.entries(data).map(([tool, data]) => {\n return {\n tool,\n progress: Math.floor(data.progress * 100 + 0.000000001),\n n_points: data.n_points,\n max_points: data.max_points,\n }\n })\n let nPointsSum = 0\n let maxPointsSum = 0\n\n Object.entries(data).forEach(([_tool, data]) => {\n nPointsSum += data.n_points\n maxPointsSum += data.max_points\n })\n let totalProgress = Math.floor((nPointsSum / maxPointsSum) * 100) / 100\n let totalPointsHeader = t(\"totalPoints\")\n allChartData.push({\n tool: totalPointsHeader,\n progress: Math.floor(totalProgress * 100 + 0.000000001),\n n_points: nPointsSum,\n max_points: maxPointsSum,\n })\n return (\n \n {improveGroupName(name)}\n
\n \n } />\n \n \n \n \n \n \n {/* \n {t(\"canApplyForStudyRight\")}{\" \"}\n {\n allChartData.find((o) => o.tool === t(\"programmingService\"))\n ?.progress\n }\n %.\n */}\n {/* {CourseSettings.studyRightEnabled &&\n appliesForStudyRight &&\n (getCourseVariant() === \"nodl\" ? (\n {t(\"noTimelimit\")}\n ) : (\n \n {t(\"canApplyForStudyRight\")}{\" \"}\n {\n allChartData.find((o) => o.tool === t(\"programmingService\"))\n ?.progress\n }\n %.\n \n ))} */}\n
\n
\n )\n}\n\nexport default withTranslation(\"points-balloon\")(\n withSimpleErrorBoundary(PartProgress),\n)\n","import React from \"react\"\nimport PartProgress from \"./PartProgress\"\n\nconst splitCourses = false\nconst CourseProgress = ({\n data,\n appliesForStudyRight,\n currentCourseVariant,\n}) => {\n return (\n data &&\n (currentCourseVariant === \"ohja-dl\" ||\n currentCourseVariant === \"ohja-nodl\" ? (\n
\n

Ohjelmoinnin jatkokurssi

\n {Object.entries(data).map(([name, data]) => {\n return (\n \n )\n })}\n
\n ) : (\n
\n {splitCourses &&

Ohjelmoinnin perusteet

}\n {Object.entries(data).map(([name, data]) => {\n if (name === \"osa08\" && splitCourses) {\n return (\n
\n

Ohjelmoinnin jatkokurssi

\n \n
\n )\n } else {\n return (\n \n )\n }\n })}\n
\n ))\n )\n}\n\nexport default CourseProgress\n","import React, { Fragment } from \"react\"\nimport withSimpleErrorBoundary from \"../../util/withSimpleErrorBoundary\"\nimport { Modal, Paper, Button } from \"@material-ui/core\"\nimport styled from \"styled-components\"\nimport Loading from \"../Loading\"\nimport { fetchProgress } from \"../../services/progress\"\nimport { getCachedUserDetails } from \"../../services/moocfi\"\nimport { SMALL_MEDIUM_BREAKPOINT } from \"../../util/constants\"\nimport CourseProgress from \"./CourseProgress\"\nimport { withTranslation } from \"react-i18next\"\n\nconst StyledModal = styled(Modal)`\n z-index: 500 !important;\n`\n\nconst ModalContent = styled(Paper)`\n padding: 2rem;\n padding-top: 1rem;\n background-color: white;\n width: 100%;\n max-width: 450px;\n height: 700px;\n max-height: 90vh;\n overflow-y: scroll;\n position: fixed;\n right: 1.5rem;\n bottom: 1.5rem;\n z-index: 200 !important;\n font-size: 1rem;\n @media only screen and (max-width: ${SMALL_MEDIUM_BREAKPOINT}) {\n right: 0rem;\n bottom: 0rem;\n border-bottom-left-radius: 0 !important;\n border-bottom-right-radius: 0 !important;\n padding: 1rem;\n }\n`\n\nconst ModalControls = styled.div`\n width: 100%;\n display: flex;\n justify-content: space-between;\n`\n\nconst Title = styled.h1`\n font-size: 1.5rem;\n`\n\nclass PointsBalloonContent extends React.Component {\n state = {\n render: false,\n data: null,\n error: null,\n appliesForStudyRight: null,\n currentCourseVariant: null,\n }\n\n async componentDidMount() {\n this.setState({ render: true })\n try {\n let data = await fetchProgress(this.props.t)\n let userDetails = await getCachedUserDetails()\n const appliesForStudyRight =\n userDetails?.extra_fields?.applies_for_study_right === \"t\"\n const currentCourseVariant = userDetails?.extra_fields?.course_variant\n this.setState({ data, appliesForStudyRight, currentCourseVariant })\n } catch (e) {\n this.setState({ error: e.toString() })\n }\n }\n\n handleClose = () => {\n this.setState({\n data: null,\n error: null,\n })\n this.props.handleClose()\n }\n\n render() {\n return (\n \n \n \n {this.props.t(\"progress\")}\n \n \n \n \n {this.state.error ? (\n
\n {this.props.t(\"error\")} {this.state.error}\n
\n ) : (\n
\n \n
\n )}\n
\n
\n
\n \n )\n }\n}\n\nexport default withTranslation(\"points-balloon\")(\n withSimpleErrorBoundary(PointsBalloonContent),\n)\n","import React, { Fragment } from \"react\"\nimport LoginStateContext from \"../../contexes/LoginStateContext\"\nimport withSimpleErrorBoundary from \"../../util/withSimpleErrorBoundary\"\nimport styled from \"styled-components\"\n\nimport PointsBalloonBalloon from \"./PointsBalloonBalloon\"\nimport PointsBalloonContent from \"./PointsBalloonContent\"\n\nconst PointsBalloonContainer = styled.div`\n position: fixed;\n right: 1.5rem;\n bottom: 1.5rem;\n z-index: 50;\n`\n\nclass PointsBalloon extends React.Component {\n static contextType = LoginStateContext\n\n state = {\n render: false,\n open: false,\n }\n\n componentDidMount() {\n this.setState({ render: true })\n }\n\n onClick = () => {\n this.setState({ open: true })\n }\n\n onClose = () => {\n this.setState({ open: false })\n }\n\n render() {\n if (!this.state.render || !this.context.loggedIn) {\n return \n }\n return (\n \n {!this.state.open && }\n {this.state.open && (\n \n )}\n \n )\n }\n}\n\nexport default withSimpleErrorBoundary(PointsBalloon)\n","import React, { Fragment } from \"react\"\nimport \"../i18n\"\nimport Helmet from \"react-helmet\"\nimport Sidebar from \"../components/Sidebar\"\nimport ContentArea from \"../components/ContentArea\"\nimport TopBar from \"../components/TopBar\"\nimport { StaticQuery, graphql } from \"gatsby\"\n// import Pheromones from \"../util/pheromones\"\nimport styled from \"styled-components\"\nimport courseMetaData from \"../../course-metadata.json\"\nimport \"./reboot.css\"\nimport \"./theme.css\"\nimport \"./remark.css\"\nimport \"focus-visible\"\nimport \"typeface-open-sans\"\nimport \"typeface-roboto-slab\"\nimport \"typeface-roboto-mono\"\nimport \"@fortawesome/fontawesome-svg-core/styles.css\"\n\nimport { config as fontAwesomeConfig } from \"@fortawesome/fontawesome-svg-core\"\nimport Footer from \"../components/Footer\"\nimport PointsBalloon from \"../components/PointsBalloon\"\nimport {\n MEDIUM_SIDEBAR_WIDTH,\n LARGE_SIDEBAR_WIDTH,\n MEDIUM_LARGE_BREAKPOINT,\n SMALL_MEDIUM_BREAKPOINT,\n} from \"../util/constants\"\nimport withSimpleErrorBoundary from \"../util/withSimpleErrorBoundary\"\n\nfontAwesomeConfig.autoAddCss = false\n\nconst layoutQuery = graphql`\n query {\n title: site {\n siteMetadata {\n title\n }\n }\n }\n`\n\nconst Wrapper = styled.div`\n ${(props) =>\n props.mobileMenuOpen &&\n `\n height: 100vh;\n overflow: hidden;\n `}\n`\n\nconst SidebarPush = styled.div`\n @media only screen and (min-width: ${SMALL_MEDIUM_BREAKPOINT}) {\n margin-left: ${LARGE_SIDEBAR_WIDTH};\n }\n @media only screen and (max-width: ${MEDIUM_LARGE_BREAKPOINT}) {\n margin-left: ${MEDIUM_SIDEBAR_WIDTH};\n }\n @media only screen and (max-width: ${SMALL_MEDIUM_BREAKPOINT}) {\n margin-left: 0;\n }\n`\n\nclass Layout extends React.Component {\n state = {\n mobileMenuOpen: false,\n }\n\n // componentDidMount() {\n // const user = store.get(\"tmc.user\")\n // if (typeof window !== \"undefined\" && user) {\n // if (canDoResearch()) {\n // setTimeout(() => {\n // this.removePheromones = Pheromones.init({\n // apiUrl: \"https://pheromones.mooc.fi/\",\n // username: user.username,\n // submitAfter: 20,\n // })\n // }, 1000)\n // }\n // }\n // }\n\n // componentWillUnmount() {\n // if (\n // typeof window === \"undefined\" ||\n // typeof this.removePheromones === \"undefined\"\n // ) {\n // return\n // }\n // this.removePheromones()\n // this.removePheromones = undefined\n // }\n\n toggleMobileMenu = () => {\n this.setState((prev) => {\n return {\n mobileMenuOpen: !prev.mobileMenuOpen,\n }\n })\n }\n\n render() {\n const { children } = this.props\n\n return (\n \n {\" \"}\n {\n const siteTitle = data.title.siteMetadata.title\n return (\n \n \n \n \n \n \n {children}\n \n \n
\ No newline at end of file diff --git a/kaikki-tehtavat/index.html b/kaikki-tehtavat/index.html index 08e662c38..6ac03e1e1 100644 --- a/kaikki-tehtavat/index.html +++ b/kaikki-tehtavat/index.html @@ -136,4 +136,4 @@ } } }) -
\ No newline at end of file +
\ No newline at end of file diff --git a/missing-info/index.html b/missing-info/index.html index 15cea27af..be376e456 100644 --- a/missing-info/index.html +++ b/missing-info/index.html @@ -57,4 +57,4 @@ } } }) -
Redirecting...
\ No newline at end of file +
Redirecting...
\ No newline at end of file diff --git a/osa-1/1-ohjelmoinnin-aloittaminen/index.html b/osa-1/1-ohjelmoinnin-aloittaminen/index.html index 357278fb7..7c29eb196 100644 --- a/osa-1/1-ohjelmoinnin-aloittaminen/index.html +++ b/osa-1/1-ohjelmoinnin-aloittaminen/index.html @@ -206,7 +206,7 @@ } } }) -
Osa 1

Ohjelmoinnin aloittaminen

\ No newline at end of file diff --git a/osa-1/2-tietoa-kayttajalta/index.html b/osa-1/2-tietoa-kayttajalta/index.html index 85c3934e8..5db5ea84e 100644 --- a/osa-1/2-tietoa-kayttajalta/index.html +++ b/osa-1/2-tietoa-kayttajalta/index.html @@ -206,7 +206,7 @@ } } }) -
Osa 1

Tietoa käyttäjältä

Kertauskysely tämän osan asioihin liittyen:

Loading...
:
Loading...

Log in to view the quiz

Seuraava osa:

\ No newline at end of file diff --git a/osa-1/3-lisaa-muuttujista/index.html b/osa-1/3-lisaa-muuttujista/index.html index 8c445576f..944b1a49c 100644 --- a/osa-1/3-lisaa-muuttujista/index.html +++ b/osa-1/3-lisaa-muuttujista/index.html @@ -206,11 +206,11 @@ } } }) -
Osa 1

Lisää muuttujista

Vastaa seuraavaan kyselyyn ennen osion aloittamista. Saat vastaamisesta yhden tehtäväpisteen.

Loading...
:
Loading...

Log in to view the quiz

Muuttujia tarvitaan ohjelmissa moniin tarkoituksiin. Voimme tallentaa muuttujiin mitä tahansa sellaista tietoa, jota tarvitaan ohjelmassa myöhemmin.

Muuttuja luodaan Pythonissa seuraavasti:

muuttujan_nimi = ...

Tässä ... tarkoittaa arvoa, joka tallennetaan muuttujaan.

Esimerkiksi kun luemme input-komennolla merkkijonon käyttäjältä, sijoitamme merkkijonon muuttujaan, jotta voimme käyttää sitä myöhemmin ohjelmassa:

nimi = input("Anna nimesi: ")
 print("Moi, " + nimi)
Esimerkkitulostus

Anna nimesi: Kummitus Moi, Kummitus

Muuttujille voidaan antaa arvoja myös esimerkiksi näin:

etunimi = "Pekka"
 sukunimi = "Pythonen"
@@ -276,4 +276,4 @@
 luku3 = 3.62
 
 keskiarvo = (luku1 + luku2 + luku3) / 3
-print(f"Keskiarvo: {keskiarvo}")
Esimerkkitulostus

Keskiarvo: 1.6233333333333333

Kertauskysely tämän osan asioihin liittyen:

Loading...
:
Loading...

Log in to view the quiz

Seuraava osa:

\ No newline at end of file +print(f"Keskiarvo: {keskiarvo}")
Esimerkkitulostus

Keskiarvo: 1.6233333333333333

Kertauskysely tämän osan asioihin liittyen:

Loading...
:
Loading...

Log in to view the quiz

Seuraava osa:

\ No newline at end of file diff --git a/osa-1/4-laskentaa-luvuilla/index.html b/osa-1/4-laskentaa-luvuilla/index.html index 578988af4..701e0d27e 100644 --- a/osa-1/4-laskentaa-luvuilla/index.html +++ b/osa-1/4-laskentaa-luvuilla/index.html @@ -208,7 +208,7 @@ } } }) -
Osa 1

Laskentaa luvuilla

Seuraava osa:

\ No newline at end of file diff --git a/osa-1/5-ehtorakenne/index.html b/osa-1/5-ehtorakenne/index.html index 14353e724..b3273b779 100644 --- a/osa-1/5-ehtorakenne/index.html +++ b/osa-1/5-ehtorakenne/index.html @@ -201,7 +201,7 @@ } } }) -
Osa 1

Ehtorakenne

\ No newline at end of file diff --git a/osa-1/index.html b/osa-1/index.html index 94eee6985..c73351234 100644 --- a/osa-1/index.html +++ b/osa-1/index.html @@ -151,5 +151,5 @@ } } }) -
\ No newline at end of file +
\ No newline at end of file diff --git a/osa-10/1-luokkahierarkiat/index.html b/osa-10/1-luokkahierarkiat/index.html index 4108a2255..c865d8535 100644 --- a/osa-10/1-luokkahierarkiat/index.html +++ b/osa-10/1-luokkahierarkiat/index.html @@ -183,7 +183,7 @@ } } }) -
Osa 10

Luokkahierarkiat

Loading
Loading
Loading
Loading
Seuraava osa:

\ No newline at end of file diff --git a/osa-10/2-nakyvyysmaareet/index.html b/osa-10/2-nakyvyysmaareet/index.html index 8e77d4130..171c31629 100644 --- a/osa-10/2-nakyvyysmaareet/index.html +++ b/osa-10/2-nakyvyysmaareet/index.html @@ -185,7 +185,7 @@ } } }) -
Osa 10

Näkyvyysmääreet

\ No newline at end of file diff --git a/osa-10/3-olio-ohjelmoinnin-tekniikoita/index.html b/osa-10/3-olio-ohjelmoinnin-tekniikoita/index.html index c93bc77d5..0945ee36f 100644 --- a/osa-10/3-olio-ohjelmoinnin-tekniikoita/index.html +++ b/osa-10/3-olio-ohjelmoinnin-tekniikoita/index.html @@ -185,7 +185,7 @@ } } }) -
Osa 10

Olio-ohjelmoinnin tekniikoita

Loading
\ No newline at end of file diff --git a/osa-10/4-lisaa-esimerkkeja/index.html b/osa-10/4-lisaa-esimerkkeja/index.html index 56704ff90..e62525ba4 100644 --- a/osa-10/4-lisaa-esimerkkeja/index.html +++ b/osa-10/4-lisaa-esimerkkeja/index.html @@ -197,7 +197,7 @@ } } }) -
Osa 10

Laajemman sovelluksen kehittäminen

\ No newline at end of file diff --git a/osa-10/index.html b/osa-10/index.html index 3ac8e356a..036617b6f 100644 --- a/osa-10/index.html +++ b/osa-10/index.html @@ -151,5 +151,5 @@ } } }) -
\ No newline at end of file +
\ No newline at end of file diff --git a/osa-11/1-koosteet/index.html b/osa-11/1-koosteet/index.html index 8fde7de73..d1b8d0471 100644 --- a/osa-11/1-koosteet/index.html +++ b/osa-11/1-koosteet/index.html @@ -183,7 +183,7 @@ } } }) -
Osa 11

Koosteet

Seuraava osa:

\ No newline at end of file diff --git a/osa-11/2-lisaa-koosteesta/index.html b/osa-11/2-lisaa-koosteesta/index.html index d23740834..15518fdb1 100644 --- a/osa-11/2-lisaa-koosteesta/index.html +++ b/osa-11/2-lisaa-koosteesta/index.html @@ -183,7 +183,7 @@ } } }) -
Osa 11

Lisää koosteesta

Seuraava osa:

\ No newline at end of file diff --git a/osa-11/3-rekursio/index.html b/osa-11/3-rekursio/index.html index 639464ecd..7b1f2c7d1 100644 --- a/osa-11/3-rekursio/index.html +++ b/osa-11/3-rekursio/index.html @@ -183,7 +183,7 @@ } } }) -
Osa 11

Rekursio

Tässä funktiolle binaarihaku annetaan neljä parametria: viite listaan, etsittävä alkio sekä hakualueen vasen ja oikea kohta. Alussa hakualue on koko lista, jolloin vasen kohta on 0 ja oikea kohta on len(lista)-1. Funktio tarkastaa hakualueen keskellä olevan alkion ja joko ilmoittaa, että haluttu alkio löytyi, tai jatkaa hakua vasemmasta tai oikeasta puoliskosta.

Jos verrataan binäärihakua peräkkäishakuun, algoritmien tehokkuus erottuu selvästi. Peräkkäishaussa alkiota lähdetään etsimään listan alusta ja listaa käydään läpi yksi alkio kerrallaan, kunnes alkio on löytynyt tai on päästy listan loppuun. Jos listan pituus on miljoona alkiota, tarvitaan perättäishaussa koko listan läpikäyntiin miljoona askelta, mutta binäärihaussa askelia tarvitaan vain 20.

\ No newline at end of file diff --git a/osa-11/4-lisaa-esimerkkeja/index.html b/osa-11/4-lisaa-esimerkkeja/index.html index 5724845c0..54ef552b4 100644 --- a/osa-11/4-lisaa-esimerkkeja/index.html +++ b/osa-11/4-lisaa-esimerkkeja/index.html @@ -197,7 +197,7 @@ } } }) -
Osa 11

Lisää esimerkkejä

\ No newline at end of file +
Loading

Paluu aikaan ennen rekursiota

Harjoitellaan vielä osan lopussa hieman laajemman ohjelman tekemistä olioita hyödyntäen. Tässä tehtäväsarjassa ei rekursiota tarvitse eikä edes kannata käyttää. Listakoosteita sen sijaan pääsee hyödyntämään!

Loading
Loading

Vastaa lopuksi osion loppukyselyyn:

Loading...
:
Loading...

Log in to view the quiz

\ No newline at end of file diff --git a/osa-11/index.html b/osa-11/index.html index ea8e509db..9a52882b7 100644 --- a/osa-11/index.html +++ b/osa-11/index.html @@ -151,5 +151,5 @@ } } }) -
\ No newline at end of file +
\ No newline at end of file diff --git a/osa-12/1-funktio-parametrina/index.html b/osa-12/1-funktio-parametrina/index.html index 79d30f2a8..effae574e 100644 --- a/osa-12/1-funktio-parametrina/index.html +++ b/osa-12/1-funktio-parametrina/index.html @@ -183,7 +183,7 @@ } } }) -
Osa 12

Funktio parametrina

Seuraava osa:

\ No newline at end of file diff --git a/osa-12/2-generaattorit/index.html b/osa-12/2-generaattorit/index.html index 468659db6..051a9dcce 100644 --- a/osa-12/2-generaattorit/index.html +++ b/osa-12/2-generaattorit/index.html @@ -183,7 +183,7 @@ } } }) -
Osa 12

Generaattorit

\ No newline at end of file +jkl

Loading
\ No newline at end of file diff --git a/osa-12/3-funktionaalista-ohjelmointia/index.html b/osa-12/3-funktionaalista-ohjelmointia/index.html index 4853131d3..52c488a3d 100644 --- a/osa-12/3-funktionaalista-ohjelmointia/index.html +++ b/osa-12/3-funktionaalista-ohjelmointia/index.html @@ -183,7 +183,7 @@ } } }) -
Osa 12

Funktionaalista ohjelmointia

Loading
\ No newline at end of file +print(lukujen_summa)

Jos alkuarvoa ei anneta, toimii listan ensimmäinen luku alkuarvona ja "redusointi" aloitetaan vasta listan toisesta alkiosta.

Huomaa, että jos käsiteltävän listan alkiot ovat eri tyyppisiä kuin laskettava arvo, on reduce-funktion kolmas parametri välttämätön. Jos yrittäisimme olla tili-esimerkissä käyttämättä alkuarvoa:

saldot_yhteensa = reduce(saldojen_summaaja, tilit)

olisi seurauksena virhe

TypeError: unsupported operand type(s) for +: 'Pankkitili' and 'int'

sillä reduce-funktion parametri yht_saldo saisi ensimmäisellä kerralla arvokseen listan ensimmäisen pankkitilin ja sen summaaminen pankkitilin saldoon ei olisi mahdollista.

Loading
\ No newline at end of file diff --git a/osa-12/4-saannolliset-lausekkeet/index.html b/osa-12/4-saannolliset-lausekkeet/index.html index 22dcbe6ab..949253017 100644 --- a/osa-12/4-saannolliset-lausekkeet/index.html +++ b/osa-12/4-saannolliset-lausekkeet/index.html @@ -197,7 +197,7 @@ } } }) -
Osa 12

Säännölliset lausekkeet

\ No newline at end of file +Ei osumaa.

Loading

Loppuhuipennus

Harjoitellaan vielä osan lopussa hieman laajemman ohjelman tekemistä olioita hyödyntäen. Tämä tehtävä ei sijainnistaan huolimatta liity mitenkään säännöllisiin lausekkeisiin, mutta luvun Funktio parametrina asia tulee olemaan tarpeen ja myös listakoosteet voivat olla käyttökelpoisia.

Sovelluksen rakenteelle voi ottaa inspiraatiota osan 10 viimeisestä luvusta.

Loading

Vastaa lopuksi osion loppukyselyyn:

Loading...
:
Loading...

Log in to view the quiz

\ No newline at end of file diff --git a/osa-12/index.html b/osa-12/index.html index b249e3819..eef3b2bb9 100644 --- a/osa-12/index.html +++ b/osa-12/index.html @@ -151,5 +151,5 @@ } } }) -
\ No newline at end of file +
\ No newline at end of file diff --git a/osa-13/1-pygame-kayttoon/index.html b/osa-13/1-pygame-kayttoon/index.html index 4d02c2d96..7cd088dae 100644 --- a/osa-13/1-pygame-kayttoon/index.html +++ b/osa-13/1-pygame-kayttoon/index.html @@ -175,7 +175,7 @@ } } }) -
Osa 13

Pygame käyttöön

Seuraava osa:

\ No newline at end of file diff --git a/osa-13/2-animaatio/index.html b/osa-13/2-animaatio/index.html index 3161202fa..cfe745d90 100644 --- a/osa-13/2-animaatio/index.html +++ b/osa-13/2-animaatio/index.html @@ -175,7 +175,7 @@ } } }) -
Osa 13

Animaatio

Seuraava osa:

\ No newline at end of file diff --git a/osa-13/3-tapahtumat/index.html b/osa-13/3-tapahtumat/index.html index 4a8388290..98256f474 100644 --- a/osa-13/3-tapahtumat/index.html +++ b/osa-13/3-tapahtumat/index.html @@ -175,7 +175,7 @@ } } }) -
Osa 13

Tapahtumat

Seuraava osa:

\ No newline at end of file diff --git a/osa-13/4-lisaa-tekniikoita/index.html b/osa-13/4-lisaa-tekniikoita/index.html index 472d9295c..d6eb9ebc9 100644 --- a/osa-13/4-lisaa-tekniikoita/index.html +++ b/osa-13/4-lisaa-tekniikoita/index.html @@ -189,7 +189,7 @@ } } }) -
Osa 13

Lisää tekniikoita

\ No newline at end of file diff --git a/osa-13/index.html b/osa-13/index.html index e20a4dc75..81de30f02 100644 --- a/osa-13/index.html +++ b/osa-13/index.html @@ -151,5 +151,5 @@ } } }) -
\ No newline at end of file +
\ No newline at end of file diff --git a/osa-14/1-peliprojekti/index.html b/osa-14/1-peliprojekti/index.html index 19644359b..9e78814fc 100644 --- a/osa-14/1-peliprojekti/index.html +++ b/osa-14/1-peliprojekti/index.html @@ -167,7 +167,7 @@ } } }) -
Osa 14

Peliprojekti

Tässä osassa tehdään Pygamen avulla hieman laajempi peli, joka on muunnelma perinteisestä Sokoban-pelistä. Pelaaja ohjaa ruudukossa olevaa robottia, jonka tehtävänä on työntää laatikot oikeille paikoille käyttäen mahdollisimman vähän siirtoja.

+
\ No newline at end of file +

Huomaa, että koordinaatteja x ja y käytetään eri päin eri tilanteissa. Kaksiulotteisen listan indeksoinnissa on luontevaa antaa ensin y ja sitten x, koska ensimmäinen indeksi tarkoittaa riviä ja toinen indeksi tarkoittaa saraketta. Kuitenkin Pygamen metodeissa annetaan ensin x ja y, kuten grafiikassa on yleensä tapana.

Seuraava osa:

\ No newline at end of file diff --git a/osa-14/2-robo-ja-laatikot/index.html b/osa-14/2-robo-ja-laatikot/index.html index fc85c8e5a..5f226972d 100644 --- a/osa-14/2-robo-ja-laatikot/index.html +++ b/osa-14/2-robo-ja-laatikot/index.html @@ -167,7 +167,7 @@ } } }) -
Osa 14

Robotti ja laatikot

Vaikein asia Sokoban-pelin toteutuksessa on saada robotti liikkumaan niin, että se pystyy työntämään laatikoita halutulla tavalla. Pelin pitää tunnistaa, milloin robotti pystyy siirtymään pelaajan haluamaan suuntiin, sekä käsitellä oikein tilanteet, joissa robotti työntää laatikkoa. Nyt on aika tarttua tähän haasteeseen.

+
Osa 14

Robotti ja laatikot

Vaikein asia Sokoban-pelin toteutuksessa on saada robotti liikkumaan niin, että se pystyy työntämään laatikoita halutulla tavalla. Pelin pitää tunnistaa, milloin robotti pystyy siirtymään pelaajan haluamaan suuntiin, sekä käsitellä oikein tilanteet, joissa robotti työntää laatikkoa. Nyt on aika tarttua tähän haasteeseen.

Näppäimistön käsittely

Pelaaja ohjaa robottia nuolinäppäimillä, joten tapahtumien käsittelyä täytyy laajentaa niin, että se tarkkailee myös näppäimistön tapahtumia:

    def tutki_tapahtumat(self):
@@ -254,4 +254,4 @@ 

Refaktorointia?3. Pelin viimeistely

\ No newline at end of file +

Refaktorointiin ja koodin laatuun liittyviin asioihin tutustutaan lisää tulevilla kursseilla, kuten Ohjelmistotekniikka ja Ohjelmistotuotanto.

Seuraava osa:

\ No newline at end of file diff --git a/osa-14/3-pelin-viimeistely/index.html b/osa-14/3-pelin-viimeistely/index.html index 6f725b94b..2b158c7dd 100644 --- a/osa-14/3-pelin-viimeistely/index.html +++ b/osa-14/3-pelin-viimeistely/index.html @@ -167,7 +167,7 @@ } } }) -
Osa 14

Pelin viimeistely

Peli on jo hyvässä vaiheessa, joten nyt voimme alkaa viimeistellä pelin toteutusta. Lisäämme peliin laskurin, joka näyttää siirtojen määrän, mahdollisuuden aloittaa uusi peli ja sulkea peli näppäinkomennoilla sekä ilmoituksen, kun pelaaja onnistuu läpäisemään pelin.

+
Osa 14

Pelin viimeistely

Peli on jo hyvässä vaiheessa, joten nyt voimme alkaa viimeistellä pelin toteutusta. Lisäämme peliin laskurin, joka näyttää siirtojen määrän, mahdollisuuden aloittaa uusi peli ja sulkea peli näppäinkomennoilla sekä ilmoituksen, kun pelaaja onnistuu läpäisemään pelin.

Siirtolaskuri

Siirtolaskuri näyttää pelin ikkunan alalaidassa, montako siirtoa pelaaja on tehnyt tähän mennessä. Tämän avulla voi yrittää etsiä ratkaisua, jossa on mahdollisimman vähän siirtoja.

Laskurin tekeminen vaatii joitakin muutoksia koodiin. Muutetaan ensin konstruktoria niin, että ikkunassa on tilaa laskurille ja käytettävissä on fontti tekstin piirtämistä varten:

@@ -248,4 +248,4 @@

Peli GitHubiinMontako siirtoa tarvitaan?

Vaikka pelin ruudukko on melko pieni, peli ei ole helppo. Ensimmäinen haaste on onnistua läpäisemään peli, ja sen jälkeen haasteena on keksiä ratkaisu, jossa siirtojen määrä on mahdollisimman pieni. Kuinka lyhyen ratkaisun onnistut muodostamaan?

-

Lyhimmän mahdollisen ratkaisun etsiminen käsin on hyvin vaikeaa, mutta tässäkin voi käyttää apuna ohjelmointia. Kurssilla Tietorakenteet ja algoritmit tutustutaan tekniikoihin, joiden avulla voidaan löytää automaattisesti lyhin mahdollinen ratkaisu peliin.

Seuraava osa:

\ No newline at end of file +

Lyhimmän mahdollisen ratkaisun etsiminen käsin on hyvin vaikeaa, mutta tässäkin voi käyttää apuna ohjelmointia. Kurssilla Tietorakenteet ja algoritmit tutustutaan tekniikoihin, joiden avulla voidaan löytää automaattisesti lyhin mahdollinen ratkaisu peliin.

Seuraava osa:

\ No newline at end of file diff --git a/osa-14/4-oma-peli/index.html b/osa-14/4-oma-peli/index.html index a4bea1c08..182a9022b 100644 --- a/osa-14/4-oma-peli/index.html +++ b/osa-14/4-oma-peli/index.html @@ -181,7 +181,7 @@ } } }) -
Osa 14

Oma peli

Viikon tehtävä

+
Osa 14

Oma peli

Viikon tehtävä

Tämän viikon tehtäväsi on tehdä oma pieni peli Pygamen avulla. Peliä varten tehtäväpohjassa on joukko kuvia, joita voit käyttää pelissä. Älä käytä muita kuvia, jotta muutkin pystyvät kokeilemaan peliä koodin perusteella.

Saat päättää pelin aiheen itse, ja pelin tulisi olla suunnilleen saman laajuinen kuin tämän viikon esimerkki. Pelin tulisi noudattaa seuraavia vaatimuksia:

+
Loading...
:
Loading...

Log in to view the quiz

Loppukysely

Vastaa ensin osion loppukyselyyn...

-
Loading...
:
Loading...

Log in to view the quiz

+
Loading...
:
Loading...

Log in to view the quiz

...ja sitten vielä koko kurssin loppukyselyyn:

-
Loading...
:
Loading...

Log in to view the quiz

\ No newline at end of file +
Loading...
:
Loading...

Log in to view the quiz

\ No newline at end of file diff --git a/osa-14/index.html b/osa-14/index.html index 23d5dd30f..3c2a921a0 100644 --- a/osa-14/index.html +++ b/osa-14/index.html @@ -151,5 +151,5 @@ } } }) -
\ No newline at end of file +
\ No newline at end of file diff --git a/osa-2/1-ohjelmoinnin-termeja/index.html b/osa-2/1-ohjelmoinnin-termeja/index.html index e64d0d315..ac5fe29d8 100644 --- a/osa-2/1-ohjelmoinnin-termeja/index.html +++ b/osa-2/1-ohjelmoinnin-termeja/index.html @@ -208,7 +208,7 @@ } } }) -
Osa 2

Ohjelmoinnin termejä

\ No newline at end of file +Palkka 552.0 euroa

Kun ohjelma on kunnossa, tulee debuggaustulosteet ja muu debuggauksen takia kirjoitettu ylimääräinen koodi poistaa.

Esimerkki oli yksinkertainen ja näin lyhyessä ohjelmassa oleva bugi selviäisi varmasti myös koodia lukemalla. Monesti kuitenkin debug-tulostuksilla pääsee huomattavasti nopeammin jyvälle siitä, missä vika piilee. Tulostamalla voidaan usein varmistua siitä, mitkä osat ohjelmasta toimivat "varmuudella" oikein, ja bugien jäljitys voidaan nopeasti kohdistaa niihin koodiriveihin, joissa ongelma todennäköisesti piileskelee.

Debuggaukseen on olemassa muitakin keinoja kuin debug-tulostusten tekeminen. Palaamme asiaan myöhemmin kurssilla. Sinun kannattaa tästä lähtien kurssilla käyttää debug-tulostamista virheiden etsimiseen. Ohjelmoinnin ammattilaiset eivät selviä työstään ilman debug-tulostuksia, joten on vaikea kuvitella, ettei aloittelijoidenkin kannattaisi laajentaa työkalupakkiaan tältä osin.

Loading...
:
Loading...

Log in to view the quiz

\ No newline at end of file diff --git a/osa-2/2-else-elif/index.html b/osa-2/2-else-elif/index.html index aa647995c..3ac085988 100644 --- a/osa-2/2-else-elif/index.html +++ b/osa-2/2-else-elif/index.html @@ -206,7 +206,7 @@ } } }) -
Osa 2

Lisää ehtolauseita

\ No newline at end of file +Kiitos ja hei.

Loading...
:
Loading...

Log in to view the quiz

\ No newline at end of file diff --git "a/osa-2/3-ehtojen-yhdist\303\244minen/index.html" "b/osa-2/3-ehtojen-yhdist\303\244minen/index.html" index eaf9f4537..bd5f7e821 100644 --- "a/osa-2/3-ehtojen-yhdist\303\244minen/index.html" +++ "b/osa-2/3-ehtojen-yhdist\303\244minen/index.html" @@ -208,7 +208,7 @@ } } }) -
Osa 2

Ehtojen yhdistäminen

\ No newline at end of file + print("Luku on negatiivinen.")

Tilanteesta riippuu, kumpaa tapaa kannattaa käyttää. Tässä esimerkissä ensimmäinen vaihtoehto tuntuu useimpien mielestä paremmalta.

Loading...
:
Loading...

Log in to view the quiz

\ No newline at end of file diff --git a/osa-2/4-yksinkertainen-silmukka/index.html b/osa-2/4-yksinkertainen-silmukka/index.html index 0fc309f30..bf836e7c0 100644 --- a/osa-2/4-yksinkertainen-silmukka/index.html +++ b/osa-2/4-yksinkertainen-silmukka/index.html @@ -199,7 +199,7 @@ } } }) -
Osa 2

Yksinkertainen silmukka

\ No newline at end of file diff --git a/osa-2/index.html b/osa-2/index.html index 40aa5c07c..0179c722d 100644 --- a/osa-2/index.html +++ b/osa-2/index.html @@ -151,5 +151,5 @@ } } }) -
\ No newline at end of file +
\ No newline at end of file diff --git a/osa-3/1-ehdot-silmukoissa/index.html b/osa-3/1-ehdot-silmukoissa/index.html index 0332902cc..ef110f63c 100644 --- a/osa-3/1-ehdot-silmukoissa/index.html +++ b/osa-3/1-ehdot-silmukoissa/index.html @@ -206,7 +206,7 @@ } } }) -
Osa 3

Ehdot silmukoissa

\ No newline at end of file diff --git a/osa-3/2-merkkijonojen-kasittely/index.html b/osa-3/2-merkkijonojen-kasittely/index.html index 372f0a0a1..c10b93296 100644 --- a/osa-3/2-merkkijonojen-kasittely/index.html +++ b/osa-3/2-merkkijonojen-kasittely/index.html @@ -206,7 +206,7 @@ } } }) -
Osa 3

Merkkijonojen käsittely

\ No newline at end of file +...

Loading...
:
Loading...

Log in to view the quiz

Seuraava osa:

\ No newline at end of file diff --git a/osa-3/3-lisaa-silmukoista/index.html b/osa-3/3-lisaa-silmukoista/index.html index d5b6272d4..6422678f8 100644 --- a/osa-3/3-lisaa-silmukoista/index.html +++ b/osa-3/3-lisaa-silmukoista/index.html @@ -206,7 +206,7 @@ } } }) -
Osa 3

Lisää silmukoista

\ No newline at end of file +0

Nyt sisemmässä silmukassa on käytössä apumuuttuja i, jonka arvo on aina sisempään silmukkaan mentäessä 0. Muuttujan i arvo kasvaa yhden välein, kunnes se on yhtä suuri kuin muuttujan luku nykyinen arvo, joka taas vähenee ulomman silmukan vuoksi kohti nollaa.

Sisempi silmukka tulostaa apumuuttujan i arvot välilyönnillä eroteltuna samalle riville. Kun sisempi silmukka päättyy, tulostetaan aina rivinvaihto komennolla print.

Jos et ole täysin varma, että ymmärrät esimerkkikoodin toiminnan, kokeile kopioida koodi Python Tutorin visualisaattoriin ja tarkastele, mitä ohjelma tulostaa ja miten muuttujien arvot vaihtuvat koodin edetessä.

Loading...
:
Loading...

Log in to view the quiz

Seuraava osa:

\ No newline at end of file diff --git a/osa-3/4-omat-funktiot/index.html b/osa-3/4-omat-funktiot/index.html index e8758051e..e07aa81b4 100644 --- a/osa-3/4-omat-funktiot/index.html +++ b/osa-3/4-omat-funktiot/index.html @@ -199,7 +199,7 @@ } } }) -
Osa 3

Omat funktiot

Vaikka funktiota kutsutaan oikein, se tulostaa aina globaalissa muuttujassa olevan nimen Emilia.

Loading...
:
Loading...

Log in to view the quiz

Vastaa lopuksi osion loppukyselyyn:

Loading...
:
Loading...

Log in to view the quiz

\ No newline at end of file diff --git a/osa-3/index.html b/osa-3/index.html index b1c057af0..e0a877682 100644 --- a/osa-3/index.html +++ b/osa-3/index.html @@ -151,5 +151,5 @@ } } }) -
\ No newline at end of file +
\ No newline at end of file diff --git a/osa-4/1-vscode/index.html b/osa-4/1-vscode/index.html index 7c15c1441..7deeee582 100644 --- a/osa-4/1-vscode/index.html +++ b/osa-4/1-vscode/index.html @@ -175,7 +175,7 @@ } } }) -
Osa 4

Visual Studio Code -editori, Python-tulkki ja debuggeri

\ No newline at end of file diff --git a/osa-4/2-lisaa-funktioista/index.html b/osa-4/2-lisaa-funktioista/index.html index 060083277..9f8592e48 100644 --- a/osa-4/2-lisaa-funktioista/index.html +++ b/osa-4/2-lisaa-funktioista/index.html @@ -206,7 +206,7 @@ } } }) -
Osa 4

Lisää funktioista

Seuraava osa:

\ No newline at end of file diff --git a/osa-4/3-listat/index.html b/osa-4/3-listat/index.html index 6660fca6b..38fe97bb9 100644 --- a/osa-4/3-listat/index.html +++ b/osa-4/3-listat/index.html @@ -204,7 +204,7 @@ } } }) -
Osa 4

Listat

\ No newline at end of file diff --git a/osa-4/4-silmukat-ja-iterointi/index.html b/osa-4/4-silmukat-ja-iterointi/index.html index 9d99a33d4..b63f3f3da 100644 --- a/osa-4/4-silmukat-ja-iterointi/index.html +++ b/osa-4/4-silmukat-ja-iterointi/index.html @@ -204,7 +204,7 @@ } } }) -
Osa 4

Silmukat ja iterointi

\ No newline at end of file diff --git a/osa-4/5-tulostuksen-muotoilu/index.html b/osa-4/5-tulostuksen-muotoilu/index.html index 0f247212f..0096f0b26 100644 --- a/osa-4/5-tulostuksen-muotoilu/index.html +++ b/osa-4/5-tulostuksen-muotoilu/index.html @@ -204,7 +204,7 @@ } } }) -
Osa 4

Tulostuksen muotoilu

\ No newline at end of file diff --git a/osa-4/6-lisaa-rakenteista/index.html b/osa-4/6-lisaa-rakenteista/index.html index 1f3469e34..d539a11b8 100644 --- a/osa-4/6-lisaa-rakenteista/index.html +++ b/osa-4/6-lisaa-rakenteista/index.html @@ -197,7 +197,7 @@ } } }) -
Osa 4

Lisää merkkijonoista ja listoista

\ No newline at end of file diff --git a/osa-4/index.html b/osa-4/index.html index afbcd6719..1bab98b97 100644 --- a/osa-4/index.html +++ b/osa-4/index.html @@ -151,5 +151,5 @@ } } }) -
\ No newline at end of file +
\ No newline at end of file diff --git a/osa-5/1-lisaa-listoja/index.html b/osa-5/1-lisaa-listoja/index.html index 35e16283f..5659581d1 100644 --- a/osa-5/1-lisaa-listoja/index.html +++ b/osa-5/1-lisaa-listoja/index.html @@ -204,7 +204,7 @@ } } }) -
Osa 5

Lisää listoista

Seuraava osa:

\ No newline at end of file diff --git a/osa-5/2-viittaukset/index.html b/osa-5/2-viittaukset/index.html index c05e55722..5778b1019 100644 --- a/osa-5/2-viittaukset/index.html +++ b/osa-5/2-viittaukset/index.html @@ -204,7 +204,7 @@ } } }) -
Osa 5

Viittaukset

Koska funktio sorted palauttaa uuden järjestetyn listan, toiseksi pienimmän alkion etsiminen ei enää sotke listan alkuperäistä järjestystä.

Usein pidetään hyvänä asiana, että funktiot eivät aiheuta sivuvaikutuksia, sillä sivuvaikutukset voivat hankaloittaa ohjelmien toimivuuden varmistamista.

Sivuvaikutuksettomia funktioita kutsutaan myös puhtaiksi funktioiksi ja erityisesti funktionaalista ohjelmointityyliä käytettäessä funktiot pyritään rakentamaan näin. Palaamme aiheeseen tarkemmin Ohjelmoinnin jatkokurssilla.

Loading...
:
Loading...

Log in to view the quiz

Seuraava osa:

\ No newline at end of file diff --git a/osa-5/3-dictionary/index.html b/osa-5/3-dictionary/index.html index f70e8d348..cf162c13c 100644 --- a/osa-5/3-dictionary/index.html +++ b/osa-5/3-dictionary/index.html @@ -204,7 +204,7 @@ } } }) -
Osa 5

Sanakirja

Loading
Loading
Loading...
:
Loading...

Log in to view the quiz

Seuraava osa:

\ No newline at end of file diff --git a/osa-5/4-tuple/index.html b/osa-5/4-tuple/index.html index 0400c0998..013685735 100644 --- a/osa-5/4-tuple/index.html +++ b/osa-5/4-tuple/index.html @@ -197,7 +197,7 @@ } } }) -
Osa 5

Tuple

\ No newline at end of file diff --git a/osa-5/index.html b/osa-5/index.html index 371b4d1ce..87803d295 100644 --- a/osa-5/index.html +++ b/osa-5/index.html @@ -151,5 +151,5 @@ } } }) -
\ No newline at end of file +
\ No newline at end of file diff --git a/osa-6/1-tiedostojen-lukeminen/index.html b/osa-6/1-tiedostojen-lukeminen/index.html index 0c624a7a3..b72552e42 100644 --- a/osa-6/1-tiedostojen-lukeminen/index.html +++ b/osa-6/1-tiedostojen-lukeminen/index.html @@ -212,7 +212,7 @@ } } }) -
Osa 6

Tiedostojen lukeminen

\ No newline at end of file diff --git a/osa-6/2-tiedostojen-kirjoittaminen/index.html b/osa-6/2-tiedostojen-kirjoittaminen/index.html index c7e967bbe..4b97e2e60 100644 --- a/osa-6/2-tiedostojen-kirjoittaminen/index.html +++ b/osa-6/2-tiedostojen-kirjoittaminen/index.html @@ -212,7 +212,7 @@ } } }) -
Osa 6

Tiedostojen kirjoittaminen

\ No newline at end of file diff --git a/osa-6/3-virheet/index.html b/osa-6/3-virheet/index.html index 62b4f5cce..fe687c978 100644 --- a/osa-6/3-virheet/index.html +++ b/osa-6/3-virheet/index.html @@ -204,7 +204,7 @@ } } }) -
Osa 6

Virhetilanteisiin varautuminen

\ No newline at end of file +ValueError: Negatiivinen syöte: -1
Loading
Loading
Loading...
:
Loading...

Log in to view the quiz

\ No newline at end of file diff --git a/osa-6/4-paikalliset-muuttujat/index.html b/osa-6/4-paikalliset-muuttujat/index.html index 84b71aa53..1b134d7bc 100644 --- a/osa-6/4-paikalliset-muuttujat/index.html +++ b/osa-6/4-paikalliset-muuttujat/index.html @@ -197,7 +197,7 @@ } } }) -
Osa 6

Paikalliset ja globaalit muuttujat

\ No newline at end of file diff --git a/osa-6/index.html b/osa-6/index.html index 9a11ac922..d419293b8 100644 --- a/osa-6/index.html +++ b/osa-6/index.html @@ -151,5 +151,5 @@ } } }) -
\ No newline at end of file +
\ No newline at end of file diff --git a/osa-7/1-moduulit/index.html b/osa-7/1-moduulit/index.html index 23d079062..4ec32bbd9 100644 --- a/osa-7/1-moduulit/index.html +++ b/osa-7/1-moduulit/index.html @@ -204,7 +204,7 @@ } } }) -
Osa 7

Moduulit

Seuraava osa:

\ No newline at end of file diff --git a/osa-7/2-satunnaisuus/index.html b/osa-7/2-satunnaisuus/index.html index a11dc06a4..eead17244 100644 --- a/osa-7/2-satunnaisuus/index.html +++ b/osa-7/2-satunnaisuus/index.html @@ -204,7 +204,7 @@ } } }) -
Osa 7

Satunnaisuus

Seuraava osa:

\ No newline at end of file diff --git a/osa-7/3-aikojen-kasittely/index.html b/osa-7/3-aikojen-kasittely/index.html index f34dd4fed..d9ced5dd6 100644 --- a/osa-7/3-aikojen-kasittely/index.html +++ b/osa-7/3-aikojen-kasittely/index.html @@ -206,7 +206,7 @@ } } }) -
Osa 7

Aikojen käsittely

Loading
Loading...
:
Loading...

Log in to view the quiz

Seuraava osa:

\ No newline at end of file diff --git a/osa-7/4-datan-kasittely/index.html b/osa-7/4-datan-kasittely/index.html index 725b62913..04507cb86 100644 --- a/osa-7/4-datan-kasittely/index.html +++ b/osa-7/4-datan-kasittely/index.html @@ -204,7 +204,7 @@ } } }) -
Osa 7

Datan käsittely

\ No newline at end of file diff --git a/osa-7/5-omat-moduulit/index.html b/osa-7/5-omat-moduulit/index.html index 6ad6bbc70..7d7e473ec 100644 --- a/osa-7/5-omat-moduulit/index.html +++ b/osa-7/5-omat-moduulit/index.html @@ -204,7 +204,7 @@ } } }) -
Osa 7

Oman moduulin tekeminen

Loading
Loading...
:
Loading...

Log in to view the quiz

Vastaa lopuksi osion loppukyselyyn:

Loading...
:
Loading...

Log in to view the quiz

Seuraava osa:

\ No newline at end of file diff --git a/osa-7/6-lisaa-pythonista/index.html b/osa-7/6-lisaa-pythonista/index.html index 517bc540a..4a03c24b1 100644 --- a/osa-7/6-lisaa-pythonista/index.html +++ b/osa-7/6-lisaa-pythonista/index.html @@ -197,7 +197,7 @@ } } }) -
Osa 7

Lisää Pythonista

Loading

Vastaa kurssin lopuksi loppukyselyyn. Kyselyn tuloksia käytetään kurssimateriaalin kehittämiseen.

Loading...
:
Loading...

Log in to view the quiz

\ No newline at end of file diff --git a/osa-7/index.html b/osa-7/index.html index 3801236f5..f10fe8fc6 100644 --- a/osa-7/index.html +++ b/osa-7/index.html @@ -151,5 +151,5 @@ } } }) -
\ No newline at end of file +
\ No newline at end of file diff --git a/osa-8/1-oliot-ja-metodit/index.html b/osa-8/1-oliot-ja-metodit/index.html index ba6d0e154..7f014ba31 100644 --- a/osa-8/1-oliot-ja-metodit/index.html +++ b/osa-8/1-oliot-ja-metodit/index.html @@ -183,7 +183,7 @@ } } }) -
Osa 8

Oliot ja metodit

Loading
Loading
Seuraava osa:

\ No newline at end of file diff --git a/osa-8/2-luokat-ja-oliot/index.html b/osa-8/2-luokat-ja-oliot/index.html index 11d87c276..9654cd62f 100644 --- a/osa-8/2-luokat-ja-oliot/index.html +++ b/osa-8/2-luokat-ja-oliot/index.html @@ -183,7 +183,7 @@ } } }) -
Osa 8

Luokat ja oliot

\ No newline at end of file +TypeError: 'int' object is not callable
Loading
Loading
Seuraava osa:

\ No newline at end of file diff --git a/osa-8/3-omat-luokat/index.html b/osa-8/3-omat-luokat/index.html index 8f1b66724..69cd56465 100644 --- a/osa-8/3-omat-luokat/index.html +++ b/osa-8/3-omat-luokat/index.html @@ -183,7 +183,7 @@ } } }) -
Osa 8

Omat luokat

Loading
Loading
Loading
\ No newline at end of file diff --git a/osa-8/4-metodit-omissa-luokissa/index.html b/osa-8/4-metodit-omissa-luokissa/index.html index 9553c2227..8b2c9cb21 100644 --- a/osa-8/4-metodit-omissa-luokissa/index.html +++ b/osa-8/4-metodit-omissa-luokissa/index.html @@ -183,7 +183,7 @@ } } }) -
Osa 8

Metodit omissa luokissa

\ No newline at end of file diff --git a/osa-8/5-lisaa-esimerkkeja/index.html b/osa-8/5-lisaa-esimerkkeja/index.html index 45a22f53c..49f41a2d3 100644 --- a/osa-8/5-lisaa-esimerkkeja/index.html +++ b/osa-8/5-lisaa-esimerkkeja/index.html @@ -197,7 +197,7 @@ } } }) -
Osa 8

Lisää esimerkkejä

\ No newline at end of file +0

Loading

Vastaa lopuksi osion loppukyselyyn:

Loading...
:
Loading...

Log in to view the quiz

\ No newline at end of file diff --git a/osa-8/index.html b/osa-8/index.html index 6070ec7ea..2d64646e7 100644 --- a/osa-8/index.html +++ b/osa-8/index.html @@ -151,5 +151,5 @@ } } }) -
\ No newline at end of file +
\ No newline at end of file diff --git a/osa-9/1-oliot-ja-viittaukset/index.html b/osa-9/1-oliot-ja-viittaukset/index.html index 10407ebad..6c1f9cb87 100644 --- a/osa-9/1-oliot-ja-viittaukset/index.html +++ b/osa-9/1-oliot-ja-viittaukset/index.html @@ -183,7 +183,7 @@ } } }) -
Osa 9

Oliot ja viittaukset

Seuraava osa:

\ No newline at end of file diff --git a/osa-9/2-oliot-attribuuttina/index.html b/osa-9/2-oliot-attribuuttina/index.html index bb3d83874..b95e7846c 100644 --- a/osa-9/2-oliot-attribuuttina/index.html +++ b/osa-9/2-oliot-attribuuttina/index.html @@ -183,7 +183,7 @@ } } }) -
Osa 9

Oliot attribuuttina

Seuraava osa:

\ No newline at end of file diff --git a/osa-9/3-kapselointi/index.html b/osa-9/3-kapselointi/index.html index 5a787e67a..ec6a0669b 100644 --- a/osa-9/3-kapselointi/index.html +++ b/osa-9/3-kapselointi/index.html @@ -183,7 +183,7 @@ } } }) -
Osa 9

Kapselointi

\ No newline at end of file +
Loading
Seuraava osa:

\ No newline at end of file diff --git a/osa-9/4-metodien-nakyvyys/index.html b/osa-9/4-metodien-nakyvyys/index.html index 0a08e61e9..8f5865d98 100644 --- a/osa-9/4-metodien-nakyvyys/index.html +++ b/osa-9/4-metodien-nakyvyys/index.html @@ -183,7 +183,7 @@ } } }) -
Osa 9

Metodien näkyvyys

Piilotettuja metodeja tarvitaan yleensä harvemmin kuin piilotettuja attribuutteja. Metodi kannattaa piilottaa, jos asiakas ei tarvitse siihen suoraa pääsyä, ja varsinkin silloin, jos on todennäköistä, että asiakas voisi sotkea olion sisäisen eheyden metodia kutsumalla.

Loading
Seuraava osa:

\ No newline at end of file diff --git a/osa-9/5-staattiset-piirteet/index.html b/osa-9/5-staattiset-piirteet/index.html index 2a9e85d16..b4c6cf6a3 100644 --- a/osa-9/5-staattiset-piirteet/index.html +++ b/osa-9/5-staattiset-piirteet/index.html @@ -183,7 +183,7 @@ } } }) -
Osa 9

Staattiset piirteet

\ No newline at end of file diff --git a/osa-9/6-lisaa-esimerkkeja/index.html b/osa-9/6-lisaa-esimerkkeja/index.html index 25ae433e9..21d689cee 100644 --- a/osa-9/6-lisaa-esimerkkeja/index.html +++ b/osa-9/6-lisaa-esimerkkeja/index.html @@ -197,7 +197,7 @@ } } }) -
Osa 9

Lisää esimerkkejä

Loppuhuipennus

Vaikka seuraava tehtävä on tässä luvussa, et tarvitse tehtävän ratkaisemiseen mitään muuta kun luvussa Oliot attribuuttina esiteltyjä tekniikoita. Tehtävä on käytännössä hyvin samanlainen kuin tuon luvun tehtävät lahjapakkaus ja huoneen lyhin.

Loading

Vastaa lopuksi osion loppukyselyyn:

Loading...
:
Loading...

Log in to view the quiz

\ No newline at end of file diff --git a/osa-9/index.html b/osa-9/index.html index 4c9f272f8..00d809695 100644 --- a/osa-9/index.html +++ b/osa-9/index.html @@ -151,5 +151,5 @@ } } }) -
\ No newline at end of file +
\ No newline at end of file diff --git a/page-data/app-data.json b/page-data/app-data.json index d33fa848c..5425d3c10 100644 --- a/page-data/app-data.json +++ b/page-data/app-data.json @@ -1 +1 @@ -{"webpackCompilationHash":"3999920a78a3575d5cc0"} +{"webpackCompilationHash":"9b5abcfc2f49ceaa0ab4"} diff --git a/page-data/kaikki-tehtavat/page-data.json b/page-data/kaikki-tehtavat/page-data.json index 36aec12ed..003fde420 100644 --- a/page-data/kaikki-tehtavat/page-data.json +++ b/page-data/kaikki-tehtavat/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-info-template-js", "path": "/kaikki-tehtavat", - "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-all-sections","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/kaikki-tehtavat.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet","overview":null,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide","overview":true,"hidden":true},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista","overview":null,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät","overview":null,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin","overview":null,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset","overview":null,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01.","overview":null,"hidden":null},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01.","overview":null,"hidden":null},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset","overview":null,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6.","overview":null,"hidden":null},"moocfiExercises":[]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto","overview":null,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen","overview":null,"hidden":false},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä","overview":null,"hidden":false},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista","overview":null,"hidden":false},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla","overview":null,"hidden":false},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne","overview":null,"hidden":false},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat","overview":null,"hidden":false},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita","overview":null,"hidden":false},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet","overview":null,"hidden":false},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio","overview":null,"hidden":false},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta","overview":null,"hidden":false},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina","overview":null,"hidden":false},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä","overview":null,"hidden":false},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit","overview":null,"hidden":false},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia","overview":null,"hidden":false},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet","overview":null,"hidden":false},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön","overview":null,"hidden":false},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio","overview":null,"hidden":false},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita","overview":null,"hidden":false},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat","overview":null,"hidden":false},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen","overview":null,"hidden":false},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet","overview":null,"hidden":false},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti","overview":null,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot","overview":null,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli","overview":null,"hidden":false},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely","overview":null,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä","overview":null,"hidden":null},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita","overview":null,"hidden":false},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka","overview":null,"hidden":false},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen","overview":null,"hidden":false},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa","overview":null,"hidden":false},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely","overview":null,"hidden":false},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista","overview":null,"hidden":false},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot","overview":null,"hidden":false},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri","overview":null,"hidden":false},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista","overview":null,"hidden":false},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi","overview":null,"hidden":false},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat","overview":null,"hidden":false},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu","overview":null,"hidden":false},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista","overview":null,"hidden":false},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset","overview":null,"hidden":false},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista","overview":null,"hidden":false},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja","overview":null,"hidden":false},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple","overview":null,"hidden":false},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen","overview":null,"hidden":false},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen","overview":null,"hidden":false},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen","overview":null,"hidden":false},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat","overview":null,"hidden":false},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit","overview":null,"hidden":false},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus","overview":null,"hidden":false},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely","overview":null,"hidden":false},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen","overview":null,"hidden":false},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely","overview":null,"hidden":false},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista","overview":null,"hidden":false},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit","overview":null,"hidden":false},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot","overview":null,"hidden":false},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat","overview":null,"hidden":false},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä","overview":null,"hidden":false},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina","overview":null,"hidden":false},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi","overview":null,"hidden":false},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys","overview":null,"hidden":false},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset","overview":null,"hidden":false},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet","overview":null,"hidden":false},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä","overview":null,"hidden":false},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa","overview":null,"hidden":false},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9","overview":true,"hidden":false},"moocfiExercises":[]}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-all-sections","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/kaikki-tehtavat.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide","overview":true,"hidden":true},"moocfiExercises":[]}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet","overview":null,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista","overview":null,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät","overview":null,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin","overview":null,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset","overview":null,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01.","overview":null,"hidden":null},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01.","overview":null,"hidden":null},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6.","overview":null,"hidden":null},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset","overview":null,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen","overview":null,"hidden":false},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto","overview":null,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä","overview":null,"hidden":false},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista","overview":null,"hidden":false},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla","overview":null,"hidden":false},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne","overview":null,"hidden":false},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet","overview":null,"hidden":false},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat","overview":null,"hidden":false},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita","overview":null,"hidden":false},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen","overview":null,"hidden":false},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet","overview":null,"hidden":false},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio","overview":null,"hidden":false},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä","overview":null,"hidden":false},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta","overview":null,"hidden":false},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit","overview":null,"hidden":false},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina","overview":null,"hidden":false},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet","overview":null,"hidden":false},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia","overview":null,"hidden":false},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön","overview":null,"hidden":false},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio","overview":null,"hidden":false},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat","overview":null,"hidden":false},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita","overview":null,"hidden":false},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot","overview":null,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti","overview":null,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli","overview":null,"hidden":false},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely","overview":null,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita","overview":null,"hidden":false},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä","overview":null,"hidden":null},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen","overview":null,"hidden":false},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa","overview":null,"hidden":false},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka","overview":null,"hidden":false},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely","overview":null,"hidden":false},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista","overview":null,"hidden":false},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot","overview":null,"hidden":false},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri","overview":null,"hidden":false},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista","overview":null,"hidden":false},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi","overview":null,"hidden":false},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat","overview":null,"hidden":false},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista","overview":null,"hidden":false},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu","overview":null,"hidden":false},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista","overview":null,"hidden":false},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset","overview":null,"hidden":false},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja","overview":null,"hidden":false},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple","overview":null,"hidden":false},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen","overview":null,"hidden":false},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen","overview":null,"hidden":false},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat","overview":null,"hidden":false},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen","overview":null,"hidden":false},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit","overview":null,"hidden":false},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely","overview":null,"hidden":false},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus","overview":null,"hidden":false},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely","overview":null,"hidden":false},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen","overview":null,"hidden":false},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista","overview":null,"hidden":false},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot","overview":null,"hidden":false},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit","overview":null,"hidden":false},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat","overview":null,"hidden":false},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa","overview":null,"hidden":false},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina","overview":null,"hidden":false},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset","overview":null,"hidden":false},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi","overview":null,"hidden":false},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys","overview":null,"hidden":false},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet","overview":null,"hidden":false},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9","overview":true,"hidden":false},"moocfiExercises":[]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä","overview":null,"hidden":false},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä","overview":null,"hidden":false},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-1/1-ohjelmoinnin-aloittaminen/page-data.json b/page-data/osa-1/1-ohjelmoinnin-aloittaminen/page-data.json index def57d424..07771ffa2 100644 --- a/page-data/osa-1/1-ohjelmoinnin-aloittaminen/page-data.json +++ b/page-data/osa-1/1-ohjelmoinnin-aloittaminen/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-1/1-ohjelmoinnin-aloittaminen", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Olet kirjoittanut ja suorittanut ensimmäisen Python-ohjelmasi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää print-komentoa viestien tulostamiseen"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat laskea laskuja ohjelmoimalla"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tietokoneohjelmat koostuvat "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"komennoista"}]},{"type":"text","value":" eli yksinkertaisista toimintaohjeista, joita kone suorittaa yksi kerrallaan. Komennot voivat esimerkiksi suorittaa laskutoimituksia, vertailla koneen muistissa olevia tietoja, aiheuttaa muutoksen ohjelman toimintaan tai viestiä käyttäjän kanssa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aloitetaan ohjelmointiin tutustuminen yksinkertaisesta komennosta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":", joka "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tulostaa"}]},{"type":"text","value":" tekstiä. Tulostaminen tarkoittaa käytännössä sitä, että ohjelma näyttää tekstiä ruudulla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraava ohjelma tulostaa rivin \"Moi kaikki!\":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi kaikki!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun suoritamme ohjelman, se tuottaa seuraavan tuloksen:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moi kaikki!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että ohjelman koodi tulee kirjoittaa tarkalleen yllä olevalla tavalla, jotta se toimii. Esimerkiksi jos yritämme tulostaa rivin käyttämättä lainausmerkkejä"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Moi kaikki!"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"ohjelma ei toimi, ja seurauksena on seuraava virheilmoitus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"File \""},{"type":"element","tagName":"stdin","properties":{},"children":[{"type":"text","value":"\", line 1\n print(Moi kaikki!)\n ^\nSyntaxError: invalid syntax\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python ei siis osaa tulkita tulostettavaa tekstiä oikein, jos se ei ole lainausmerkeissä."}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Hymiö","tmcname":"osa01-01_hymio","height":"300px"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita ohjelma, joka tulostaa ruudulle hymiön: :-)"}]}]},{"type":"element","tagName":"h2","properties":{"id":"ohjelman-eteneminen","style":"position:relative;"},"children":[{"type":"text","value":"Ohjelman eteneminen"},{"type":"element","tagName":"a","properties":{"href":"#ohjelman-eteneminen","ariaLabel":"ohjelman eteneminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun kirjoitamme useita komentoja peräkkäin,\nne suoritetaan järjestyksessä ylhäältä alas.\nEsimerkiksi ohjelma"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tervetuloa opettelemaan ohjelmointia!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aluksi harjoitellaan print-komennon käyttöä.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tämä ohjelma tulostaa ruudulle kolme riviä tekstiä.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tulostaa ruudulle seuraavat rivit:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tervetuloa opettelemaan ohjelmointia!\nAluksi harjoitellaan print-komennon käyttöä.\nTämä ohjelma tulostaa ruudulle kolme riviä tekstiä."}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Korjaa ohjelma: seitsemän veljestä","tmcname":"osa01-03_korjaa_ohjelma_7_veljesta"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tarkoitus on tulostaa seitsemän veljestä aakkosjärjestyksessä. Ohjelmassa on kuitenkin yksi tai useampi virhe, jonka takia se ei toimi oikein.\nKorjaa ohjelma niin, että veljekset tulostuvat oikeassa järjestyksessä."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Simeoni\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Juhani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Eero\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lauri\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aapo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tuomas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Timo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Ukko Nooa","tmcname":"osa01-02_ukko_nooa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita ohjelma, joka tulostaa ruudulle seuraavat rivit (tarkalleen annetussa muodossa välimerkkeineen):"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ukko Nooa, Ukko Nooa oli kunnon mies.\nKun hän meni saunaan, laittoi laukun naulaan.\nUkko Nooa, Ukko Nooa oli kunnon mies."}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"laskutoimitukset","style":"position:relative;"},"children":[{"type":"text","value":"Laskutoimitukset"},{"type":"element","tagName":"a","properties":{"href":"#laskutoimitukset","ariaLabel":"laskutoimitukset permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos laitamme "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennon sisälle laskutoimituksen, tulostuu ruudulle laskutoimituksen tulos. Esimerkiksi ohjelma"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tulostaa ruudulle seuraavat rivit:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"7\n9\n22"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että laskutoimituksen ympärille ei kirjoiteta lainausmerkkejä. Lainausmerkeillä merkitään "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"merkkijono"}]},{"type":"text","value":", joka tulostetaan ruudulle sellaisenaan. Huomaa siis seuraavien komentojen ero:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"2 + 2 * 10\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostus on:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"22\n2 + 2 * 10"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jälkimmäisessä tapauksessa Python ei laske laskutoimitusta, vaan tulostaa sen ruudulle.\nMerkkijonot siis tulostetaan ruudulle sellaisenaan riippumatta niiden sisällöstä."}]},{"type":"element","tagName":"h2","properties":{"id":"kommentit","style":"position:relative;"},"children":[{"type":"text","value":"Kommentit"},{"type":"element","tagName":"a","properties":{"href":"#kommentit","ariaLabel":"kommentit permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos rivin alussa on merkki "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"#"}]},{"type":"text","value":", rivi on kommentti, jolloin rivillä oleva teksti ei vaikuta ohjelman toimintaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kommenttien avulla ohjelmoija voi selostaa itselleen ja muille ohjelmoijille, miten ohjelma toimii. Esimerkiksi seuraavassa ohjelmassa kommentit selittävät käytettyä laskukaavaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tuntien määrä vuodessa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# vuodessa on 365 päivää ja jokaisessa 24 tuntia"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"365"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun ohjelma suoritetaan, kommenteissa oleva teksti ei näy mitenkään ohjelman käyttäjälle:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tuntien määrä vuodessa:\n8760"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lyhyempi kommentti voi olla myös rivin lopussa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tuntien määrä vuodessa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"365"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# 365 päivää, 24 tuntia päivässä"}]}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Minuutit vuodessa","tmcname":"osa01-04_minuuttien_maara_vuodessa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka tulostaa minuuttien määrän vuodessa. Käytä edellisen esimerkin tapaan Pythonia tekemään laskutoimitus!"}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Ohjelma tulostaa koodia","tmcname":"osa01-05_ohjelma_tulostaa_koodia"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa voidaan käyttää kaksinkertaisten lainausmerkkien "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\""}]},{"type":"text","value":" lisäksi myös yksinkertaista lainausmerkkiä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"'"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä on kätevää, kun haluat tulostaa lainausmerkkejä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'\"Heti takaisin!\", poliisi huusi.'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"\"Heti takaisin!\", poliisi huusi."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, jonka tulostus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"print(\"Moi kaikki!\")"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kertauskysely tämän osan asioihin liittyen:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Olet kirjoittanut ja suorittanut ensimmäisen Python-ohjelmasi
  • \n
  • Osaat käyttää print-komentoa viestien tulostamiseen
  • \n
  • Osaat laskea laskuja ohjelmoimalla
  • \n

Tietokoneohjelmat koostuvat komennoista eli yksinkertaisista toimintaohjeista, joita kone suorittaa yksi kerrallaan. Komennot voivat esimerkiksi suorittaa laskutoimituksia, vertailla koneen muistissa olevia tietoja, aiheuttaa muutoksen ohjelman toimintaan tai viestiä käyttäjän kanssa.

Aloitetaan ohjelmointiin tutustuminen yksinkertaisesta komennosta print, joka tulostaa tekstiä. Tulostaminen tarkoittaa käytännössä sitä, että ohjelma näyttää tekstiä ruudulla.

Esimerkiksi seuraava ohjelma tulostaa rivin \"Moi kaikki!\":

print(\"Moi kaikki!\")

Kun suoritamme ohjelman, se tuottaa seuraavan tuloksen:

Moi kaikki!

Huomaa, että ohjelman koodi tulee kirjoittaa tarkalleen yllä olevalla tavalla, jotta se toimii. Esimerkiksi jos yritämme tulostaa rivin käyttämättä lainausmerkkejä

print(Moi kaikki!)

ohjelma ei toimi, ja seurauksena on seuraava virheilmoitus:

\nFile \"\", line 1\n  print(Moi kaikki!)\n                   ^\nSyntaxError: invalid syntax\n

Python ei siis osaa tulkita tulostettavaa tekstiä oikein, jos se ei ole lainausmerkeissä.

Kirjoita ohjelma, joka tulostaa ruudulle hymiön: :-)

Ohjelman eteneminen

Kun kirjoitamme useita komentoja peräkkäin,\nne suoritetaan järjestyksessä ylhäältä alas.\nEsimerkiksi ohjelma

print(\"Tervetuloa opettelemaan ohjelmointia!\")\nprint(\"Aluksi harjoitellaan print-komennon käyttöä.\")\nprint(\"Tämä ohjelma tulostaa ruudulle kolme riviä tekstiä.\")

tulostaa ruudulle seuraavat rivit:

Tervetuloa opettelemaan ohjelmointia!\nAluksi harjoitellaan print-komennon käyttöä.\nTämä ohjelma tulostaa ruudulle kolme riviä tekstiä.

Ohjelman tarkoitus on tulostaa seitsemän veljestä aakkosjärjestyksessä. Ohjelmassa on kuitenkin yksi tai useampi virhe, jonka takia se ei toimi oikein.\nKorjaa ohjelma niin, että veljekset tulostuvat oikeassa järjestyksessä.

print(\"Simeoni\")\nprint(\"Juhani\")\nprint(\"Eero\")\nprint(\"Lauri\")\nprint(\"Aapo\")\nprint(\"Tuomas\")\nprint(\"Timo\")

Kirjoita ohjelma, joka tulostaa ruudulle seuraavat rivit (tarkalleen annetussa muodossa välimerkkeineen):

Ukko Nooa, Ukko Nooa oli kunnon mies.\nKun hän meni saunaan, laittoi laukun naulaan.\nUkko Nooa, Ukko Nooa oli kunnon mies.

Laskutoimitukset

Jos laitamme print-komennon sisälle laskutoimituksen, tulostuu ruudulle laskutoimituksen tulos. Esimerkiksi ohjelma

print(2 + 5)\nprint(3 * 3)\nprint(2 + 2 * 10)

tulostaa ruudulle seuraavat rivit:

7\n9\n22

Huomaa, että laskutoimituksen ympärille ei kirjoiteta lainausmerkkejä. Lainausmerkeillä merkitään merkkijono, joka tulostetaan ruudulle sellaisenaan. Huomaa siis seuraavien komentojen ero:

print(2 + 2 * 10)\nprint(\"2 + 2 * 10\")

Ohjelman tulostus on:

22\n2 + 2 * 10

Jälkimmäisessä tapauksessa Python ei laske laskutoimitusta, vaan tulostaa sen ruudulle.\nMerkkijonot siis tulostetaan ruudulle sellaisenaan riippumatta niiden sisällöstä.

Kommentit

Jos rivin alussa on merkki #, rivi on kommentti, jolloin rivillä oleva teksti ei vaikuta ohjelman toimintaan.

Kommenttien avulla ohjelmoija voi selostaa itselleen ja muille ohjelmoijille, miten ohjelma toimii. Esimerkiksi seuraavassa ohjelmassa kommentit selittävät käytettyä laskukaavaa:

print(\"Tuntien määrä vuodessa:\")\n# vuodessa on 365 päivää ja jokaisessa 24 tuntia\nprint(365*24)

Kun ohjelma suoritetaan, kommenteissa oleva teksti ei näy mitenkään ohjelman käyttäjälle:

Tuntien määrä vuodessa:\n8760

Lyhyempi kommentti voi olla myös rivin lopussa:

print(\"Tuntien määrä vuodessa:\")\nprint(365*24) # 365 päivää, 24 tuntia päivässä

Tee ohjelma, joka tulostaa minuuttien määrän vuodessa. Käytä edellisen esimerkin tapaan Pythonia tekemään laskutoimitus!

Pythonissa voidaan käyttää kaksinkertaisten lainausmerkkien \" lisäksi myös yksinkertaista lainausmerkkiä '.

Tämä on kätevää, kun haluat tulostaa lainausmerkkejä:

\nprint('\"Heti takaisin!\", poliisi huusi.')\n

\"Heti takaisin!\", poliisi huusi.

Tee ohjelma, jonka tulostus on seuraava:

print(\"Moi kaikki!\")

Kertauskysely tämän osan asioihin liittyen:

","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-1/1-ohjelmoinnin-aloittaminen.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Olet kirjoittanut ja suorittanut ensimmäisen Python-ohjelmasi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää print-komentoa viestien tulostamiseen"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat laskea laskuja ohjelmoimalla"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tietokoneohjelmat koostuvat "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"komennoista"}]},{"type":"text","value":" eli yksinkertaisista toimintaohjeista, joita kone suorittaa yksi kerrallaan. Komennot voivat esimerkiksi suorittaa laskutoimituksia, vertailla koneen muistissa olevia tietoja, aiheuttaa muutoksen ohjelman toimintaan tai viestiä käyttäjän kanssa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aloitetaan ohjelmointiin tutustuminen yksinkertaisesta komennosta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":", joka "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tulostaa"}]},{"type":"text","value":" tekstiä. Tulostaminen tarkoittaa käytännössä sitä, että ohjelma näyttää tekstiä ruudulla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraava ohjelma tulostaa rivin \"Moi kaikki!\":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi kaikki!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun suoritamme ohjelman, se tuottaa seuraavan tuloksen:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moi kaikki!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että ohjelman koodi tulee kirjoittaa tarkalleen yllä olevalla tavalla, jotta se toimii. Esimerkiksi jos yritämme tulostaa rivin käyttämättä lainausmerkkejä"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Moi kaikki!"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"ohjelma ei toimi, ja seurauksena on seuraava virheilmoitus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"File \""},{"type":"element","tagName":"stdin","properties":{},"children":[{"type":"text","value":"\", line 1\n print(Moi kaikki!)\n ^\nSyntaxError: invalid syntax\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python ei siis osaa tulkita tulostettavaa tekstiä oikein, jos se ei ole lainausmerkeissä."}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Hymiö","tmcname":"osa01-01_hymio","height":"300px"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita ohjelma, joka tulostaa ruudulle hymiön: :-)"}]}]},{"type":"element","tagName":"h2","properties":{"id":"ohjelman-eteneminen","style":"position:relative;"},"children":[{"type":"text","value":"Ohjelman eteneminen"},{"type":"element","tagName":"a","properties":{"href":"#ohjelman-eteneminen","ariaLabel":"ohjelman eteneminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun kirjoitamme useita komentoja peräkkäin,\nne suoritetaan järjestyksessä ylhäältä alas.\nEsimerkiksi ohjelma"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tervetuloa opettelemaan ohjelmointia!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aluksi harjoitellaan print-komennon käyttöä.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tämä ohjelma tulostaa ruudulle kolme riviä tekstiä.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tulostaa ruudulle seuraavat rivit:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tervetuloa opettelemaan ohjelmointia!\nAluksi harjoitellaan print-komennon käyttöä.\nTämä ohjelma tulostaa ruudulle kolme riviä tekstiä."}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Korjaa ohjelma: seitsemän veljestä","tmcname":"osa01-03_korjaa_ohjelma_7_veljesta"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tarkoitus on tulostaa seitsemän veljestä aakkosjärjestyksessä. Ohjelmassa on kuitenkin yksi tai useampi virhe, jonka takia se ei toimi oikein.\nKorjaa ohjelma niin, että veljekset tulostuvat oikeassa järjestyksessä."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Simeoni\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Juhani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Eero\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lauri\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aapo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tuomas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Timo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Ukko Nooa","tmcname":"osa01-02_ukko_nooa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita ohjelma, joka tulostaa ruudulle seuraavat rivit (tarkalleen annetussa muodossa välimerkkeineen):"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ukko Nooa, Ukko Nooa oli kunnon mies.\nKun hän meni saunaan, laittoi laukun naulaan.\nUkko Nooa, Ukko Nooa oli kunnon mies."}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"laskutoimitukset","style":"position:relative;"},"children":[{"type":"text","value":"Laskutoimitukset"},{"type":"element","tagName":"a","properties":{"href":"#laskutoimitukset","ariaLabel":"laskutoimitukset permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos laitamme "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennon sisälle laskutoimituksen, tulostuu ruudulle laskutoimituksen tulos. Esimerkiksi ohjelma"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tulostaa ruudulle seuraavat rivit:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"7\n9\n22"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että laskutoimituksen ympärille ei kirjoiteta lainausmerkkejä. Lainausmerkeillä merkitään "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"merkkijono"}]},{"type":"text","value":", joka tulostetaan ruudulle sellaisenaan. Huomaa siis seuraavien komentojen ero:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"2 + 2 * 10\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostus on:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"22\n2 + 2 * 10"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jälkimmäisessä tapauksessa Python ei laske laskutoimitusta, vaan tulostaa sen ruudulle.\nMerkkijonot siis tulostetaan ruudulle sellaisenaan riippumatta niiden sisällöstä."}]},{"type":"element","tagName":"h2","properties":{"id":"kommentit","style":"position:relative;"},"children":[{"type":"text","value":"Kommentit"},{"type":"element","tagName":"a","properties":{"href":"#kommentit","ariaLabel":"kommentit permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos rivin alussa on merkki "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"#"}]},{"type":"text","value":", rivi on kommentti, jolloin rivillä oleva teksti ei vaikuta ohjelman toimintaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kommenttien avulla ohjelmoija voi selostaa itselleen ja muille ohjelmoijille, miten ohjelma toimii. Esimerkiksi seuraavassa ohjelmassa kommentit selittävät käytettyä laskukaavaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tuntien määrä vuodessa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# vuodessa on 365 päivää ja jokaisessa 24 tuntia"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"365"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun ohjelma suoritetaan, kommenteissa oleva teksti ei näy mitenkään ohjelman käyttäjälle:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tuntien määrä vuodessa:\n8760"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lyhyempi kommentti voi olla myös rivin lopussa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tuntien määrä vuodessa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"365"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# 365 päivää, 24 tuntia päivässä"}]}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Minuutit vuodessa","tmcname":"osa01-04_minuuttien_maara_vuodessa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka tulostaa minuuttien määrän vuodessa. Käytä edellisen esimerkin tapaan Pythonia tekemään laskutoimitus!"}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Ohjelma tulostaa koodia","tmcname":"osa01-05_ohjelma_tulostaa_koodia"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa voidaan käyttää kaksinkertaisten lainausmerkkien "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\""}]},{"type":"text","value":" lisäksi myös yksinkertaista lainausmerkkiä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"'"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä on kätevää, kun haluat tulostaa lainausmerkkejä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'\"Heti takaisin!\", poliisi huusi.'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"\"Heti takaisin!\", poliisi huusi."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, jonka tulostus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"print(\"Moi kaikki!\")"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kertauskysely tämän osan asioihin liittyen:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Olet kirjoittanut ja suorittanut ensimmäisen Python-ohjelmasi
  • \n
  • Osaat käyttää print-komentoa viestien tulostamiseen
  • \n
  • Osaat laskea laskuja ohjelmoimalla
  • \n

Tietokoneohjelmat koostuvat komennoista eli yksinkertaisista toimintaohjeista, joita kone suorittaa yksi kerrallaan. Komennot voivat esimerkiksi suorittaa laskutoimituksia, vertailla koneen muistissa olevia tietoja, aiheuttaa muutoksen ohjelman toimintaan tai viestiä käyttäjän kanssa.

Aloitetaan ohjelmointiin tutustuminen yksinkertaisesta komennosta print, joka tulostaa tekstiä. Tulostaminen tarkoittaa käytännössä sitä, että ohjelma näyttää tekstiä ruudulla.

Esimerkiksi seuraava ohjelma tulostaa rivin \"Moi kaikki!\":

print(\"Moi kaikki!\")

Kun suoritamme ohjelman, se tuottaa seuraavan tuloksen:

Moi kaikki!

Huomaa, että ohjelman koodi tulee kirjoittaa tarkalleen yllä olevalla tavalla, jotta se toimii. Esimerkiksi jos yritämme tulostaa rivin käyttämättä lainausmerkkejä

print(Moi kaikki!)

ohjelma ei toimi, ja seurauksena on seuraava virheilmoitus:

\nFile \"\", line 1\n  print(Moi kaikki!)\n                   ^\nSyntaxError: invalid syntax\n

Python ei siis osaa tulkita tulostettavaa tekstiä oikein, jos se ei ole lainausmerkeissä.

Kirjoita ohjelma, joka tulostaa ruudulle hymiön: :-)

Ohjelman eteneminen

Kun kirjoitamme useita komentoja peräkkäin,\nne suoritetaan järjestyksessä ylhäältä alas.\nEsimerkiksi ohjelma

print(\"Tervetuloa opettelemaan ohjelmointia!\")\nprint(\"Aluksi harjoitellaan print-komennon käyttöä.\")\nprint(\"Tämä ohjelma tulostaa ruudulle kolme riviä tekstiä.\")

tulostaa ruudulle seuraavat rivit:

Tervetuloa opettelemaan ohjelmointia!\nAluksi harjoitellaan print-komennon käyttöä.\nTämä ohjelma tulostaa ruudulle kolme riviä tekstiä.

Ohjelman tarkoitus on tulostaa seitsemän veljestä aakkosjärjestyksessä. Ohjelmassa on kuitenkin yksi tai useampi virhe, jonka takia se ei toimi oikein.\nKorjaa ohjelma niin, että veljekset tulostuvat oikeassa järjestyksessä.

print(\"Simeoni\")\nprint(\"Juhani\")\nprint(\"Eero\")\nprint(\"Lauri\")\nprint(\"Aapo\")\nprint(\"Tuomas\")\nprint(\"Timo\")

Kirjoita ohjelma, joka tulostaa ruudulle seuraavat rivit (tarkalleen annetussa muodossa välimerkkeineen):

Ukko Nooa, Ukko Nooa oli kunnon mies.\nKun hän meni saunaan, laittoi laukun naulaan.\nUkko Nooa, Ukko Nooa oli kunnon mies.

Laskutoimitukset

Jos laitamme print-komennon sisälle laskutoimituksen, tulostuu ruudulle laskutoimituksen tulos. Esimerkiksi ohjelma

print(2 + 5)\nprint(3 * 3)\nprint(2 + 2 * 10)

tulostaa ruudulle seuraavat rivit:

7\n9\n22

Huomaa, että laskutoimituksen ympärille ei kirjoiteta lainausmerkkejä. Lainausmerkeillä merkitään merkkijono, joka tulostetaan ruudulle sellaisenaan. Huomaa siis seuraavien komentojen ero:

print(2 + 2 * 10)\nprint(\"2 + 2 * 10\")

Ohjelman tulostus on:

22\n2 + 2 * 10

Jälkimmäisessä tapauksessa Python ei laske laskutoimitusta, vaan tulostaa sen ruudulle.\nMerkkijonot siis tulostetaan ruudulle sellaisenaan riippumatta niiden sisällöstä.

Kommentit

Jos rivin alussa on merkki #, rivi on kommentti, jolloin rivillä oleva teksti ei vaikuta ohjelman toimintaan.

Kommenttien avulla ohjelmoija voi selostaa itselleen ja muille ohjelmoijille, miten ohjelma toimii. Esimerkiksi seuraavassa ohjelmassa kommentit selittävät käytettyä laskukaavaa:

print(\"Tuntien määrä vuodessa:\")\n# vuodessa on 365 päivää ja jokaisessa 24 tuntia\nprint(365*24)

Kun ohjelma suoritetaan, kommenteissa oleva teksti ei näy mitenkään ohjelman käyttäjälle:

Tuntien määrä vuodessa:\n8760

Lyhyempi kommentti voi olla myös rivin lopussa:

print(\"Tuntien määrä vuodessa:\")\nprint(365*24) # 365 päivää, 24 tuntia päivässä

Tee ohjelma, joka tulostaa minuuttien määrän vuodessa. Käytä edellisen esimerkin tapaan Pythonia tekemään laskutoimitus!

Pythonissa voidaan käyttää kaksinkertaisten lainausmerkkien \" lisäksi myös yksinkertaista lainausmerkkiä '.

Tämä on kätevää, kun haluat tulostaa lainausmerkkejä:

\nprint('\"Heti takaisin!\", poliisi huusi.')\n

\"Heti takaisin!\", poliisi huusi.

Tee ohjelma, jonka tulostus on seuraava:

print(\"Moi kaikki!\")

Kertauskysely tämän osan asioihin liittyen:

","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-1/1-ohjelmoinnin-aloittaminen.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-1/2-tietoa-kayttajalta/page-data.json b/page-data/osa-1/2-tietoa-kayttajalta/page-data.json index 583043a51..372b89164 100644 --- a/page-data/osa-1/2-tietoa-kayttajalta/page-data.json +++ b/page-data/osa-1/2-tietoa-kayttajalta/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-1/2-tietoa-kayttajalta", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat kirjoittaa ohjelman, joka lukee tietoa käyttäjältä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää muuttujaa syötteen lukemisessa ja tulostamisessa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat yhdistää merkkijonoja toisiinsa"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Syöte"}]},{"type":"text","value":" tarkoittaa tietoa, jonka ohjelman käyttäjä antaa ohjelmalle. Pythonissa voimme lukea rivin käyttäjän antamaa syötettä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"input"}]},{"type":"text","value":"-komennolla. Komento näyttää samalla viestin käyttäjälle, jossa voi pyytää syötettä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraava ohjelma lukee käyttäjän nimen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"input"}]},{"type":"text","value":"-komennolla ja\ntulostaa ruudulle tervehdyksen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennolla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna nimesi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi vaan, \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suoritus voisi näyttää esimerkiksi seuraavalta (käyttäjän kirjoittama syöte on merkitty punaisella):"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Pekka Python"}]},{"type":"text","value":"\nMoi vaan, Pekka Python"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostama teksti riippuu siis osittain käyttäjän syötteestä. Niinpä ohjelman suoritus voisi näyttää myös tältä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Outi Ohjelmoija"}]},{"type":"text","value":"\nMoi vaan, Outi Ohjelmoija"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmassa esiintyvä sana "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":" on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"muuttuja"}]},{"type":"text","value":". Muuttujalla tarkoitetaan ohjelmoinnissa paikkaa, johon voidaan tallentaa jokin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"arvo"}]},{"type":"text","value":" kuten merkkijono tai lukuarvo. Tämä arvo voidaan myöhemmin lukea tai sitä voidaan muuttaa."}]},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Muuttujan nimen valinta"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttujat voi periaatteessa ohjelmissa nimetä vapaasti, tiettyjä Python-kielen asettamia rajoituksia noudattaen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tällä kurssilla muuttujat ja muut vastaavat ohjelmien osat nimetään suomeksi.\nOhjelmoinnissa käytetään kuitenkin yleisesti kielenä englantia – jos etsit Googlen avulla ohjelmointiesimerkkejä, kielenä on usein englanti."}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Nimi kahdesti","tmcname":"osa01-06_nimi_kahdesti"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita ohjelma, joka kysyy käyttäjän nimeä ja tämän jälkeen tulostaa nimen kahteen kertaan peräkkäisille riveille."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Pekka"}]},{"type":"text","value":"\nPekka\nPekka"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"muuttujaan-viittaaminen","style":"position:relative;"},"children":[{"type":"text","value":"Muuttujaan viittaaminen"},{"type":"element","tagName":"a","properties":{"href":"#muuttujaan-viittaaminen","ariaLabel":"muuttujaan viittaaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttujaan voidaan viitata ohjelmassa useasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna nimesi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi, \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" on aika kiva nimi.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostus, kun käyttäjä antaa nimen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pauli Python"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Pauli Python"}]},{"type":"text","value":"\nMoi, Pauli Python!\nPauli Python on aika kiva nimi."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaanpa tulostuskomentoja vähän tarkemmin: "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennolle annetaan merkkijono, johon on yhdistetty valmista tekstiä ja käyttäjän syöte. Nämä on yhdistetty toisiinsa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"-operaattorilla,\njoka yhdistää kaksi merkkijonoa yhdeksi uudeksi merkkijonoksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkkijonoja voidaan yhdistää muuttujien arvoihin vapaasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna nimesi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"! Varmistan vielä: nimesi on siis \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"?\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostus, kun käyttäjä antaa nimen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Erkki Esimerkki"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Erkki Esimerkki"}]},{"type":"text","value":"\nMoi Erkki Esimerkki! Varmistan vielä: nimesi on siis Erkki Esimerkki?"}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Nimet huutomerkillä","tmcname":"osa01-07_nimi_ja_huutomerkit"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita ohjelma, joka kysyy käyttäjän nimeä ja tämän jälkeen tulostaa nimen kaksi kertaa samalle riville siten, että rivin alussa lopussa sekä nimien välissä on huutomerkki."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Pekka"}]},{"type":"text","value":"\n!Pekka!Pekka!"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"useampi-kuin-yksi-syote","style":"position:relative;"},"children":[{"type":"text","value":"Useampi kuin yksi syöte"},{"type":"element","tagName":"a","properties":{"href":"#useampi-kuin-yksi-syote","ariaLabel":"useampi kuin yksi syote permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmassa voi lukea useamman eri syötteen. Huomaa, että jokainen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"input"}]},{"type":"text","value":"-komennon kysymä merkkijono tallennetaan eri muuttujaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna nimesi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna sähköpostiosoitteesi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlempinimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna lempinimesi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Varmistetaan vielä, että tiedot menivät oikein\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nimesi: \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sähköpostiosoitteesi: \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lempinimesi: \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" lempinimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki ohjelman suorituksesta:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Keijo Keksitty"}]},{"type":"text","value":"\nAnna sähköpostiosoitteesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"mailto:keijo99@example.com","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"keijo99@example.com"}]}]},{"type":"text","value":"\nAnna lempinimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Keke"}]},{"type":"text","value":"\nVarmistetaan vielä, että tiedot menivät oikein\nNimesi: Keijo Keksitty\nSähköpostiosoitteesi: "},{"type":"element","tagName":"a","properties":{"href":"mailto:keijo99@example.com","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"keijo99@example.com"}]},{"type":"text","value":"\nLempinimesi: Keke"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos samaan muuttujaan luetaan syöte useamman kerran, uusi arvo ylikirjoittaa aina edellisen. Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"osoite "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikä on osoitteesi? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Asut siis osoitteessa \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" osoite"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nosoite "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna uusi osoite: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Osoite on nyt \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" osoite"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuoritus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mikä on osoitteesi? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Pythonpolku 1 A 10"}]},{"type":"text","value":"\nAsut siis osoitteessa Pythonpolku 1 A 10\nAnna uusi osoite: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Uusikatu 999"}]},{"type":"text","value":"\nOsoite on nyt Uusikatu 999"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos samaan muuttujaan luetaan kaksi syötettä peräkkäin, ei ensimmäisenä syötettyyn arvoon siis pääse enää käsiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"osoite "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikä on osoitteesi? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nosoite "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna uusi osoite: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Osoite on nyt \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" osoite"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuoritus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mikä on osoitteesi? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Pythonpolku 10"}]},{"type":"text","value":"\nAnna uusi osoite: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Ohjelmoijanraitti 230"}]},{"type":"text","value":"\nOsoite on nyt Ohjelmoijanraitti 230"}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Nimi ja osoite","tmcname":"osa01-08_nimi_ja_osoite"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita ohjelma, joka kysyy käyttäjän nimeä ja osoitetta. Ohjelma tulostaa syötetyt tiedot."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Etunimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Sanna"}]},{"type":"text","value":"\nSukunimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Seppänen"}]},{"type":"text","value":"\nKatuosoite: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Mannerheimintie 10"}]},{"type":"text","value":"\nPostinumero ja kaupunki: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"00100 Helsinki"}]},{"type":"text","value":"\nSanna Seppänen\nMannerheimintie 10\n00100 Helsinki"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":" Korjaa ohjelma: Lausahdukset","tmcname":"osa01-09_korjaa_ohjelma_lausahdukset"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on annettu ohjelma, jonka pitäisi kysyä käyttäjältä kolme lausahdusta ja tulostaa ne esimerkin mukaisesti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna 1. osa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"entten"}]},{"type":"text","value":"\nAnna 2. osa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tentten"}]},{"type":"text","value":"\nAnna 3. osa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"teelikamentten"}]},{"type":"text","value":"\nentten-tentten-teelikamentten!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmassa on kuitenkin virhe tai virheitä, joiden takia se ei toimi oikein. Korjaa ohjelma."}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Tarina","tmcname":"osa01-10_tarina"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka tulostaa oheisen tarinan, johon on upotettu käyttäjän antama nimi ja vuosi."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Maija"}]},{"type":"text","value":"\nAnna vuosi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1572"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Maija on urhea ritari, syntynyt vuonna 1572. Eräänä aamuna Maija heräsi kovaan meluun: lohikäärme lähestyi kylää. Vain Maija voisi pelastaa kylän asukkaat."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarinan tulee muuttua sen mukaan, mitkä tiedot käyttäjä antaa."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kertauskysely tämän osan asioihin liittyen:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"260a58a9-a12e-5a55-835b-26cfac247f57"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat kirjoittaa ohjelman, joka lukee tietoa käyttäjältä
  • \n
  • Osaat käyttää muuttujaa syötteen lukemisessa ja tulostamisessa
  • \n
  • Osaat yhdistää merkkijonoja toisiinsa
  • \n

Syöte tarkoittaa tietoa, jonka ohjelman käyttäjä antaa ohjelmalle. Pythonissa voimme lukea rivin käyttäjän antamaa syötettä input-komennolla. Komento näyttää samalla viestin käyttäjälle, jossa voi pyytää syötettä.

Esimerkiksi seuraava ohjelma lukee käyttäjän nimen input-komennolla ja\ntulostaa ruudulle tervehdyksen print-komennolla:

nimi = input(\"Anna nimesi: \")\nprint(\"Moi vaan, \" + nimi)

Ohjelman suoritus voisi näyttää esimerkiksi seuraavalta (käyttäjän kirjoittama syöte on merkitty punaisella):

Anna nimesi: Pekka Python\nMoi vaan, Pekka Python

Ohjelman tulostama teksti riippuu siis osittain käyttäjän syötteestä. Niinpä ohjelman suoritus voisi näyttää myös tältä:

Anna nimesi: Outi Ohjelmoija\nMoi vaan, Outi Ohjelmoija

Ohjelmassa esiintyvä sana nimi on muuttuja. Muuttujalla tarkoitetaan ohjelmoinnissa paikkaa, johon voidaan tallentaa jokin arvo kuten merkkijono tai lukuarvo. Tämä arvo voidaan myöhemmin lukea tai sitä voidaan muuttaa.

Muuttujat voi periaatteessa ohjelmissa nimetä vapaasti, tiettyjä Python-kielen asettamia rajoituksia noudattaen.

Tällä kurssilla muuttujat ja muut vastaavat ohjelmien osat nimetään suomeksi.\nOhjelmoinnissa käytetään kuitenkin yleisesti kielenä englantia – jos etsit Googlen avulla ohjelmointiesimerkkejä, kielenä on usein englanti.

Kirjoita ohjelma, joka kysyy käyttäjän nimeä ja tämän jälkeen tulostaa nimen kahteen kertaan peräkkäisille riveille.

Ohjelman tulee toimia seuraavasti:

Anna nimesi: Pekka\nPekka\nPekka

Muuttujaan viittaaminen

Muuttujaan voidaan viitata ohjelmassa useasti:

nimi = input(\"Anna nimesi: \")\n\nprint(\"Moi, \" + nimi + \"!\")\nprint(nimi + \" on aika kiva nimi.\")

Esimerkkitulostus, kun käyttäjä antaa nimen Pauli Python:

Anna nimesi: Pauli Python\nMoi, Pauli Python!\nPauli Python on aika kiva nimi.

Tarkastellaanpa tulostuskomentoja vähän tarkemmin: print-komennolle annetaan merkkijono, johon on yhdistetty valmista tekstiä ja käyttäjän syöte. Nämä on yhdistetty toisiinsa +-operaattorilla,\njoka yhdistää kaksi merkkijonoa yhdeksi uudeksi merkkijonoksi.

Merkkijonoja voidaan yhdistää muuttujien arvoihin vapaasti:

nimi = input(\"Anna nimesi: \")\n\nprint(\"Moi \" + nimi + \"! Varmistan vielä: nimesi on siis \" + nimi + \"?\")

Esimerkkitulostus, kun käyttäjä antaa nimen Erkki Esimerkki:

Anna nimesi: Erkki Esimerkki\nMoi Erkki Esimerkki! Varmistan vielä: nimesi on siis Erkki Esimerkki?

Kirjoita ohjelma, joka kysyy käyttäjän nimeä ja tämän jälkeen tulostaa nimen kaksi kertaa samalle riville siten, että rivin alussa lopussa sekä nimien välissä on huutomerkki.

Ohjelman tulee toimia seuraavasti:

Anna nimesi: Pekka\n!Pekka!Pekka!

Useampi kuin yksi syöte

Ohjelmassa voi lukea useamman eri syötteen. Huomaa, että jokainen input-komennon kysymä merkkijono tallennetaan eri muuttujaan:

nimi = input(\"Anna nimesi: \")\nsposti = input(\"Anna sähköpostiosoitteesi: \")\nlempinimi = input(\"Anna lempinimesi: \")\n\nprint(\"Varmistetaan vielä, että tiedot menivät oikein\")\nprint(\"Nimesi: \" + nimi)\nprint(\"Sähköpostiosoitteesi: \" + sposti)\nprint(\"Lempinimesi: \" + lempinimi)

Esimerkki ohjelman suorituksesta:

Anna nimesi: Keijo Keksitty\nAnna sähköpostiosoitteesi: keijo99@example.com\nAnna lempinimesi: Keke\nVarmistetaan vielä, että tiedot menivät oikein\nNimesi: Keijo Keksitty\nSähköpostiosoitteesi: keijo99@example.com\nLempinimesi: Keke

Jos samaan muuttujaan luetaan syöte useamman kerran, uusi arvo ylikirjoittaa aina edellisen. Esimerkiksi:

osoite = input(\"Mikä on osoitteesi? \")\nprint(\"Asut siis osoitteessa \" + osoite)\n\nosoite = input(\"Anna uusi osoite: \")\nprint(\"Osoite on nyt \" + osoite)

Esimerkkisuoritus:

Mikä on osoitteesi? Pythonpolku 1 A 10\nAsut siis osoitteessa Pythonpolku 1 A 10\nAnna uusi osoite: Uusikatu 999\nOsoite on nyt Uusikatu 999

Jos samaan muuttujaan luetaan kaksi syötettä peräkkäin, ei ensimmäisenä syötettyyn arvoon siis pääse enää käsiksi:

osoite = input(\"Mikä on osoitteesi? \")\nosoite = input(\"Anna uusi osoite: \")\n\nprint(\"Osoite on nyt \" + osoite)

Esimerkkisuoritus:

Mikä on osoitteesi? Pythonpolku 10\nAnna uusi osoite: Ohjelmoijanraitti 230\nOsoite on nyt Ohjelmoijanraitti 230

Kirjoita ohjelma, joka kysyy käyttäjän nimeä ja osoitetta. Ohjelma tulostaa syötetyt tiedot.

Ohjelman tulee toimia seuraavasti:

Etunimi: Sanna\nSukunimi: Seppänen\nKatuosoite: Mannerheimintie 10\nPostinumero ja kaupunki: 00100 Helsinki\nSanna Seppänen\nMannerheimintie 10\n00100 Helsinki

Tehtäväpohjassa on annettu ohjelma, jonka pitäisi kysyä käyttäjältä kolme lausahdusta ja tulostaa ne esimerkin mukaisesti:

Anna 1. osa: entten\nAnna 2. osa: tentten\nAnna 3. osa: teelikamentten\nentten-tentten-teelikamentten!

Ohjelmassa on kuitenkin virhe tai virheitä, joiden takia se ei toimi oikein. Korjaa ohjelma.

Tee ohjelma, joka tulostaa oheisen tarinan, johon on upotettu käyttäjän antama nimi ja vuosi.

Anna nimi: Maija\nAnna vuosi: 1572

Maija on urhea ritari, syntynyt vuonna 1572. Eräänä aamuna Maija heräsi kovaan meluun: lohikäärme lähestyi kylää. Vain Maija voisi pelastaa kylän asukkaat.

Tarinan tulee muuttua sen mukaan, mitkä tiedot käyttäjä antaa.

Kertauskysely tämän osan asioihin liittyen:

","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-1/2-tietoa-kayttajalta.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat kirjoittaa ohjelman, joka lukee tietoa käyttäjältä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää muuttujaa syötteen lukemisessa ja tulostamisessa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat yhdistää merkkijonoja toisiinsa"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Syöte"}]},{"type":"text","value":" tarkoittaa tietoa, jonka ohjelman käyttäjä antaa ohjelmalle. Pythonissa voimme lukea rivin käyttäjän antamaa syötettä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"input"}]},{"type":"text","value":"-komennolla. Komento näyttää samalla viestin käyttäjälle, jossa voi pyytää syötettä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraava ohjelma lukee käyttäjän nimen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"input"}]},{"type":"text","value":"-komennolla ja\ntulostaa ruudulle tervehdyksen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennolla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna nimesi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi vaan, \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suoritus voisi näyttää esimerkiksi seuraavalta (käyttäjän kirjoittama syöte on merkitty punaisella):"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Pekka Python"}]},{"type":"text","value":"\nMoi vaan, Pekka Python"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostama teksti riippuu siis osittain käyttäjän syötteestä. Niinpä ohjelman suoritus voisi näyttää myös tältä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Outi Ohjelmoija"}]},{"type":"text","value":"\nMoi vaan, Outi Ohjelmoija"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmassa esiintyvä sana "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":" on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"muuttuja"}]},{"type":"text","value":". Muuttujalla tarkoitetaan ohjelmoinnissa paikkaa, johon voidaan tallentaa jokin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"arvo"}]},{"type":"text","value":" kuten merkkijono tai lukuarvo. Tämä arvo voidaan myöhemmin lukea tai sitä voidaan muuttaa."}]},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Muuttujan nimen valinta"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttujat voi periaatteessa ohjelmissa nimetä vapaasti, tiettyjä Python-kielen asettamia rajoituksia noudattaen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tällä kurssilla muuttujat ja muut vastaavat ohjelmien osat nimetään suomeksi.\nOhjelmoinnissa käytetään kuitenkin yleisesti kielenä englantia – jos etsit Googlen avulla ohjelmointiesimerkkejä, kielenä on usein englanti."}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Nimi kahdesti","tmcname":"osa01-06_nimi_kahdesti"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita ohjelma, joka kysyy käyttäjän nimeä ja tämän jälkeen tulostaa nimen kahteen kertaan peräkkäisille riveille."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Pekka"}]},{"type":"text","value":"\nPekka\nPekka"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"muuttujaan-viittaaminen","style":"position:relative;"},"children":[{"type":"text","value":"Muuttujaan viittaaminen"},{"type":"element","tagName":"a","properties":{"href":"#muuttujaan-viittaaminen","ariaLabel":"muuttujaan viittaaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttujaan voidaan viitata ohjelmassa useasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna nimesi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi, \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" on aika kiva nimi.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostus, kun käyttäjä antaa nimen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pauli Python"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Pauli Python"}]},{"type":"text","value":"\nMoi, Pauli Python!\nPauli Python on aika kiva nimi."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaanpa tulostuskomentoja vähän tarkemmin: "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennolle annetaan merkkijono, johon on yhdistetty valmista tekstiä ja käyttäjän syöte. Nämä on yhdistetty toisiinsa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"-operaattorilla,\njoka yhdistää kaksi merkkijonoa yhdeksi uudeksi merkkijonoksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkkijonoja voidaan yhdistää muuttujien arvoihin vapaasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna nimesi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"! Varmistan vielä: nimesi on siis \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"?\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostus, kun käyttäjä antaa nimen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Erkki Esimerkki"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Erkki Esimerkki"}]},{"type":"text","value":"\nMoi Erkki Esimerkki! Varmistan vielä: nimesi on siis Erkki Esimerkki?"}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Nimet huutomerkillä","tmcname":"osa01-07_nimi_ja_huutomerkit"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita ohjelma, joka kysyy käyttäjän nimeä ja tämän jälkeen tulostaa nimen kaksi kertaa samalle riville siten, että rivin alussa lopussa sekä nimien välissä on huutomerkki."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Pekka"}]},{"type":"text","value":"\n!Pekka!Pekka!"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"useampi-kuin-yksi-syote","style":"position:relative;"},"children":[{"type":"text","value":"Useampi kuin yksi syöte"},{"type":"element","tagName":"a","properties":{"href":"#useampi-kuin-yksi-syote","ariaLabel":"useampi kuin yksi syote permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmassa voi lukea useamman eri syötteen. Huomaa, että jokainen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"input"}]},{"type":"text","value":"-komennon kysymä merkkijono tallennetaan eri muuttujaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna nimesi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna sähköpostiosoitteesi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlempinimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna lempinimesi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Varmistetaan vielä, että tiedot menivät oikein\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nimesi: \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sähköpostiosoitteesi: \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lempinimesi: \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" lempinimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki ohjelman suorituksesta:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Keijo Keksitty"}]},{"type":"text","value":"\nAnna sähköpostiosoitteesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"mailto:keijo99@example.com","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"keijo99@example.com"}]}]},{"type":"text","value":"\nAnna lempinimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Keke"}]},{"type":"text","value":"\nVarmistetaan vielä, että tiedot menivät oikein\nNimesi: Keijo Keksitty\nSähköpostiosoitteesi: "},{"type":"element","tagName":"a","properties":{"href":"mailto:keijo99@example.com","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"keijo99@example.com"}]},{"type":"text","value":"\nLempinimesi: Keke"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos samaan muuttujaan luetaan syöte useamman kerran, uusi arvo ylikirjoittaa aina edellisen. Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"osoite "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikä on osoitteesi? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Asut siis osoitteessa \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" osoite"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nosoite "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna uusi osoite: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Osoite on nyt \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" osoite"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuoritus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mikä on osoitteesi? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Pythonpolku 1 A 10"}]},{"type":"text","value":"\nAsut siis osoitteessa Pythonpolku 1 A 10\nAnna uusi osoite: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Uusikatu 999"}]},{"type":"text","value":"\nOsoite on nyt Uusikatu 999"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos samaan muuttujaan luetaan kaksi syötettä peräkkäin, ei ensimmäisenä syötettyyn arvoon siis pääse enää käsiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"osoite "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikä on osoitteesi? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nosoite "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna uusi osoite: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Osoite on nyt \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" osoite"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuoritus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mikä on osoitteesi? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Pythonpolku 10"}]},{"type":"text","value":"\nAnna uusi osoite: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Ohjelmoijanraitti 230"}]},{"type":"text","value":"\nOsoite on nyt Ohjelmoijanraitti 230"}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Nimi ja osoite","tmcname":"osa01-08_nimi_ja_osoite"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita ohjelma, joka kysyy käyttäjän nimeä ja osoitetta. Ohjelma tulostaa syötetyt tiedot."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Etunimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Sanna"}]},{"type":"text","value":"\nSukunimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Seppänen"}]},{"type":"text","value":"\nKatuosoite: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Mannerheimintie 10"}]},{"type":"text","value":"\nPostinumero ja kaupunki: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"00100 Helsinki"}]},{"type":"text","value":"\nSanna Seppänen\nMannerheimintie 10\n00100 Helsinki"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":" Korjaa ohjelma: Lausahdukset","tmcname":"osa01-09_korjaa_ohjelma_lausahdukset"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on annettu ohjelma, jonka pitäisi kysyä käyttäjältä kolme lausahdusta ja tulostaa ne esimerkin mukaisesti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna 1. osa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"entten"}]},{"type":"text","value":"\nAnna 2. osa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tentten"}]},{"type":"text","value":"\nAnna 3. osa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"teelikamentten"}]},{"type":"text","value":"\nentten-tentten-teelikamentten!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmassa on kuitenkin virhe tai virheitä, joiden takia se ei toimi oikein. Korjaa ohjelma."}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Tarina","tmcname":"osa01-10_tarina"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka tulostaa oheisen tarinan, johon on upotettu käyttäjän antama nimi ja vuosi."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Maija"}]},{"type":"text","value":"\nAnna vuosi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1572"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Maija on urhea ritari, syntynyt vuonna 1572. Eräänä aamuna Maija heräsi kovaan meluun: lohikäärme lähestyi kylää. Vain Maija voisi pelastaa kylän asukkaat."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarinan tulee muuttua sen mukaan, mitkä tiedot käyttäjä antaa."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kertauskysely tämän osan asioihin liittyen:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"260a58a9-a12e-5a55-835b-26cfac247f57"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat kirjoittaa ohjelman, joka lukee tietoa käyttäjältä
  • \n
  • Osaat käyttää muuttujaa syötteen lukemisessa ja tulostamisessa
  • \n
  • Osaat yhdistää merkkijonoja toisiinsa
  • \n

Syöte tarkoittaa tietoa, jonka ohjelman käyttäjä antaa ohjelmalle. Pythonissa voimme lukea rivin käyttäjän antamaa syötettä input-komennolla. Komento näyttää samalla viestin käyttäjälle, jossa voi pyytää syötettä.

Esimerkiksi seuraava ohjelma lukee käyttäjän nimen input-komennolla ja\ntulostaa ruudulle tervehdyksen print-komennolla:

nimi = input(\"Anna nimesi: \")\nprint(\"Moi vaan, \" + nimi)

Ohjelman suoritus voisi näyttää esimerkiksi seuraavalta (käyttäjän kirjoittama syöte on merkitty punaisella):

Anna nimesi: Pekka Python\nMoi vaan, Pekka Python

Ohjelman tulostama teksti riippuu siis osittain käyttäjän syötteestä. Niinpä ohjelman suoritus voisi näyttää myös tältä:

Anna nimesi: Outi Ohjelmoija\nMoi vaan, Outi Ohjelmoija

Ohjelmassa esiintyvä sana nimi on muuttuja. Muuttujalla tarkoitetaan ohjelmoinnissa paikkaa, johon voidaan tallentaa jokin arvo kuten merkkijono tai lukuarvo. Tämä arvo voidaan myöhemmin lukea tai sitä voidaan muuttaa.

Muuttujat voi periaatteessa ohjelmissa nimetä vapaasti, tiettyjä Python-kielen asettamia rajoituksia noudattaen.

Tällä kurssilla muuttujat ja muut vastaavat ohjelmien osat nimetään suomeksi.\nOhjelmoinnissa käytetään kuitenkin yleisesti kielenä englantia – jos etsit Googlen avulla ohjelmointiesimerkkejä, kielenä on usein englanti.

Kirjoita ohjelma, joka kysyy käyttäjän nimeä ja tämän jälkeen tulostaa nimen kahteen kertaan peräkkäisille riveille.

Ohjelman tulee toimia seuraavasti:

Anna nimesi: Pekka\nPekka\nPekka

Muuttujaan viittaaminen

Muuttujaan voidaan viitata ohjelmassa useasti:

nimi = input(\"Anna nimesi: \")\n\nprint(\"Moi, \" + nimi + \"!\")\nprint(nimi + \" on aika kiva nimi.\")

Esimerkkitulostus, kun käyttäjä antaa nimen Pauli Python:

Anna nimesi: Pauli Python\nMoi, Pauli Python!\nPauli Python on aika kiva nimi.

Tarkastellaanpa tulostuskomentoja vähän tarkemmin: print-komennolle annetaan merkkijono, johon on yhdistetty valmista tekstiä ja käyttäjän syöte. Nämä on yhdistetty toisiinsa +-operaattorilla,\njoka yhdistää kaksi merkkijonoa yhdeksi uudeksi merkkijonoksi.

Merkkijonoja voidaan yhdistää muuttujien arvoihin vapaasti:

nimi = input(\"Anna nimesi: \")\n\nprint(\"Moi \" + nimi + \"! Varmistan vielä: nimesi on siis \" + nimi + \"?\")

Esimerkkitulostus, kun käyttäjä antaa nimen Erkki Esimerkki:

Anna nimesi: Erkki Esimerkki\nMoi Erkki Esimerkki! Varmistan vielä: nimesi on siis Erkki Esimerkki?

Kirjoita ohjelma, joka kysyy käyttäjän nimeä ja tämän jälkeen tulostaa nimen kaksi kertaa samalle riville siten, että rivin alussa lopussa sekä nimien välissä on huutomerkki.

Ohjelman tulee toimia seuraavasti:

Anna nimesi: Pekka\n!Pekka!Pekka!

Useampi kuin yksi syöte

Ohjelmassa voi lukea useamman eri syötteen. Huomaa, että jokainen input-komennon kysymä merkkijono tallennetaan eri muuttujaan:

nimi = input(\"Anna nimesi: \")\nsposti = input(\"Anna sähköpostiosoitteesi: \")\nlempinimi = input(\"Anna lempinimesi: \")\n\nprint(\"Varmistetaan vielä, että tiedot menivät oikein\")\nprint(\"Nimesi: \" + nimi)\nprint(\"Sähköpostiosoitteesi: \" + sposti)\nprint(\"Lempinimesi: \" + lempinimi)

Esimerkki ohjelman suorituksesta:

Anna nimesi: Keijo Keksitty\nAnna sähköpostiosoitteesi: keijo99@example.com\nAnna lempinimesi: Keke\nVarmistetaan vielä, että tiedot menivät oikein\nNimesi: Keijo Keksitty\nSähköpostiosoitteesi: keijo99@example.com\nLempinimesi: Keke

Jos samaan muuttujaan luetaan syöte useamman kerran, uusi arvo ylikirjoittaa aina edellisen. Esimerkiksi:

osoite = input(\"Mikä on osoitteesi? \")\nprint(\"Asut siis osoitteessa \" + osoite)\n\nosoite = input(\"Anna uusi osoite: \")\nprint(\"Osoite on nyt \" + osoite)

Esimerkkisuoritus:

Mikä on osoitteesi? Pythonpolku 1 A 10\nAsut siis osoitteessa Pythonpolku 1 A 10\nAnna uusi osoite: Uusikatu 999\nOsoite on nyt Uusikatu 999

Jos samaan muuttujaan luetaan kaksi syötettä peräkkäin, ei ensimmäisenä syötettyyn arvoon siis pääse enää käsiksi:

osoite = input(\"Mikä on osoitteesi? \")\nosoite = input(\"Anna uusi osoite: \")\n\nprint(\"Osoite on nyt \" + osoite)

Esimerkkisuoritus:

Mikä on osoitteesi? Pythonpolku 10\nAnna uusi osoite: Ohjelmoijanraitti 230\nOsoite on nyt Ohjelmoijanraitti 230

Kirjoita ohjelma, joka kysyy käyttäjän nimeä ja osoitetta. Ohjelma tulostaa syötetyt tiedot.

Ohjelman tulee toimia seuraavasti:

Etunimi: Sanna\nSukunimi: Seppänen\nKatuosoite: Mannerheimintie 10\nPostinumero ja kaupunki: 00100 Helsinki\nSanna Seppänen\nMannerheimintie 10\n00100 Helsinki

Tehtäväpohjassa on annettu ohjelma, jonka pitäisi kysyä käyttäjältä kolme lausahdusta ja tulostaa ne esimerkin mukaisesti:

Anna 1. osa: entten\nAnna 2. osa: tentten\nAnna 3. osa: teelikamentten\nentten-tentten-teelikamentten!

Ohjelmassa on kuitenkin virhe tai virheitä, joiden takia se ei toimi oikein. Korjaa ohjelma.

Tee ohjelma, joka tulostaa oheisen tarinan, johon on upotettu käyttäjän antama nimi ja vuosi.

Anna nimi: Maija\nAnna vuosi: 1572

Maija on urhea ritari, syntynyt vuonna 1572. Eräänä aamuna Maija heräsi kovaan meluun: lohikäärme lähestyi kylää. Vain Maija voisi pelastaa kylän asukkaat.

Tarinan tulee muuttua sen mukaan, mitkä tiedot käyttäjä antaa.

Kertauskysely tämän osan asioihin liittyen:

","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-1/2-tietoa-kayttajalta.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-1/3-lisaa-muuttujista/page-data.json b/page-data/osa-1/3-lisaa-muuttujista/page-data.json index d31f2a36d..546806053 100644 --- a/page-data/osa-1/3-lisaa-muuttujista/page-data.json +++ b/page-data/osa-1/3-lisaa-muuttujista/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-1/3-lisaa-muuttujista", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää muuttujia eri yhteyksissä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, millaista tietoa muuttujiin voidaan tallentaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ymmärrät merkkijonojen sekä kokonais- ja liukulukujen eron"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa seuraavaan kyselyyn ennen osion aloittamista. Saat vastaamisesta yhden tehtäväpisteen."}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc"},"children":[]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttujia tarvitaan ohjelmissa moniin tarkoituksiin. Voimme tallentaa muuttujiin mitä tahansa sellaista tietoa, jota tarvitaan ohjelmassa myöhemmin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttuja luodaan Pythonissa seuraavasti:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"muuttujan_nimi = ..."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"..."}]},{"type":"text","value":" tarkoittaa arvoa, joka tallennetaan muuttujaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi kun luemme "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"input"}]},{"type":"text","value":"-komennolla merkkijonon käyttäjältä, sijoitamme merkkijonon muuttujaan, jotta voimme käyttää sitä myöhemmin ohjelmassa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna nimesi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi, \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Kummitus"}]},{"type":"text","value":"\nMoi, Kummitus"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttujille voidaan antaa arvoja myös esimerkiksi näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"etunimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"text","value":"\nsukunimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pythonen\""}]},{"type":"text","value":"\n\nnimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" etunimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" sukunimi\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka Pythonen"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tapauksessa muuttujan arvo ei tule käyttäjältä vaan se on sama ohjelman jokaisella suorituskerralla."}]},{"type":"element","tagName":"h2","properties":{"id":"muuttujan-arvon-muuttaminen","style":"position:relative;"},"children":[{"type":"text","value":"Muuttujan arvon muuttaminen"},{"type":"element","tagName":"a","properties":{"href":"#muuttujan-arvon-muuttaminen","ariaLabel":"muuttujan arvon muuttaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttujan arvo voi nimensä mukaisesti muuttua. Niin kuin edellisessä osassa todettiin, uusi arvo ylikirjoittaa vanhan arvon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraavassa ohjelmassa muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sana"}]},{"type":"text","value":" saa kolme eri arvoa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna sana: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna toinen sana: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kolmas\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"eka"}]},{"type":"text","value":"\neka\nAnna toinen sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"toka"}]},{"type":"text","value":"\ntoka\nkolmas"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttujan sisältö siis vaihtuu jokaisen sijoituksen yhteydessä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttujan uusi arvo voi myös perustua sen vanhaan arvoon. Esimerkiksi seuraavassa muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sana"}]},{"type":"text","value":" saa ensin arvoksi käyttäjän syötteen. Tämän jälkeen muuttuja saa arvoksi vanhan arvonsa, jonka perään on lisätty kolme huutomerkkiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna sana: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"!!!\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"testi"}]},{"type":"text","value":"\ntesti\ntesti!!!"}]}]},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Lisää muuttujan nimen valinnasta"},"children":[{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttujat kannattaa nimetä niiden käyttötarkoituksen mukaan.\nEsimerkiksi jos muuttujassa on sana, nimi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sana"}]},{"type":"text","value":" on parempi kuin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python ei rajoita muuttujien nimien pituutta, mutta eräitä muita sääntöjä muuttujien nimiin liittyy. Nimen täytyy alkaa kirjaimella ja se saa sisältää vain kirjaimia, numeroita ja alaviivoja _."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa myös, että pienet ja isot kirjaimet ovat eri merkkejä. Muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":" on siis eri muuttuja kuin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Nimi"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"NIMI"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa muuttujien nimet on tapana kirjoittaa pienillä kirjaimilla. Jos nimessä on useita sanoja, niiden välissä on alaviiva."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"kokonaisluvut","style":"position:relative;"},"children":[{"type":"text","value":"Kokonaisluvut"},{"type":"element","tagName":"a","properties":{"href":"#kokonaisluvut","ariaLabel":"kokonaisluvut permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tähän mennessä olemme tallentaneet muuttujiin vain merkkijonoja. Usein ohjelmissa halutaan kuitenkin tallentaa myös muun tyyppistä tietoa. Tarkastellaan aluksi kokonaislukuja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma luo muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ika"}]},{"type":"text","value":", jonka sisältönä on kokonaisluku."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"24"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kokonaisluvun ympärille ei kirjoiteta lainausmerkkejä. Itse asiassa luvun ympärille kirjoitettavat lainausmerkit tarkoittavat, että kyseessä ei ole luku vaan merkkijono (joka tosin saattaa sisältää numeroita)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mitä eroa muuttujan tyypeillä siis on, kun seuraava ohjelma tulostaa samat arvot?"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"text","value":"\nluku2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"100\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"100\n100"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tyypeillä on merkitystä, koska\nerilaiset operaatiot vaikuttavat eri tavalla erityyppisiin muuttujiin. Tarkastellaan seuraavaa esimerkkiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"text","value":"\nluku2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"100\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" luku1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" luku2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"200\n100100"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kahdelle lukuarvolle "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"-operaattori siis merkitsee yhteenlaskua, merkkijonoille taas yhdistämistä peräkkäin."}]},{"type":"element","tagName":"h2","properties":{"id":"arvojen-yhdistaminen-tulostettaessa","style":"position:relative;"},"children":[{"type":"text","value":"Arvojen yhdistäminen tulostettaessa"},{"type":"element","tagName":"a","properties":{"href":"#arvojen-yhdistaminen-tulostettaessa","ariaLabel":"arvojen yhdistaminen tulostettaessa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma ei toimi, koska "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"Tulos on \""}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulos"}]},{"type":"text","value":" ovat erityypisiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"25"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# seuraava rivi tuottaa virheen"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tulos on \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma ei tulosta mitään, vaan antaa virheen"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"TypeError: unsupported operand type(s) for +: 'str' and 'int'"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python kertoo, ettei kahden erityyppisen arvon yhdistäminen toimi. Tässä tapauksessa arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"Tulos on\""}]},{"type":"text","value":" tyyppi on merkkijono ja arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulos"}]},{"type":"text","value":" tyyppi on kokonaisluku."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos haluamme tulostaa yhdellä komennolla merkkijonon ja luvun, yhdistäminen onnistuu kuitenkin muuttamalla luku merkkijonoksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"str"}]},{"type":"text","value":"-funktiolla. Esimerkiksi"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"25"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tulos on \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulos on 250"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen mahdollisuus on käyttää pilkkua "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennossa. Tällöin komento tulostaa kaikki pilkuilla erotetut arvot riippumatta niiden tyypistä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"25"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tulos on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulos on 250"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että tässä tapauksessa arvojen väliin ilmestyy automaattisesti yksi välilyönti tulostuksessa."}]},{"type":"element","tagName":"h2","properties":{"id":"tulostaminen-f-merkkijonojen-avulla","style":"position:relative;"},"children":[{"type":"text","value":"Tulostaminen f-merkkijonojen avulla"},{"type":"element","tagName":"a","properties":{"href":"#tulostaminen-f-merkkijonojen-avulla","ariaLabel":"tulostaminen f merkkijonojen avulla permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Niin sanotut "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"f-merkkijonot"}]},{"type":"text","value":" tarjoavat kolmannen edellisiä joustavamman ja jopa helppokäyttöisemmän tavan tulostuksen muotoiluun."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aiempi tekstin ja kokonaisluvun tulostava esimerkki tehtäisiin f-merkkijonojen avulla seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"25"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Tulos on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostettavan merkkijonon alussa on kirjain "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"f"}]},{"type":"text","value":", joka tarkoittaa, että kyseessä on f-merkkijono. Merkkijonon sisälle on sijoitettu aaltosuluissa muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulos"}]},{"type":"text","value":", jonka arvo tulee tulostuvan merkkijonon osaksi. Tulostus on täsmälleen sama kuin aiemmissa esimerkeissä eli"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulos on 250"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yksittäisen f-merkkijonon sisälle on mahdollista laittaa useampiakin muuttujia. Esimerkiksi koodi"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"text","value":"\nika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"39"}]},{"type":"text","value":"\nkaupunki "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Espoo\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Hei "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", olet "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"-vuotias. Asuinpaikkasi on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"kaupunki"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":".\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tuottaa seuraavan tuloksen:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hei Arto, olet 39-vuotias. Asuinpaikkasi on Espoo."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että täsmälleen tämän esimerkin kaltaista tulostusta on mahdotonta saada aikaan käyttämällä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennossa pilkkua:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"text","value":"\nika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"39"}]},{"type":"text","value":"\nkaupunki "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Espoo\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hei\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\", olet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"-vuotias. Asuinpaikkasi on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kaupunki"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\".\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hei Arto , olet 39 -vuotias. Asuinpaikkasi on Espoo ."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostuksessa on nyt välilyönti jokaisen erillisen osan välissä ja muutamassa kohdassa se aiheuttaa ongelman."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaikka pilkullinen muoto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennosta on joskus kätevä, se aiheuttaa välillä harmaita hiuksia ja silloin on parempi käyttää f-merkkijonoja. Osassa 4 opimme lisää f-merkkijonojen käteviä ominaisuuksia tulosteen muotoilussa."}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Välilyönnillä vai ilman","tmcname":"osa01-10b_valilyonnilla_vai_ilman","height":"400px"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Saat seuraavan koodinpätkän työnhakijoille suunnatun sovelluksen parissa työskentelevältä tuttavaltasi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Teppo Testaaja\""}]},{"type":"text","value":"\nika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"text","value":"\ntaito1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"python\""}]},{"type":"text","value":"\ntaso1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"aloittelija\""}]},{"type":"text","value":"\ntaito2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"java\""}]},{"type":"text","value":"\ntaso2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"veteraani\""}]},{"type":"text","value":"\ntaito3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ohjelmointi\""}]},{"type":"text","value":"\ntaso3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"puoliammattilainen\""}]},{"type":"text","value":"\nala "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2000"}]},{"type":"text","value":"\nyla "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3000"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimeni on \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" , olen \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"-vuotias\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"taitoihini kuuluvat\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"- \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" taito1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" (\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" taso1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\")\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"- \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" taito2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" (\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" taso2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\")\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"- \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" taito3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" (\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" taso3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" )\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"haen työtä, josta maksetaan palkkaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" ala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"-\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" yla"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"euroa kuussa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodin pitäisi tuottaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"täsmälleen"}]},{"type":"text","value":" seuraavanlainen tulostus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"nimeni on Teppo Testaaja, olen 20-vuotias\n\ntaitoihini kuuluvat\n - python (aloittelija)\n - java (veteraani)\n - ohjelmointi (puoliammattilainen)\n\nhaen työtä, josta maksetaan palkkaa 2000-3000 euroa kuussa\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodi toimii melkein oikein, mutta ei kuitenkaan ihan. Tässä tehtävässä on todella tarkat testit, jotka vaativat, että tulostus on välilyönnilleen oikein."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Korjaa siis koodi siten, että tulostus näyttää oikealta. Huomaa, että erityisesti "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennon muoto, jossa tulostettavat osat eritellään pilkulla, voi tuottaa yllätyksiä, sillä se lisää osien väliin välilyönnin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Helpoiten saat muutettua koodin toimivaksi käyttämällä tulostukseen f-merkkijonoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vihje: saat tulostettua tyhjän rivin komennolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":" tai lisäämällä tulostettavaan merkkijonoon merkinnän "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\n"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muista olla tarkkana tulostusten muodon suhteen jatkossakin kurssin tehtävissä. Osassa tehtävissä testit vaativat täsmälleen esimerkkitulostusten mukaisen muotoilun."}]}]},{"type":"element","tagName":"h2","properties":{"id":"liukuluvut","style":"position:relative;"},"children":[{"type":"text","value":"Liukuluvut"},{"type":"element","tagName":"a","properties":{"href":"#liukuluvut","ariaLabel":"liukuluvut permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Liukuluku"}]},{"type":"text","value":" on ohjelmoinnissa esiintyvä termi, joka tarkoittaa käytännössä desimaalilukua. Liukulukuja voidaan käyttää melko samalla tavalla kuin kokonaislukuja. Huomaa, että desimaalierottimena käytetään pistettä kuten englannissa yleensä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraava ohjelma laskee kolmen liukuluvun keskiarvon:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2.5"}]},{"type":"text","value":"\nluku2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1.25"}]},{"type":"text","value":"\nluku3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.62"}]},{"type":"text","value":"\n\nkeskiarvo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" luku2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" luku3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Keskiarvo: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"keskiarvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Keskiarvo: 1.6233333333333333"}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Laskutoimitukset","tmcname":"osa01-11_laskutoimitukset"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tehtäväpohjassa on määritelty kaksi kokonaislukumuuttujaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"y"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"27"}]},{"type":"text","value":"\ny "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Täydennä ohjelma siten, että sen tulostus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"27 + 15 = 42\n27 - 15 = 12\n27 * 15 = 405\n27 / 15 = 1.8"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia siinäkin tapauksessa, että muuttujien arvoa vaihdetaan. Eli jos ensimmäiset rivit muuttuvat muotoon"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\ny "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"niin tulostus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4 + 9 = 13\n4 - 9 = -5\n4 * 9 = 36\n4 / 9 = 0.4444444444444444"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Korjaa ohjelma: Tulostukset samalle riville","tmcname":"osa01-12_korjaa_ohjelma_tulostukset_samalle_riville"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennolle annetaan lisäparametri "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"end = \"\""}]},{"type":"text","value":", komento ei tulosta rivinvaihtoa merkkijonon jälkeen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" end"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kaikki!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moi kaikki!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Korjaa ohjelma niin, että koko lasku tuloksineen tulostetaan yhdelle riville muuttamatta kuitenkaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komentojen määrää:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" + \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" - \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" = \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kertauskysely tämän osan asioihin liittyen:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat käyttää muuttujia eri yhteyksissä
  • \n
  • Tiedät, millaista tietoa muuttujiin voidaan tallentaa
  • \n
  • Ymmärrät merkkijonojen sekä kokonais- ja liukulukujen eron
  • \n

Vastaa seuraavaan kyselyyn ennen osion aloittamista. Saat vastaamisesta yhden tehtäväpisteen.

Muuttujia tarvitaan ohjelmissa moniin tarkoituksiin. Voimme tallentaa muuttujiin mitä tahansa sellaista tietoa, jota tarvitaan ohjelmassa myöhemmin.

Muuttuja luodaan Pythonissa seuraavasti:

muuttujan_nimi = ...

Tässä ... tarkoittaa arvoa, joka tallennetaan muuttujaan.

Esimerkiksi kun luemme input-komennolla merkkijonon käyttäjältä, sijoitamme merkkijonon muuttujaan, jotta voimme käyttää sitä myöhemmin ohjelmassa:

nimi = input(\"Anna nimesi: \")\nprint(\"Moi, \" + nimi)

Anna nimesi: Kummitus\nMoi, Kummitus

Muuttujille voidaan antaa arvoja myös esimerkiksi näin:

etunimi = \"Pekka\"\nsukunimi = \"Pythonen\"\n\nnimi = etunimi + \" \" + sukunimi\n\nprint(nimi)

Pekka Pythonen

Tässä tapauksessa muuttujan arvo ei tule käyttäjältä vaan se on sama ohjelman jokaisella suorituskerralla.

Muuttujan arvon muuttaminen

Muuttujan arvo voi nimensä mukaisesti muuttua. Niin kuin edellisessä osassa todettiin, uusi arvo ylikirjoittaa vanhan arvon.

Esimerkiksi seuraavassa ohjelmassa muuttuja sana saa kolme eri arvoa:

sana = input(\"Anna sana: \")\nprint(sana)\n\nsana = input(\"Anna toinen sana: \")\nprint(sana)\n\nsana = \"kolmas\"\nprint(sana)

Anna sana: eka\neka\nAnna toinen sana: toka\ntoka\nkolmas

Muuttujan sisältö siis vaihtuu jokaisen sijoituksen yhteydessä.

Muuttujan uusi arvo voi myös perustua sen vanhaan arvoon. Esimerkiksi seuraavassa muuttuja sana saa ensin arvoksi käyttäjän syötteen. Tämän jälkeen muuttuja saa arvoksi vanhan arvonsa, jonka perään on lisätty kolme huutomerkkiä:

sana = input(\"Anna sana: \")\nprint(sana)\n\nsana = sana + \"!!!\"\nprint(sana)

Anna sana: testi\ntesti\ntesti!!!

    \n
  • \n

    Muuttujat kannattaa nimetä niiden käyttötarkoituksen mukaan.\nEsimerkiksi jos muuttujassa on sana, nimi sana on parempi kuin a.

    \n
  • \n
  • \n

    Python ei rajoita muuttujien nimien pituutta, mutta eräitä muita sääntöjä muuttujien nimiin liittyy. Nimen täytyy alkaa kirjaimella ja se saa sisältää vain kirjaimia, numeroita ja alaviivoja _.

    \n
  • \n
  • \n

    Huomaa myös, että pienet ja isot kirjaimet ovat eri merkkejä. Muuttuja nimi on siis eri muuttuja kuin Nimi tai NIMI.

    \n
  • \n
  • \n

    Pythonissa muuttujien nimet on tapana kirjoittaa pienillä kirjaimilla. Jos nimessä on useita sanoja, niiden välissä on alaviiva.

    \n
  • \n

Kokonaisluvut

Tähän mennessä olemme tallentaneet muuttujiin vain merkkijonoja. Usein ohjelmissa halutaan kuitenkin tallentaa myös muun tyyppistä tietoa. Tarkastellaan aluksi kokonaislukuja.

Seuraava ohjelma luo muuttujan ika, jonka sisältönä on kokonaisluku.

ika = 24\nprint(ika)

Ohjelman tulostus on seuraava:

24

Kokonaisluvun ympärille ei kirjoiteta lainausmerkkejä. Itse asiassa luvun ympärille kirjoitettavat lainausmerkit tarkoittavat, että kyseessä ei ole luku vaan merkkijono (joka tosin saattaa sisältää numeroita).

Mitä eroa muuttujan tyypeillä siis on, kun seuraava ohjelma tulostaa samat arvot?

luku1 = 100\nluku2 = \"100\"\n\nprint(luku1)\nprint(luku2)

100\n100

Tyypeillä on merkitystä, koska\nerilaiset operaatiot vaikuttavat eri tavalla erityyppisiin muuttujiin. Tarkastellaan seuraavaa esimerkkiä:

luku1 = 100\nluku2 = \"100\"\n\nprint(luku1 + luku1)\nprint(luku2 + luku2)

Ohjelman tulostus on seuraava:

200\n100100

Kahdelle lukuarvolle +-operaattori siis merkitsee yhteenlaskua, merkkijonoille taas yhdistämistä peräkkäin.

Arvojen yhdistäminen tulostettaessa

Seuraava ohjelma ei toimi, koska \"Tulos on \" ja tulos ovat erityypisiä:

tulos = 10 * 25\n# seuraava rivi tuottaa virheen\nprint(\"Tulos on \" + tulos)

Ohjelma ei tulosta mitään, vaan antaa virheen

TypeError: unsupported operand type(s) for +: 'str' and 'int'

Python kertoo, ettei kahden erityyppisen arvon yhdistäminen toimi. Tässä tapauksessa arvon \"Tulos on\" tyyppi on merkkijono ja arvon tulos tyyppi on kokonaisluku.

Jos haluamme tulostaa yhdellä komennolla merkkijonon ja luvun, yhdistäminen onnistuu kuitenkin muuttamalla luku merkkijonoksi str-funktiolla. Esimerkiksi

tulos = 10 * 25\nprint(\"Tulos on \" + str(tulos))

Tulos on 250

Toinen mahdollisuus on käyttää pilkkua print-komennossa. Tällöin komento tulostaa kaikki pilkuilla erotetut arvot riippumatta niiden tyypistä:

tulos = 10 * 25\nprint(\"Tulos on\", tulos)

Tulos on 250

Huomaa, että tässä tapauksessa arvojen väliin ilmestyy automaattisesti yksi välilyönti tulostuksessa.

Tulostaminen f-merkkijonojen avulla

Niin sanotut f-merkkijonot tarjoavat kolmannen edellisiä joustavamman ja jopa helppokäyttöisemmän tavan tulostuksen muotoiluun.

Aiempi tekstin ja kokonaisluvun tulostava esimerkki tehtäisiin f-merkkijonojen avulla seuraavasti:

tulos = 10 * 25\nprint(f\"Tulos on {tulos}\")

Tulostettavan merkkijonon alussa on kirjain f, joka tarkoittaa, että kyseessä on f-merkkijono. Merkkijonon sisälle on sijoitettu aaltosuluissa muuttuja tulos, jonka arvo tulee tulostuvan merkkijonon osaksi. Tulostus on täsmälleen sama kuin aiemmissa esimerkeissä eli

Tulos on 250

Yksittäisen f-merkkijonon sisälle on mahdollista laittaa useampiakin muuttujia. Esimerkiksi koodi

nimi = \"Arto\"\nika = 39\nkaupunki = \"Espoo\"\nprint(f\"Hei {nimi}, olet {ika}-vuotias. Asuinpaikkasi on {kaupunki}.\")

tuottaa seuraavan tuloksen:

Hei Arto, olet 39-vuotias. Asuinpaikkasi on Espoo.

Huomaa, että täsmälleen tämän esimerkin kaltaista tulostusta on mahdotonta saada aikaan käyttämällä print-komennossa pilkkua:

nimi = \"Arto\"\nika = 39\nkaupunki = \"Espoo\"\nprint(\"Hei\", nimi, \", olet\", ika, \"-vuotias. Asuinpaikkasi on\", kaupunki, \".\")

Tulostus on seuraava:

Hei Arto , olet 39 -vuotias. Asuinpaikkasi on Espoo .

Tulostuksessa on nyt välilyönti jokaisen erillisen osan välissä ja muutamassa kohdassa se aiheuttaa ongelman.

Vaikka pilkullinen muoto print-komennosta on joskus kätevä, se aiheuttaa välillä harmaita hiuksia ja silloin on parempi käyttää f-merkkijonoja. Osassa 4 opimme lisää f-merkkijonojen käteviä ominaisuuksia tulosteen muotoilussa.

Saat seuraavan koodinpätkän työnhakijoille suunnatun sovelluksen parissa työskentelevältä tuttavaltasi:

nimi = \"Teppo Testaaja\"\nika = 20\ntaito1 = \"python\"\ntaso1 = \"aloittelija\"\ntaito2 = \"java\"\ntaso2 = \"veteraani\"\ntaito3 = \"ohjelmointi\"\ntaso3 = \"puoliammattilainen\"\nala = 2000\nyla = 3000\n\nprint(\"nimeni on \", nimi, \" , olen \", ika, \"-vuotias\")\nprint(\"taitoihini kuuluvat\")\nprint(\"- \", taito1, \" (\", taso1, \")\")\nprint(\"- \", taito2, \" (\", taso2, \")\")\nprint(\"- \", taito3, \" (\", taso3, \" )\")\nprint(\"haen työtä, josta maksetaan palkkaa\", ala, \"-\", yla, \"euroa kuussa\")

Koodin pitäisi tuottaa täsmälleen seuraavanlainen tulostus:

\nnimeni on Teppo Testaaja, olen 20-vuotias\n\ntaitoihini kuuluvat\n - python (aloittelija)\n - java (veteraani)\n - ohjelmointi (puoliammattilainen)\n\nhaen työtä, josta maksetaan palkkaa 2000-3000 euroa kuussa\n

Koodi toimii melkein oikein, mutta ei kuitenkaan ihan. Tässä tehtävässä on todella tarkat testit, jotka vaativat, että tulostus on välilyönnilleen oikein.

Korjaa siis koodi siten, että tulostus näyttää oikealta. Huomaa, että erityisesti print-komennon muoto, jossa tulostettavat osat eritellään pilkulla, voi tuottaa yllätyksiä, sillä se lisää osien väliin välilyönnin.

Helpoiten saat muutettua koodin toimivaksi käyttämällä tulostukseen f-merkkijonoja.

Vihje: saat tulostettua tyhjän rivin komennolla print tai lisäämällä tulostettavaan merkkijonoon merkinnän \\n.

Muista olla tarkkana tulostusten muodon suhteen jatkossakin kurssin tehtävissä. Osassa tehtävissä testit vaativat täsmälleen esimerkkitulostusten mukaisen muotoilun.

Liukuluvut

Liukuluku on ohjelmoinnissa esiintyvä termi, joka tarkoittaa käytännössä desimaalilukua. Liukulukuja voidaan käyttää melko samalla tavalla kuin kokonaislukuja. Huomaa, että desimaalierottimena käytetään pistettä kuten englannissa yleensä.

Esimerkiksi seuraava ohjelma laskee kolmen liukuluvun keskiarvon:

luku1 = 2.5\nluku2 = -1.25\nluku3 = 3.62\n\nkeskiarvo = (luku1 + luku2 + luku3) / 3\nprint(f\"Keskiarvo: {keskiarvo}\")

Keskiarvo: 1.6233333333333333

Ohjelman tehtäväpohjassa on määritelty kaksi kokonaislukumuuttujaa x ja y:

x = 27\ny = 15

Täydennä ohjelma siten, että sen tulostus on seuraava:

27 + 15 = 42\n27 - 15 = 12\n27 * 15 = 405\n27 / 15 = 1.8

Ohjelman tulee toimia siinäkin tapauksessa, että muuttujien arvoa vaihdetaan. Eli jos ensimmäiset rivit muuttuvat muotoon

x = 4\ny = 9

niin tulostus on seuraava:

4 + 9 = 13\n4 - 9 = -5\n4 * 9 = 36\n4 / 9 = 0.4444444444444444

Jos print-komennolle annetaan lisäparametri end = \"\", komento ei tulosta rivinvaihtoa merkkijonon jälkeen.

Esimerkiksi:

print(\"Moi \", end=\"\")\nprint(\"kaikki!\")

Moi kaikki!

Korjaa ohjelma niin, että koko lasku tuloksineen tulostetaan yhdelle riville muuttamatta kuitenkaan print-komentojen määrää:

\nprint(5)\nprint(\" + \")\nprint(8)\nprint(\" - \")\nprint(4)\nprint(\" = \")\nprint(5 + 8 - 4)

Kertauskysely tämän osan asioihin liittyen:

","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-1/3-lisaa-muuttujista.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää muuttujia eri yhteyksissä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, millaista tietoa muuttujiin voidaan tallentaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ymmärrät merkkijonojen sekä kokonais- ja liukulukujen eron"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa seuraavaan kyselyyn ennen osion aloittamista. Saat vastaamisesta yhden tehtäväpisteen."}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc"},"children":[]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttujia tarvitaan ohjelmissa moniin tarkoituksiin. Voimme tallentaa muuttujiin mitä tahansa sellaista tietoa, jota tarvitaan ohjelmassa myöhemmin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttuja luodaan Pythonissa seuraavasti:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"muuttujan_nimi = ..."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"..."}]},{"type":"text","value":" tarkoittaa arvoa, joka tallennetaan muuttujaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi kun luemme "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"input"}]},{"type":"text","value":"-komennolla merkkijonon käyttäjältä, sijoitamme merkkijonon muuttujaan, jotta voimme käyttää sitä myöhemmin ohjelmassa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna nimesi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi, \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Kummitus"}]},{"type":"text","value":"\nMoi, Kummitus"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttujille voidaan antaa arvoja myös esimerkiksi näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"etunimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"text","value":"\nsukunimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pythonen\""}]},{"type":"text","value":"\n\nnimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" etunimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" sukunimi\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka Pythonen"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tapauksessa muuttujan arvo ei tule käyttäjältä vaan se on sama ohjelman jokaisella suorituskerralla."}]},{"type":"element","tagName":"h2","properties":{"id":"muuttujan-arvon-muuttaminen","style":"position:relative;"},"children":[{"type":"text","value":"Muuttujan arvon muuttaminen"},{"type":"element","tagName":"a","properties":{"href":"#muuttujan-arvon-muuttaminen","ariaLabel":"muuttujan arvon muuttaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttujan arvo voi nimensä mukaisesti muuttua. Niin kuin edellisessä osassa todettiin, uusi arvo ylikirjoittaa vanhan arvon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraavassa ohjelmassa muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sana"}]},{"type":"text","value":" saa kolme eri arvoa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna sana: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna toinen sana: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kolmas\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"eka"}]},{"type":"text","value":"\neka\nAnna toinen sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"toka"}]},{"type":"text","value":"\ntoka\nkolmas"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttujan sisältö siis vaihtuu jokaisen sijoituksen yhteydessä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttujan uusi arvo voi myös perustua sen vanhaan arvoon. Esimerkiksi seuraavassa muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sana"}]},{"type":"text","value":" saa ensin arvoksi käyttäjän syötteen. Tämän jälkeen muuttuja saa arvoksi vanhan arvonsa, jonka perään on lisätty kolme huutomerkkiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna sana: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"!!!\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"testi"}]},{"type":"text","value":"\ntesti\ntesti!!!"}]}]},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Lisää muuttujan nimen valinnasta"},"children":[{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttujat kannattaa nimetä niiden käyttötarkoituksen mukaan.\nEsimerkiksi jos muuttujassa on sana, nimi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sana"}]},{"type":"text","value":" on parempi kuin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python ei rajoita muuttujien nimien pituutta, mutta eräitä muita sääntöjä muuttujien nimiin liittyy. Nimen täytyy alkaa kirjaimella ja se saa sisältää vain kirjaimia, numeroita ja alaviivoja _."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa myös, että pienet ja isot kirjaimet ovat eri merkkejä. Muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":" on siis eri muuttuja kuin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Nimi"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"NIMI"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa muuttujien nimet on tapana kirjoittaa pienillä kirjaimilla. Jos nimessä on useita sanoja, niiden välissä on alaviiva."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"kokonaisluvut","style":"position:relative;"},"children":[{"type":"text","value":"Kokonaisluvut"},{"type":"element","tagName":"a","properties":{"href":"#kokonaisluvut","ariaLabel":"kokonaisluvut permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tähän mennessä olemme tallentaneet muuttujiin vain merkkijonoja. Usein ohjelmissa halutaan kuitenkin tallentaa myös muun tyyppistä tietoa. Tarkastellaan aluksi kokonaislukuja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma luo muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ika"}]},{"type":"text","value":", jonka sisältönä on kokonaisluku."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"24"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kokonaisluvun ympärille ei kirjoiteta lainausmerkkejä. Itse asiassa luvun ympärille kirjoitettavat lainausmerkit tarkoittavat, että kyseessä ei ole luku vaan merkkijono (joka tosin saattaa sisältää numeroita)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mitä eroa muuttujan tyypeillä siis on, kun seuraava ohjelma tulostaa samat arvot?"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"text","value":"\nluku2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"100\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"100\n100"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tyypeillä on merkitystä, koska\nerilaiset operaatiot vaikuttavat eri tavalla erityyppisiin muuttujiin. Tarkastellaan seuraavaa esimerkkiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"text","value":"\nluku2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"100\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" luku1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" luku2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"200\n100100"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kahdelle lukuarvolle "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"-operaattori siis merkitsee yhteenlaskua, merkkijonoille taas yhdistämistä peräkkäin."}]},{"type":"element","tagName":"h2","properties":{"id":"arvojen-yhdistaminen-tulostettaessa","style":"position:relative;"},"children":[{"type":"text","value":"Arvojen yhdistäminen tulostettaessa"},{"type":"element","tagName":"a","properties":{"href":"#arvojen-yhdistaminen-tulostettaessa","ariaLabel":"arvojen yhdistaminen tulostettaessa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma ei toimi, koska "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"Tulos on \""}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulos"}]},{"type":"text","value":" ovat erityypisiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"25"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# seuraava rivi tuottaa virheen"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tulos on \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma ei tulosta mitään, vaan antaa virheen"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"TypeError: unsupported operand type(s) for +: 'str' and 'int'"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python kertoo, ettei kahden erityyppisen arvon yhdistäminen toimi. Tässä tapauksessa arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"Tulos on\""}]},{"type":"text","value":" tyyppi on merkkijono ja arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulos"}]},{"type":"text","value":" tyyppi on kokonaisluku."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos haluamme tulostaa yhdellä komennolla merkkijonon ja luvun, yhdistäminen onnistuu kuitenkin muuttamalla luku merkkijonoksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"str"}]},{"type":"text","value":"-funktiolla. Esimerkiksi"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"25"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tulos on \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulos on 250"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen mahdollisuus on käyttää pilkkua "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennossa. Tällöin komento tulostaa kaikki pilkuilla erotetut arvot riippumatta niiden tyypistä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"25"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tulos on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulos on 250"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että tässä tapauksessa arvojen väliin ilmestyy automaattisesti yksi välilyönti tulostuksessa."}]},{"type":"element","tagName":"h2","properties":{"id":"tulostaminen-f-merkkijonojen-avulla","style":"position:relative;"},"children":[{"type":"text","value":"Tulostaminen f-merkkijonojen avulla"},{"type":"element","tagName":"a","properties":{"href":"#tulostaminen-f-merkkijonojen-avulla","ariaLabel":"tulostaminen f merkkijonojen avulla permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Niin sanotut "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"f-merkkijonot"}]},{"type":"text","value":" tarjoavat kolmannen edellisiä joustavamman ja jopa helppokäyttöisemmän tavan tulostuksen muotoiluun."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aiempi tekstin ja kokonaisluvun tulostava esimerkki tehtäisiin f-merkkijonojen avulla seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"25"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Tulos on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostettavan merkkijonon alussa on kirjain "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"f"}]},{"type":"text","value":", joka tarkoittaa, että kyseessä on f-merkkijono. Merkkijonon sisälle on sijoitettu aaltosuluissa muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulos"}]},{"type":"text","value":", jonka arvo tulee tulostuvan merkkijonon osaksi. Tulostus on täsmälleen sama kuin aiemmissa esimerkeissä eli"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulos on 250"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yksittäisen f-merkkijonon sisälle on mahdollista laittaa useampiakin muuttujia. Esimerkiksi koodi"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"text","value":"\nika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"39"}]},{"type":"text","value":"\nkaupunki "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Espoo\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Hei "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", olet "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"-vuotias. Asuinpaikkasi on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"kaupunki"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":".\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tuottaa seuraavan tuloksen:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hei Arto, olet 39-vuotias. Asuinpaikkasi on Espoo."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että täsmälleen tämän esimerkin kaltaista tulostusta on mahdotonta saada aikaan käyttämällä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennossa pilkkua:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"text","value":"\nika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"39"}]},{"type":"text","value":"\nkaupunki "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Espoo\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hei\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\", olet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"-vuotias. Asuinpaikkasi on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kaupunki"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\".\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hei Arto , olet 39 -vuotias. Asuinpaikkasi on Espoo ."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostuksessa on nyt välilyönti jokaisen erillisen osan välissä ja muutamassa kohdassa se aiheuttaa ongelman."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaikka pilkullinen muoto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennosta on joskus kätevä, se aiheuttaa välillä harmaita hiuksia ja silloin on parempi käyttää f-merkkijonoja. Osassa 4 opimme lisää f-merkkijonojen käteviä ominaisuuksia tulosteen muotoilussa."}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Välilyönnillä vai ilman","tmcname":"osa01-10b_valilyonnilla_vai_ilman","height":"400px"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Saat seuraavan koodinpätkän työnhakijoille suunnatun sovelluksen parissa työskentelevältä tuttavaltasi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Teppo Testaaja\""}]},{"type":"text","value":"\nika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"text","value":"\ntaito1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"python\""}]},{"type":"text","value":"\ntaso1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"aloittelija\""}]},{"type":"text","value":"\ntaito2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"java\""}]},{"type":"text","value":"\ntaso2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"veteraani\""}]},{"type":"text","value":"\ntaito3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ohjelmointi\""}]},{"type":"text","value":"\ntaso3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"puoliammattilainen\""}]},{"type":"text","value":"\nala "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2000"}]},{"type":"text","value":"\nyla "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3000"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimeni on \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" , olen \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"-vuotias\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"taitoihini kuuluvat\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"- \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" taito1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" (\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" taso1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\")\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"- \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" taito2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" (\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" taso2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\")\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"- \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" taito3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" (\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" taso3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" )\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"haen työtä, josta maksetaan palkkaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" ala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"-\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" yla"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"euroa kuussa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodin pitäisi tuottaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"täsmälleen"}]},{"type":"text","value":" seuraavanlainen tulostus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"nimeni on Teppo Testaaja, olen 20-vuotias\n\ntaitoihini kuuluvat\n - python (aloittelija)\n - java (veteraani)\n - ohjelmointi (puoliammattilainen)\n\nhaen työtä, josta maksetaan palkkaa 2000-3000 euroa kuussa\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodi toimii melkein oikein, mutta ei kuitenkaan ihan. Tässä tehtävässä on todella tarkat testit, jotka vaativat, että tulostus on välilyönnilleen oikein."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Korjaa siis koodi siten, että tulostus näyttää oikealta. Huomaa, että erityisesti "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennon muoto, jossa tulostettavat osat eritellään pilkulla, voi tuottaa yllätyksiä, sillä se lisää osien väliin välilyönnin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Helpoiten saat muutettua koodin toimivaksi käyttämällä tulostukseen f-merkkijonoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vihje: saat tulostettua tyhjän rivin komennolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":" tai lisäämällä tulostettavaan merkkijonoon merkinnän "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\n"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muista olla tarkkana tulostusten muodon suhteen jatkossakin kurssin tehtävissä. Osassa tehtävissä testit vaativat täsmälleen esimerkkitulostusten mukaisen muotoilun."}]}]},{"type":"element","tagName":"h2","properties":{"id":"liukuluvut","style":"position:relative;"},"children":[{"type":"text","value":"Liukuluvut"},{"type":"element","tagName":"a","properties":{"href":"#liukuluvut","ariaLabel":"liukuluvut permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Liukuluku"}]},{"type":"text","value":" on ohjelmoinnissa esiintyvä termi, joka tarkoittaa käytännössä desimaalilukua. Liukulukuja voidaan käyttää melko samalla tavalla kuin kokonaislukuja. Huomaa, että desimaalierottimena käytetään pistettä kuten englannissa yleensä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraava ohjelma laskee kolmen liukuluvun keskiarvon:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2.5"}]},{"type":"text","value":"\nluku2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1.25"}]},{"type":"text","value":"\nluku3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.62"}]},{"type":"text","value":"\n\nkeskiarvo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" luku2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" luku3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Keskiarvo: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"keskiarvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Keskiarvo: 1.6233333333333333"}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Laskutoimitukset","tmcname":"osa01-11_laskutoimitukset"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tehtäväpohjassa on määritelty kaksi kokonaislukumuuttujaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"y"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"27"}]},{"type":"text","value":"\ny "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Täydennä ohjelma siten, että sen tulostus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"27 + 15 = 42\n27 - 15 = 12\n27 * 15 = 405\n27 / 15 = 1.8"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia siinäkin tapauksessa, että muuttujien arvoa vaihdetaan. Eli jos ensimmäiset rivit muuttuvat muotoon"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\ny "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"niin tulostus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4 + 9 = 13\n4 - 9 = -5\n4 * 9 = 36\n4 / 9 = 0.4444444444444444"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Korjaa ohjelma: Tulostukset samalle riville","tmcname":"osa01-12_korjaa_ohjelma_tulostukset_samalle_riville"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennolle annetaan lisäparametri "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"end = \"\""}]},{"type":"text","value":", komento ei tulosta rivinvaihtoa merkkijonon jälkeen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" end"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kaikki!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moi kaikki!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Korjaa ohjelma niin, että koko lasku tuloksineen tulostetaan yhdelle riville muuttamatta kuitenkaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komentojen määrää:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" + \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" - \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" = \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kertauskysely tämän osan asioihin liittyen:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat käyttää muuttujia eri yhteyksissä
  • \n
  • Tiedät, millaista tietoa muuttujiin voidaan tallentaa
  • \n
  • Ymmärrät merkkijonojen sekä kokonais- ja liukulukujen eron
  • \n

Vastaa seuraavaan kyselyyn ennen osion aloittamista. Saat vastaamisesta yhden tehtäväpisteen.

Muuttujia tarvitaan ohjelmissa moniin tarkoituksiin. Voimme tallentaa muuttujiin mitä tahansa sellaista tietoa, jota tarvitaan ohjelmassa myöhemmin.

Muuttuja luodaan Pythonissa seuraavasti:

muuttujan_nimi = ...

Tässä ... tarkoittaa arvoa, joka tallennetaan muuttujaan.

Esimerkiksi kun luemme input-komennolla merkkijonon käyttäjältä, sijoitamme merkkijonon muuttujaan, jotta voimme käyttää sitä myöhemmin ohjelmassa:

nimi = input(\"Anna nimesi: \")\nprint(\"Moi, \" + nimi)

Anna nimesi: Kummitus\nMoi, Kummitus

Muuttujille voidaan antaa arvoja myös esimerkiksi näin:

etunimi = \"Pekka\"\nsukunimi = \"Pythonen\"\n\nnimi = etunimi + \" \" + sukunimi\n\nprint(nimi)

Pekka Pythonen

Tässä tapauksessa muuttujan arvo ei tule käyttäjältä vaan se on sama ohjelman jokaisella suorituskerralla.

Muuttujan arvon muuttaminen

Muuttujan arvo voi nimensä mukaisesti muuttua. Niin kuin edellisessä osassa todettiin, uusi arvo ylikirjoittaa vanhan arvon.

Esimerkiksi seuraavassa ohjelmassa muuttuja sana saa kolme eri arvoa:

sana = input(\"Anna sana: \")\nprint(sana)\n\nsana = input(\"Anna toinen sana: \")\nprint(sana)\n\nsana = \"kolmas\"\nprint(sana)

Anna sana: eka\neka\nAnna toinen sana: toka\ntoka\nkolmas

Muuttujan sisältö siis vaihtuu jokaisen sijoituksen yhteydessä.

Muuttujan uusi arvo voi myös perustua sen vanhaan arvoon. Esimerkiksi seuraavassa muuttuja sana saa ensin arvoksi käyttäjän syötteen. Tämän jälkeen muuttuja saa arvoksi vanhan arvonsa, jonka perään on lisätty kolme huutomerkkiä:

sana = input(\"Anna sana: \")\nprint(sana)\n\nsana = sana + \"!!!\"\nprint(sana)

Anna sana: testi\ntesti\ntesti!!!

    \n
  • \n

    Muuttujat kannattaa nimetä niiden käyttötarkoituksen mukaan.\nEsimerkiksi jos muuttujassa on sana, nimi sana on parempi kuin a.

    \n
  • \n
  • \n

    Python ei rajoita muuttujien nimien pituutta, mutta eräitä muita sääntöjä muuttujien nimiin liittyy. Nimen täytyy alkaa kirjaimella ja se saa sisältää vain kirjaimia, numeroita ja alaviivoja _.

    \n
  • \n
  • \n

    Huomaa myös, että pienet ja isot kirjaimet ovat eri merkkejä. Muuttuja nimi on siis eri muuttuja kuin Nimi tai NIMI.

    \n
  • \n
  • \n

    Pythonissa muuttujien nimet on tapana kirjoittaa pienillä kirjaimilla. Jos nimessä on useita sanoja, niiden välissä on alaviiva.

    \n
  • \n

Kokonaisluvut

Tähän mennessä olemme tallentaneet muuttujiin vain merkkijonoja. Usein ohjelmissa halutaan kuitenkin tallentaa myös muun tyyppistä tietoa. Tarkastellaan aluksi kokonaislukuja.

Seuraava ohjelma luo muuttujan ika, jonka sisältönä on kokonaisluku.

ika = 24\nprint(ika)

Ohjelman tulostus on seuraava:

24

Kokonaisluvun ympärille ei kirjoiteta lainausmerkkejä. Itse asiassa luvun ympärille kirjoitettavat lainausmerkit tarkoittavat, että kyseessä ei ole luku vaan merkkijono (joka tosin saattaa sisältää numeroita).

Mitä eroa muuttujan tyypeillä siis on, kun seuraava ohjelma tulostaa samat arvot?

luku1 = 100\nluku2 = \"100\"\n\nprint(luku1)\nprint(luku2)

100\n100

Tyypeillä on merkitystä, koska\nerilaiset operaatiot vaikuttavat eri tavalla erityyppisiin muuttujiin. Tarkastellaan seuraavaa esimerkkiä:

luku1 = 100\nluku2 = \"100\"\n\nprint(luku1 + luku1)\nprint(luku2 + luku2)

Ohjelman tulostus on seuraava:

200\n100100

Kahdelle lukuarvolle +-operaattori siis merkitsee yhteenlaskua, merkkijonoille taas yhdistämistä peräkkäin.

Arvojen yhdistäminen tulostettaessa

Seuraava ohjelma ei toimi, koska \"Tulos on \" ja tulos ovat erityypisiä:

tulos = 10 * 25\n# seuraava rivi tuottaa virheen\nprint(\"Tulos on \" + tulos)

Ohjelma ei tulosta mitään, vaan antaa virheen

TypeError: unsupported operand type(s) for +: 'str' and 'int'

Python kertoo, ettei kahden erityyppisen arvon yhdistäminen toimi. Tässä tapauksessa arvon \"Tulos on\" tyyppi on merkkijono ja arvon tulos tyyppi on kokonaisluku.

Jos haluamme tulostaa yhdellä komennolla merkkijonon ja luvun, yhdistäminen onnistuu kuitenkin muuttamalla luku merkkijonoksi str-funktiolla. Esimerkiksi

tulos = 10 * 25\nprint(\"Tulos on \" + str(tulos))

Tulos on 250

Toinen mahdollisuus on käyttää pilkkua print-komennossa. Tällöin komento tulostaa kaikki pilkuilla erotetut arvot riippumatta niiden tyypistä:

tulos = 10 * 25\nprint(\"Tulos on\", tulos)

Tulos on 250

Huomaa, että tässä tapauksessa arvojen väliin ilmestyy automaattisesti yksi välilyönti tulostuksessa.

Tulostaminen f-merkkijonojen avulla

Niin sanotut f-merkkijonot tarjoavat kolmannen edellisiä joustavamman ja jopa helppokäyttöisemmän tavan tulostuksen muotoiluun.

Aiempi tekstin ja kokonaisluvun tulostava esimerkki tehtäisiin f-merkkijonojen avulla seuraavasti:

tulos = 10 * 25\nprint(f\"Tulos on {tulos}\")

Tulostettavan merkkijonon alussa on kirjain f, joka tarkoittaa, että kyseessä on f-merkkijono. Merkkijonon sisälle on sijoitettu aaltosuluissa muuttuja tulos, jonka arvo tulee tulostuvan merkkijonon osaksi. Tulostus on täsmälleen sama kuin aiemmissa esimerkeissä eli

Tulos on 250

Yksittäisen f-merkkijonon sisälle on mahdollista laittaa useampiakin muuttujia. Esimerkiksi koodi

nimi = \"Arto\"\nika = 39\nkaupunki = \"Espoo\"\nprint(f\"Hei {nimi}, olet {ika}-vuotias. Asuinpaikkasi on {kaupunki}.\")

tuottaa seuraavan tuloksen:

Hei Arto, olet 39-vuotias. Asuinpaikkasi on Espoo.

Huomaa, että täsmälleen tämän esimerkin kaltaista tulostusta on mahdotonta saada aikaan käyttämällä print-komennossa pilkkua:

nimi = \"Arto\"\nika = 39\nkaupunki = \"Espoo\"\nprint(\"Hei\", nimi, \", olet\", ika, \"-vuotias. Asuinpaikkasi on\", kaupunki, \".\")

Tulostus on seuraava:

Hei Arto , olet 39 -vuotias. Asuinpaikkasi on Espoo .

Tulostuksessa on nyt välilyönti jokaisen erillisen osan välissä ja muutamassa kohdassa se aiheuttaa ongelman.

Vaikka pilkullinen muoto print-komennosta on joskus kätevä, se aiheuttaa välillä harmaita hiuksia ja silloin on parempi käyttää f-merkkijonoja. Osassa 4 opimme lisää f-merkkijonojen käteviä ominaisuuksia tulosteen muotoilussa.

Saat seuraavan koodinpätkän työnhakijoille suunnatun sovelluksen parissa työskentelevältä tuttavaltasi:

nimi = \"Teppo Testaaja\"\nika = 20\ntaito1 = \"python\"\ntaso1 = \"aloittelija\"\ntaito2 = \"java\"\ntaso2 = \"veteraani\"\ntaito3 = \"ohjelmointi\"\ntaso3 = \"puoliammattilainen\"\nala = 2000\nyla = 3000\n\nprint(\"nimeni on \", nimi, \" , olen \", ika, \"-vuotias\")\nprint(\"taitoihini kuuluvat\")\nprint(\"- \", taito1, \" (\", taso1, \")\")\nprint(\"- \", taito2, \" (\", taso2, \")\")\nprint(\"- \", taito3, \" (\", taso3, \" )\")\nprint(\"haen työtä, josta maksetaan palkkaa\", ala, \"-\", yla, \"euroa kuussa\")

Koodin pitäisi tuottaa täsmälleen seuraavanlainen tulostus:

\nnimeni on Teppo Testaaja, olen 20-vuotias\n\ntaitoihini kuuluvat\n - python (aloittelija)\n - java (veteraani)\n - ohjelmointi (puoliammattilainen)\n\nhaen työtä, josta maksetaan palkkaa 2000-3000 euroa kuussa\n

Koodi toimii melkein oikein, mutta ei kuitenkaan ihan. Tässä tehtävässä on todella tarkat testit, jotka vaativat, että tulostus on välilyönnilleen oikein.

Korjaa siis koodi siten, että tulostus näyttää oikealta. Huomaa, että erityisesti print-komennon muoto, jossa tulostettavat osat eritellään pilkulla, voi tuottaa yllätyksiä, sillä se lisää osien väliin välilyönnin.

Helpoiten saat muutettua koodin toimivaksi käyttämällä tulostukseen f-merkkijonoja.

Vihje: saat tulostettua tyhjän rivin komennolla print tai lisäämällä tulostettavaan merkkijonoon merkinnän \\n.

Muista olla tarkkana tulostusten muodon suhteen jatkossakin kurssin tehtävissä. Osassa tehtävissä testit vaativat täsmälleen esimerkkitulostusten mukaisen muotoilun.

Liukuluvut

Liukuluku on ohjelmoinnissa esiintyvä termi, joka tarkoittaa käytännössä desimaalilukua. Liukulukuja voidaan käyttää melko samalla tavalla kuin kokonaislukuja. Huomaa, että desimaalierottimena käytetään pistettä kuten englannissa yleensä.

Esimerkiksi seuraava ohjelma laskee kolmen liukuluvun keskiarvon:

luku1 = 2.5\nluku2 = -1.25\nluku3 = 3.62\n\nkeskiarvo = (luku1 + luku2 + luku3) / 3\nprint(f\"Keskiarvo: {keskiarvo}\")

Keskiarvo: 1.6233333333333333

Ohjelman tehtäväpohjassa on määritelty kaksi kokonaislukumuuttujaa x ja y:

x = 27\ny = 15

Täydennä ohjelma siten, että sen tulostus on seuraava:

27 + 15 = 42\n27 - 15 = 12\n27 * 15 = 405\n27 / 15 = 1.8

Ohjelman tulee toimia siinäkin tapauksessa, että muuttujien arvoa vaihdetaan. Eli jos ensimmäiset rivit muuttuvat muotoon

x = 4\ny = 9

niin tulostus on seuraava:

4 + 9 = 13\n4 - 9 = -5\n4 * 9 = 36\n4 / 9 = 0.4444444444444444

Jos print-komennolle annetaan lisäparametri end = \"\", komento ei tulosta rivinvaihtoa merkkijonon jälkeen.

Esimerkiksi:

print(\"Moi \", end=\"\")\nprint(\"kaikki!\")

Moi kaikki!

Korjaa ohjelma niin, että koko lasku tuloksineen tulostetaan yhdelle riville muuttamatta kuitenkaan print-komentojen määrää:

\nprint(5)\nprint(\" + \")\nprint(8)\nprint(\" - \")\nprint(4)\nprint(\" = \")\nprint(5 + 8 - 4)

Kertauskysely tämän osan asioihin liittyen:

","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-1/3-lisaa-muuttujista.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-1/4-laskentaa-luvuilla/page-data.json b/page-data/osa-1/4-laskentaa-luvuilla/page-data.json index 4d73796b7..7384f8b46 100644 --- a/page-data/osa-1/4-laskentaa-luvuilla/page-data.json +++ b/page-data/osa-1/4-laskentaa-luvuilla/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-1/4-laskentaa-luvuilla", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää muuttujia laskutoimitusten kanssa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käsitellä käyttäjän antamia lukuarvoja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat muuntaa arvoja eri perustyyppien välillä"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aiemmissa osissa nähtiin esimerkkejä peruslaskutoimituksista. Seuraavaan taulukkoon on koottu Pythonin yleisimmät laskuoperaattorit esimerkkeineen:"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Operaattori"}]},{"type":"element","tagName":"th","properties":{},"children":[{"type":"text","value":"Merkitys"}]},{"type":"element","tagName":"th","properties":{},"children":[{"type":"text","value":"Esimerkki"}]},{"type":"element","tagName":"th","properties":{},"children":[{"type":"text","value":"Tulos"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"+"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Yhteenlasku"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"2 + 4"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"6"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"-"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Vähennyslasku"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"10 - 2.5"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"7.5"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"*"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Kertolasku"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"-2 * 123"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"-246"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"/"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Jakolasku (liukuluku)"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"9 / 2"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"4.5"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"//"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Jakolasku (kokonaisluku)"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"9 // 2"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"4"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"%"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Jakojäännös"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"9 % 2"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"1"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"**"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Potenssi"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"2 ** 3"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"8"}]}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laskujärjestys noudattaa matematiikasta tuttuja sääntöjä: aluksi lasketaan potenssilaskut, sitten kerto- ja jakolaskut ja lopuksi yhteen- ja vähennyslaskut. Järjestystä voidaan muuttaa sulkujen avulla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma tulostaa"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"11\n15"}]}]},{"type":"element","tagName":"h2","properties":{"id":"operandit-operaattorit-ja-tyypit","style":"position:relative;"},"children":[{"type":"text","value":"Operandit, operaattorit ja tyypit"},{"type":"element","tagName":"a","properties":{"href":"#operandit-operaattorit-ja-tyypit","ariaLabel":"operandit operaattorit ja tyypit permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laskutoimituksen osana on yleensä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"operandeja"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"operaattoreita"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 324px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/8589df3fea236cb343ba84562f88bba2/67580/1_5.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 62.60869565217391%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAABv0lEQVQ4y11T2Y7iMBDM/38Yr4AQoNkhIhqRw86dQA7iuFblHovsttSK3WdVuxMAgLVwMgxAngNNI1rXomX5UdqLAuh7yfG5XoKtseuA91vOLHS7AVEEfH3JWWvxrSvQtp+CPp/fYNthmiRwHAUB0fDO4rw/n8KCjfndiq8TABbGMNGi6yzyXDRNhf7Pj0UYWiglCL3fx7PpsriSsNYK5b63LpiFSYcBcWwxz9KMmiQWr5d1SOinjWetWfRDM9BaOQeDgRVKZTDGoKqkq1IprDVuHDLbEutqwLzXq3N2zp32pmmkIFERvjEL0jTFshiMo1B4PB6Y5zeGQdAVRYGqqhDHMfq+d3Nlfp5rtG2L4H6/bwZrceNzboQFn8zaCGPefh1+RWvtwATf33/cJcsUkiTB5XJxDiKg/Xg84nw+QynlbPRdr1fXiLYsy1xcFEVCeVkWTNPkdJ5n1HXtAqhlWSIMQ+z3+3/spOxzvHrEwRY2Z0IE7MQkzoRFqbxT6SOqSl7tv120XGwZPiXPc4zcavc3rI7u4XDA6XTCbrfD8LvNZEW6vshWA2+UlahddyZ2XefObOKp0kafv29z/R7+BdJ66xYE3UIGAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8589df3fea236cb343ba84562f88bba2/a0b58/1_5.webp 230w","/static/8589df3fea236cb343ba84562f88bba2/4e123/1_5.webp 324w"],"sizes":"(max-width: 324px) 100vw, 324px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8589df3fea236cb343ba84562f88bba2/81c8e/1_5.png 230w","/static/8589df3fea236cb343ba84562f88bba2/67580/1_5.png 324w"],"sizes":"(max-width: 324px) 100vw, 324px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/8589df3fea236cb343ba84562f88bba2/67580/1_5.png","alt":"1 5","title":"1 5","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yleensä operandien tyyppi ratkaisee lopputuloksen tyypin: jos lasketaan yhteen kaksi kokonaislukua, myös tulos on kokonaisluku. Jos taas vähennetään liukuluku toisesta liukuluvusta, myös tulos on liukuluku. Itse asiassa tulos on liukuluku, jos edes yksi operandeista lausekkeessa on liukuluku."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jakolasku "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" muodostaa Pythonissa poikkeuksen sääntöön: sen tulos on liukuluku, vaikka operandit olisivatkin kokonaislukuja (esim. "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"1 / 5"}]},{"type":"text","value":" tuottaa liukuluvun "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"0.2"}]},{"type":"text","value":")."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"172.5"}]},{"type":"text","value":"\npaino "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"68.55"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# painoindeksi lasketaan jakamalla paino pituuden neliöllä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# pituus ilmoitetaan kaavassa metreinä"}]},{"type":"text","value":"\nbmi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" paino "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Painoindeksi on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"bmi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Painoindeksi on 23.037177063642087"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että Pythonissa on myös kokonaislukujakolaskuoperaattori "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"//"}]},{"type":"text","value":", joka tuottaa kokonaisluvun, jos sen operandit ovat kokonaislukuja. Vastaus pyöristetään alaspäin kokonaisluvuksi, eli esim."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\ny "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"/-operaattori "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"//-operaattori "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"//"}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tulostaa"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"/-operaattori 1.5\n//-operaattori 1"}]}]},{"type":"element","tagName":"h2","properties":{"id":"lukuarvojen-lukeminen","style":"position:relative;"},"children":[{"type":"text","value":"Lukuarvojen lukeminen"},{"type":"element","tagName":"a","properties":{"href":"#lukuarvojen-lukeminen","ariaLabel":"lukuarvojen lukeminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aikaisemmin käytettiin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"input"}]},{"type":"text","value":"-komentoa lukemaan käyttäjältä merkkijonoja. Samaa funktiota voidaan käyttää myös lukuarvojen lukemiseen. Tällaisessa tapauksessa muunnos merkkijonosta lukutyyppiin on kuitenkin tehtävä itse. Logiikka on samanlainen kuin edellisessä osassa opitussa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"str"}]},{"type":"text","value":"-funktiossa, vain funktion nimi vaihtuu."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi voimme muuttaa merkkijonon kokonaisluvuksi funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"int"}]},{"type":"text","value":". Seuraava ohjelma lukee käyttäjältä syntymävuoden muuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"syote"}]},{"type":"text","value":" ja luo sitten toisen muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vuosi"}]},{"type":"text","value":", jossa on vuosi kokonaisluvuksi muutettuna. Tämän jälkeen voimme suorittaa laskun "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"2020-vuosi"}]},{"type":"text","value":", jossa on mukana käyttäjän antama vuosi."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"syote "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Minä vuonna olet syntynyt? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nvuosi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Ikäsi vuoden 2020 lopussa: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Minä vuonna olet syntynyt? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1995"}]},{"type":"text","value":"\nIkäsi vuoden 2020 lopussa: 25"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yleensä ei kannata luoda kahta muuttujaa (tässä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"syote"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vuosi"}]},{"type":"text","value":") lukuarvon lukemista varten, vaan voimme samalla kertaa lukea merkkijonon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"input"}]},{"type":"text","value":"-funktiolla ja muuttaa sen kokonaisluvuksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"int"}]},{"type":"text","value":"-funktiolla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"vuosi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Minä vuonna olet syntynyt? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Ikäsi vuoden 2020 lopussa: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaavasti voimme muuttaa merkkijonon liukuluvuksi funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"float"}]},{"type":"text","value":". Seuraava ohjelma kysyy käyttäjän painon ja pituuden ja laskee näiden tietojen avulla painoindeksin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna pituus: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npaino "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna paino: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"text","value":"\nbmi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" paino "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Painoindeksi on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"bmi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostus voisi näyttää vaikka seuraavalta:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna pituus: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"163"}]},{"type":"text","value":"\nAnna paino: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"74.45"}]},{"type":"text","value":"\nPainoindeksi on 28.02137829801649"}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Luku kertaa viisi","tmcname":"osa01-13_kerrottuna_viidella"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä lukua. Ohjelma tulostaa luvun kerrottuna viidellä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nKun kerrotaan 3 luvulla 5, saadaan 15"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Nimi ja ikä","tmcname":"osa01-14_nimi_ja_ika"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä tämän nimen ja syntymävuoden. Ohjelma tulostaa sitten viestin seuraavan esimerkin mukaisesti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Keijo Keksitty"}]},{"type":"text","value":"\nAnna syntymävuosi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1990"}]},{"type":"text","value":"\nMoi Keijo Keksitty, olet 30 vuotta vanha vuoden 2020 lopussa"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"muuttujien-kayttoa","style":"position:relative;"},"children":[{"type":"text","value":"Muuttujien käyttöä"},{"type":"element","tagName":"a","properties":{"href":"#muuttujien-kayttoa","ariaLabel":"muuttujien kayttoa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan ohjelmaa, joka laskee kolmen käyttäjän syöttämän luvun summan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ensimmäinen luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluku2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Toinen luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluku3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kolmas luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" luku1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" luku2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" luku3\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Lukujen summa: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman esimerkkisuoritus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ensimmäinen luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nToinen luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"21"}]},{"type":"text","value":"\nKolmas luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"7"}]},{"type":"text","value":"\nLukujen summa: 33"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma käyttää nyt neljää muuttujaa. Tässä tilanteessa tultaisiin toimeen myös vähemmällä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ensimmäinen luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" luku\n\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Toinen luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" luku\n\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kolmas luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" luku\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Lukujen summa: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt kaikki käyttäjän syötteet luetaan muuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku"}]},{"type":"text","value":", jonka arvolla "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kasvatetaan"}]},{"type":"text","value":" muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa"}]},{"type":"text","value":" arvoa joka kerta sen jälkeen kun käyttäjältä on saatu uusi syöte."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava komento siis "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kasvattaa"}]},{"type":"text","value":" muuttujassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa"}]},{"type":"text","value":" olevaa arvoa muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku"}]},{"type":"text","value":" arvolla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" luku"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eli esimerkiksi jos ennen komentoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa"}]},{"type":"text","value":" on 3 ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku"}]},{"type":"text","value":" on 2, niin komennon suorittamisen jälkeen muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa"}]},{"type":"text","value":" arvona on 5."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska muuttujan arvon kasvattaminen on usein tarvittava toiminto, voimme kirjoittaa sen myös lyhyemmin näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" luku"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän avulla saamme kirjoitettua ohjelman koodin tiiviimmin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ensimmäinen luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" luku\n\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Toinen luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" luku\n\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kolmas luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" luku\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Lukujen summa: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Itse asiassa apumuuttujaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku"}]},{"type":"text","value":" ei välttämättä tarvita ollenkaan. Käyttäjän antamat syötteet voitaisiin lisätä yksi kerrallaan muuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa"}]},{"type":"text","value":" myös seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ensimmäinen luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Toinen luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kolmas luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Lukujen summa: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Riippuu toki tilanteesta, montako muuttujaa ohjelmassa tarvitaan. Jos käyttäjän kaikkien syötteiden arvo tulee muistaa, ei ole mahdollista \"uusiokäyttää\" samaa apumuuttujaa kaikkien syötteiden lukemiseen. Näin on seuraavassa esimerkissä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ensimmäinen luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluku2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Toinen luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"luku1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" + "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"luku2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" = "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"luku1"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"luku2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ensimmäinen luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nToinen luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n2 + 3 = 5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toisaalta tässä ohjelmassa ei ole omaa muuttujaa summan arvon tallettamiseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kannattaa kuitenkin huomata, että yhtä muuttujaa ei kannata \"uusiokäyttää\" kuin samankaltaisiin asioihin, esim. summattavien lukujen tilapäiseen tallentamiseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraavassa on uusiokäytetty muuttujaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tieto"}]},{"type":"text","value":" nimen ja iän tallentamiseen ja tämä ei ole missään nimessä järkevää:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tieto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikä on nimesi? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hei \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" tieto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntieto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikä on ikäsi? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ohjelma jatkuu..."}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"On parempi käyttää näitä kahta eri tarkoitusta varten omia "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kuvaavasti nimettyjä"}]},{"type":"text","value":" muuttujia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikä on nimesi? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hei \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikä on ikäsi? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ohjelma jatkuu..."}]}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Vuorokaudet sekunteina","tmcname":"osa01-15_sekunteja_vuorokaudessa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä vuorokausien lukumäärän. Tämän jälkeen ohjelma tulostaa sekuntien määrän annetuissa vuorokausissa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuinka monen vuorokauden sekunnit tulostetaan? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n86400"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen esimerkki:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuinka monen vuorokauden sekunnit tulostetaan? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"7"}]},{"type":"text","value":"\n604800"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Korjaa ohjelma: Lukujen tulo","tmcname":"osa01-20_korjaa_ohjelma_lukujen_tulo"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oheinen ohjelma kysyy käyttäjältä kolme lukua ja tulostaa näiden tulon (eli luvut kerrottuna toisillaan).\nOhjelmassa on kuitenkin virhe tai virheitä, joiden takia se ei toimi. Korjaa ohjelma sellaiseksi, että se toimii oikein."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman siis pitäisi toimia esimerkiksi näin:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku 1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nAnna luku 2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nAnna luku 3: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nTulo on 30"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Lukujen summa ja tulo","tmcname":"osa01-16_lukujen_summa_ja_tulo"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma joka kysyy käyttäjältä kaksi lukua. Ohjelma tulostaa lukujen summan ja tulon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luku 1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nLuku 2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"7"}]},{"type":"text","value":"\nLukujen summa 10\nLukujen tulo 21"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Lukujen summa ja keskiarvo","tmcname":"osa01-17_lukujen_summa_ja_keskiarvo"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka lukee käyttäjältä neljä lukua ja tulostaa niiden summan ja keskiarvon"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luku 1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nLuku 2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nLuku 3: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"6"}]},{"type":"text","value":"\nLuku 4: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"7"}]},{"type":"text","value":"\nLukujen summa on 16 ja keskiarvo 4.0"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Ruokailukustannukset","tmcname":"osa01-19_ruokailukustannukset"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka arvioi käyttäjän keskimääräisiä ruokailukustannuksia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma kysyy, kuinka monta kertaa viikossa käyttäjä käy Unicafessa ja Unicafe-lounaan hinnan sekä viikon muiden ruokaostosten hinnan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Näiden tietojen perusteella ohjelma laskee käyttäjän keskimääräiset ruokamenot sekä viikossa että yhtenä päivänä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Montako kertaa viikossa syöt Unicafessa? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nUnicafe-lounaan hinta? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2.5"}]},{"type":"text","value":"\nPaljonko käytät viikossa ruokaostoksiin? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"28.5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kustannukset keskimäärin:\nPäivässä 5.5 euroa\nViikossa 38.5 euroa"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Opiskelijat ryhmiin","tmcname":"osa01-18_opiskelijat_ryhmiin"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy kurssin opiskelijoiden määrän ja ryhmän koon ja ilmoittaa, montako ryhmää opiskelijoista muodostuu. Jos jako ei mene tasan, yhdessä ryhmässä voi olla vähemmän opiskelijoita, mutta kaikissa muissa on oltava haluttu määrä."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Montako opiskelijaa? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"8"}]},{"type":"text","value":"\nMikä on ryhmän koko? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nRyhmien määrä: 2"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Montako opiskelijaa? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"11"}]},{"type":"text","value":"\nMikä on ryhmän koko? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nRyhmien määrä: 4"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vihje: tehtävän tekeminen onnistuu kokonaislukujakolaskuoperaattorilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"//"}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"text","value":"Vihje2: jos et keksi miten tehtävä ratkeaa, älä huolestu suotta vaan tutustu "},{"type":"element","tagName":"a","properties":{"href":"/osa-1/5-ehtorakenne"},"children":[{"type":"text","value":"seuraavassa luvussa"}]},{"type":"text","value":" esiteltävään "},{"type":"element","tagName":"i","properties":{},"children":[{"type":"text","value":"ehtorakenteeseen"}]},{"type":"text","value":". Ehtorakenteen avulla tehtävä on huomattavasti helpompi ratkaista."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kertauskysely tämän osan asioihin liittyen:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat käyttää muuttujia laskutoimitusten kanssa
  • \n
  • Osaat käsitellä käyttäjän antamia lukuarvoja
  • \n
  • Osaat muuntaa arvoja eri perustyyppien välillä
  • \n

Aiemmissa osissa nähtiin esimerkkejä peruslaskutoimituksista. Seuraavaan taulukkoon on koottu Pythonin yleisimmät laskuoperaattorit esimerkkeineen:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
OperaattoriMerkitysEsimerkkiTulos
+Yhteenlasku2 + 46
-Vähennyslasku10 - 2.57.5
*Kertolasku-2 * 123-246
/Jakolasku (liukuluku)9 / 24.5
//Jakolasku (kokonaisluku)9 // 24
%Jakojäännös9 % 21
**Potenssi2 ** 38

Laskujärjestys noudattaa matematiikasta tuttuja sääntöjä: aluksi lasketaan potenssilaskut, sitten kerto- ja jakolaskut ja lopuksi yhteen- ja vähennyslaskut. Järjestystä voidaan muuttaa sulkujen avulla.

Esimerkki:

print(2 + 3 * 3)\nprint((2 + 3) * 3)

Ohjelma tulostaa

11\n15

Operandit, operaattorit ja tyypit

Laskutoimituksen osana on yleensä operandeja ja operaattoreita:

\n \n \n \n \n \n \"1\n \n \n

Yleensä operandien tyyppi ratkaisee lopputuloksen tyypin: jos lasketaan yhteen kaksi kokonaislukua, myös tulos on kokonaisluku. Jos taas vähennetään liukuluku toisesta liukuluvusta, myös tulos on liukuluku. Itse asiassa tulos on liukuluku, jos edes yksi operandeista lausekkeessa on liukuluku.

Jakolasku / muodostaa Pythonissa poikkeuksen sääntöön: sen tulos on liukuluku, vaikka operandit olisivatkin kokonaislukuja (esim. 1 / 5 tuottaa liukuluvun 0.2).

Esimerkki:

pituus = 172.5\npaino = 68.55\n\n# painoindeksi lasketaan jakamalla paino pituuden neliöllä\n# pituus ilmoitetaan kaavassa metreinä\nbmi = paino / (pituus / 100) ** 2\n\nprint(f\"Painoindeksi on {bmi}\")

Ohjelman tulostus on seuraava:

Painoindeksi on 23.037177063642087

Huomaa, että Pythonissa on myös kokonaislukujakolaskuoperaattori //, joka tuottaa kokonaisluvun, jos sen operandit ovat kokonaislukuja. Vastaus pyöristetään alaspäin kokonaisluvuksi, eli esim.

x = 3\ny = 2\n\nprint(f\"/-operaattori {x/y}\")\nprint(f\"//-operaattori {x//y}\")

tulostaa

/-operaattori 1.5\n//-operaattori 1

Lukuarvojen lukeminen

Aikaisemmin käytettiin input-komentoa lukemaan käyttäjältä merkkijonoja. Samaa funktiota voidaan käyttää myös lukuarvojen lukemiseen. Tällaisessa tapauksessa muunnos merkkijonosta lukutyyppiin on kuitenkin tehtävä itse. Logiikka on samanlainen kuin edellisessä osassa opitussa str-funktiossa, vain funktion nimi vaihtuu.

Esimerkiksi voimme muuttaa merkkijonon kokonaisluvuksi funktiolla int. Seuraava ohjelma lukee käyttäjältä syntymävuoden muuttujaan syote ja luo sitten toisen muuttujan vuosi, jossa on vuosi kokonaisluvuksi muutettuna. Tämän jälkeen voimme suorittaa laskun 2020-vuosi, jossa on mukana käyttäjän antama vuosi.

syote = input(\"Minä vuonna olet syntynyt? \")\nvuosi = int(syote)\nprint(f\"Ikäsi vuoden 2020 lopussa: {2020 - vuosi}\" )

Minä vuonna olet syntynyt? 1995\nIkäsi vuoden 2020 lopussa: 25

Yleensä ei kannata luoda kahta muuttujaa (tässä syote ja vuosi) lukuarvon lukemista varten, vaan voimme samalla kertaa lukea merkkijonon input-funktiolla ja muuttaa sen kokonaisluvuksi int-funktiolla:

vuosi = int(input(\"Minä vuonna olet syntynyt? \"))\nprint(f\"Ikäsi vuoden 2020 lopussa: {2020 - vuosi}\" )

Vastaavasti voimme muuttaa merkkijonon liukuluvuksi funktiolla float. Seuraava ohjelma kysyy käyttäjän painon ja pituuden ja laskee näiden tietojen avulla painoindeksin:

pituus = float(input(\"Anna pituus: \"))\npaino = float(input(\"Anna paino: \"))\n\npituus = pituus / 100\nbmi = paino / pituus ** 2\n\nprint(f\"Painoindeksi on {bmi}\")

Ohjelman tulostus voisi näyttää vaikka seuraavalta:

Anna pituus: 163\nAnna paino: 74.45\nPainoindeksi on 28.02137829801649

Tee ohjelma, joka kysyy käyttäjältä lukua. Ohjelma tulostaa luvun kerrottuna viidellä.

Ohjelman tulee toimia seuraavasti:

Anna luku: 3\nKun kerrotaan 3 luvulla 5, saadaan 15

Tee ohjelma, joka kysyy käyttäjältä tämän nimen ja syntymävuoden. Ohjelma tulostaa sitten viestin seuraavan esimerkin mukaisesti:

Anna nimi: Keijo Keksitty\nAnna syntymävuosi: 1990\nMoi Keijo Keksitty, olet 30 vuotta vanha vuoden 2020 lopussa

Muuttujien käyttöä

Tarkastellaan ohjelmaa, joka laskee kolmen käyttäjän syöttämän luvun summan:

luku1 = int(input(\"Ensimmäinen luku: \"))\nluku2 = int(input(\"Toinen luku: \"))\nluku3 = int(input(\"Kolmas luku: \"))\n\nsumma = luku1 + luku2 + luku3\nprint(f\"Lukujen summa: {summa}\")

Ohjelman esimerkkisuoritus:

Ensimmäinen luku: 5\nToinen luku: 21\nKolmas luku: 7\nLukujen summa: 33

Ohjelma käyttää nyt neljää muuttujaa. Tässä tilanteessa tultaisiin toimeen myös vähemmällä:

summa = 0\n\nluku = int(input(\"Ensimmäinen luku: \"))\nsumma = summa + luku\n\nluku = int(input(\"Toinen luku: \"))\nsumma = summa + luku\n\nluku = int(input(\"kolmas luku: \"))\nsumma = summa + luku\n\nprint(f\"Lukujen summa: {summa}\")

Nyt kaikki käyttäjän syötteet luetaan muuttujaan luku, jonka arvolla kasvatetaan muuttujan summa arvoa joka kerta sen jälkeen kun käyttäjältä on saatu uusi syöte.

Seuraava komento siis kasvattaa muuttujassa summa olevaa arvoa muuttujan luku arvolla:

summa = summa + luku

Eli esimerkiksi jos ennen komentoa summa on 3 ja luku on 2, niin komennon suorittamisen jälkeen muuttujan summa arvona on 5.

Koska muuttujan arvon kasvattaminen on usein tarvittava toiminto, voimme kirjoittaa sen myös lyhyemmin näin:

summa += luku

Tämän avulla saamme kirjoitettua ohjelman koodin tiiviimmin:

summa = 0\n\nluku = int(input(\"Ensimmäinen luku: \"))\nsumma += luku\n\nluku = int(input(\"Toinen luku: \"))\nsumma += luku\n\nluku = int(input(\"kolmas luku: \"))\nsumma += luku\n\nprint(f\"Lukujen summa: {summa}\")

Itse asiassa apumuuttujaa luku ei välttämättä tarvita ollenkaan. Käyttäjän antamat syötteet voitaisiin lisätä yksi kerrallaan muuttujaan summa myös seuraavasti:

summa = 0\n\nsumma += int(input(\"Ensimmäinen luku: \"))\nsumma += int(input(\"Toinen luku: \"))\nsumma += int(input(\"Kolmas luku: \"))\n\nprint(f\"Lukujen summa: {summa}\")

Riippuu toki tilanteesta, montako muuttujaa ohjelmassa tarvitaan. Jos käyttäjän kaikkien syötteiden arvo tulee muistaa, ei ole mahdollista \"uusiokäyttää\" samaa apumuuttujaa kaikkien syötteiden lukemiseen. Näin on seuraavassa esimerkissä:

luku1 = int(input(\"Ensimmäinen luku: \"))\nluku2 = int(input(\"Toinen luku: \"))\n\nprint(f\"{luku1} + {luku2} = {luku1+luku2}\")

Ensimmäinen luku: 2\nToinen luku: 3\n2 + 3 = 5

Toisaalta tässä ohjelmassa ei ole omaa muuttujaa summan arvon tallettamiseen.

Kannattaa kuitenkin huomata, että yhtä muuttujaa ei kannata \"uusiokäyttää\" kuin samankaltaisiin asioihin, esim. summattavien lukujen tilapäiseen tallentamiseen.

Esimerkiksi seuraavassa on uusiokäytetty muuttujaa tieto nimen ja iän tallentamiseen ja tämä ei ole missään nimessä järkevää:

tieto = input(\"Mikä on nimesi? \")\nprint(\"Hei \" + tieto + \"!\")\n\ntieto = int(input(\"Mikä on ikäsi? \"))\n# ohjelma jatkuu...

On parempi käyttää näitä kahta eri tarkoitusta varten omia kuvaavasti nimettyjä muuttujia:

nimi = input(\"Mikä on nimesi? \")\nprint(\"Hei \" + nimi + \"!\")\n\nika = int(input(\"Mikä on ikäsi? \"))\n# ohjelma jatkuu...

Tee ohjelma, joka kysyy käyttäjältä vuorokausien lukumäärän. Tämän jälkeen ohjelma tulostaa sekuntien määrän annetuissa vuorokausissa.

Ohjelman tulee toimia seuraavasti:

Kuinka monen vuorokauden sekunnit tulostetaan? 1\n86400

Toinen esimerkki:

Kuinka monen vuorokauden sekunnit tulostetaan? 7\n604800

Oheinen ohjelma kysyy käyttäjältä kolme lukua ja tulostaa näiden tulon (eli luvut kerrottuna toisillaan).\nOhjelmassa on kuitenkin virhe tai virheitä, joiden takia se ei toimi. Korjaa ohjelma sellaiseksi, että se toimii oikein.

Ohjelman siis pitäisi toimia esimerkiksi näin:

Anna luku 1: 2\nAnna luku 2: 3\nAnna luku 3: 5\nTulo on 30

Tee ohjelma joka kysyy käyttäjältä kaksi lukua. Ohjelma tulostaa lukujen summan ja tulon.

Ohjelman tulee toimia seuraavasti:

Luku 1: 3\nLuku 2: 7\nLukujen summa 10\nLukujen tulo 21

Tee ohjelma, joka lukee käyttäjältä neljä lukua ja tulostaa niiden summan ja keskiarvon

Ohjelman tulee toimia seuraavasti:

Luku 1: 2\nLuku 2: 1\nLuku 3: 6\nLuku 4: 7\nLukujen summa on 16 ja keskiarvo 4.0

Tee ohjelma, joka arvioi käyttäjän keskimääräisiä ruokailukustannuksia.

Ohjelma kysyy, kuinka monta kertaa viikossa käyttäjä käy Unicafessa ja Unicafe-lounaan hinnan sekä viikon muiden ruokaostosten hinnan.

Näiden tietojen perusteella ohjelma laskee käyttäjän keskimääräiset ruokamenot sekä viikossa että yhtenä päivänä.

Ohjelman tulee toimia seuraavasti:

Montako kertaa viikossa syöt Unicafessa? 4\nUnicafe-lounaan hinta? 2.5\nPaljonko käytät viikossa ruokaostoksiin? 28.5

Kustannukset keskimäärin:\nPäivässä 5.5 euroa\nViikossa 38.5 euroa

Tee ohjelma, joka kysyy kurssin opiskelijoiden määrän ja ryhmän koon ja ilmoittaa, montako ryhmää opiskelijoista muodostuu. Jos jako ei mene tasan, yhdessä ryhmässä voi olla vähemmän opiskelijoita, mutta kaikissa muissa on oltava haluttu määrä.

Montako opiskelijaa? 8\nMikä on ryhmän koko? 4\nRyhmien määrä: 2

Montako opiskelijaa? 11\nMikä on ryhmän koko? 3\nRyhmien määrä: 4

Vihje: tehtävän tekeminen onnistuu kokonaislukujakolaskuoperaattorilla //

Vihje2: jos et keksi miten tehtävä ratkeaa, älä huolestu suotta vaan tutustu seuraavassa luvussa esiteltävään ehtorakenteeseen. Ehtorakenteen avulla tehtävä on huomattavasti helpompi ratkaista.

Kertauskysely tämän osan asioihin liittyen:

","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-1/4-laskentaa-luvuilla.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää muuttujia laskutoimitusten kanssa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käsitellä käyttäjän antamia lukuarvoja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat muuntaa arvoja eri perustyyppien välillä"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aiemmissa osissa nähtiin esimerkkejä peruslaskutoimituksista. Seuraavaan taulukkoon on koottu Pythonin yleisimmät laskuoperaattorit esimerkkeineen:"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Operaattori"}]},{"type":"element","tagName":"th","properties":{},"children":[{"type":"text","value":"Merkitys"}]},{"type":"element","tagName":"th","properties":{},"children":[{"type":"text","value":"Esimerkki"}]},{"type":"element","tagName":"th","properties":{},"children":[{"type":"text","value":"Tulos"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"+"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Yhteenlasku"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"2 + 4"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"6"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"-"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Vähennyslasku"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"10 - 2.5"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"7.5"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"*"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Kertolasku"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"-2 * 123"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"-246"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"/"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Jakolasku (liukuluku)"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"9 / 2"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"4.5"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"//"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Jakolasku (kokonaisluku)"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"9 // 2"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"4"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"%"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Jakojäännös"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"9 % 2"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"1"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"**"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Potenssi"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"2 ** 3"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"8"}]}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laskujärjestys noudattaa matematiikasta tuttuja sääntöjä: aluksi lasketaan potenssilaskut, sitten kerto- ja jakolaskut ja lopuksi yhteen- ja vähennyslaskut. Järjestystä voidaan muuttaa sulkujen avulla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma tulostaa"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"11\n15"}]}]},{"type":"element","tagName":"h2","properties":{"id":"operandit-operaattorit-ja-tyypit","style":"position:relative;"},"children":[{"type":"text","value":"Operandit, operaattorit ja tyypit"},{"type":"element","tagName":"a","properties":{"href":"#operandit-operaattorit-ja-tyypit","ariaLabel":"operandit operaattorit ja tyypit permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laskutoimituksen osana on yleensä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"operandeja"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"operaattoreita"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 324px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/8589df3fea236cb343ba84562f88bba2/67580/1_5.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 62.60869565217391%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAABv0lEQVQ4y11T2Y7iMBDM/38Yr4AQoNkhIhqRw86dQA7iuFblHovsttSK3WdVuxMAgLVwMgxAngNNI1rXomX5UdqLAuh7yfG5XoKtseuA91vOLHS7AVEEfH3JWWvxrSvQtp+CPp/fYNthmiRwHAUB0fDO4rw/n8KCjfndiq8TABbGMNGi6yzyXDRNhf7Pj0UYWiglCL3fx7PpsriSsNYK5b63LpiFSYcBcWwxz9KMmiQWr5d1SOinjWetWfRDM9BaOQeDgRVKZTDGoKqkq1IprDVuHDLbEutqwLzXq3N2zp32pmmkIFERvjEL0jTFshiMo1B4PB6Y5zeGQdAVRYGqqhDHMfq+d3Nlfp5rtG2L4H6/bwZrceNzboQFn8zaCGPefh1+RWvtwATf33/cJcsUkiTB5XJxDiKg/Xg84nw+QynlbPRdr1fXiLYsy1xcFEVCeVkWTNPkdJ5n1HXtAqhlWSIMQ+z3+3/spOxzvHrEwRY2Z0IE7MQkzoRFqbxT6SOqSl7tv120XGwZPiXPc4zcavc3rI7u4XDA6XTCbrfD8LvNZEW6vshWA2+UlahddyZ2XefObOKp0kafv29z/R7+BdJ66xYE3UIGAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8589df3fea236cb343ba84562f88bba2/a0b58/1_5.webp 230w","/static/8589df3fea236cb343ba84562f88bba2/4e123/1_5.webp 324w"],"sizes":"(max-width: 324px) 100vw, 324px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8589df3fea236cb343ba84562f88bba2/81c8e/1_5.png 230w","/static/8589df3fea236cb343ba84562f88bba2/67580/1_5.png 324w"],"sizes":"(max-width: 324px) 100vw, 324px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/8589df3fea236cb343ba84562f88bba2/67580/1_5.png","alt":"1 5","title":"1 5","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yleensä operandien tyyppi ratkaisee lopputuloksen tyypin: jos lasketaan yhteen kaksi kokonaislukua, myös tulos on kokonaisluku. Jos taas vähennetään liukuluku toisesta liukuluvusta, myös tulos on liukuluku. Itse asiassa tulos on liukuluku, jos edes yksi operandeista lausekkeessa on liukuluku."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jakolasku "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" muodostaa Pythonissa poikkeuksen sääntöön: sen tulos on liukuluku, vaikka operandit olisivatkin kokonaislukuja (esim. "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"1 / 5"}]},{"type":"text","value":" tuottaa liukuluvun "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"0.2"}]},{"type":"text","value":")."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"172.5"}]},{"type":"text","value":"\npaino "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"68.55"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# painoindeksi lasketaan jakamalla paino pituuden neliöllä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# pituus ilmoitetaan kaavassa metreinä"}]},{"type":"text","value":"\nbmi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" paino "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Painoindeksi on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"bmi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Painoindeksi on 23.037177063642087"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että Pythonissa on myös kokonaislukujakolaskuoperaattori "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"//"}]},{"type":"text","value":", joka tuottaa kokonaisluvun, jos sen operandit ovat kokonaislukuja. Vastaus pyöristetään alaspäin kokonaisluvuksi, eli esim."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\ny "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"/-operaattori "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"//-operaattori "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"//"}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tulostaa"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"/-operaattori 1.5\n//-operaattori 1"}]}]},{"type":"element","tagName":"h2","properties":{"id":"lukuarvojen-lukeminen","style":"position:relative;"},"children":[{"type":"text","value":"Lukuarvojen lukeminen"},{"type":"element","tagName":"a","properties":{"href":"#lukuarvojen-lukeminen","ariaLabel":"lukuarvojen lukeminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aikaisemmin käytettiin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"input"}]},{"type":"text","value":"-komentoa lukemaan käyttäjältä merkkijonoja. Samaa funktiota voidaan käyttää myös lukuarvojen lukemiseen. Tällaisessa tapauksessa muunnos merkkijonosta lukutyyppiin on kuitenkin tehtävä itse. Logiikka on samanlainen kuin edellisessä osassa opitussa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"str"}]},{"type":"text","value":"-funktiossa, vain funktion nimi vaihtuu."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi voimme muuttaa merkkijonon kokonaisluvuksi funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"int"}]},{"type":"text","value":". Seuraava ohjelma lukee käyttäjältä syntymävuoden muuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"syote"}]},{"type":"text","value":" ja luo sitten toisen muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vuosi"}]},{"type":"text","value":", jossa on vuosi kokonaisluvuksi muutettuna. Tämän jälkeen voimme suorittaa laskun "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"2020-vuosi"}]},{"type":"text","value":", jossa on mukana käyttäjän antama vuosi."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"syote "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Minä vuonna olet syntynyt? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nvuosi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Ikäsi vuoden 2020 lopussa: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Minä vuonna olet syntynyt? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1995"}]},{"type":"text","value":"\nIkäsi vuoden 2020 lopussa: 25"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yleensä ei kannata luoda kahta muuttujaa (tässä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"syote"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vuosi"}]},{"type":"text","value":") lukuarvon lukemista varten, vaan voimme samalla kertaa lukea merkkijonon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"input"}]},{"type":"text","value":"-funktiolla ja muuttaa sen kokonaisluvuksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"int"}]},{"type":"text","value":"-funktiolla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"vuosi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Minä vuonna olet syntynyt? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Ikäsi vuoden 2020 lopussa: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaavasti voimme muuttaa merkkijonon liukuluvuksi funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"float"}]},{"type":"text","value":". Seuraava ohjelma kysyy käyttäjän painon ja pituuden ja laskee näiden tietojen avulla painoindeksin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna pituus: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npaino "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna paino: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"text","value":"\nbmi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" paino "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Painoindeksi on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"bmi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostus voisi näyttää vaikka seuraavalta:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna pituus: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"163"}]},{"type":"text","value":"\nAnna paino: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"74.45"}]},{"type":"text","value":"\nPainoindeksi on 28.02137829801649"}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Luku kertaa viisi","tmcname":"osa01-13_kerrottuna_viidella"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä lukua. Ohjelma tulostaa luvun kerrottuna viidellä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nKun kerrotaan 3 luvulla 5, saadaan 15"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Nimi ja ikä","tmcname":"osa01-14_nimi_ja_ika"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä tämän nimen ja syntymävuoden. Ohjelma tulostaa sitten viestin seuraavan esimerkin mukaisesti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Keijo Keksitty"}]},{"type":"text","value":"\nAnna syntymävuosi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1990"}]},{"type":"text","value":"\nMoi Keijo Keksitty, olet 30 vuotta vanha vuoden 2020 lopussa"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"muuttujien-kayttoa","style":"position:relative;"},"children":[{"type":"text","value":"Muuttujien käyttöä"},{"type":"element","tagName":"a","properties":{"href":"#muuttujien-kayttoa","ariaLabel":"muuttujien kayttoa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan ohjelmaa, joka laskee kolmen käyttäjän syöttämän luvun summan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ensimmäinen luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluku2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Toinen luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluku3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kolmas luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" luku1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" luku2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" luku3\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Lukujen summa: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman esimerkkisuoritus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ensimmäinen luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nToinen luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"21"}]},{"type":"text","value":"\nKolmas luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"7"}]},{"type":"text","value":"\nLukujen summa: 33"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma käyttää nyt neljää muuttujaa. Tässä tilanteessa tultaisiin toimeen myös vähemmällä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ensimmäinen luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" luku\n\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Toinen luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" luku\n\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kolmas luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" luku\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Lukujen summa: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt kaikki käyttäjän syötteet luetaan muuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku"}]},{"type":"text","value":", jonka arvolla "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kasvatetaan"}]},{"type":"text","value":" muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa"}]},{"type":"text","value":" arvoa joka kerta sen jälkeen kun käyttäjältä on saatu uusi syöte."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava komento siis "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kasvattaa"}]},{"type":"text","value":" muuttujassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa"}]},{"type":"text","value":" olevaa arvoa muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku"}]},{"type":"text","value":" arvolla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" luku"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eli esimerkiksi jos ennen komentoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa"}]},{"type":"text","value":" on 3 ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku"}]},{"type":"text","value":" on 2, niin komennon suorittamisen jälkeen muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa"}]},{"type":"text","value":" arvona on 5."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska muuttujan arvon kasvattaminen on usein tarvittava toiminto, voimme kirjoittaa sen myös lyhyemmin näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" luku"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän avulla saamme kirjoitettua ohjelman koodin tiiviimmin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ensimmäinen luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" luku\n\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Toinen luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" luku\n\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kolmas luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" luku\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Lukujen summa: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Itse asiassa apumuuttujaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku"}]},{"type":"text","value":" ei välttämättä tarvita ollenkaan. Käyttäjän antamat syötteet voitaisiin lisätä yksi kerrallaan muuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa"}]},{"type":"text","value":" myös seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ensimmäinen luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Toinen luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kolmas luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Lukujen summa: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Riippuu toki tilanteesta, montako muuttujaa ohjelmassa tarvitaan. Jos käyttäjän kaikkien syötteiden arvo tulee muistaa, ei ole mahdollista \"uusiokäyttää\" samaa apumuuttujaa kaikkien syötteiden lukemiseen. Näin on seuraavassa esimerkissä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ensimmäinen luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluku2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Toinen luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"luku1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" + "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"luku2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" = "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"luku1"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"luku2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ensimmäinen luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nToinen luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n2 + 3 = 5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toisaalta tässä ohjelmassa ei ole omaa muuttujaa summan arvon tallettamiseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kannattaa kuitenkin huomata, että yhtä muuttujaa ei kannata \"uusiokäyttää\" kuin samankaltaisiin asioihin, esim. summattavien lukujen tilapäiseen tallentamiseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraavassa on uusiokäytetty muuttujaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tieto"}]},{"type":"text","value":" nimen ja iän tallentamiseen ja tämä ei ole missään nimessä järkevää:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tieto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikä on nimesi? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hei \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" tieto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntieto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikä on ikäsi? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ohjelma jatkuu..."}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"On parempi käyttää näitä kahta eri tarkoitusta varten omia "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kuvaavasti nimettyjä"}]},{"type":"text","value":" muuttujia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikä on nimesi? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hei \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikä on ikäsi? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ohjelma jatkuu..."}]}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Vuorokaudet sekunteina","tmcname":"osa01-15_sekunteja_vuorokaudessa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä vuorokausien lukumäärän. Tämän jälkeen ohjelma tulostaa sekuntien määrän annetuissa vuorokausissa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuinka monen vuorokauden sekunnit tulostetaan? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n86400"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen esimerkki:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuinka monen vuorokauden sekunnit tulostetaan? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"7"}]},{"type":"text","value":"\n604800"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Korjaa ohjelma: Lukujen tulo","tmcname":"osa01-20_korjaa_ohjelma_lukujen_tulo"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oheinen ohjelma kysyy käyttäjältä kolme lukua ja tulostaa näiden tulon (eli luvut kerrottuna toisillaan).\nOhjelmassa on kuitenkin virhe tai virheitä, joiden takia se ei toimi. Korjaa ohjelma sellaiseksi, että se toimii oikein."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman siis pitäisi toimia esimerkiksi näin:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku 1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nAnna luku 2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nAnna luku 3: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nTulo on 30"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Lukujen summa ja tulo","tmcname":"osa01-16_lukujen_summa_ja_tulo"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma joka kysyy käyttäjältä kaksi lukua. Ohjelma tulostaa lukujen summan ja tulon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luku 1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nLuku 2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"7"}]},{"type":"text","value":"\nLukujen summa 10\nLukujen tulo 21"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Lukujen summa ja keskiarvo","tmcname":"osa01-17_lukujen_summa_ja_keskiarvo"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka lukee käyttäjältä neljä lukua ja tulostaa niiden summan ja keskiarvon"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luku 1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nLuku 2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nLuku 3: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"6"}]},{"type":"text","value":"\nLuku 4: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"7"}]},{"type":"text","value":"\nLukujen summa on 16 ja keskiarvo 4.0"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Ruokailukustannukset","tmcname":"osa01-19_ruokailukustannukset"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka arvioi käyttäjän keskimääräisiä ruokailukustannuksia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma kysyy, kuinka monta kertaa viikossa käyttäjä käy Unicafessa ja Unicafe-lounaan hinnan sekä viikon muiden ruokaostosten hinnan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Näiden tietojen perusteella ohjelma laskee käyttäjän keskimääräiset ruokamenot sekä viikossa että yhtenä päivänä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Montako kertaa viikossa syöt Unicafessa? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nUnicafe-lounaan hinta? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2.5"}]},{"type":"text","value":"\nPaljonko käytät viikossa ruokaostoksiin? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"28.5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kustannukset keskimäärin:\nPäivässä 5.5 euroa\nViikossa 38.5 euroa"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Opiskelijat ryhmiin","tmcname":"osa01-18_opiskelijat_ryhmiin"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy kurssin opiskelijoiden määrän ja ryhmän koon ja ilmoittaa, montako ryhmää opiskelijoista muodostuu. Jos jako ei mene tasan, yhdessä ryhmässä voi olla vähemmän opiskelijoita, mutta kaikissa muissa on oltava haluttu määrä."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Montako opiskelijaa? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"8"}]},{"type":"text","value":"\nMikä on ryhmän koko? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nRyhmien määrä: 2"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Montako opiskelijaa? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"11"}]},{"type":"text","value":"\nMikä on ryhmän koko? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nRyhmien määrä: 4"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vihje: tehtävän tekeminen onnistuu kokonaislukujakolaskuoperaattorilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"//"}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"text","value":"Vihje2: jos et keksi miten tehtävä ratkeaa, älä huolestu suotta vaan tutustu "},{"type":"element","tagName":"a","properties":{"href":"/osa-1/5-ehtorakenne"},"children":[{"type":"text","value":"seuraavassa luvussa"}]},{"type":"text","value":" esiteltävään "},{"type":"element","tagName":"i","properties":{},"children":[{"type":"text","value":"ehtorakenteeseen"}]},{"type":"text","value":". Ehtorakenteen avulla tehtävä on huomattavasti helpompi ratkaista."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kertauskysely tämän osan asioihin liittyen:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat käyttää muuttujia laskutoimitusten kanssa
  • \n
  • Osaat käsitellä käyttäjän antamia lukuarvoja
  • \n
  • Osaat muuntaa arvoja eri perustyyppien välillä
  • \n

Aiemmissa osissa nähtiin esimerkkejä peruslaskutoimituksista. Seuraavaan taulukkoon on koottu Pythonin yleisimmät laskuoperaattorit esimerkkeineen:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
OperaattoriMerkitysEsimerkkiTulos
+Yhteenlasku2 + 46
-Vähennyslasku10 - 2.57.5
*Kertolasku-2 * 123-246
/Jakolasku (liukuluku)9 / 24.5
//Jakolasku (kokonaisluku)9 // 24
%Jakojäännös9 % 21
**Potenssi2 ** 38

Laskujärjestys noudattaa matematiikasta tuttuja sääntöjä: aluksi lasketaan potenssilaskut, sitten kerto- ja jakolaskut ja lopuksi yhteen- ja vähennyslaskut. Järjestystä voidaan muuttaa sulkujen avulla.

Esimerkki:

print(2 + 3 * 3)\nprint((2 + 3) * 3)

Ohjelma tulostaa

11\n15

Operandit, operaattorit ja tyypit

Laskutoimituksen osana on yleensä operandeja ja operaattoreita:

\n \n \n \n \n \n \"1\n \n \n

Yleensä operandien tyyppi ratkaisee lopputuloksen tyypin: jos lasketaan yhteen kaksi kokonaislukua, myös tulos on kokonaisluku. Jos taas vähennetään liukuluku toisesta liukuluvusta, myös tulos on liukuluku. Itse asiassa tulos on liukuluku, jos edes yksi operandeista lausekkeessa on liukuluku.

Jakolasku / muodostaa Pythonissa poikkeuksen sääntöön: sen tulos on liukuluku, vaikka operandit olisivatkin kokonaislukuja (esim. 1 / 5 tuottaa liukuluvun 0.2).

Esimerkki:

pituus = 172.5\npaino = 68.55\n\n# painoindeksi lasketaan jakamalla paino pituuden neliöllä\n# pituus ilmoitetaan kaavassa metreinä\nbmi = paino / (pituus / 100) ** 2\n\nprint(f\"Painoindeksi on {bmi}\")

Ohjelman tulostus on seuraava:

Painoindeksi on 23.037177063642087

Huomaa, että Pythonissa on myös kokonaislukujakolaskuoperaattori //, joka tuottaa kokonaisluvun, jos sen operandit ovat kokonaislukuja. Vastaus pyöristetään alaspäin kokonaisluvuksi, eli esim.

x = 3\ny = 2\n\nprint(f\"/-operaattori {x/y}\")\nprint(f\"//-operaattori {x//y}\")

tulostaa

/-operaattori 1.5\n//-operaattori 1

Lukuarvojen lukeminen

Aikaisemmin käytettiin input-komentoa lukemaan käyttäjältä merkkijonoja. Samaa funktiota voidaan käyttää myös lukuarvojen lukemiseen. Tällaisessa tapauksessa muunnos merkkijonosta lukutyyppiin on kuitenkin tehtävä itse. Logiikka on samanlainen kuin edellisessä osassa opitussa str-funktiossa, vain funktion nimi vaihtuu.

Esimerkiksi voimme muuttaa merkkijonon kokonaisluvuksi funktiolla int. Seuraava ohjelma lukee käyttäjältä syntymävuoden muuttujaan syote ja luo sitten toisen muuttujan vuosi, jossa on vuosi kokonaisluvuksi muutettuna. Tämän jälkeen voimme suorittaa laskun 2020-vuosi, jossa on mukana käyttäjän antama vuosi.

syote = input(\"Minä vuonna olet syntynyt? \")\nvuosi = int(syote)\nprint(f\"Ikäsi vuoden 2020 lopussa: {2020 - vuosi}\" )

Minä vuonna olet syntynyt? 1995\nIkäsi vuoden 2020 lopussa: 25

Yleensä ei kannata luoda kahta muuttujaa (tässä syote ja vuosi) lukuarvon lukemista varten, vaan voimme samalla kertaa lukea merkkijonon input-funktiolla ja muuttaa sen kokonaisluvuksi int-funktiolla:

vuosi = int(input(\"Minä vuonna olet syntynyt? \"))\nprint(f\"Ikäsi vuoden 2020 lopussa: {2020 - vuosi}\" )

Vastaavasti voimme muuttaa merkkijonon liukuluvuksi funktiolla float. Seuraava ohjelma kysyy käyttäjän painon ja pituuden ja laskee näiden tietojen avulla painoindeksin:

pituus = float(input(\"Anna pituus: \"))\npaino = float(input(\"Anna paino: \"))\n\npituus = pituus / 100\nbmi = paino / pituus ** 2\n\nprint(f\"Painoindeksi on {bmi}\")

Ohjelman tulostus voisi näyttää vaikka seuraavalta:

Anna pituus: 163\nAnna paino: 74.45\nPainoindeksi on 28.02137829801649

Tee ohjelma, joka kysyy käyttäjältä lukua. Ohjelma tulostaa luvun kerrottuna viidellä.

Ohjelman tulee toimia seuraavasti:

Anna luku: 3\nKun kerrotaan 3 luvulla 5, saadaan 15

Tee ohjelma, joka kysyy käyttäjältä tämän nimen ja syntymävuoden. Ohjelma tulostaa sitten viestin seuraavan esimerkin mukaisesti:

Anna nimi: Keijo Keksitty\nAnna syntymävuosi: 1990\nMoi Keijo Keksitty, olet 30 vuotta vanha vuoden 2020 lopussa

Muuttujien käyttöä

Tarkastellaan ohjelmaa, joka laskee kolmen käyttäjän syöttämän luvun summan:

luku1 = int(input(\"Ensimmäinen luku: \"))\nluku2 = int(input(\"Toinen luku: \"))\nluku3 = int(input(\"Kolmas luku: \"))\n\nsumma = luku1 + luku2 + luku3\nprint(f\"Lukujen summa: {summa}\")

Ohjelman esimerkkisuoritus:

Ensimmäinen luku: 5\nToinen luku: 21\nKolmas luku: 7\nLukujen summa: 33

Ohjelma käyttää nyt neljää muuttujaa. Tässä tilanteessa tultaisiin toimeen myös vähemmällä:

summa = 0\n\nluku = int(input(\"Ensimmäinen luku: \"))\nsumma = summa + luku\n\nluku = int(input(\"Toinen luku: \"))\nsumma = summa + luku\n\nluku = int(input(\"kolmas luku: \"))\nsumma = summa + luku\n\nprint(f\"Lukujen summa: {summa}\")

Nyt kaikki käyttäjän syötteet luetaan muuttujaan luku, jonka arvolla kasvatetaan muuttujan summa arvoa joka kerta sen jälkeen kun käyttäjältä on saatu uusi syöte.

Seuraava komento siis kasvattaa muuttujassa summa olevaa arvoa muuttujan luku arvolla:

summa = summa + luku

Eli esimerkiksi jos ennen komentoa summa on 3 ja luku on 2, niin komennon suorittamisen jälkeen muuttujan summa arvona on 5.

Koska muuttujan arvon kasvattaminen on usein tarvittava toiminto, voimme kirjoittaa sen myös lyhyemmin näin:

summa += luku

Tämän avulla saamme kirjoitettua ohjelman koodin tiiviimmin:

summa = 0\n\nluku = int(input(\"Ensimmäinen luku: \"))\nsumma += luku\n\nluku = int(input(\"Toinen luku: \"))\nsumma += luku\n\nluku = int(input(\"kolmas luku: \"))\nsumma += luku\n\nprint(f\"Lukujen summa: {summa}\")

Itse asiassa apumuuttujaa luku ei välttämättä tarvita ollenkaan. Käyttäjän antamat syötteet voitaisiin lisätä yksi kerrallaan muuttujaan summa myös seuraavasti:

summa = 0\n\nsumma += int(input(\"Ensimmäinen luku: \"))\nsumma += int(input(\"Toinen luku: \"))\nsumma += int(input(\"Kolmas luku: \"))\n\nprint(f\"Lukujen summa: {summa}\")

Riippuu toki tilanteesta, montako muuttujaa ohjelmassa tarvitaan. Jos käyttäjän kaikkien syötteiden arvo tulee muistaa, ei ole mahdollista \"uusiokäyttää\" samaa apumuuttujaa kaikkien syötteiden lukemiseen. Näin on seuraavassa esimerkissä:

luku1 = int(input(\"Ensimmäinen luku: \"))\nluku2 = int(input(\"Toinen luku: \"))\n\nprint(f\"{luku1} + {luku2} = {luku1+luku2}\")

Ensimmäinen luku: 2\nToinen luku: 3\n2 + 3 = 5

Toisaalta tässä ohjelmassa ei ole omaa muuttujaa summan arvon tallettamiseen.

Kannattaa kuitenkin huomata, että yhtä muuttujaa ei kannata \"uusiokäyttää\" kuin samankaltaisiin asioihin, esim. summattavien lukujen tilapäiseen tallentamiseen.

Esimerkiksi seuraavassa on uusiokäytetty muuttujaa tieto nimen ja iän tallentamiseen ja tämä ei ole missään nimessä järkevää:

tieto = input(\"Mikä on nimesi? \")\nprint(\"Hei \" + tieto + \"!\")\n\ntieto = int(input(\"Mikä on ikäsi? \"))\n# ohjelma jatkuu...

On parempi käyttää näitä kahta eri tarkoitusta varten omia kuvaavasti nimettyjä muuttujia:

nimi = input(\"Mikä on nimesi? \")\nprint(\"Hei \" + nimi + \"!\")\n\nika = int(input(\"Mikä on ikäsi? \"))\n# ohjelma jatkuu...

Tee ohjelma, joka kysyy käyttäjältä vuorokausien lukumäärän. Tämän jälkeen ohjelma tulostaa sekuntien määrän annetuissa vuorokausissa.

Ohjelman tulee toimia seuraavasti:

Kuinka monen vuorokauden sekunnit tulostetaan? 1\n86400

Toinen esimerkki:

Kuinka monen vuorokauden sekunnit tulostetaan? 7\n604800

Oheinen ohjelma kysyy käyttäjältä kolme lukua ja tulostaa näiden tulon (eli luvut kerrottuna toisillaan).\nOhjelmassa on kuitenkin virhe tai virheitä, joiden takia se ei toimi. Korjaa ohjelma sellaiseksi, että se toimii oikein.

Ohjelman siis pitäisi toimia esimerkiksi näin:

Anna luku 1: 2\nAnna luku 2: 3\nAnna luku 3: 5\nTulo on 30

Tee ohjelma joka kysyy käyttäjältä kaksi lukua. Ohjelma tulostaa lukujen summan ja tulon.

Ohjelman tulee toimia seuraavasti:

Luku 1: 3\nLuku 2: 7\nLukujen summa 10\nLukujen tulo 21

Tee ohjelma, joka lukee käyttäjältä neljä lukua ja tulostaa niiden summan ja keskiarvon

Ohjelman tulee toimia seuraavasti:

Luku 1: 2\nLuku 2: 1\nLuku 3: 6\nLuku 4: 7\nLukujen summa on 16 ja keskiarvo 4.0

Tee ohjelma, joka arvioi käyttäjän keskimääräisiä ruokailukustannuksia.

Ohjelma kysyy, kuinka monta kertaa viikossa käyttäjä käy Unicafessa ja Unicafe-lounaan hinnan sekä viikon muiden ruokaostosten hinnan.

Näiden tietojen perusteella ohjelma laskee käyttäjän keskimääräiset ruokamenot sekä viikossa että yhtenä päivänä.

Ohjelman tulee toimia seuraavasti:

Montako kertaa viikossa syöt Unicafessa? 4\nUnicafe-lounaan hinta? 2.5\nPaljonko käytät viikossa ruokaostoksiin? 28.5

Kustannukset keskimäärin:\nPäivässä 5.5 euroa\nViikossa 38.5 euroa

Tee ohjelma, joka kysyy kurssin opiskelijoiden määrän ja ryhmän koon ja ilmoittaa, montako ryhmää opiskelijoista muodostuu. Jos jako ei mene tasan, yhdessä ryhmässä voi olla vähemmän opiskelijoita, mutta kaikissa muissa on oltava haluttu määrä.

Montako opiskelijaa? 8\nMikä on ryhmän koko? 4\nRyhmien määrä: 2

Montako opiskelijaa? 11\nMikä on ryhmän koko? 3\nRyhmien määrä: 4

Vihje: tehtävän tekeminen onnistuu kokonaislukujakolaskuoperaattorilla //

Vihje2: jos et keksi miten tehtävä ratkeaa, älä huolestu suotta vaan tutustu seuraavassa luvussa esiteltävään ehtorakenteeseen. Ehtorakenteen avulla tehtävä on huomattavasti helpompi ratkaista.

Kertauskysely tämän osan asioihin liittyen:

","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-1/4-laskentaa-luvuilla.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-1/5-ehtorakenne/page-data.json b/page-data/osa-1/5-ehtorakenne/page-data.json index aad3e9d0a..ae205f490 100644 --- a/page-data/osa-1/5-ehtorakenne/page-data.json +++ b/page-data/osa-1/5-ehtorakenne/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-1/5-ehtorakenne", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää yksinkertaista ehtorakennetta ohjelmoinnissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä tarkoitetaan totuusarvoilla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat muodostaa ehtoja vertailuoperaattoreiden avulla"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tähän mennessä kaikissa ohjelmissamme on suoritettu samat rivit samassa järjestyksessä.\nUsein on kuitenkin tarpeen määritellä ohjelmaan osia, jotka suoritetaan vain tietyissä tilanteissa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraava koodi tarkastaa, onko henkilö täysi-ikäinen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kuinka vanha olet? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"17"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olet täysi-ikäinen!\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tässä siis sinulle ikiomaksi GTA6.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Seuraava asiakas, kiitos!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suoritus näyttää tältä, kun ikä on suurempi kuin 17:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuinka vanha olet? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"18"}]},{"type":"text","value":"\nOlet täysi-ikäinen!\nTässä siis sinulle ikiomaksi GTA6.\nSeuraava asiakas, kiitos!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos kuitenkaan ikä ei ole suurempi kuin 17, käy näin:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuinka vanha olet? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"16"}]},{"type":"text","value":"\nSeuraava asiakas, kiitos!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkejä tarkastelemalla huomataan, että syötteenä annettu arvo vaikuttaa nyt siihen, mitkä osat ohjelmasta suoritetaan. Ohjelmassa on käytössä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ehtorakenne"}]},{"type":"text","value":", jonka sisällä oleva koodi suoritetaan vain, kun annettu ehto on tosi."}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 363px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 126.52173913043478%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAYAAAAxFw7TAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB60lEQVQ4y5WVV6/CMAyF+/9/EM9IvCAkHtiILfbee/nq81VQGlIolqq6aXxy7OMkgcSw5/Op78PhIPf7PTTmWuAL5O3z5/O5XK/Xt/FIQHdlE/R4PPR7MBjIfr/3LvqRIQAEugzS6bTU6/U3AvbjBbxcLjIajdSnZtvtVvr9viyXS1ksFvrPt2AkQ+o0m81eadZqNcnn81KpVPTBbzab0ul0dN50OpXhcCibzUYCm66plQ3I+G63k8lkIuv1WlmOx2M5nU6hGDoA0QKf9C6gsUajoWA+YwHKETAhm81KoVCQarUqvV5PqcPIVTOXy2mqrhghQApODQCm2KTFT8aMIQCTM5mMLgp7ux9DgN9SxvAJMEYGELEBj8fjP+A3UTAmAlgqlVRZGLuAtBrZRfahy5Cx8/msi6E6LO0YFG6329F9aKu5Wq20pgTh03OkaMcwViwW3wHt7Wfv1dvt9uoAfHe+N+VPBwRGgHsgvIny6fgy3zCifslkUvsVgYyAsdrGXYCJsCNdFKaebg1/AmT/Ighbr9VqqU9w7L3sAqIsk1OplJ42tFEikdBOgC0Pu4x2igUIAOmSFrWEnTm5v14BUY0OS9Ll0MC3L6vIE/tbC9lt42ud2AxN4cvlcuhY812nwS/3crfbVcU/3ct/vS6flnKmxFEAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/94986ed527f8f4c5b0dc6a9053d071b7/a0b58/1_6.webp 230w","/static/94986ed527f8f4c5b0dc6a9053d071b7/2ed29/1_6.webp 363w"],"sizes":"(max-width: 363px) 100vw, 363px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/94986ed527f8f4c5b0dc6a9053d071b7/81c8e/1_6.png 230w","/static/94986ed527f8f4c5b0dc6a9053d071b7/4e786/1_6.png 363w"],"sizes":"(max-width: 363px) 100vw, 363px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/94986ed527f8f4c5b0dc6a9053d071b7/4e786/1_6.png","alt":"1 6","title":"1 6","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ehtorakenteessa avainsanaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" seuraa jokin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ehto"}]},{"type":"text","value":", kuten kahden arvon vertailu. Tämän jälkeen tuleva koodi suoritetaan vain, jos ehto pitää paikkansa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että ehtorakenteen ensimmäisen rivin lopussa on kaksoispiste. Seuraavassa koodissa kaksoispiste on unohtunut:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kaksoispiste unohtui seuraavan rivin lopusta"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"17"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olet täysi-ikäinen.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän seurauksena koodi antaa virheen:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"File \"ohjelma.py\", line 3\n if ika > 17\n ^\nSyntaxError: invalid syntax\n"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"h2","properties":{"id":"vertailuoperaattorit","style":"position:relative;"},"children":[{"type":"text","value":"Vertailuoperaattorit"},{"type":"element","tagName":"a","properties":{"href":"#vertailuoperaattorit","ariaLabel":"vertailuoperaattorit permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tyypillinen ehto on kahden arvon vertailu. Pythonin vertailuoperaattorit ovat:"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Operaattori"}]},{"type":"element","tagName":"th","properties":{},"children":[{"type":"text","value":"Merkitys"}]},{"type":"element","tagName":"th","properties":{},"children":[{"type":"text","value":"Esimerkki"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"=="}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Yhtä suuri"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a == b"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"!="}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Eri suuri"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a != b"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":">"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Suurempi"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a > b"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":">="}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Suurempi tai yhtä suuri"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a >= b"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Pienempi"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a < b"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<="}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Pienempi tai yhtä suuri"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a <= b"}]}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkinä ohjelmaa, joka tulostaa tiedon siitä, onko käyttäjän syöttämä luku negatiivinen, positiivinen vai nolla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on negatiivinen.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on positiivinen.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on nolla.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma suoritettuna kolme kertaa eri syötteillä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"15"}]},{"type":"text","value":"\nLuku on positiivinen."}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-18"}]},{"type":"text","value":"\nLuku on negatiivinen."}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nLuku on nolla."}]}]},{"type":"element","tagName":"h2","properties":{"id":"sisentaminen","style":"position:relative;"},"children":[{"type":"text","value":"Sisentäminen"},{"type":"element","tagName":"a","properties":{"href":"#sisentaminen","ariaLabel":"sisentaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python tunnistaa ehtorakenteen sisällä olevan koodin siitä, että jokainen rivi on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"sisennetty"}]},{"type":"text","value":" samalla tavalla. Tämä tarkoittaa, että ehtorakenteen sisällä olevan koodin alussa on tyhjää tilaa. Jokaisella rivillä tulee olla yhtä paljon tyhjää tilaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"salasana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna salasana: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" salasana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kissa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tiesit salasanan!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olet siis joko oikea käyttäjä...\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"...tai melkoinen hakkerivelho.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelman suoritus päättyi. Kiitos ja hei!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tyhjä tila saadaan aikaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tabulaattorilla"}]},{"type":"text","value":", jonka saat Tab-näppäimestä."}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 537px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 67.82608695652173%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAEQklEQVQ4y4WT/TPbBxzHv39D7zZH57FDqdZQWykroYmQB/KAREhEHj0kCEHiKb6SSIR4SDwuw5W5YaImqnO7royutM1Zx7pq1TZ3G03cVrfK3Oqzy37aL7v99H7d+z6/vD+fzxsBgCMA2AeAg3/pf/H+/80iuy92v9VrW2eMBqN1espqNrQYFtr07WPWz2YGdGrdoqnTNDIzPWNBG9DFwb6PhsbHxofUKvXisGXYMj46PoI2oF+MjowODluGxzSodh65ab0JQX7BEBMVC0XC4mM3X4mMgWJhMfifDQBsIu5UWCACzzNeQCVRT3MZefDOW97AoDNPs6jZ4O3hA9xc7ht8cioE+gYBYn9of8rKYt2vlStXOg0dFj5HYFdW1y626dtv8Ni8DbSheUGLaj/hsPI39NrWebQB/ZTN5Ng7DB02RZVyKj+X+9DUaZorl8hmBFzhN8jdO3d/T8WTnQQi1alv61yiZ2Q5CViCs03fvsygMZw4TIqjRa1bFhaIHEkfJjubVepVaZH0l8Q4zG9oA/qoXCLbxsQnHTXWqTZKxJInyOSUFQLPeALeLwia8/mvos6Hg593IMgkssOIC5Hg7xUARYIiJyYOA95v+wCPzT8kppD+iZ3P4v6Rdj3txNfTD3IyWa9JeLIL2ZqadjZisNvl2azn1matzYBL2+bgST+bewdmuSzuJj0987nRYJwT8cTf0cj0HYOubb5YVGKnEKk/6jX6LyWF0hUKkbqnRbV3Kkorl5AHHw8dMNm8nRwmZzeDnvPEbDCuGcnUPTol64eB3gGbQq7Yyc3O3TYajLYauWKHnk5/ptPobU31TdsMGvOFBtUuqupUG1nU7J8aa1VLyESXGd6PvgqRoRHg5+EDUmkF5IRHQ5iXP5SVVjhxiTi4FBwOIp7Y4b6kOx43t8CRQaDAu96BwMnhHOEwKW98PHyBQWOeIF/1DRxdT6M4qemZh0QSzanXtj6TRccckvFkR19P/yo+OfUgJQn/sruje5VGph9gE3AOg67tXk4max8Tn3So0+gf5THZO0nxya9UdapNZGdick9LyVyr5InstTzRujGVZB9X1vcr65qsbEbeA3WTZs69NzaTvdZU3zTX3to+z80rWFdW1dq6O0zzfI5gTV5etWDqNH8u4onvIVbrLBAuXQbBB3GA9fSFi2cDQFxUusLKYv0aFnQRCDiiS1ggcrk5DUtwFQqKXO7HT7iaeFwilvzp9mMux/5VLpEdX4u5BsiCbeEoNjbhJQ5PdrwXccUZHhb1Wt3YfINKoq2HnAs9EXCFmzwO//sg32AXj8PfFBWIt84HhLgYNOaWpFC6GXIu9DiDQNmWSWWPIy5EHiFbm1tPy4rL7lfLqh4b9e23uo1dt+Tl8ts6tW7S3NWzUFOpWG1R62Z7Tb1zNZU1y9rmltv9Pf3TCrli2d1vy4Blqra67ut6ZcPiYN/gxN+K6mUiaF+/igAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/43a34a2e4b0bc023009954d6f7809f7c/a0b58/1_6_keyboard.webp 230w","/static/43a34a2e4b0bc023009954d6f7809f7c/bc10c/1_6_keyboard.webp 460w","/static/43a34a2e4b0bc023009954d6f7809f7c/27c24/1_6_keyboard.webp 537w"],"sizes":"(max-width: 537px) 100vw, 537px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/43a34a2e4b0bc023009954d6f7809f7c/81c8e/1_6_keyboard.png 230w","/static/43a34a2e4b0bc023009954d6f7809f7c/08a84/1_6_keyboard.png 460w","/static/43a34a2e4b0bc023009954d6f7809f7c/b1cde/1_6_keyboard.png 537w"],"sizes":"(max-width: 537px) 100vw, 537px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/43a34a2e4b0bc023009954d6f7809f7c/b1cde/1_6_keyboard.png","alt":"1 6 keyboard","title":"1 6 keyboard","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Suurin osa editoreista osaa automaattisesti sisentää rivin, kun edellinen rivi päättyy kaksoispisteeseen. Voit lopettaa sisentämisen editorissa painamalla rivin alussa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Backspace"}]},{"type":"text","value":"-näppäintä."}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 293px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 96.08695652173913%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAAAsTAAALEwEAmpwYAAAEtElEQVQ4y3WU6U+UVxSHSdMvbbWNSgXZh2FmGAYYdnBBERA6SsdWZYdgK4ggOyrKElBR6oYoaFllHdZhUQGRalkTo8QUqMFGwCVubfzWf+Bp3kuaNDF9k5O89+Te555zfvcck7DQMAb6Boj4PoLw78LxcvWmsb6JI5m5hG4PZkdAEGnJqRia29gVFELUnnB2BocyYOwnISoGfYiOwC3bKC4oRvpMtvj401B3Aw9nT6R/maWciovlREUkopBvRuMYQHTkQa5cq0ahCcLHT4dK7U9DUxtbg+Nx89mJQrGJtEO5K8DYyDgmJ6bQ63YTFvqtgN7sG6Awv4ygwDj8A6PIzjrJUGUVP3jq+EkfT5kumqe19ZRFprHPJZhtXjrKymtWgE8X/mDm0QzTU9NMjE/y6uUrJN+D6Wnuj4/x8pe7fGhqZLamlme3Bng6Mc785ARPJqdYvHuH2YZaxvOO8WHw9gqw6EQRjvZqtE5uOFgrMHYZ2Ru2BzuZI3q5mnMBwXQbOtF6+KFx8Uat0qJWuqJSOKNUadG4+iCXqenJy4eZGUwK8gpE/by1PqjlTrQ2txETEYuvmy/Zji7sCgmjtbWdiN37iI+ME+IFbNqOm9oNT40HXs6eKK3kGIZGYGoSk8zDWdhZyFDaqbBYZ0l9TT36b/Qigngza6I2bqOhowcbCxlySzlyCxkOlnIcrFZMYavCzMyWxoYmGPsVk672LqLDY8hOz+ZQYgpzs3OcO3OO/QlJnEjNYProcRa6ukmMjONAYgoH07JJTMkgMTWT5NRM0pNSSdHpeVRQBO/eYXJnaIT3799zs/8mfcY+UcOHDx6yvLiEob2L/p4+jCcKeVFTx9+Dg7xu7+BDXz9/Go0sNzYxejSP3sxs/lpcWhHFTeNFd2c3fh4bUdqq+PrL9STE7ud65c8orBVCsNVfmQl444XLaNdZoHP1Zq/fVrwsZKjtHDG3lIs6C2DA5u30dveiC96Jj7uvAKQmpVJXXYevu5+4SLbBDmNXD9U19ezYsYvomARCQsLQOLnj4eKF0kZB+79AF5Urbc1tQmnp2Ziu/prYiDguX6zAxtwWlcyRLz5dRfONZiorKvnsk89FJhoHZ7RqN9w1Hjj8F1h9rZo3r99QefkqZ0+d5VTxaYZuDbHwZIHTJaVCoNKSUpYWl1heWqbiYgUpiSloFP8DvFJ+lUvny7l04SrLS8/FoJCiO3/2PG0tBl48f0FlRZXYU3ryDI9nHjM6Morc2kHAPgIqbJTYWzmwfo09NddrOfhjMl5ab8zXbGCT12aRqnRYSn3dKlNyMnJFBpLPTeP+MVAq+kqXqDG0GIiLihebXB21oksMre3odXoCtwSJgyWFJQzfHhaNII06yaTLOto6VoDSQorSfK0FTTeahdqWplbYmtvh77uVlsYWnJUuODlohGDHcvLoN/azdpUpMgt7ZJb2wi86RQJ2GjrpMHSK6CRx7o3eE6pL6+HBYd6+eSvS6WzvFPD5ud9ZfLaINFSkmp4uLqXweBHzc/MrwKorVWJcZaVlk3k4k+QDhxkducfI8Ahph9KF/0jWUWF5uXkk7k9ioHeAsftjpKekk38sn5yMHGZ/mxXAfwDrwXYWIBU21wAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/7f8b7a68350e9455732bc0462f21ccff/a0b58/1_6_keyboard2.webp 230w","/static/7f8b7a68350e9455732bc0462f21ccff/2b735/1_6_keyboard2.webp 293w"],"sizes":"(max-width: 293px) 100vw, 293px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/7f8b7a68350e9455732bc0462f21ccff/81c8e/1_6_keyboard2.png 230w","/static/7f8b7a68350e9455732bc0462f21ccff/3cf3e/1_6_keyboard2.png 293w"],"sizes":"(max-width: 293px) 100vw, 293px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/7f8b7a68350e9455732bc0462f21ccff/3cf3e/1_6_keyboard2.png","alt":"1 6 keyboard2","title":"1 6 keyboard2","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"small","properties":{},"children":[{"type":"element","tagName":"center","properties":{},"children":[{"type":"text","value":"\nNäppäimistökuvien alkuperä:\n "},{"type":"element","tagName":"a","properties":{"href":"https://pixabay.com/users/Clker-Free-Vector-Images-3736/?utm_source=link-attribution&utm_medium=referral&utm_campaign=image&utm_content=311803"},"children":[{"type":"text","value":"Clker-Free-Vector-Images"}]},{"type":"text","value":" from "},{"type":"element","tagName":"a","properties":{"href":"https://pixabay.com/?utm_source=link-attribution&utm_medium=referral&utm_campaign=image&utm_content=311803"},"children":[{"type":"text","value":"Pixabay"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Orwell","tmcname":"osa01-21_orwel"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä kokonaisluvun ja tulostaa merkkijonon \"Orwell\" jos luku on täsmälleen 1984. Muussa tapauksessa ohjelma ei tulosta mitään."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2020"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1984"}]},{"type":"text","value":"\nOrwell"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Itseisarvo","tmcname":"osa01-22_itseisarvo"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita ohjelma, joka lukee käyttäjältä kokonaisluvun. Mikäli luku on pienempi kuin 0, ohjelma tulostaa luvun kerrottuna luvulla -1. Muulloin ohjelma tulostaa käyttäjän syöttämän luvun. Alla on muutamia esimerkkejä ohjelman odotetusta toiminnasta."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-7"}]},{"type":"text","value":"\nLuvun itseisarvo on 7"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nLuvun itseisarvo on 1"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-99"}]},{"type":"text","value":"\nLuvun itseisarvo on 99"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Keittoa vai ei","tmcname":"osa01-23_keittoa_vai_ei"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita ohjelma, joka kysyy ensin käyttäjän nimen. Jos nimi on mikä tahansa muu kuin \"Jerry\", ohjelma kysyy keittoannosten lukumäärän ja kertoo sitten kokonaishinnan. Yksi annos maksaa 5,90."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kaksi esimerkkisuoritusta:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mikä on nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Kramer"}]},{"type":"text","value":"\nKuinka monta annosta keittoa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nKokonaishinta on 11.8\nSeuraava!"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mikä on nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Jerry"}]},{"type":"text","value":"\nSeuraava!"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Luvun suuruusluokka","tmcname":"osa01-24_luvun_suuruusluokka"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka lukee käyttäjältä kokonaisluvun ja kertoo sitten sen suuruusluokan oheisten esimerkkisuoritusten mukaisesti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"950"}]},{"type":"text","value":"\nLuku on pienempi kuin 1000\nKiitos!"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"59"}]},{"type":"text","value":"\nLuku on pienempi kuin 1000\nLuku on pienempi kuin 100\nKiitos!"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nLuku on pienempi kuin 1000\nLuku on pienempi kuin 100\nLuku on pienempi kuin 10\nKiitos!"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1123"}]},{"type":"text","value":"\nKiitos!"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"totuusarvot","style":"position:relative;"},"children":[{"type":"text","value":"Totuusarvot"},{"type":"element","tagName":"a","properties":{"href":"#totuusarvot","ariaLabel":"totuusarvot permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ehtorakenteessa käytettävä ehto saa totuusarvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":" (tosi) tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":" (epätosi). Esimerkiksi ehto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a < 5"}]},{"type":"text","value":" on tosi jos "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":" on alle 5 ja epätosi jos "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":" on 5 tai suurempi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmoinnissa totuusarvoja kutsutaan usein boolean-arvoiksi matemaatikko George Boolen kehittämän algebrallisen rakenteen mukaan. Pythonissa totuusarvoja käsitellään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"bool"}]},{"type":"text","value":"-tietotyypin avulla, ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"bool"}]},{"type":"text","value":"-tyyppisillä muuttujilla voi olla vain kaksi eri arvoa: "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme asettaa ehdon tuloksen muuttujan arvoksi samaan tapaan kuin laskutoimituksen tuloksen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nehto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ehto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" ehto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"a on pienempi kuin 5\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\na on pienempi kuin 5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme käyttää koodissa myös sanoja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":". Esimerkiksi seuraava koodi suorittaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennon aina, koska ehdon arvona on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ehto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" ehto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tänne tullaan aina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tänne tullaan aina"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tällainen ohjelma ei ole sinänsä kovin hyödyllinen, mutta myöhemmin kurssilla näemme, mitä hyötyä on totuusarvoista muuttujissa."}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Laskin","tmcname":"osa01-25_laskin"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä ensin kaksi lukua ja sen jälkeen komennon. Jos komento on joko "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"summa"}]},{"type":"text","value":", "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tulo"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"erotus"}]},{"type":"text","value":", ohjelma laskee syötteille kyseisen operaation tuloksen. Muussa tapauksessa ohjelma ei tulosta mitään."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostuksia:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luku 1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\nLuku 2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"17"}]},{"type":"text","value":"\nKomento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"summa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"10 + 17 = 27"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luku 1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nLuku 2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"6"}]},{"type":"text","value":"\nKomento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tulo"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4 * 6 = 24"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luku 1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nLuku 2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"6"}]},{"type":"text","value":"\nKomento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"erotus"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4 - 6 = -2"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Lämpötilat","tmcname":"osa01-26_lampotilat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä lämpötilan fahrenheit-asteina, ja tulostaa sitten lämpötilan celsius-asteina. Jos lämpötila celsius-asteina on pienempi kuin 0, ohjelma tulostaa lisäksi viestin \"Paleltaa!\"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kaavan fahrenheit-asteiden muuntamiseksi celsius-asteiksi voit etsiä esimerkiksi googlaamalla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kaksi esimerkkisuoritusta:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lämpötila (F): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"101"}]},{"type":"text","value":"\n101 fahrenheit-astetta on 38.333333333333336 celsius-astetta"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lämpötila (F): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"21"}]},{"type":"text","value":"\n21 fahrenheit-astetta on -6.111111111111111 celsius-astetta\nPaleltaa!"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Palkka","tmcname":"osa01-27_palkka"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy tuntipalkkaa, työskenneltyjen tuntien määrää ja viikonpäivää. Ohjelma tulostaa palkan, joka on tuntipalkka kertaa tuntien määrä muina päivinä paitsi sunnuntaisin, jolloin tuntipalkka on kaksinkertainen."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tuntipalkka: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"8.5"}]},{"type":"text","value":"\nTyötunnit: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nViikonpäivä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"maanantai"}]},{"type":"text","value":"\nPalkka 25.5 euroa"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tuntipalkka: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"12.5"}]},{"type":"text","value":"\nTyötunnit: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\nViikonpäivä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"sunnuntai"}]},{"type":"text","value":"\nPalkka 250.0 euroa"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Korjaa ohjelma: Korkoa kortille","tmcname":"osa01-28_korjaaa_ohjelma_korkoa_kortille"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmassa lasketaan bonuskortin saldoon vuoden lopussa lisättävä bonuspistemäärä seuraavan kaavan mukaisesti:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Jos bonuspisteitä on alle sata, korkona saa 10 % lisää pisteitä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Muussa tapauksessa korkona saa 15 % lisää pisteitä"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma siis toimii esim. näin:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuinka paljon pisteitä? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"55"}]},{"type":"text","value":"\nSait 10 % bonusta\nPisteitä on nyt 60.5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma toimii kuitenkin jollain syötteillä oudosti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuinka paljon pisteitä? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"95"}]},{"type":"text","value":"\nSait 10 % bonusta\nSait 15 % bonusta\nPisteitä on nyt 120.175"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Korjaa ohjelma niin, että bonusta tulee joko 10 % tai 15 %, ei koskaan molempia."}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Huomiset vaatteet","tmcname":"osa01-29_huomisen_vaatteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy huomisen sääennusteen ja suosittelee sen mukaista pukeutumista."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Suositus vaihtelee sen mukaan, onko lämpötila yli 20 astetta, yli 10 astetta vai yli 5 astetta. Myös sade vaikuttaa suositukseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma toimii seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kerro huominen sääennuste:\nLämpötila: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"21"}]},{"type":"text","value":"\nSataako (kyllä/ei): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":"\nPue housut ja t-paita"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kerro huominen sääennuste:\nLämpötila: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"11"}]},{"type":"text","value":"\nSataako (kyllä/ei): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":"\nPue housut ja t-paita\nOta myös pitkähihainen paita"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kerro huominen sääennuste:\nLämpötila: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"7"}]},{"type":"text","value":"\nSataako (kyllä/ei): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":"\nPue housut ja t-paita\nOta myös pitkähihainen paita\nPue päälle takki"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kerro huominen sääennuste:\nLämpötila: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nSataako (kyllä/ei): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kyllä"}]},{"type":"text","value":"\nPue housut ja t-paita\nOta myös pitkähihainen paita\nPue päälle takki\nSuosittelen lämmintä takkia\nKannattaa ottaa myös hanskat\nMuista sateenvarjo!"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Toisen asteen yhtälön ratkaiseminen","tmcname":"osa01-30_toisen_asteen_yhtalo"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"math"}]},{"type":"text","value":"-moduulissa on funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sqrt"}]},{"type":"text","value":", jolla voi laskea luvun neliöjuuren. Voit käyttää sitä ohjelmassa seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" math "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" sqrt\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sqrt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma tulostaa:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3.0"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita ohjelma, joka ratkaisee toisen asteen yhtälön ax²+bx+c. Ohjelmalle annetaan arvot a, b ja c, ja sen tulee laskea juuret (eli ratkaisut) kaavalla"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"x = (-b ± sqrt(b²-4ac))/(2a)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa, että yhtälöllä on kaksi juurta, jolloin yllä oleva kaava toimii."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkituloste:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna a: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nAnna b: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nAnna c: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-8"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Juuret ovat 2.0 ja -4.0"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kertauskysely tämän osan asioihin liittyen:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3"},"children":[]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa lopuksi kyselyyn tämän viikon materiaaleista. Saat kyselyyn vastaamisesta yhden pisteen:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat käyttää yksinkertaista ehtorakennetta ohjelmoinnissa
  • \n
  • Tiedät, mitä tarkoitetaan totuusarvoilla
  • \n
  • Osaat muodostaa ehtoja vertailuoperaattoreiden avulla
  • \n

Tähän mennessä kaikissa ohjelmissamme on suoritettu samat rivit samassa järjestyksessä.\nUsein on kuitenkin tarpeen määritellä ohjelmaan osia, jotka suoritetaan vain tietyissä tilanteissa.

Esimerkiksi seuraava koodi tarkastaa, onko henkilö täysi-ikäinen:

ika = int(input(\"Kuinka vanha olet? \"))\n\nif ika > 17:\n    print(\"Olet täysi-ikäinen!\"\n    print(\"Tässä siis sinulle ikiomaksi GTA6.\")\n\nprint(\"Seuraava asiakas, kiitos!\")

Ohjelman suoritus näyttää tältä, kun ikä on suurempi kuin 17:

Kuinka vanha olet? 18\nOlet täysi-ikäinen!\nTässä siis sinulle ikiomaksi GTA6.\nSeuraava asiakas, kiitos!

Jos kuitenkaan ikä ei ole suurempi kuin 17, käy näin:

Kuinka vanha olet? 16\nSeuraava asiakas, kiitos!

Esimerkkejä tarkastelemalla huomataan, että syötteenä annettu arvo vaikuttaa nyt siihen, mitkä osat ohjelmasta suoritetaan. Ohjelmassa on käytössä ehtorakenne, jonka sisällä oleva koodi suoritetaan vain, kun annettu ehto on tosi.

\n \n \n \n \n \"1\n \n

Suurin osa editoreista osaa automaattisesti sisentää rivin, kun edellinen rivi päättyy kaksoispisteeseen. Voit lopettaa sisentämisen editorissa painamalla rivin alussa Backspace-näppäintä.

\n \n \n \n \n \"1\n \n \n
\nNäppäimistökuvien alkuperä:\n Clker-Free-Vector-Images from Pixabay\n

Tee ohjelma, joka kysyy käyttäjältä kokonaisluvun ja tulostaa merkkijonon \"Orwell\" jos luku on täsmälleen 1984. Muussa tapauksessa ohjelma ei tulosta mitään.

Anna luku: 2020

Anna luku: 1984\nOrwell

Kirjoita ohjelma, joka lukee käyttäjältä kokonaisluvun. Mikäli luku on pienempi kuin 0, ohjelma tulostaa luvun kerrottuna luvulla -1. Muulloin ohjelma tulostaa käyttäjän syöttämän luvun. Alla on muutamia esimerkkejä ohjelman odotetusta toiminnasta.

Anna luku: -7\nLuvun itseisarvo on 7

Anna luku: 1\nLuvun itseisarvo on 1

Anna luku: -99\nLuvun itseisarvo on 99

Kirjoita ohjelma, joka kysyy ensin käyttäjän nimen. Jos nimi on mikä tahansa muu kuin \"Jerry\", ohjelma kysyy keittoannosten lukumäärän ja kertoo sitten kokonaishinnan. Yksi annos maksaa 5,90.

Kaksi esimerkkisuoritusta:

Mikä on nimesi: Kramer\nKuinka monta annosta keittoa: 2\nKokonaishinta on 11.8\nSeuraava!

Mikä on nimesi: Jerry\nSeuraava!

Tee ohjelma, joka lukee käyttäjältä kokonaisluvun ja kertoo sitten sen suuruusluokan oheisten esimerkkisuoritusten mukaisesti:

Anna luku: 950\nLuku on pienempi kuin 1000\nKiitos!

Anna luku: 59\nLuku on pienempi kuin 1000\nLuku on pienempi kuin 100\nKiitos!

Anna luku: 2\nLuku on pienempi kuin 1000\nLuku on pienempi kuin 100\nLuku on pienempi kuin 10\nKiitos!

Anna luku: 1123\nKiitos!

Totuusarvot

Ehtorakenteessa käytettävä ehto saa totuusarvon True (tosi) tai False (epätosi). Esimerkiksi ehto a < 5 on tosi jos a on alle 5 ja epätosi jos a on 5 tai suurempi.

Ohjelmoinnissa totuusarvoja kutsutaan usein boolean-arvoiksi matemaatikko George Boolen kehittämän algebrallisen rakenteen mukaan. Pythonissa totuusarvoja käsitellään bool-tietotyypin avulla, ja bool-tyyppisillä muuttujilla voi olla vain kaksi eri arvoa: True tai False.

Voimme asettaa ehdon tuloksen muuttujan arvoksi samaan tapaan kuin laskutoimituksen tuloksen:

a = 3\nehto = a < 5\nprint(ehto)\nif ehto:\n    print(\"a on pienempi kuin 5\")

True\na on pienempi kuin 5

Voimme käyttää koodissa myös sanoja True ja False. Esimerkiksi seuraava koodi suorittaa print-komennon aina, koska ehdon arvona on True:

ehto = True\nif ehto:\n    print(\"Tänne tullaan aina\")

Tänne tullaan aina

Tällainen ohjelma ei ole sinänsä kovin hyödyllinen, mutta myöhemmin kurssilla näemme, mitä hyötyä on totuusarvoista muuttujissa.

Tee ohjelma, joka kysyy käyttäjältä ensin kaksi lukua ja sen jälkeen komennon. Jos komento on joko summa, tulo tai erotus, ohjelma laskee syötteille kyseisen operaation tuloksen. Muussa tapauksessa ohjelma ei tulosta mitään.

Esimerkkitulostuksia:

Luku 1: 10\nLuku 2: 17\nKomento: summa

10 + 17 = 27

Luku 1: 4\nLuku 2: 6\nKomento: tulo

4 * 6 = 24

Luku 1: 4\nLuku 2: 6\nKomento: erotus

4 - 6 = -2

Tee ohjelma, joka kysyy käyttäjältä lämpötilan fahrenheit-asteina, ja tulostaa sitten lämpötilan celsius-asteina. Jos lämpötila celsius-asteina on pienempi kuin 0, ohjelma tulostaa lisäksi viestin \"Paleltaa!\".

Kaavan fahrenheit-asteiden muuntamiseksi celsius-asteiksi voit etsiä esimerkiksi googlaamalla.

Kaksi esimerkkisuoritusta:

Anna lämpötila (F): 101\n101 fahrenheit-astetta on 38.333333333333336 celsius-astetta

Anna lämpötila (F): 21\n21 fahrenheit-astetta on -6.111111111111111 celsius-astetta\nPaleltaa!

Tee ohjelma, joka kysyy tuntipalkkaa, työskenneltyjen tuntien määrää ja viikonpäivää. Ohjelma tulostaa palkan, joka on tuntipalkka kertaa tuntien määrä muina päivinä paitsi sunnuntaisin, jolloin tuntipalkka on kaksinkertainen.

Tuntipalkka: 8.5\nTyötunnit: 3\nViikonpäivä: maanantai\nPalkka 25.5 euroa

Tuntipalkka: 12.5\nTyötunnit: 10\nViikonpäivä: sunnuntai\nPalkka 250.0 euroa

Ohjelmassa lasketaan bonuskortin saldoon vuoden lopussa lisättävä bonuspistemäärä seuraavan kaavan mukaisesti:

    \n
  • Jos bonuspisteitä on alle sata, korkona saa 10 % lisää pisteitä
  • \n
  • Muussa tapauksessa korkona saa 15 % lisää pisteitä
  • \n

Ohjelma siis toimii esim. näin:

Kuinka paljon pisteitä? 55\nSait 10 % bonusta\nPisteitä on nyt 60.5

Ohjelma toimii kuitenkin jollain syötteillä oudosti:

Kuinka paljon pisteitä? 95\nSait 10 % bonusta\nSait 15 % bonusta\nPisteitä on nyt 120.175

Korjaa ohjelma niin, että bonusta tulee joko 10 % tai 15 %, ei koskaan molempia.

Tee ohjelma, joka kysyy huomisen sääennusteen ja suosittelee sen mukaista pukeutumista.

Suositus vaihtelee sen mukaan, onko lämpötila yli 20 astetta, yli 10 astetta vai yli 5 astetta. Myös sade vaikuttaa suositukseen.

Ohjelma toimii seuraavasti:

Kerro huominen sääennuste:\nLämpötila: 21\nSataako (kyllä/ei): ei\nPue housut ja t-paita

Kerro huominen sääennuste:\nLämpötila: 11\nSataako (kyllä/ei): ei\nPue housut ja t-paita\nOta myös pitkähihainen paita

Kerro huominen sääennuste:\nLämpötila: 7\nSataako (kyllä/ei): ei\nPue housut ja t-paita\nOta myös pitkähihainen paita\nPue päälle takki

Kerro huominen sääennuste:\nLämpötila: 3\nSataako (kyllä/ei): kyllä\nPue housut ja t-paita\nOta myös pitkähihainen paita\nPue päälle takki\nSuosittelen lämmintä takkia\nKannattaa ottaa myös hanskat\nMuista sateenvarjo!

Pythonin math-moduulissa on funktio sqrt, jolla voi laskea luvun neliöjuuren. Voit käyttää sitä ohjelmassa seuraavasti:

from math import sqrt\n\nprint(sqrt(9))

Ohjelma tulostaa:

3.0

Kirjoita ohjelma, joka ratkaisee toisen asteen yhtälön ax²+bx+c. Ohjelmalle annetaan arvot a, b ja c, ja sen tulee laskea juuret (eli ratkaisut) kaavalla

x = (-b ± sqrt(b²-4ac))/(2a).

Voit olettaa, että yhtälöllä on kaksi juurta, jolloin yllä oleva kaava toimii.

Esimerkkituloste:

Anna a: 1\nAnna b: 2\nAnna c: -8

Juuret ovat 2.0 ja -4.0

Kertauskysely tämän osan asioihin liittyen:

Vastaa lopuksi kyselyyn tämän viikon materiaaleista. Saat kyselyyn vastaamisesta yhden pisteen:

","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-1/5-ehtorakenne.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää yksinkertaista ehtorakennetta ohjelmoinnissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä tarkoitetaan totuusarvoilla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat muodostaa ehtoja vertailuoperaattoreiden avulla"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tähän mennessä kaikissa ohjelmissamme on suoritettu samat rivit samassa järjestyksessä.\nUsein on kuitenkin tarpeen määritellä ohjelmaan osia, jotka suoritetaan vain tietyissä tilanteissa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraava koodi tarkastaa, onko henkilö täysi-ikäinen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kuinka vanha olet? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"17"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olet täysi-ikäinen!\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tässä siis sinulle ikiomaksi GTA6.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Seuraava asiakas, kiitos!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suoritus näyttää tältä, kun ikä on suurempi kuin 17:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuinka vanha olet? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"18"}]},{"type":"text","value":"\nOlet täysi-ikäinen!\nTässä siis sinulle ikiomaksi GTA6.\nSeuraava asiakas, kiitos!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos kuitenkaan ikä ei ole suurempi kuin 17, käy näin:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuinka vanha olet? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"16"}]},{"type":"text","value":"\nSeuraava asiakas, kiitos!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkejä tarkastelemalla huomataan, että syötteenä annettu arvo vaikuttaa nyt siihen, mitkä osat ohjelmasta suoritetaan. Ohjelmassa on käytössä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ehtorakenne"}]},{"type":"text","value":", jonka sisällä oleva koodi suoritetaan vain, kun annettu ehto on tosi."}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 363px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 126.52173913043478%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAYAAAAxFw7TAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB60lEQVQ4y5WVV6/CMAyF+/9/EM9IvCAkHtiILfbee/nq81VQGlIolqq6aXxy7OMkgcSw5/Op78PhIPf7PTTmWuAL5O3z5/O5XK/Xt/FIQHdlE/R4PPR7MBjIfr/3LvqRIQAEugzS6bTU6/U3AvbjBbxcLjIajdSnZtvtVvr9viyXS1ksFvrPt2AkQ+o0m81eadZqNcnn81KpVPTBbzab0ul0dN50OpXhcCibzUYCm66plQ3I+G63k8lkIuv1WlmOx2M5nU6hGDoA0QKf9C6gsUajoWA+YwHKETAhm81KoVCQarUqvV5PqcPIVTOXy2mqrhghQApODQCm2KTFT8aMIQCTM5mMLgp7ux9DgN9SxvAJMEYGELEBj8fjP+A3UTAmAlgqlVRZGLuAtBrZRfahy5Cx8/msi6E6LO0YFG6329F9aKu5Wq20pgTh03OkaMcwViwW3wHt7Wfv1dvt9uoAfHe+N+VPBwRGgHsgvIny6fgy3zCifslkUvsVgYyAsdrGXYCJsCNdFKaebg1/AmT/Ighbr9VqqU9w7L3sAqIsk1OplJ42tFEikdBOgC0Pu4x2igUIAOmSFrWEnTm5v14BUY0OS9Ll0MC3L6vIE/tbC9lt42ud2AxN4cvlcuhY812nwS/3crfbVcU/3ct/vS6flnKmxFEAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/94986ed527f8f4c5b0dc6a9053d071b7/a0b58/1_6.webp 230w","/static/94986ed527f8f4c5b0dc6a9053d071b7/2ed29/1_6.webp 363w"],"sizes":"(max-width: 363px) 100vw, 363px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/94986ed527f8f4c5b0dc6a9053d071b7/81c8e/1_6.png 230w","/static/94986ed527f8f4c5b0dc6a9053d071b7/4e786/1_6.png 363w"],"sizes":"(max-width: 363px) 100vw, 363px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/94986ed527f8f4c5b0dc6a9053d071b7/4e786/1_6.png","alt":"1 6","title":"1 6","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ehtorakenteessa avainsanaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" seuraa jokin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ehto"}]},{"type":"text","value":", kuten kahden arvon vertailu. Tämän jälkeen tuleva koodi suoritetaan vain, jos ehto pitää paikkansa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että ehtorakenteen ensimmäisen rivin lopussa on kaksoispiste. Seuraavassa koodissa kaksoispiste on unohtunut:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kaksoispiste unohtui seuraavan rivin lopusta"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"17"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olet täysi-ikäinen.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän seurauksena koodi antaa virheen:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"File \"ohjelma.py\", line 3\n if ika > 17\n ^\nSyntaxError: invalid syntax\n"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"h2","properties":{"id":"vertailuoperaattorit","style":"position:relative;"},"children":[{"type":"text","value":"Vertailuoperaattorit"},{"type":"element","tagName":"a","properties":{"href":"#vertailuoperaattorit","ariaLabel":"vertailuoperaattorit permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tyypillinen ehto on kahden arvon vertailu. Pythonin vertailuoperaattorit ovat:"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Operaattori"}]},{"type":"element","tagName":"th","properties":{},"children":[{"type":"text","value":"Merkitys"}]},{"type":"element","tagName":"th","properties":{},"children":[{"type":"text","value":"Esimerkki"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"=="}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Yhtä suuri"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a == b"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"!="}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Eri suuri"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a != b"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":">"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Suurempi"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a > b"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":">="}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Suurempi tai yhtä suuri"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a >= b"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Pienempi"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a < b"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<="}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"Pienempi tai yhtä suuri"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a <= b"}]}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkinä ohjelmaa, joka tulostaa tiedon siitä, onko käyttäjän syöttämä luku negatiivinen, positiivinen vai nolla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on negatiivinen.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on positiivinen.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on nolla.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma suoritettuna kolme kertaa eri syötteillä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"15"}]},{"type":"text","value":"\nLuku on positiivinen."}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-18"}]},{"type":"text","value":"\nLuku on negatiivinen."}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nLuku on nolla."}]}]},{"type":"element","tagName":"h2","properties":{"id":"sisentaminen","style":"position:relative;"},"children":[{"type":"text","value":"Sisentäminen"},{"type":"element","tagName":"a","properties":{"href":"#sisentaminen","ariaLabel":"sisentaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python tunnistaa ehtorakenteen sisällä olevan koodin siitä, että jokainen rivi on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"sisennetty"}]},{"type":"text","value":" samalla tavalla. Tämä tarkoittaa, että ehtorakenteen sisällä olevan koodin alussa on tyhjää tilaa. Jokaisella rivillä tulee olla yhtä paljon tyhjää tilaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"salasana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna salasana: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" salasana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kissa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tiesit salasanan!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olet siis joko oikea käyttäjä...\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"...tai melkoinen hakkerivelho.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelman suoritus päättyi. Kiitos ja hei!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tyhjä tila saadaan aikaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tabulaattorilla"}]},{"type":"text","value":", jonka saat Tab-näppäimestä."}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 537px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 67.82608695652173%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAEQklEQVQ4y4WT/TPbBxzHv39D7zZH57FDqdZQWykroYmQB/KAREhEHj0kCEHiKb6SSIR4SDwuw5W5YaImqnO7royutM1Zx7pq1TZ3G03cVrfK3Oqzy37aL7v99H7d+z6/vD+fzxsBgCMA2AeAg3/pf/H+/80iuy92v9VrW2eMBqN1espqNrQYFtr07WPWz2YGdGrdoqnTNDIzPWNBG9DFwb6PhsbHxofUKvXisGXYMj46PoI2oF+MjowODluGxzSodh65ab0JQX7BEBMVC0XC4mM3X4mMgWJhMfifDQBsIu5UWCACzzNeQCVRT3MZefDOW97AoDNPs6jZ4O3hA9xc7ht8cioE+gYBYn9of8rKYt2vlStXOg0dFj5HYFdW1y626dtv8Ni8DbSheUGLaj/hsPI39NrWebQB/ZTN5Ng7DB02RZVyKj+X+9DUaZorl8hmBFzhN8jdO3d/T8WTnQQi1alv61yiZ2Q5CViCs03fvsygMZw4TIqjRa1bFhaIHEkfJjubVepVaZH0l8Q4zG9oA/qoXCLbxsQnHTXWqTZKxJInyOSUFQLPeALeLwia8/mvos6Hg593IMgkssOIC5Hg7xUARYIiJyYOA95v+wCPzT8kppD+iZ3P4v6Rdj3txNfTD3IyWa9JeLIL2ZqadjZisNvl2azn1matzYBL2+bgST+bewdmuSzuJj0987nRYJwT8cTf0cj0HYOubb5YVGKnEKk/6jX6LyWF0hUKkbqnRbV3Kkorl5AHHw8dMNm8nRwmZzeDnvPEbDCuGcnUPTol64eB3gGbQq7Yyc3O3TYajLYauWKHnk5/ptPobU31TdsMGvOFBtUuqupUG1nU7J8aa1VLyESXGd6PvgqRoRHg5+EDUmkF5IRHQ5iXP5SVVjhxiTi4FBwOIp7Y4b6kOx43t8CRQaDAu96BwMnhHOEwKW98PHyBQWOeIF/1DRxdT6M4qemZh0QSzanXtj6TRccckvFkR19P/yo+OfUgJQn/sruje5VGph9gE3AOg67tXk4max8Tn3So0+gf5THZO0nxya9UdapNZGdick9LyVyr5InstTzRujGVZB9X1vcr65qsbEbeA3WTZs69NzaTvdZU3zTX3to+z80rWFdW1dq6O0zzfI5gTV5etWDqNH8u4onvIVbrLBAuXQbBB3GA9fSFi2cDQFxUusLKYv0aFnQRCDiiS1ggcrk5DUtwFQqKXO7HT7iaeFwilvzp9mMux/5VLpEdX4u5BsiCbeEoNjbhJQ5PdrwXccUZHhb1Wt3YfINKoq2HnAs9EXCFmzwO//sg32AXj8PfFBWIt84HhLgYNOaWpFC6GXIu9DiDQNmWSWWPIy5EHiFbm1tPy4rL7lfLqh4b9e23uo1dt+Tl8ts6tW7S3NWzUFOpWG1R62Z7Tb1zNZU1y9rmltv9Pf3TCrli2d1vy4Blqra67ut6ZcPiYN/gxN+K6mUiaF+/igAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/43a34a2e4b0bc023009954d6f7809f7c/a0b58/1_6_keyboard.webp 230w","/static/43a34a2e4b0bc023009954d6f7809f7c/bc10c/1_6_keyboard.webp 460w","/static/43a34a2e4b0bc023009954d6f7809f7c/27c24/1_6_keyboard.webp 537w"],"sizes":"(max-width: 537px) 100vw, 537px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/43a34a2e4b0bc023009954d6f7809f7c/81c8e/1_6_keyboard.png 230w","/static/43a34a2e4b0bc023009954d6f7809f7c/08a84/1_6_keyboard.png 460w","/static/43a34a2e4b0bc023009954d6f7809f7c/b1cde/1_6_keyboard.png 537w"],"sizes":"(max-width: 537px) 100vw, 537px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/43a34a2e4b0bc023009954d6f7809f7c/b1cde/1_6_keyboard.png","alt":"1 6 keyboard","title":"1 6 keyboard","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Suurin osa editoreista osaa automaattisesti sisentää rivin, kun edellinen rivi päättyy kaksoispisteeseen. Voit lopettaa sisentämisen editorissa painamalla rivin alussa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Backspace"}]},{"type":"text","value":"-näppäintä."}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 293px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 96.08695652173913%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAAAsTAAALEwEAmpwYAAAEtElEQVQ4y3WU6U+UVxSHSdMvbbWNSgXZh2FmGAYYdnBBERA6SsdWZYdgK4ggOyrKElBR6oYoaFllHdZhUQGRalkTo8QUqMFGwCVubfzWf+Bp3kuaNDF9k5O89+Te555zfvcck7DQMAb6Boj4PoLw78LxcvWmsb6JI5m5hG4PZkdAEGnJqRia29gVFELUnnB2BocyYOwnISoGfYiOwC3bKC4oRvpMtvj401B3Aw9nT6R/maWciovlREUkopBvRuMYQHTkQa5cq0ahCcLHT4dK7U9DUxtbg+Nx89mJQrGJtEO5K8DYyDgmJ6bQ63YTFvqtgN7sG6Awv4ygwDj8A6PIzjrJUGUVP3jq+EkfT5kumqe19ZRFprHPJZhtXjrKymtWgE8X/mDm0QzTU9NMjE/y6uUrJN+D6Wnuj4/x8pe7fGhqZLamlme3Bng6Mc785ARPJqdYvHuH2YZaxvOO8WHw9gqw6EQRjvZqtE5uOFgrMHYZ2Ru2BzuZI3q5mnMBwXQbOtF6+KFx8Uat0qJWuqJSOKNUadG4+iCXqenJy4eZGUwK8gpE/by1PqjlTrQ2txETEYuvmy/Zji7sCgmjtbWdiN37iI+ME+IFbNqOm9oNT40HXs6eKK3kGIZGYGoSk8zDWdhZyFDaqbBYZ0l9TT36b/Qigngza6I2bqOhowcbCxlySzlyCxkOlnIcrFZMYavCzMyWxoYmGPsVk672LqLDY8hOz+ZQYgpzs3OcO3OO/QlJnEjNYProcRa6ukmMjONAYgoH07JJTMkgMTWT5NRM0pNSSdHpeVRQBO/eYXJnaIT3799zs/8mfcY+UcOHDx6yvLiEob2L/p4+jCcKeVFTx9+Dg7xu7+BDXz9/Go0sNzYxejSP3sxs/lpcWhHFTeNFd2c3fh4bUdqq+PrL9STE7ud65c8orBVCsNVfmQl444XLaNdZoHP1Zq/fVrwsZKjtHDG3lIs6C2DA5u30dveiC96Jj7uvAKQmpVJXXYevu5+4SLbBDmNXD9U19ezYsYvomARCQsLQOLnj4eKF0kZB+79AF5Urbc1tQmnp2Ziu/prYiDguX6zAxtwWlcyRLz5dRfONZiorKvnsk89FJhoHZ7RqN9w1Hjj8F1h9rZo3r99QefkqZ0+d5VTxaYZuDbHwZIHTJaVCoNKSUpYWl1heWqbiYgUpiSloFP8DvFJ+lUvny7l04SrLS8/FoJCiO3/2PG0tBl48f0FlRZXYU3ryDI9nHjM6Morc2kHAPgIqbJTYWzmwfo09NddrOfhjMl5ab8zXbGCT12aRqnRYSn3dKlNyMnJFBpLPTeP+MVAq+kqXqDG0GIiLihebXB21oksMre3odXoCtwSJgyWFJQzfHhaNII06yaTLOto6VoDSQorSfK0FTTeahdqWplbYmtvh77uVlsYWnJUuODlohGDHcvLoN/azdpUpMgt7ZJb2wi86RQJ2GjrpMHSK6CRx7o3eE6pL6+HBYd6+eSvS6WzvFPD5ud9ZfLaINFSkmp4uLqXweBHzc/MrwKorVWJcZaVlk3k4k+QDhxkducfI8Ahph9KF/0jWUWF5uXkk7k9ioHeAsftjpKekk38sn5yMHGZ/mxXAfwDrwXYWIBU21wAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/7f8b7a68350e9455732bc0462f21ccff/a0b58/1_6_keyboard2.webp 230w","/static/7f8b7a68350e9455732bc0462f21ccff/2b735/1_6_keyboard2.webp 293w"],"sizes":"(max-width: 293px) 100vw, 293px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/7f8b7a68350e9455732bc0462f21ccff/81c8e/1_6_keyboard2.png 230w","/static/7f8b7a68350e9455732bc0462f21ccff/3cf3e/1_6_keyboard2.png 293w"],"sizes":"(max-width: 293px) 100vw, 293px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/7f8b7a68350e9455732bc0462f21ccff/3cf3e/1_6_keyboard2.png","alt":"1 6 keyboard2","title":"1 6 keyboard2","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"small","properties":{},"children":[{"type":"element","tagName":"center","properties":{},"children":[{"type":"text","value":"\nNäppäimistökuvien alkuperä:\n "},{"type":"element","tagName":"a","properties":{"href":"https://pixabay.com/users/Clker-Free-Vector-Images-3736/?utm_source=link-attribution&utm_medium=referral&utm_campaign=image&utm_content=311803"},"children":[{"type":"text","value":"Clker-Free-Vector-Images"}]},{"type":"text","value":" from "},{"type":"element","tagName":"a","properties":{"href":"https://pixabay.com/?utm_source=link-attribution&utm_medium=referral&utm_campaign=image&utm_content=311803"},"children":[{"type":"text","value":"Pixabay"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Orwell","tmcname":"osa01-21_orwel"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä kokonaisluvun ja tulostaa merkkijonon \"Orwell\" jos luku on täsmälleen 1984. Muussa tapauksessa ohjelma ei tulosta mitään."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2020"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1984"}]},{"type":"text","value":"\nOrwell"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Itseisarvo","tmcname":"osa01-22_itseisarvo"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita ohjelma, joka lukee käyttäjältä kokonaisluvun. Mikäli luku on pienempi kuin 0, ohjelma tulostaa luvun kerrottuna luvulla -1. Muulloin ohjelma tulostaa käyttäjän syöttämän luvun. Alla on muutamia esimerkkejä ohjelman odotetusta toiminnasta."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-7"}]},{"type":"text","value":"\nLuvun itseisarvo on 7"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nLuvun itseisarvo on 1"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-99"}]},{"type":"text","value":"\nLuvun itseisarvo on 99"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Keittoa vai ei","tmcname":"osa01-23_keittoa_vai_ei"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita ohjelma, joka kysyy ensin käyttäjän nimen. Jos nimi on mikä tahansa muu kuin \"Jerry\", ohjelma kysyy keittoannosten lukumäärän ja kertoo sitten kokonaishinnan. Yksi annos maksaa 5,90."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kaksi esimerkkisuoritusta:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mikä on nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Kramer"}]},{"type":"text","value":"\nKuinka monta annosta keittoa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nKokonaishinta on 11.8\nSeuraava!"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mikä on nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Jerry"}]},{"type":"text","value":"\nSeuraava!"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Luvun suuruusluokka","tmcname":"osa01-24_luvun_suuruusluokka"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka lukee käyttäjältä kokonaisluvun ja kertoo sitten sen suuruusluokan oheisten esimerkkisuoritusten mukaisesti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"950"}]},{"type":"text","value":"\nLuku on pienempi kuin 1000\nKiitos!"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"59"}]},{"type":"text","value":"\nLuku on pienempi kuin 1000\nLuku on pienempi kuin 100\nKiitos!"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nLuku on pienempi kuin 1000\nLuku on pienempi kuin 100\nLuku on pienempi kuin 10\nKiitos!"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1123"}]},{"type":"text","value":"\nKiitos!"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"totuusarvot","style":"position:relative;"},"children":[{"type":"text","value":"Totuusarvot"},{"type":"element","tagName":"a","properties":{"href":"#totuusarvot","ariaLabel":"totuusarvot permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ehtorakenteessa käytettävä ehto saa totuusarvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":" (tosi) tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":" (epätosi). Esimerkiksi ehto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a < 5"}]},{"type":"text","value":" on tosi jos "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":" on alle 5 ja epätosi jos "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":" on 5 tai suurempi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmoinnissa totuusarvoja kutsutaan usein boolean-arvoiksi matemaatikko George Boolen kehittämän algebrallisen rakenteen mukaan. Pythonissa totuusarvoja käsitellään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"bool"}]},{"type":"text","value":"-tietotyypin avulla, ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"bool"}]},{"type":"text","value":"-tyyppisillä muuttujilla voi olla vain kaksi eri arvoa: "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme asettaa ehdon tuloksen muuttujan arvoksi samaan tapaan kuin laskutoimituksen tuloksen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nehto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ehto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" ehto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"a on pienempi kuin 5\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\na on pienempi kuin 5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme käyttää koodissa myös sanoja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":". Esimerkiksi seuraava koodi suorittaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennon aina, koska ehdon arvona on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ehto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" ehto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tänne tullaan aina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tänne tullaan aina"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tällainen ohjelma ei ole sinänsä kovin hyödyllinen, mutta myöhemmin kurssilla näemme, mitä hyötyä on totuusarvoista muuttujissa."}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Laskin","tmcname":"osa01-25_laskin"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä ensin kaksi lukua ja sen jälkeen komennon. Jos komento on joko "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"summa"}]},{"type":"text","value":", "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tulo"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"erotus"}]},{"type":"text","value":", ohjelma laskee syötteille kyseisen operaation tuloksen. Muussa tapauksessa ohjelma ei tulosta mitään."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostuksia:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luku 1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\nLuku 2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"17"}]},{"type":"text","value":"\nKomento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"summa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"10 + 17 = 27"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luku 1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nLuku 2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"6"}]},{"type":"text","value":"\nKomento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tulo"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4 * 6 = 24"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luku 1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nLuku 2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"6"}]},{"type":"text","value":"\nKomento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"erotus"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4 - 6 = -2"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Lämpötilat","tmcname":"osa01-26_lampotilat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä lämpötilan fahrenheit-asteina, ja tulostaa sitten lämpötilan celsius-asteina. Jos lämpötila celsius-asteina on pienempi kuin 0, ohjelma tulostaa lisäksi viestin \"Paleltaa!\"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kaavan fahrenheit-asteiden muuntamiseksi celsius-asteiksi voit etsiä esimerkiksi googlaamalla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kaksi esimerkkisuoritusta:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lämpötila (F): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"101"}]},{"type":"text","value":"\n101 fahrenheit-astetta on 38.333333333333336 celsius-astetta"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lämpötila (F): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"21"}]},{"type":"text","value":"\n21 fahrenheit-astetta on -6.111111111111111 celsius-astetta\nPaleltaa!"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Palkka","tmcname":"osa01-27_palkka"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy tuntipalkkaa, työskenneltyjen tuntien määrää ja viikonpäivää. Ohjelma tulostaa palkan, joka on tuntipalkka kertaa tuntien määrä muina päivinä paitsi sunnuntaisin, jolloin tuntipalkka on kaksinkertainen."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tuntipalkka: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"8.5"}]},{"type":"text","value":"\nTyötunnit: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nViikonpäivä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"maanantai"}]},{"type":"text","value":"\nPalkka 25.5 euroa"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tuntipalkka: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"12.5"}]},{"type":"text","value":"\nTyötunnit: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\nViikonpäivä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"sunnuntai"}]},{"type":"text","value":"\nPalkka 250.0 euroa"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Korjaa ohjelma: Korkoa kortille","tmcname":"osa01-28_korjaaa_ohjelma_korkoa_kortille"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmassa lasketaan bonuskortin saldoon vuoden lopussa lisättävä bonuspistemäärä seuraavan kaavan mukaisesti:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Jos bonuspisteitä on alle sata, korkona saa 10 % lisää pisteitä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Muussa tapauksessa korkona saa 15 % lisää pisteitä"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma siis toimii esim. näin:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuinka paljon pisteitä? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"55"}]},{"type":"text","value":"\nSait 10 % bonusta\nPisteitä on nyt 60.5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma toimii kuitenkin jollain syötteillä oudosti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuinka paljon pisteitä? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"95"}]},{"type":"text","value":"\nSait 10 % bonusta\nSait 15 % bonusta\nPisteitä on nyt 120.175"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Korjaa ohjelma niin, että bonusta tulee joko 10 % tai 15 %, ei koskaan molempia."}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Huomiset vaatteet","tmcname":"osa01-29_huomisen_vaatteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy huomisen sääennusteen ja suosittelee sen mukaista pukeutumista."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Suositus vaihtelee sen mukaan, onko lämpötila yli 20 astetta, yli 10 astetta vai yli 5 astetta. Myös sade vaikuttaa suositukseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma toimii seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kerro huominen sääennuste:\nLämpötila: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"21"}]},{"type":"text","value":"\nSataako (kyllä/ei): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":"\nPue housut ja t-paita"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kerro huominen sääennuste:\nLämpötila: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"11"}]},{"type":"text","value":"\nSataako (kyllä/ei): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":"\nPue housut ja t-paita\nOta myös pitkähihainen paita"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kerro huominen sääennuste:\nLämpötila: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"7"}]},{"type":"text","value":"\nSataako (kyllä/ei): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":"\nPue housut ja t-paita\nOta myös pitkähihainen paita\nPue päälle takki"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kerro huominen sääennuste:\nLämpötila: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nSataako (kyllä/ei): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kyllä"}]},{"type":"text","value":"\nPue housut ja t-paita\nOta myös pitkähihainen paita\nPue päälle takki\nSuosittelen lämmintä takkia\nKannattaa ottaa myös hanskat\nMuista sateenvarjo!"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Toisen asteen yhtälön ratkaiseminen","tmcname":"osa01-30_toisen_asteen_yhtalo"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"math"}]},{"type":"text","value":"-moduulissa on funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sqrt"}]},{"type":"text","value":", jolla voi laskea luvun neliöjuuren. Voit käyttää sitä ohjelmassa seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" math "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" sqrt\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sqrt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma tulostaa:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3.0"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita ohjelma, joka ratkaisee toisen asteen yhtälön ax²+bx+c. Ohjelmalle annetaan arvot a, b ja c, ja sen tulee laskea juuret (eli ratkaisut) kaavalla"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"x = (-b ± sqrt(b²-4ac))/(2a)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa, että yhtälöllä on kaksi juurta, jolloin yllä oleva kaava toimii."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkituloste:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna a: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nAnna b: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nAnna c: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-8"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Juuret ovat 2.0 ja -4.0"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kertauskysely tämän osan asioihin liittyen:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3"},"children":[]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa lopuksi kyselyyn tämän viikon materiaaleista. Saat kyselyyn vastaamisesta yhden pisteen:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat käyttää yksinkertaista ehtorakennetta ohjelmoinnissa
  • \n
  • Tiedät, mitä tarkoitetaan totuusarvoilla
  • \n
  • Osaat muodostaa ehtoja vertailuoperaattoreiden avulla
  • \n

Tähän mennessä kaikissa ohjelmissamme on suoritettu samat rivit samassa järjestyksessä.\nUsein on kuitenkin tarpeen määritellä ohjelmaan osia, jotka suoritetaan vain tietyissä tilanteissa.

Esimerkiksi seuraava koodi tarkastaa, onko henkilö täysi-ikäinen:

ika = int(input(\"Kuinka vanha olet? \"))\n\nif ika > 17:\n    print(\"Olet täysi-ikäinen!\"\n    print(\"Tässä siis sinulle ikiomaksi GTA6.\")\n\nprint(\"Seuraava asiakas, kiitos!\")

Ohjelman suoritus näyttää tältä, kun ikä on suurempi kuin 17:

Kuinka vanha olet? 18\nOlet täysi-ikäinen!\nTässä siis sinulle ikiomaksi GTA6.\nSeuraava asiakas, kiitos!

Jos kuitenkaan ikä ei ole suurempi kuin 17, käy näin:

Kuinka vanha olet? 16\nSeuraava asiakas, kiitos!

Esimerkkejä tarkastelemalla huomataan, että syötteenä annettu arvo vaikuttaa nyt siihen, mitkä osat ohjelmasta suoritetaan. Ohjelmassa on käytössä ehtorakenne, jonka sisällä oleva koodi suoritetaan vain, kun annettu ehto on tosi.

\n \n \n \n \n \"1\n \n

Suurin osa editoreista osaa automaattisesti sisentää rivin, kun edellinen rivi päättyy kaksoispisteeseen. Voit lopettaa sisentämisen editorissa painamalla rivin alussa Backspace-näppäintä.

\n \n \n \n \n \"1\n \n \n
\nNäppäimistökuvien alkuperä:\n Clker-Free-Vector-Images from Pixabay\n

Tee ohjelma, joka kysyy käyttäjältä kokonaisluvun ja tulostaa merkkijonon \"Orwell\" jos luku on täsmälleen 1984. Muussa tapauksessa ohjelma ei tulosta mitään.

Anna luku: 2020

Anna luku: 1984\nOrwell

Kirjoita ohjelma, joka lukee käyttäjältä kokonaisluvun. Mikäli luku on pienempi kuin 0, ohjelma tulostaa luvun kerrottuna luvulla -1. Muulloin ohjelma tulostaa käyttäjän syöttämän luvun. Alla on muutamia esimerkkejä ohjelman odotetusta toiminnasta.

Anna luku: -7\nLuvun itseisarvo on 7

Anna luku: 1\nLuvun itseisarvo on 1

Anna luku: -99\nLuvun itseisarvo on 99

Kirjoita ohjelma, joka kysyy ensin käyttäjän nimen. Jos nimi on mikä tahansa muu kuin \"Jerry\", ohjelma kysyy keittoannosten lukumäärän ja kertoo sitten kokonaishinnan. Yksi annos maksaa 5,90.

Kaksi esimerkkisuoritusta:

Mikä on nimesi: Kramer\nKuinka monta annosta keittoa: 2\nKokonaishinta on 11.8\nSeuraava!

Mikä on nimesi: Jerry\nSeuraava!

Tee ohjelma, joka lukee käyttäjältä kokonaisluvun ja kertoo sitten sen suuruusluokan oheisten esimerkkisuoritusten mukaisesti:

Anna luku: 950\nLuku on pienempi kuin 1000\nKiitos!

Anna luku: 59\nLuku on pienempi kuin 1000\nLuku on pienempi kuin 100\nKiitos!

Anna luku: 2\nLuku on pienempi kuin 1000\nLuku on pienempi kuin 100\nLuku on pienempi kuin 10\nKiitos!

Anna luku: 1123\nKiitos!

Totuusarvot

Ehtorakenteessa käytettävä ehto saa totuusarvon True (tosi) tai False (epätosi). Esimerkiksi ehto a < 5 on tosi jos a on alle 5 ja epätosi jos a on 5 tai suurempi.

Ohjelmoinnissa totuusarvoja kutsutaan usein boolean-arvoiksi matemaatikko George Boolen kehittämän algebrallisen rakenteen mukaan. Pythonissa totuusarvoja käsitellään bool-tietotyypin avulla, ja bool-tyyppisillä muuttujilla voi olla vain kaksi eri arvoa: True tai False.

Voimme asettaa ehdon tuloksen muuttujan arvoksi samaan tapaan kuin laskutoimituksen tuloksen:

a = 3\nehto = a < 5\nprint(ehto)\nif ehto:\n    print(\"a on pienempi kuin 5\")

True\na on pienempi kuin 5

Voimme käyttää koodissa myös sanoja True ja False. Esimerkiksi seuraava koodi suorittaa print-komennon aina, koska ehdon arvona on True:

ehto = True\nif ehto:\n    print(\"Tänne tullaan aina\")

Tänne tullaan aina

Tällainen ohjelma ei ole sinänsä kovin hyödyllinen, mutta myöhemmin kurssilla näemme, mitä hyötyä on totuusarvoista muuttujissa.

Tee ohjelma, joka kysyy käyttäjältä ensin kaksi lukua ja sen jälkeen komennon. Jos komento on joko summa, tulo tai erotus, ohjelma laskee syötteille kyseisen operaation tuloksen. Muussa tapauksessa ohjelma ei tulosta mitään.

Esimerkkitulostuksia:

Luku 1: 10\nLuku 2: 17\nKomento: summa

10 + 17 = 27

Luku 1: 4\nLuku 2: 6\nKomento: tulo

4 * 6 = 24

Luku 1: 4\nLuku 2: 6\nKomento: erotus

4 - 6 = -2

Tee ohjelma, joka kysyy käyttäjältä lämpötilan fahrenheit-asteina, ja tulostaa sitten lämpötilan celsius-asteina. Jos lämpötila celsius-asteina on pienempi kuin 0, ohjelma tulostaa lisäksi viestin \"Paleltaa!\".

Kaavan fahrenheit-asteiden muuntamiseksi celsius-asteiksi voit etsiä esimerkiksi googlaamalla.

Kaksi esimerkkisuoritusta:

Anna lämpötila (F): 101\n101 fahrenheit-astetta on 38.333333333333336 celsius-astetta

Anna lämpötila (F): 21\n21 fahrenheit-astetta on -6.111111111111111 celsius-astetta\nPaleltaa!

Tee ohjelma, joka kysyy tuntipalkkaa, työskenneltyjen tuntien määrää ja viikonpäivää. Ohjelma tulostaa palkan, joka on tuntipalkka kertaa tuntien määrä muina päivinä paitsi sunnuntaisin, jolloin tuntipalkka on kaksinkertainen.

Tuntipalkka: 8.5\nTyötunnit: 3\nViikonpäivä: maanantai\nPalkka 25.5 euroa

Tuntipalkka: 12.5\nTyötunnit: 10\nViikonpäivä: sunnuntai\nPalkka 250.0 euroa

Ohjelmassa lasketaan bonuskortin saldoon vuoden lopussa lisättävä bonuspistemäärä seuraavan kaavan mukaisesti:

    \n
  • Jos bonuspisteitä on alle sata, korkona saa 10 % lisää pisteitä
  • \n
  • Muussa tapauksessa korkona saa 15 % lisää pisteitä
  • \n

Ohjelma siis toimii esim. näin:

Kuinka paljon pisteitä? 55\nSait 10 % bonusta\nPisteitä on nyt 60.5

Ohjelma toimii kuitenkin jollain syötteillä oudosti:

Kuinka paljon pisteitä? 95\nSait 10 % bonusta\nSait 15 % bonusta\nPisteitä on nyt 120.175

Korjaa ohjelma niin, että bonusta tulee joko 10 % tai 15 %, ei koskaan molempia.

Tee ohjelma, joka kysyy huomisen sääennusteen ja suosittelee sen mukaista pukeutumista.

Suositus vaihtelee sen mukaan, onko lämpötila yli 20 astetta, yli 10 astetta vai yli 5 astetta. Myös sade vaikuttaa suositukseen.

Ohjelma toimii seuraavasti:

Kerro huominen sääennuste:\nLämpötila: 21\nSataako (kyllä/ei): ei\nPue housut ja t-paita

Kerro huominen sääennuste:\nLämpötila: 11\nSataako (kyllä/ei): ei\nPue housut ja t-paita\nOta myös pitkähihainen paita

Kerro huominen sääennuste:\nLämpötila: 7\nSataako (kyllä/ei): ei\nPue housut ja t-paita\nOta myös pitkähihainen paita\nPue päälle takki

Kerro huominen sääennuste:\nLämpötila: 3\nSataako (kyllä/ei): kyllä\nPue housut ja t-paita\nOta myös pitkähihainen paita\nPue päälle takki\nSuosittelen lämmintä takkia\nKannattaa ottaa myös hanskat\nMuista sateenvarjo!

Pythonin math-moduulissa on funktio sqrt, jolla voi laskea luvun neliöjuuren. Voit käyttää sitä ohjelmassa seuraavasti:

from math import sqrt\n\nprint(sqrt(9))

Ohjelma tulostaa:

3.0

Kirjoita ohjelma, joka ratkaisee toisen asteen yhtälön ax²+bx+c. Ohjelmalle annetaan arvot a, b ja c, ja sen tulee laskea juuret (eli ratkaisut) kaavalla

x = (-b ± sqrt(b²-4ac))/(2a).

Voit olettaa, että yhtälöllä on kaksi juurta, jolloin yllä oleva kaava toimii.

Esimerkkituloste:

Anna a: 1\nAnna b: 2\nAnna c: -8

Juuret ovat 2.0 ja -4.0

Kertauskysely tämän osan asioihin liittyen:

Vastaa lopuksi kyselyyn tämän viikon materiaaleista. Saat kyselyyn vastaamisesta yhden pisteen:

","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-1/5-ehtorakenne.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-1/page-data.json b/page-data/osa-1/page-data.json index bdb66f1c7..f240fbe1c 100644 --- a/page-data/osa-1/page-data.json +++ b/page-data/osa-1/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-part-overview-template-js", "path": "/osa-1", - "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-1","title":"Osa 1"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-1/index.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-1","title":"Osa 1"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-1/index.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-10/1-luokkahierarkiat/page-data.json b/page-data/osa-10/1-luokkahierarkiat/page-data.json index ecf6a108d..efee41962 100644 --- a/page-data/osa-10/1-luokkahierarkiat/page-data.json +++ b/page-data/osa-10/1-luokkahierarkiat/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-10/1-luokkahierarkiat", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät mitä tarkoitetaan perinnällä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat kirjoittaa luokkia jotka perivät jonkin toisen luokan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät miten eri piirteet periytyvät"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"luokkien-erikoistaminen","style":"position:relative;"},"children":[{"type":"text","value":"Luokkien erikoistaminen"},{"type":"element","tagName":"a","properties":{"href":"#luokkien-erikoistaminen","ariaLabel":"luokkien erikoistaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joskus tulee vastaan tilanne, jossa luokan toimintaa olisi hyvä pyrkiä erikoistamaan, mutta vain osalle olioista. Tarkastellaan esimerkkinä tilannetta, jossa meillä on kaksi luokkaa - Opiskelija ja Opettaja. Yksinkertaistuksen vuoksi luokista on jätetty pois kaikki asetus- ja havainnointimetodit."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opnro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opnro "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opnro\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sposti\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opintopisteet\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opettaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" huone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opetusvuosia"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sposti\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"huone "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" huone\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opetusvuosia "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opetusvuosia\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yksinkertaistetustakin esimerkistä huomataan, että luokilla on yhteisiä piirteitä - tässä tapauksessa nimi ja sähköpostiosoite. Monessa tilanteessa olisi hyvä, jos yhteisiä piirteitä voitaisin käsitellä yhdellä operaatiolla: oletetaan tilanne, jossa koulun sähköpostitunnus muuttuu. Toki voitaisiin kirjoittaa kaksi käsittelyfunktiota..."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"korjaa_email"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"o"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n o"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" o"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"replace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\".com\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\".edu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"korjaa_email2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"o"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Opettaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n o"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" o"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"replace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\".com\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\".edu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"...mutta saman koodin toistaminen kahteen kertaan tuntuu turhalta työltä, ja lisää virheiden mahdollisuutta. Olisi siis hyvä, jos molempien luokkien mukaisia olioita voitaisiin käsitellä samalla metodilla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokat kuitenkin sisältävät myös piirteitä, joita toisella luokalla ei ole. Sen takia luokkien yhdistäminen ei tunnu järkevältä."}]},{"type":"element","tagName":"h2","properties":{"id":"perinta","style":"position:relative;"},"children":[{"type":"text","value":"Perintä"},{"type":"element","tagName":"a","properties":{"href":"#perinta","ariaLabel":"perinta permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ratkaisu löytyy olio-ohjelmoinnin tekniikasta nimeltä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"perintä"}]},{"type":"text","value":". Perinnällä tarkoitetaan sitä, että luokka "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"perii"}]},{"type":"text","value":" piirteet joltain toiselta luokalta. Näiden perittyjen piirteiden rinnalle luokka voi sitten toteuttaa uusia piirteitä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Opettaja- ja Opiskelija-luokilla voisi olla yhteinen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"yliluokka"}]},{"type":"text","value":" "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sposti\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokassa on toteutettu siis henkilöön liittyvät piirteet. Nyt luokat Opiskelija ja Opettaja voivat "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"periä"}]},{"type":"text","value":" luokan ja lisätä perittyjen ominaisuuksien rinnalle uusia piirteitä:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Perintä tapahtuu kirjoittamalla luokan nimen perään perittävän luokan nimi sulkuihin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sposti\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"vaihda_spostitunniste"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" uusi_tunniste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n vanha "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"@\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"replace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vanha"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" uusi_tunniste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opnro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opnro "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opnro\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sposti\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opintopisteet\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opettaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" huone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opetusvuosia"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sposti\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"huone "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" huone\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opetusvuosia "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opetusvuosia\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Testi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n olli "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olli Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1234\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"olli@example.com\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n olli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vaihda_spostitunniste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"example.edu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"olli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n outi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opettaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Outi Ope\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"outi@example.fi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"A123\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n outi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vaihda_spostitunniste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"example.ex\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"outi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska sekä Opiskelija että Opettaja perivät luokan Henkilo, molemmilla on käytössään Henkilo-luokassa määritellyt piirteet, mukaanlukien metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vaihda_spostitunniste"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan vielä toista esimerkkiä, jossa luokka Kirjahylly perii luokan Laatikko:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kirja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Luokka mallintaa yksinkertaista kirjaa \"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirjailija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjailija "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kirjailija\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kirjalaatikko"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Luokka mallintaa laatikkoa, johon voidaan tallentaa kirjoja \"\"\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_kirja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"listaa_kirjat"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" kirja "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjailija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kirjahylly"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kirjalaatikko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Luokka mallintaa yksinkertaista kirjahyllyä \"\"\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"super"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__init__"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_kirja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" paikka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"insert"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"paikka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokassa Kirjahylly on määritelty metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_kirja"}]},{"type":"text","value":". Samanniminen metodi on määritelty myös yliluokassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kirjalaatikko"}]},{"type":"text","value":". Tällaisessa tapauksessa puhutaan metodin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"uudelleenmäärittelystä"}]},{"type":"text","value":" tai ylikirjoituksesta (overwriting): aliluokan samanniminen metodi korvaa yliluokan vastaavan metodin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkissämme idea on, että kirjalaatikossa kirja asetetaan aina laatikossa päällimmäiseksi, mutta kirjahyllyssä voidaan määritellä asetuspaikka. Sen sijaan metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"listaa_kirjat"}]},{"type":"text","value":" uudelleenmäärittelyä ei ole nähty tarpeelliseksi - sama kirjojen listaus toimii niin laatikossa kuin hyllyssäkin (ainakin esimerkissämme)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkiä luokkien käyttämisestä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luodaan pari kirjaa testiksi"}]},{"type":"text","value":"\n k1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"7 veljestä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aleksis Kivi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n k2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sinuhe\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mika Waltari\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n k3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tuntematon sotilas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Väinö Linna\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luodaan kirjalaatikko ja lisätään kirjat sinne"}]},{"type":"text","value":"\n laatikko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirjalaatikko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n laatikko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n laatikko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n laatikko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luodaan kirjahylly ja lisätään kirjat sinne (aina hyllyn alkupäähän)"}]},{"type":"text","value":"\n hylly "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirjahylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n hylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n hylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n hylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Laatikossa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n laatikko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"listaa_kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hyllyssä:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n hylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"listaa_kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":" "},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laatikossa:\n7 veljestä (Aleksis Kivi)\nSinuhe (Mika Waltari)\nTuntematon sotilas (Väinö Linna)"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hyllyssä:\nTuntematon sotilas (Väinö Linna)\nSinuhe (Mika Waltari)\n7 veljestä (Aleksis Kivi)"}]},{"type":"text","value":" "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Myös Kirjahylly-luokasta muodostettujen olioiden kautta voidaan käyttää metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"listaa_kirjat"}]},{"type":"text","value":", koska perinnän ansiosta se on olemassa myös luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kirjahylly"}]},{"type":"text","value":" aliluokissa."}]},{"type":"element","tagName":"h2","properties":{"id":"piirteiden-periytyminen","style":"position:relative;"},"children":[{"type":"text","value":"Piirteiden periytyminen"},{"type":"element","tagName":"a","properties":{"href":"#piirteiden-periytyminen","ariaLabel":"piirteiden periytyminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aliluokka perii yliluokalta kaikki piirteet. Aliluokasta voidaan viitata suoraan yliluokan piirteisiin, paitsi jos yliluokassa on määritelty piirteet yksityisiksi (käyttämällä kahta alaviivaa muuttujan nimen edessä)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Niinpä esimerkiksi Kirjahylly-luokasta voitaisiin viitata yliluokan konstruktoriin sen sijaan että kirjoitettaisiin toiminnallisuus uudestaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kirjahylly"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kirjalaatikko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"super"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__init__"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yliluokan konstuktoriin (tai yliluokkaan muutenkin) viitataan funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"super()"}]},{"type":"text","value":" avulla. Huomaa, että tässäkin tapauksessa parametri "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":" lisätään automaattisesti."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan toisena esimerkkinä luokkaa Gradu, joka perii luokan Kirja. Aliluokasta kutsutaan yliluokan konstruktoria:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kirja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Luokka mallintaa yksinkertaista kirjaa \"\"\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirjailija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjailija "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kirjailija\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Gradu"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Luokka mallintaa gradua eli ylemmän korkeakoulututkinnon lopputyötä \"\"\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirjailija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvosana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"super"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__init__"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirjailija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvosana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" arvosana\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt Gradu-luokan konstruktorista kutsutaan yliluokan (eli luokan Kirja) konstruktoria, jossa asetetaan attribuuttien "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kirjailija"}]},{"type":"text","value":" arvot. Sen jälkeen aliluokan konstruktorissa asetetaan attribuutin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"arvosana"}]},{"type":"text","value":" arvo - tätä luonnollisesti ei voida tehdä yliluokan konstruktorissa, koska yliluokalla ei tällaista attribuuttia ole."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkaa voidaan käyttää esimerkiksi näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Testataan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n gradu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Gradu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Python ja maailmankaikkeus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan kenttien arvot"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"gradu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"gradu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjailija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"gradu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvosana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python ja maailmankaikkeus\nPekka Python\n3"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska aliluokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Gradu"}]},{"type":"text","value":" perii kaikki yliluokan piirteet, se perii myös attribuutit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kirjailija"}]},{"type":"text","value":". Arvot osalle attribuuteista annetaan yliluokan sisältä löytyvässä konstruktorissa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aliluokka voi myös viitata yliluokan metodiin, vaikka metodi olisikin määritelty uudestaan aliluokassa. Seuraavassa esimerkissä luokasta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Platinakortti"}]},{"type":"text","value":" kutsutaan uudelleenmääritellyssä metodissa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"bonuspisteet"}]},{"type":"text","value":" yliluokan vastaavaa metodia."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Tuote"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" hinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" hinta\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Bonuskortti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ostetut_tuotteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_tuote"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ostetut_tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"laske_bonus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n bonus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tuote "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ostetut_tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n bonus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.05"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" bonus\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Platinakortti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Bonuskortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"super"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__init__"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"laske_bonus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kutsutaan yliluokan metodia..."}]},{"type":"text","value":"\n bonus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"super"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"laske_bonus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ...ja lisätään vielä viisi prosenttia päälle"}]},{"type":"text","value":"\n bonus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" bonus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1.05"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" bonus\n\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt platinakortin bonus lasketaan hyödyntämällä aluksi yliluokan vastaavaa metodia ja lisäämällä sitten ylimääräiset 5 prosenttia tähän bonukseen. Esimerkki luokkien käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Bonuskortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Banaanit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6.50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mandariinit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n bonus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"laske_bonus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n kortti2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Platinakortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kortti2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Banaanit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6.50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kortti2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mandariinit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n bonus2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kortti2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"laske_bonus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"bonus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"bonus2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"0.7225\n0.7586250000000001"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kannettava tietokone","tmcname":"osa10-01_kannettava_tietokone"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on määritelty luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tietokone"}]},{"type":"text","value":", jolla on attribuutit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"malli"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nopeus"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"KannettavaTietokone"}]},{"type":"text","value":", joka "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"perii luokan Tietokone"}]},{"type":"text","value":". Luokka saa konstruktorissa luokan Tietokone attribuuttien lisäksi kolmannen kokonaislukutyyppisen attribuutin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"paino"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita luokkaan lisäksi metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":", jonka avulla voi tulostaa esimerkkisuorituksen mukaisen tulosteen olion tilasta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ipm "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" KannettavaTietokone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"IPM MikroMauri\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ipm"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"IPM MikroMauri, 1500 MHz, 2 kg"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Pelimuseo","tmcname":"osa10-02_pelimuseo"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on määritelty luokat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tietokonepeli"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pelivarasto"}]},{"type":"text","value":". Pelivarastoon voidaan säilöä tietokonepelejä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tutustu luokkien ohjelmakoodiin ja kirjoita sitten uusi luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pelimuseo"}]},{"type":"text","value":", joka perii luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pelivarasto"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelimuseo-luokassa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"uudelleentoteutetaan"}]},{"type":"text","value":" metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"anna_pelit()"}]},{"type":"text","value":" niin, että se palauttaa listassa ainoastaan ne pelit, jotka on tehty ennen vuotta 1990."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisäksi luokassa tulee olla konstruktori, josta "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kutsutaan yliluokan Pelivarasto konstruktoria"}]},{"type":"text","value":". Konstruktorilla ei ole parametreja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"museo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pelimuseo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmuseo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_peli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Tietokonepeli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pacman\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Namco\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1980"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmuseo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_peli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Tietokonepeli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"GTA 2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Rockstar\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1999"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmuseo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_peli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Tietokonepeli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Bubble Bobble\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Taito\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1986"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" peli "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" museo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"anna_pelit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"peli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pacman\nBubble Bobble"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Pinta-alat","tmcname":"osa10-03_pinta_alat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjan mukana tulee luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Suorakulmio"}]},{"type":"text","value":" joka nimensä mukaisesti mallintaa "},{"type":"element","tagName":"a","properties":{"href":"https://fi.wikipedia.org/wiki/Suorakulmio","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"suorakulmiota"}]},{"type":"text","value":". Luokkaa käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"suorakulmio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pinta-ala:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pinta_ala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"suorakulmio 2x3\npinta-ala: 6"}]}]},{"type":"element","tagName":"h2","properties":{"id":"nelio","style":"position:relative;"},"children":[{"type":"text","value":"Neliö"},{"type":"element","tagName":"a","properties":{"href":"#nelio","ariaLabel":"nelio permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Nelio"}]},{"type":"text","value":" joka perii luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Suorakulmio"}]},{"type":"text","value":". Suorakulmiosta poiketen "},{"type":"element","tagName":"a","properties":{"href":"https://fi.wikipedia.org/wiki/Neli%C3%B6_(geometria)","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"neliön"}]},{"type":"text","value":" kaikki sivut ovat saman pituisia, eli neliö on eräänlainen yksinkertaisempi erikoistapaus suorakulmiosta. Luokka ei saa määritellä uusia attribuutteja!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkaa käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nelio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Nelio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nelio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pinta-ala:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nelio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pinta_ala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"neliö 4x4\npinta-ala: 16"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sanapeli","tmcname":"osa10-04_sanapeli"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohja sisältää valmiin luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Sanapeli"}]},{"type":"text","value":", joka tarjoaa perustoiminnallisuuden erilaisten sanapelien pelaamiseen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" random\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Sanapeli"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kierrokset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"voitot1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"voitot2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kierrokset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kierrokset\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kierroksen_voittaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelaaja1_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelaaja2_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# arvotaan voittaja"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" random"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"randint"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pelaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sanapeli:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kierrokset"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"kierros "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n vastaus1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pelaaja1: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n vastaus2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pelaaja2: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kierroksen_voittaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vastaus1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vastaus2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"voitot1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pelaaja 1 voitti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kierroksen_voittaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vastaus1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vastaus2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"voitot2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pelaaja 2 voitti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tasapeli"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"peli päättyi, voitot:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"pelaaja 1: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"voitot1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"pelaaja 2: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"voitot2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Peliä käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"p "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Sanapeli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\np"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostus"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanapeli:\nkierros 1\npelaaja1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pitkäsana"}]},{"type":"text","value":"\npelaaja2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"??"}]},{"type":"text","value":"\npelaaja 2 voitti\nkierros 2\npelaaja1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"olen paras"}]},{"type":"text","value":"\npelaaja2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"mitä?"}]},{"type":"text","value":"\npelaaja 1 voitti\nkierros 3\npelaaja1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kuka voittaa"}]},{"type":"text","value":"\npelaaja2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"minä"}]},{"type":"text","value":"\npelaaja 1 voitti\npeli päättyi voitot:\npelaaja 1: 2\npelaaja 2: 1"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä pelin \"perusversiossa\" voittaja ratkaistaan arpomalla, pelaajien antamilla syötteillä ei ole tulokseen vaikutusta."}]},{"type":"element","tagName":"h2","properties":{"id":"pisin-sana-voittaa","style":"position:relative;"},"children":[{"type":"text","value":"Pisin sana voittaa"},{"type":"element","tagName":"a","properties":{"href":"#pisin-sana-voittaa","ariaLabel":"pisin sana voittaa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee nyt luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"PisinSana"}]},{"type":"text","value":" eli pelin versio, missä kunkin kierroksen voittaja on sen kierroksen aikana pidemmän sanan syöttänyt käyttäjä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Uusi versio toteuteaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"perimällä"}]},{"type":"text","value":" luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Sanapeli"}]},{"type":"text","value":" ja ylikirjoittamalla sen metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kierroksen_voittaja"}]},{"type":"text","value":" sopivalla tavalla. Uuden luokan runko on siis seuraavanlainen"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"PisinSana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Sanapeli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kierrokset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"super"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__init__"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kierrokset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kierroksen_voittaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelaaja1_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelaaja2_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tänne voittajan ratkaiseva koodi"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki toiminnasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"p "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" PisinSana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\np"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanapeli:\nkierros 1\npelaaja1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"lyhyt"}]},{"type":"text","value":"\npelaaja2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pitkäsana"}]},{"type":"text","value":"\npelaaja 2 voitti\nkierros 2\npelaaja1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"sana"}]},{"type":"text","value":"\npelaaja2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"vat?"}]},{"type":"text","value":"\nkierros 3\npelaaja1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"olen paras"}]},{"type":"text","value":"\npelaaja2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"minäpäs"}]},{"type":"text","value":"\npelaaja 1 voitti\npeli päättyi, voitot:\npelaaja 1: 1\npelaaja 2: 1"}]}]},{"type":"element","tagName":"h2","properties":{"id":"eniten-vokaaleja-voittaa","style":"position:relative;"},"children":[{"type":"text","value":"Eniten vokaaleja voittaa"},{"type":"element","tagName":"a","properties":{"href":"#eniten-vokaaleja-voittaa","ariaLabel":"eniten vokaaleja voittaa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee nyt luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"EnitenVokaaleja"}]},{"type":"text","value":" eli pelin versio, missä kunkin kierroksen voittaja on se pelaaja, jonka sanassa oli enemmän vokaaleja."}]},{"type":"element","tagName":"h2","properties":{"id":"kivi-paperi-sakset","style":"position:relative;"},"children":[{"type":"text","value":"Kivi, paperi, sakset"},{"type":"element","tagName":"a","properties":{"href":"#kivi-paperi-sakset","ariaLabel":"kivi paperi sakset permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee nyt luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"KiviPaperiSakset"}]},{"type":"text","value":" joka mallintaa nimensä mukaisesti "},{"type":"element","tagName":"a","properties":{"href":"https://fi.wikipedia.org/wiki/Kivi,_paperi_ja_sakset","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"kivi, paperi ja sakset"}]},{"type":"text","value":" -peliä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelin säännöt ovat seuraavat:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"kivi voittaa sakset (kivellä voi rikkoa sakset eikä saksilla voi leikata kiveä)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"paperi voittaa kiven (kiven voi peittää paperilla)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"sakset voittaa paperin (saksilla voi leikata paperia)"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos pelaajan syöte on epäkelpo, eli se ei ole mikään sanoista "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kivi, paperi, sakset"}]},{"type":"text","value":" pelaaja häviää kierroksen, ellei molempien syöte ole epäkelpo."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki toiminnasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"p "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" KiviPaperiSakset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\np"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanapeli:\nkierros 1\npelaaja1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kivi"}]},{"type":"text","value":"\npelaaja2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kivi"}]},{"type":"text","value":"\nkierros 2\npelaaja1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kivi"}]},{"type":"text","value":"\npelaaja2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"paperi"}]},{"type":"text","value":"\npelaaja 2 voitti\nkierros 3\npelaaja1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"sakset"}]},{"type":"text","value":"\npelaaja2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"paperi"}]},{"type":"text","value":"\npelaaja 1 voitti\nkierros 4\npelaaja1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"paperi"}]},{"type":"text","value":"\npelaaja2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"dynamiitti"}]},{"type":"text","value":"\npelaaja 1 voitti\npeli päättyi, voitot:\npelaaja 1: 2\npelaaja 2: 1"}]}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät mitä tarkoitetaan perinnällä
  • \n
  • Osaat kirjoittaa luokkia jotka perivät jonkin toisen luokan
  • \n
  • Tiedät miten eri piirteet periytyvät
  • \n

Luokkien erikoistaminen

Joskus tulee vastaan tilanne, jossa luokan toimintaa olisi hyvä pyrkiä erikoistamaan, mutta vain osalle olioista. Tarkastellaan esimerkkinä tilannetta, jossa meillä on kaksi luokkaa - Opiskelija ja Opettaja. Yksinkertaistuksen vuoksi luokista on jätetty pois kaikki asetus- ja havainnointimetodit.

\nclass Opiskelija:\n\n    def __init__(self, nimi: str, opnro: str, sposti: str, opintopisteet: str):\n        self.nimi = nimi\n        self.opnro = opnro\n        self.sposti = sposti\n        self.opintopisteet = opintopisteet\n\nclass Opettaja:\n\n    def __init__(self, nimi: str, sposti: str, huone: str, opetusvuosia: int):\n        self.nimi = nimi\n        self.sposti = sposti\n        self.huone = huone\n        self.opetusvuosia = opetusvuosia\n

Yksinkertaistetustakin esimerkistä huomataan, että luokilla on yhteisiä piirteitä - tässä tapauksessa nimi ja sähköpostiosoite. Monessa tilanteessa olisi hyvä, jos yhteisiä piirteitä voitaisin käsitellä yhdellä operaatiolla: oletetaan tilanne, jossa koulun sähköpostitunnus muuttuu. Toki voitaisiin kirjoittaa kaksi käsittelyfunktiota...

\ndef korjaa_email(o: Opiskelija):\n    o.sposti = o.sposti.replace(\".com\", \".edu\")\n\ndef korjaa_email2(o: Opettaja):\n    o.sposti = o.sposti.replace(\".com\", \".edu\")\n

...mutta saman koodin toistaminen kahteen kertaan tuntuu turhalta työltä, ja lisää virheiden mahdollisuutta. Olisi siis hyvä, jos molempien luokkien mukaisia olioita voitaisiin käsitellä samalla metodilla.

Luokat kuitenkin sisältävät myös piirteitä, joita toisella luokalla ei ole. Sen takia luokkien yhdistäminen ei tunnu järkevältä.

Perintä

Ratkaisu löytyy olio-ohjelmoinnin tekniikasta nimeltä perintä. Perinnällä tarkoitetaan sitä, että luokka perii piirteet joltain toiselta luokalta. Näiden perittyjen piirteiden rinnalle luokka voi sitten toteuttaa uusia piirteitä.

Opettaja- ja Opiskelija-luokilla voisi olla yhteinen yliluokka Henkilo:

\nclass Henkilo:\n\n   def __init__(self, nimi: str, sposti: str):\n       self.nimi = nimi\n       self.sposti = sposti\n

Luokassa on toteutettu siis henkilöön liittyvät piirteet. Nyt luokat Opiskelija ja Opettaja voivat periä luokan ja lisätä perittyjen ominaisuuksien rinnalle uusia piirteitä:

Perintä tapahtuu kirjoittamalla luokan nimen perään perittävän luokan nimi sulkuihin:

\nclass Henkilo:\n\n   def __init__(self, nimi: str, sposti: str):\n       self.nimi = nimi\n       self.sposti = sposti\n\n   def vaihda_spostitunniste(self, uusi_tunniste: str):\n       vanha = self.sposti.split(\"@\")[1]\n       self.sposti = self.sposti.replace(vanha, uusi_tunniste)\n\nclass Opiskelija(Henkilo):\n\n   def __init__(self, nimi: str, opnro: str, sposti: str, opintopisteet: str):\n       self.nimi = nimi\n       self.opnro = opnro\n       self.sposti = sposti\n       self.opintopisteet = opintopisteet\n\nclass Opettaja(Henkilo):\n\n   def __init__(self, nimi: str, sposti: str, huone: str, opetusvuosia: int):\n       self.nimi = nimi\n       self.sposti = sposti\n       self.huone = huone\n       self.opetusvuosia = opetusvuosia\n\n# Testi\nif __name__ == \"__main__\":\n   olli = Opiskelija(\"Olli Opiskelija\", \"1234\", \"olli@example.com\", 0)\n   olli.vaihda_spostitunniste(\"example.edu\")\n   print(olli.sposti)\n\n   outi = Opettaja(\"Outi Ope\", \"outi@example.fi\", \"A123\", 2)\n   outi.vaihda_spostitunniste(\"example.ex\")\n   print(outi.sposti)\n

Koska sekä Opiskelija että Opettaja perivät luokan Henkilo, molemmilla on käytössään Henkilo-luokassa määritellyt piirteet, mukaanlukien metodi vaihda_spostitunniste.

Tarkastellaan vielä toista esimerkkiä, jossa luokka Kirjahylly perii luokan Laatikko:

class Kirja:\n   \"\"\" Luokka mallintaa yksinkertaista kirjaa \"\"\"\n   def __init__(self, nimi: str, kirjailija: str):\n       self.nimi = nimi\n       self.kirjailija = kirjailija\n\n\nclass Kirjalaatikko:\n   \"\"\" Luokka mallintaa laatikkoa, johon voidaan tallentaa kirjoja \"\"\"\n\n   def __init__(self):\n       self.kirjat = []\n\n   def lisaa_kirja(self, kirja: Kirja):\n       self.kirjat.append(kirja)\n\n   def listaa_kirjat(self):\n       for kirja in self.kirjat:\n           print(f\"{kirja.nimi} ({kirja.kirjailija})\")\n\nclass Kirjahylly(Kirjalaatikko):\n   \"\"\" Luokka mallintaa yksinkertaista kirjahyllyä \"\"\"\n\n   def __init__(self):\n       super().__init__()\n\n   def lisaa_kirja(self, kirja: Kirja, paikka: int):\n       self.kirjat.insert(paikka, kirja)\n\n

Luokassa Kirjahylly on määritelty metodi lisaa_kirja. Samanniminen metodi on määritelty myös yliluokassa Kirjalaatikko. Tällaisessa tapauksessa puhutaan metodin uudelleenmäärittelystä tai ylikirjoituksesta (overwriting): aliluokan samanniminen metodi korvaa yliluokan vastaavan metodin.

Esimerkissämme idea on, että kirjalaatikossa kirja asetetaan aina laatikossa päällimmäiseksi, mutta kirjahyllyssä voidaan määritellä asetuspaikka. Sen sijaan metodin listaa_kirjat uudelleenmäärittelyä ei ole nähty tarpeelliseksi - sama kirjojen listaus toimii niin laatikossa kuin hyllyssäkin (ainakin esimerkissämme).

Tarkastellaan esimerkkiä luokkien käyttämisestä:

\nif __name__ == \"__main__\":\n   # Luodaan pari kirjaa testiksi\n   k1 = Kirja(\"7 veljestä\", \"Aleksis Kivi\")\n   k2 = Kirja(\"Sinuhe\", \"Mika Waltari\")\n   k3 = Kirja(\"Tuntematon sotilas\", \"Väinö Linna\")\n\n   # Luodaan kirjalaatikko ja lisätään kirjat sinne\n   laatikko = Kirjalaatikko()\n   laatikko.lisaa_kirja(k1)\n   laatikko.lisaa_kirja(k2)\n   laatikko.lisaa_kirja(k3)\n\n   # Luodaan kirjahylly ja lisätään kirjat sinne (aina hyllyn alkupäähän)\n   hylly = Kirjahylly()\n   hylly.lisaa_kirja(k1, 0)\n   hylly.lisaa_kirja(k2, 0)\n   hylly.lisaa_kirja(k3, 0)\n\n\n   # Tulostetaan\n   print(\"Laatikossa:\")\n   laatikko.listaa_kirjat()\n\n   print()\n\n   print(\"Hyllyssä:\")\n   hylly.listaa_kirjat()\n

Laatikossa:\n7 veljestä (Aleksis Kivi)\nSinuhe (Mika Waltari)\nTuntematon sotilas (Väinö Linna)

Hyllyssä:\nTuntematon sotilas (Väinö Linna)\nSinuhe (Mika Waltari)\n7 veljestä (Aleksis Kivi)

Myös Kirjahylly-luokasta muodostettujen olioiden kautta voidaan käyttää metodia listaa_kirjat, koska perinnän ansiosta se on olemassa myös luokan Kirjahylly aliluokissa.

Piirteiden periytyminen

Aliluokka perii yliluokalta kaikki piirteet. Aliluokasta voidaan viitata suoraan yliluokan piirteisiin, paitsi jos yliluokassa on määritelty piirteet yksityisiksi (käyttämällä kahta alaviivaa muuttujan nimen edessä).

Niinpä esimerkiksi Kirjahylly-luokasta voitaisiin viitata yliluokan konstruktoriin sen sijaan että kirjoitettaisiin toiminnallisuus uudestaan:

\nclass Kirjahylly(Kirjalaatikko):\n\n   def __init__(self):\n       super().__init__()\n

Yliluokan konstuktoriin (tai yliluokkaan muutenkin) viitataan funktion super() avulla. Huomaa, että tässäkin tapauksessa parametri self lisätään automaattisesti.

Tarkastellaan toisena esimerkkinä luokkaa Gradu, joka perii luokan Kirja. Aliluokasta kutsutaan yliluokan konstruktoria:

\nclass Kirja:\n    \"\"\" Luokka mallintaa yksinkertaista kirjaa \"\"\"\n\n    def __init__(self, nimi: str, kirjailija: str):\n        self.nimi = nimi\n        self.kirjailija = kirjailija\n\n\nclass Gradu(Kirja):\n    \"\"\" Luokka mallintaa gradua eli ylemmän korkeakoulututkinnon lopputyötä \"\"\"\n\n    def __init__(self, nimi: str, kirjailija: str, arvosana: int):\n        super().__init__(nimi, kirjailija)\n        self.arvosana = arvosana\n

Nyt Gradu-luokan konstruktorista kutsutaan yliluokan (eli luokan Kirja) konstruktoria, jossa asetetaan attribuuttien nimi ja kirjailija arvot. Sen jälkeen aliluokan konstruktorissa asetetaan attribuutin arvosana arvo - tätä luonnollisesti ei voida tehdä yliluokan konstruktorissa, koska yliluokalla ei tällaista attribuuttia ole.

Luokkaa voidaan käyttää esimerkiksi näin:

\n# Testataan\nif __name__ == \"__main__\":\n    gradu = Gradu(\"Python ja maailmankaikkeus\", \"Pekka Python\", 3)\n\n    # Tulostetaan kenttien arvot\n    print(gradu.nimi)\n    print(gradu.kirjailija)\n    print(gradu.arvosana)\n

Python ja maailmankaikkeus\nPekka Python\n3

Koska aliluokka Gradu perii kaikki yliluokan piirteet, se perii myös attribuutit nimi ja kirjailija. Arvot osalle attribuuteista annetaan yliluokan sisältä löytyvässä konstruktorissa.

Aliluokka voi myös viitata yliluokan metodiin, vaikka metodi olisikin määritelty uudestaan aliluokassa. Seuraavassa esimerkissä luokasta Platinakortti kutsutaan uudelleenmääritellyssä metodissa bonuspisteet yliluokan vastaavaa metodia.

\nclass Tuote:\n\n    def __init__(self, nimi: str, hinta: float):\n        self.nimi = nimi\n        self.hinta = hinta\n\nclass Bonuskortti:\n\n    def __init__(self):\n        self.ostetut_tuotteet = []\n\n    def lisaa_tuote(self, tuote: Tuote):\n        self.ostetut_tuotteet.append(tuote)\n\n    def laske_bonus(self):\n        bonus = 0\n        for tuote in self.ostetut_tuotteet:\n            bonus += tuote.hinta * 0.05\n\n        return bonus\n\nclass Platinakortti(Bonuskortti):\n\n    def __init__(self):\n        super().__init__()\n\n    def laske_bonus(self):\n        # Kutsutaan yliluokan metodia...\n        bonus = super().laske_bonus()\n\n        # ...ja lisätään vielä viisi prosenttia päälle\n        bonus = bonus * 1.05\n        return bonus\n\n

Nyt platinakortin bonus lasketaan hyödyntämällä aluksi yliluokan vastaavaa metodia ja lisäämällä sitten ylimääräiset 5 prosenttia tähän bonukseen. Esimerkki luokkien käytöstä:

if __name__ == \"__main__\":\n    kortti = Bonuskortti()\n    kortti.lisaa_tuote(Tuote(\"Banaanit\", 6.50))\n    kortti.lisaa_tuote(Tuote(\"Mandariinit\", 7.95))\n    bonus = kortti.laske_bonus()\n\n    kortti2 = Platinakortti()\n    kortti2.lisaa_tuote(Tuote(\"Banaanit\", 6.50))\n    kortti2.lisaa_tuote(Tuote(\"Mandariinit\", 7.95))\n    bonus2 = kortti2.laske_bonus()\n\n    print(bonus)\n    print(bonus2)

0.7225\n0.7586250000000001

Tehtäväpohjassa on määritelty luokka Tietokone, jolla on attribuutit malli ja nopeus.

Kirjoita luokka KannettavaTietokone, joka perii luokan Tietokone. Luokka saa konstruktorissa luokan Tietokone attribuuttien lisäksi kolmannen kokonaislukutyyppisen attribuutin paino.

Kirjoita luokkaan lisäksi metodi __str__, jonka avulla voi tulostaa esimerkkisuorituksen mukaisen tulosteen olion tilasta.

Esimerkki:

ipm = KannettavaTietokone(\"IPM MikroMauri\", 1500, 2)\nprint(ipm)

IPM MikroMauri, 1500 MHz, 2 kg

Tehtäväpohjassa on määritelty luokat Tietokonepeli ja Pelivarasto. Pelivarastoon voidaan säilöä tietokonepelejä.

Tutustu luokkien ohjelmakoodiin ja kirjoita sitten uusi luokka Pelimuseo, joka perii luokan Pelivarasto.

Pelimuseo-luokassa uudelleentoteutetaan metodi anna_pelit() niin, että se palauttaa listassa ainoastaan ne pelit, jotka on tehty ennen vuotta 1990.

Lisäksi luokassa tulee olla konstruktori, josta kutsutaan yliluokan Pelivarasto konstruktoria. Konstruktorilla ei ole parametreja.

Esimerkiksi:

museo = Pelimuseo()\nmuseo.lisaa_peli(Tietokonepeli(\"Pacman\", \"Namco\", 1980))\nmuseo.lisaa_peli(Tietokonepeli(\"GTA 2\", \"Rockstar\", 1999))\nmuseo.lisaa_peli(Tietokonepeli(\"Bubble Bobble\", \"Taito\", 1986))\nfor peli in museo.anna_pelit():\n    print(peli.nimi)

Pacman\nBubble Bobble

Tehtäväpohjan mukana tulee luokka Suorakulmio joka nimensä mukaisesti mallintaa suorakulmiota. Luokkaa käytetään seuraavasti:

suorakulmio = Suorakulmio(2, 3)\nprint(suorakulmio)\nprint(\"pinta-ala:\", suorakulmio.pinta_ala())

suorakulmio 2x3\npinta-ala: 6

Neliö

Toteuta luokka Nelio joka perii luokan Suorakulmio. Suorakulmiosta poiketen neliön kaikki sivut ovat saman pituisia, eli neliö on eräänlainen yksinkertaisempi erikoistapaus suorakulmiosta. Luokka ei saa määritellä uusia attribuutteja!

Luokkaa käytetään seuraavasti:

nelio = Nelio(4)\nprint(nelio)\nprint(\"pinta-ala:\", nelio.pinta_ala())

neliö 4x4\npinta-ala: 16

Tehtäväpohja sisältää valmiin luokan Sanapeli, joka tarjoaa perustoiminnallisuuden erilaisten sanapelien pelaamiseen:

import random\n\nclass Sanapeli():\n    def __init__(self, kierrokset: int):\n        self.voitot1 = 0\n        self.voitot2 = 0\n        self.kierrokset = kierrokset\n\n    def kierroksen_voittaja(self, pelaaja1_sana: str, pelaaja2_sana: str):\n        # arvotaan voittaja\n        return random.randint(1, 2)\n\n    def pelaa(self):\n        print(\"Sanapeli:\")\n        for i in range(1, self.kierrokset+1):\n            print(f\"kierros {i}\")\n            vastaus1 = input(\"pelaaja1: \")\n            vastaus2 = input(\"pelaaja2: \")\n\n            if self.kierroksen_voittaja(vastaus1, vastaus2) == 1:\n                self.voitot1 += 1\n                print(\"pelaaja 1 voitti\")\n            elif self.kierroksen_voittaja(vastaus1, vastaus2) == 2:\n                self.voitot2 += 1\n                print(\"pelaaja 2 voitti\")\n            else:\n                pass # tasapeli\n\n        print(\"peli päättyi, voitot:\")\n        print(f\"pelaaja 1: {self.voitot1}\")\n        print(f\"pelaaja 2: {self.voitot2}\")

Peliä käytetään seuraavasti:

p = Sanapeli(3)\np.pelaa()

Esimerkkitulostus

Sanapeli:\nkierros 1\npelaaja1: pitkäsana\npelaaja2: ??\npelaaja 2 voitti\nkierros 2\npelaaja1: olen paras\npelaaja2: mitä?\npelaaja 1 voitti\nkierros 3\npelaaja1: kuka voittaa\npelaaja2: minä\npelaaja 1 voitti\npeli päättyi voitot:\npelaaja 1: 2\npelaaja 2: 1

Tässä pelin \"perusversiossa\" voittaja ratkaistaan arpomalla, pelaajien antamilla syötteillä ei ole tulokseen vaikutusta.

Pisin sana voittaa

Tee nyt luokka PisinSana eli pelin versio, missä kunkin kierroksen voittaja on sen kierroksen aikana pidemmän sanan syöttänyt käyttäjä.

Uusi versio toteuteaan perimällä luokka Sanapeli ja ylikirjoittamalla sen metodi kierroksen_voittaja sopivalla tavalla. Uuden luokan runko on siis seuraavanlainen

class PisinSana(Sanapeli):\n    def __init__(self, kierrokset: int):\n        super().__init__(kierrokset)\n\n    def kierroksen_voittaja(self, pelaaja1_sana: str, pelaaja2_sana: str):\n        # tänne voittajan ratkaiseva koodi

Esimerkki toiminnasta:

p = PisinSana(3)\np.pelaa()

Sanapeli:\nkierros 1\npelaaja1: lyhyt\npelaaja2: pitkäsana\npelaaja 2 voitti\nkierros 2\npelaaja1: sana\npelaaja2: vat?\nkierros 3\npelaaja1: olen paras\npelaaja2: minäpäs\npelaaja 1 voitti\npeli päättyi, voitot:\npelaaja 1: 1\npelaaja 2: 1

Eniten vokaaleja voittaa

Tee nyt luokka EnitenVokaaleja eli pelin versio, missä kunkin kierroksen voittaja on se pelaaja, jonka sanassa oli enemmän vokaaleja.

Kivi, paperi, sakset

Tee nyt luokka KiviPaperiSakset joka mallintaa nimensä mukaisesti kivi, paperi ja sakset -peliä.

Pelin säännöt ovat seuraavat:

    \n
  • kivi voittaa sakset (kivellä voi rikkoa sakset eikä saksilla voi leikata kiveä)
  • \n
  • paperi voittaa kiven (kiven voi peittää paperilla)
  • \n
  • sakset voittaa paperin (saksilla voi leikata paperia)
  • \n

Jos pelaajan syöte on epäkelpo, eli se ei ole mikään sanoista kivi, paperi, sakset pelaaja häviää kierroksen, ellei molempien syöte ole epäkelpo.

Esimerkki toiminnasta:

p = KiviPaperiSakset(4)\np.pelaa()

Sanapeli:\nkierros 1\npelaaja1: kivi\npelaaja2: kivi\nkierros 2\npelaaja1: kivi\npelaaja2: paperi\npelaaja 2 voitti\nkierros 3\npelaaja1: sakset\npelaaja2: paperi\npelaaja 1 voitti\nkierros 4\npelaaja1: paperi\npelaaja2: dynamiitti\npelaaja 1 voitti\npeli päättyi, voitot:\npelaaja 1: 2\npelaaja 2: 1

","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-10/1-luokkahierarkiat.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät mitä tarkoitetaan perinnällä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat kirjoittaa luokkia jotka perivät jonkin toisen luokan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät miten eri piirteet periytyvät"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"luokkien-erikoistaminen","style":"position:relative;"},"children":[{"type":"text","value":"Luokkien erikoistaminen"},{"type":"element","tagName":"a","properties":{"href":"#luokkien-erikoistaminen","ariaLabel":"luokkien erikoistaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joskus tulee vastaan tilanne, jossa luokan toimintaa olisi hyvä pyrkiä erikoistamaan, mutta vain osalle olioista. Tarkastellaan esimerkkinä tilannetta, jossa meillä on kaksi luokkaa - Opiskelija ja Opettaja. Yksinkertaistuksen vuoksi luokista on jätetty pois kaikki asetus- ja havainnointimetodit."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opnro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opnro "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opnro\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sposti\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opintopisteet\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opettaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" huone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opetusvuosia"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sposti\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"huone "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" huone\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opetusvuosia "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opetusvuosia\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yksinkertaistetustakin esimerkistä huomataan, että luokilla on yhteisiä piirteitä - tässä tapauksessa nimi ja sähköpostiosoite. Monessa tilanteessa olisi hyvä, jos yhteisiä piirteitä voitaisin käsitellä yhdellä operaatiolla: oletetaan tilanne, jossa koulun sähköpostitunnus muuttuu. Toki voitaisiin kirjoittaa kaksi käsittelyfunktiota..."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"korjaa_email"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"o"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n o"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" o"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"replace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\".com\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\".edu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"korjaa_email2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"o"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Opettaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n o"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" o"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"replace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\".com\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\".edu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"...mutta saman koodin toistaminen kahteen kertaan tuntuu turhalta työltä, ja lisää virheiden mahdollisuutta. Olisi siis hyvä, jos molempien luokkien mukaisia olioita voitaisiin käsitellä samalla metodilla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokat kuitenkin sisältävät myös piirteitä, joita toisella luokalla ei ole. Sen takia luokkien yhdistäminen ei tunnu järkevältä."}]},{"type":"element","tagName":"h2","properties":{"id":"perinta","style":"position:relative;"},"children":[{"type":"text","value":"Perintä"},{"type":"element","tagName":"a","properties":{"href":"#perinta","ariaLabel":"perinta permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ratkaisu löytyy olio-ohjelmoinnin tekniikasta nimeltä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"perintä"}]},{"type":"text","value":". Perinnällä tarkoitetaan sitä, että luokka "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"perii"}]},{"type":"text","value":" piirteet joltain toiselta luokalta. Näiden perittyjen piirteiden rinnalle luokka voi sitten toteuttaa uusia piirteitä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Opettaja- ja Opiskelija-luokilla voisi olla yhteinen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"yliluokka"}]},{"type":"text","value":" "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sposti\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokassa on toteutettu siis henkilöön liittyvät piirteet. Nyt luokat Opiskelija ja Opettaja voivat "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"periä"}]},{"type":"text","value":" luokan ja lisätä perittyjen ominaisuuksien rinnalle uusia piirteitä:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Perintä tapahtuu kirjoittamalla luokan nimen perään perittävän luokan nimi sulkuihin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sposti\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"vaihda_spostitunniste"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" uusi_tunniste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n vanha "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"@\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"replace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vanha"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" uusi_tunniste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opnro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opnro "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opnro\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sposti\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opintopisteet\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opettaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" huone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opetusvuosia"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sposti\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"huone "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" huone\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opetusvuosia "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opetusvuosia\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Testi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n olli "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olli Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1234\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"olli@example.com\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n olli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vaihda_spostitunniste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"example.edu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"olli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n outi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opettaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Outi Ope\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"outi@example.fi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"A123\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n outi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vaihda_spostitunniste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"example.ex\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"outi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska sekä Opiskelija että Opettaja perivät luokan Henkilo, molemmilla on käytössään Henkilo-luokassa määritellyt piirteet, mukaanlukien metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vaihda_spostitunniste"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan vielä toista esimerkkiä, jossa luokka Kirjahylly perii luokan Laatikko:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kirja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Luokka mallintaa yksinkertaista kirjaa \"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirjailija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjailija "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kirjailija\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kirjalaatikko"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Luokka mallintaa laatikkoa, johon voidaan tallentaa kirjoja \"\"\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_kirja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"listaa_kirjat"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" kirja "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjailija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kirjahylly"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kirjalaatikko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Luokka mallintaa yksinkertaista kirjahyllyä \"\"\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"super"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__init__"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_kirja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" paikka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"insert"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"paikka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokassa Kirjahylly on määritelty metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_kirja"}]},{"type":"text","value":". Samanniminen metodi on määritelty myös yliluokassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kirjalaatikko"}]},{"type":"text","value":". Tällaisessa tapauksessa puhutaan metodin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"uudelleenmäärittelystä"}]},{"type":"text","value":" tai ylikirjoituksesta (overwriting): aliluokan samanniminen metodi korvaa yliluokan vastaavan metodin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkissämme idea on, että kirjalaatikossa kirja asetetaan aina laatikossa päällimmäiseksi, mutta kirjahyllyssä voidaan määritellä asetuspaikka. Sen sijaan metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"listaa_kirjat"}]},{"type":"text","value":" uudelleenmäärittelyä ei ole nähty tarpeelliseksi - sama kirjojen listaus toimii niin laatikossa kuin hyllyssäkin (ainakin esimerkissämme)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkiä luokkien käyttämisestä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luodaan pari kirjaa testiksi"}]},{"type":"text","value":"\n k1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"7 veljestä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aleksis Kivi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n k2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sinuhe\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mika Waltari\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n k3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tuntematon sotilas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Väinö Linna\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luodaan kirjalaatikko ja lisätään kirjat sinne"}]},{"type":"text","value":"\n laatikko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirjalaatikko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n laatikko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n laatikko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n laatikko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luodaan kirjahylly ja lisätään kirjat sinne (aina hyllyn alkupäähän)"}]},{"type":"text","value":"\n hylly "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirjahylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n hylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n hylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n hylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Laatikossa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n laatikko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"listaa_kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hyllyssä:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n hylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"listaa_kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":" "},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laatikossa:\n7 veljestä (Aleksis Kivi)\nSinuhe (Mika Waltari)\nTuntematon sotilas (Väinö Linna)"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hyllyssä:\nTuntematon sotilas (Väinö Linna)\nSinuhe (Mika Waltari)\n7 veljestä (Aleksis Kivi)"}]},{"type":"text","value":" "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Myös Kirjahylly-luokasta muodostettujen olioiden kautta voidaan käyttää metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"listaa_kirjat"}]},{"type":"text","value":", koska perinnän ansiosta se on olemassa myös luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kirjahylly"}]},{"type":"text","value":" aliluokissa."}]},{"type":"element","tagName":"h2","properties":{"id":"piirteiden-periytyminen","style":"position:relative;"},"children":[{"type":"text","value":"Piirteiden periytyminen"},{"type":"element","tagName":"a","properties":{"href":"#piirteiden-periytyminen","ariaLabel":"piirteiden periytyminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aliluokka perii yliluokalta kaikki piirteet. Aliluokasta voidaan viitata suoraan yliluokan piirteisiin, paitsi jos yliluokassa on määritelty piirteet yksityisiksi (käyttämällä kahta alaviivaa muuttujan nimen edessä)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Niinpä esimerkiksi Kirjahylly-luokasta voitaisiin viitata yliluokan konstruktoriin sen sijaan että kirjoitettaisiin toiminnallisuus uudestaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kirjahylly"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kirjalaatikko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"super"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__init__"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yliluokan konstuktoriin (tai yliluokkaan muutenkin) viitataan funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"super()"}]},{"type":"text","value":" avulla. Huomaa, että tässäkin tapauksessa parametri "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":" lisätään automaattisesti."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan toisena esimerkkinä luokkaa Gradu, joka perii luokan Kirja. Aliluokasta kutsutaan yliluokan konstruktoria:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kirja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Luokka mallintaa yksinkertaista kirjaa \"\"\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirjailija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjailija "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kirjailija\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Gradu"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Luokka mallintaa gradua eli ylemmän korkeakoulututkinnon lopputyötä \"\"\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirjailija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvosana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"super"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__init__"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirjailija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvosana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" arvosana\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt Gradu-luokan konstruktorista kutsutaan yliluokan (eli luokan Kirja) konstruktoria, jossa asetetaan attribuuttien "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kirjailija"}]},{"type":"text","value":" arvot. Sen jälkeen aliluokan konstruktorissa asetetaan attribuutin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"arvosana"}]},{"type":"text","value":" arvo - tätä luonnollisesti ei voida tehdä yliluokan konstruktorissa, koska yliluokalla ei tällaista attribuuttia ole."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkaa voidaan käyttää esimerkiksi näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Testataan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n gradu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Gradu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Python ja maailmankaikkeus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan kenttien arvot"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"gradu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"gradu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjailija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"gradu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvosana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python ja maailmankaikkeus\nPekka Python\n3"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska aliluokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Gradu"}]},{"type":"text","value":" perii kaikki yliluokan piirteet, se perii myös attribuutit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kirjailija"}]},{"type":"text","value":". Arvot osalle attribuuteista annetaan yliluokan sisältä löytyvässä konstruktorissa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aliluokka voi myös viitata yliluokan metodiin, vaikka metodi olisikin määritelty uudestaan aliluokassa. Seuraavassa esimerkissä luokasta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Platinakortti"}]},{"type":"text","value":" kutsutaan uudelleenmääritellyssä metodissa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"bonuspisteet"}]},{"type":"text","value":" yliluokan vastaavaa metodia."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Tuote"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" hinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" hinta\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Bonuskortti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ostetut_tuotteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_tuote"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ostetut_tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"laske_bonus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n bonus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tuote "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ostetut_tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n bonus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.05"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" bonus\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Platinakortti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Bonuskortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"super"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__init__"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"laske_bonus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kutsutaan yliluokan metodia..."}]},{"type":"text","value":"\n bonus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"super"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"laske_bonus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ...ja lisätään vielä viisi prosenttia päälle"}]},{"type":"text","value":"\n bonus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" bonus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1.05"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" bonus\n\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt platinakortin bonus lasketaan hyödyntämällä aluksi yliluokan vastaavaa metodia ja lisäämällä sitten ylimääräiset 5 prosenttia tähän bonukseen. Esimerkki luokkien käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Bonuskortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Banaanit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6.50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mandariinit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n bonus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"laske_bonus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n kortti2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Platinakortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kortti2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Banaanit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6.50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kortti2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mandariinit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n bonus2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kortti2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"laske_bonus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"bonus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"bonus2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"0.7225\n0.7586250000000001"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kannettava tietokone","tmcname":"osa10-01_kannettava_tietokone"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on määritelty luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tietokone"}]},{"type":"text","value":", jolla on attribuutit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"malli"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nopeus"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"KannettavaTietokone"}]},{"type":"text","value":", joka "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"perii luokan Tietokone"}]},{"type":"text","value":". Luokka saa konstruktorissa luokan Tietokone attribuuttien lisäksi kolmannen kokonaislukutyyppisen attribuutin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"paino"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita luokkaan lisäksi metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":", jonka avulla voi tulostaa esimerkkisuorituksen mukaisen tulosteen olion tilasta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ipm "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" KannettavaTietokone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"IPM MikroMauri\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ipm"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"IPM MikroMauri, 1500 MHz, 2 kg"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Pelimuseo","tmcname":"osa10-02_pelimuseo"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on määritelty luokat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tietokonepeli"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pelivarasto"}]},{"type":"text","value":". Pelivarastoon voidaan säilöä tietokonepelejä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tutustu luokkien ohjelmakoodiin ja kirjoita sitten uusi luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pelimuseo"}]},{"type":"text","value":", joka perii luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pelivarasto"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelimuseo-luokassa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"uudelleentoteutetaan"}]},{"type":"text","value":" metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"anna_pelit()"}]},{"type":"text","value":" niin, että se palauttaa listassa ainoastaan ne pelit, jotka on tehty ennen vuotta 1990."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisäksi luokassa tulee olla konstruktori, josta "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kutsutaan yliluokan Pelivarasto konstruktoria"}]},{"type":"text","value":". Konstruktorilla ei ole parametreja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"museo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pelimuseo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmuseo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_peli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Tietokonepeli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pacman\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Namco\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1980"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmuseo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_peli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Tietokonepeli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"GTA 2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Rockstar\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1999"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmuseo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_peli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Tietokonepeli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Bubble Bobble\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Taito\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1986"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" peli "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" museo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"anna_pelit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"peli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pacman\nBubble Bobble"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Pinta-alat","tmcname":"osa10-03_pinta_alat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjan mukana tulee luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Suorakulmio"}]},{"type":"text","value":" joka nimensä mukaisesti mallintaa "},{"type":"element","tagName":"a","properties":{"href":"https://fi.wikipedia.org/wiki/Suorakulmio","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"suorakulmiota"}]},{"type":"text","value":". Luokkaa käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"suorakulmio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pinta-ala:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pinta_ala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"suorakulmio 2x3\npinta-ala: 6"}]}]},{"type":"element","tagName":"h2","properties":{"id":"nelio","style":"position:relative;"},"children":[{"type":"text","value":"Neliö"},{"type":"element","tagName":"a","properties":{"href":"#nelio","ariaLabel":"nelio permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Nelio"}]},{"type":"text","value":" joka perii luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Suorakulmio"}]},{"type":"text","value":". Suorakulmiosta poiketen "},{"type":"element","tagName":"a","properties":{"href":"https://fi.wikipedia.org/wiki/Neli%C3%B6_(geometria)","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"neliön"}]},{"type":"text","value":" kaikki sivut ovat saman pituisia, eli neliö on eräänlainen yksinkertaisempi erikoistapaus suorakulmiosta. Luokka ei saa määritellä uusia attribuutteja!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkaa käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nelio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Nelio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nelio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pinta-ala:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nelio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pinta_ala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"neliö 4x4\npinta-ala: 16"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sanapeli","tmcname":"osa10-04_sanapeli"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohja sisältää valmiin luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Sanapeli"}]},{"type":"text","value":", joka tarjoaa perustoiminnallisuuden erilaisten sanapelien pelaamiseen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" random\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Sanapeli"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kierrokset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"voitot1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"voitot2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kierrokset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kierrokset\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kierroksen_voittaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelaaja1_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelaaja2_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# arvotaan voittaja"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" random"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"randint"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pelaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sanapeli:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kierrokset"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"kierros "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n vastaus1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pelaaja1: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n vastaus2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pelaaja2: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kierroksen_voittaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vastaus1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vastaus2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"voitot1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pelaaja 1 voitti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kierroksen_voittaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vastaus1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vastaus2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"voitot2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pelaaja 2 voitti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tasapeli"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"peli päättyi, voitot:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"pelaaja 1: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"voitot1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"pelaaja 2: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"voitot2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Peliä käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"p "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Sanapeli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\np"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostus"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanapeli:\nkierros 1\npelaaja1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pitkäsana"}]},{"type":"text","value":"\npelaaja2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"??"}]},{"type":"text","value":"\npelaaja 2 voitti\nkierros 2\npelaaja1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"olen paras"}]},{"type":"text","value":"\npelaaja2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"mitä?"}]},{"type":"text","value":"\npelaaja 1 voitti\nkierros 3\npelaaja1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kuka voittaa"}]},{"type":"text","value":"\npelaaja2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"minä"}]},{"type":"text","value":"\npelaaja 1 voitti\npeli päättyi voitot:\npelaaja 1: 2\npelaaja 2: 1"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä pelin \"perusversiossa\" voittaja ratkaistaan arpomalla, pelaajien antamilla syötteillä ei ole tulokseen vaikutusta."}]},{"type":"element","tagName":"h2","properties":{"id":"pisin-sana-voittaa","style":"position:relative;"},"children":[{"type":"text","value":"Pisin sana voittaa"},{"type":"element","tagName":"a","properties":{"href":"#pisin-sana-voittaa","ariaLabel":"pisin sana voittaa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee nyt luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"PisinSana"}]},{"type":"text","value":" eli pelin versio, missä kunkin kierroksen voittaja on sen kierroksen aikana pidemmän sanan syöttänyt käyttäjä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Uusi versio toteuteaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"perimällä"}]},{"type":"text","value":" luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Sanapeli"}]},{"type":"text","value":" ja ylikirjoittamalla sen metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kierroksen_voittaja"}]},{"type":"text","value":" sopivalla tavalla. Uuden luokan runko on siis seuraavanlainen"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"PisinSana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Sanapeli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kierrokset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"super"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__init__"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kierrokset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kierroksen_voittaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelaaja1_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelaaja2_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tänne voittajan ratkaiseva koodi"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki toiminnasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"p "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" PisinSana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\np"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanapeli:\nkierros 1\npelaaja1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"lyhyt"}]},{"type":"text","value":"\npelaaja2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pitkäsana"}]},{"type":"text","value":"\npelaaja 2 voitti\nkierros 2\npelaaja1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"sana"}]},{"type":"text","value":"\npelaaja2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"vat?"}]},{"type":"text","value":"\nkierros 3\npelaaja1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"olen paras"}]},{"type":"text","value":"\npelaaja2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"minäpäs"}]},{"type":"text","value":"\npelaaja 1 voitti\npeli päättyi, voitot:\npelaaja 1: 1\npelaaja 2: 1"}]}]},{"type":"element","tagName":"h2","properties":{"id":"eniten-vokaaleja-voittaa","style":"position:relative;"},"children":[{"type":"text","value":"Eniten vokaaleja voittaa"},{"type":"element","tagName":"a","properties":{"href":"#eniten-vokaaleja-voittaa","ariaLabel":"eniten vokaaleja voittaa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee nyt luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"EnitenVokaaleja"}]},{"type":"text","value":" eli pelin versio, missä kunkin kierroksen voittaja on se pelaaja, jonka sanassa oli enemmän vokaaleja."}]},{"type":"element","tagName":"h2","properties":{"id":"kivi-paperi-sakset","style":"position:relative;"},"children":[{"type":"text","value":"Kivi, paperi, sakset"},{"type":"element","tagName":"a","properties":{"href":"#kivi-paperi-sakset","ariaLabel":"kivi paperi sakset permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee nyt luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"KiviPaperiSakset"}]},{"type":"text","value":" joka mallintaa nimensä mukaisesti "},{"type":"element","tagName":"a","properties":{"href":"https://fi.wikipedia.org/wiki/Kivi,_paperi_ja_sakset","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"kivi, paperi ja sakset"}]},{"type":"text","value":" -peliä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelin säännöt ovat seuraavat:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"kivi voittaa sakset (kivellä voi rikkoa sakset eikä saksilla voi leikata kiveä)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"paperi voittaa kiven (kiven voi peittää paperilla)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"sakset voittaa paperin (saksilla voi leikata paperia)"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos pelaajan syöte on epäkelpo, eli se ei ole mikään sanoista "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kivi, paperi, sakset"}]},{"type":"text","value":" pelaaja häviää kierroksen, ellei molempien syöte ole epäkelpo."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki toiminnasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"p "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" KiviPaperiSakset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\np"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanapeli:\nkierros 1\npelaaja1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kivi"}]},{"type":"text","value":"\npelaaja2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kivi"}]},{"type":"text","value":"\nkierros 2\npelaaja1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kivi"}]},{"type":"text","value":"\npelaaja2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"paperi"}]},{"type":"text","value":"\npelaaja 2 voitti\nkierros 3\npelaaja1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"sakset"}]},{"type":"text","value":"\npelaaja2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"paperi"}]},{"type":"text","value":"\npelaaja 1 voitti\nkierros 4\npelaaja1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"paperi"}]},{"type":"text","value":"\npelaaja2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"dynamiitti"}]},{"type":"text","value":"\npelaaja 1 voitti\npeli päättyi, voitot:\npelaaja 1: 2\npelaaja 2: 1"}]}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät mitä tarkoitetaan perinnällä
  • \n
  • Osaat kirjoittaa luokkia jotka perivät jonkin toisen luokan
  • \n
  • Tiedät miten eri piirteet periytyvät
  • \n

Luokkien erikoistaminen

Joskus tulee vastaan tilanne, jossa luokan toimintaa olisi hyvä pyrkiä erikoistamaan, mutta vain osalle olioista. Tarkastellaan esimerkkinä tilannetta, jossa meillä on kaksi luokkaa - Opiskelija ja Opettaja. Yksinkertaistuksen vuoksi luokista on jätetty pois kaikki asetus- ja havainnointimetodit.

\nclass Opiskelija:\n\n    def __init__(self, nimi: str, opnro: str, sposti: str, opintopisteet: str):\n        self.nimi = nimi\n        self.opnro = opnro\n        self.sposti = sposti\n        self.opintopisteet = opintopisteet\n\nclass Opettaja:\n\n    def __init__(self, nimi: str, sposti: str, huone: str, opetusvuosia: int):\n        self.nimi = nimi\n        self.sposti = sposti\n        self.huone = huone\n        self.opetusvuosia = opetusvuosia\n

Yksinkertaistetustakin esimerkistä huomataan, että luokilla on yhteisiä piirteitä - tässä tapauksessa nimi ja sähköpostiosoite. Monessa tilanteessa olisi hyvä, jos yhteisiä piirteitä voitaisin käsitellä yhdellä operaatiolla: oletetaan tilanne, jossa koulun sähköpostitunnus muuttuu. Toki voitaisiin kirjoittaa kaksi käsittelyfunktiota...

\ndef korjaa_email(o: Opiskelija):\n    o.sposti = o.sposti.replace(\".com\", \".edu\")\n\ndef korjaa_email2(o: Opettaja):\n    o.sposti = o.sposti.replace(\".com\", \".edu\")\n

...mutta saman koodin toistaminen kahteen kertaan tuntuu turhalta työltä, ja lisää virheiden mahdollisuutta. Olisi siis hyvä, jos molempien luokkien mukaisia olioita voitaisiin käsitellä samalla metodilla.

Luokat kuitenkin sisältävät myös piirteitä, joita toisella luokalla ei ole. Sen takia luokkien yhdistäminen ei tunnu järkevältä.

Perintä

Ratkaisu löytyy olio-ohjelmoinnin tekniikasta nimeltä perintä. Perinnällä tarkoitetaan sitä, että luokka perii piirteet joltain toiselta luokalta. Näiden perittyjen piirteiden rinnalle luokka voi sitten toteuttaa uusia piirteitä.

Opettaja- ja Opiskelija-luokilla voisi olla yhteinen yliluokka Henkilo:

\nclass Henkilo:\n\n   def __init__(self, nimi: str, sposti: str):\n       self.nimi = nimi\n       self.sposti = sposti\n

Luokassa on toteutettu siis henkilöön liittyvät piirteet. Nyt luokat Opiskelija ja Opettaja voivat periä luokan ja lisätä perittyjen ominaisuuksien rinnalle uusia piirteitä:

Perintä tapahtuu kirjoittamalla luokan nimen perään perittävän luokan nimi sulkuihin:

\nclass Henkilo:\n\n   def __init__(self, nimi: str, sposti: str):\n       self.nimi = nimi\n       self.sposti = sposti\n\n   def vaihda_spostitunniste(self, uusi_tunniste: str):\n       vanha = self.sposti.split(\"@\")[1]\n       self.sposti = self.sposti.replace(vanha, uusi_tunniste)\n\nclass Opiskelija(Henkilo):\n\n   def __init__(self, nimi: str, opnro: str, sposti: str, opintopisteet: str):\n       self.nimi = nimi\n       self.opnro = opnro\n       self.sposti = sposti\n       self.opintopisteet = opintopisteet\n\nclass Opettaja(Henkilo):\n\n   def __init__(self, nimi: str, sposti: str, huone: str, opetusvuosia: int):\n       self.nimi = nimi\n       self.sposti = sposti\n       self.huone = huone\n       self.opetusvuosia = opetusvuosia\n\n# Testi\nif __name__ == \"__main__\":\n   olli = Opiskelija(\"Olli Opiskelija\", \"1234\", \"olli@example.com\", 0)\n   olli.vaihda_spostitunniste(\"example.edu\")\n   print(olli.sposti)\n\n   outi = Opettaja(\"Outi Ope\", \"outi@example.fi\", \"A123\", 2)\n   outi.vaihda_spostitunniste(\"example.ex\")\n   print(outi.sposti)\n

Koska sekä Opiskelija että Opettaja perivät luokan Henkilo, molemmilla on käytössään Henkilo-luokassa määritellyt piirteet, mukaanlukien metodi vaihda_spostitunniste.

Tarkastellaan vielä toista esimerkkiä, jossa luokka Kirjahylly perii luokan Laatikko:

class Kirja:\n   \"\"\" Luokka mallintaa yksinkertaista kirjaa \"\"\"\n   def __init__(self, nimi: str, kirjailija: str):\n       self.nimi = nimi\n       self.kirjailija = kirjailija\n\n\nclass Kirjalaatikko:\n   \"\"\" Luokka mallintaa laatikkoa, johon voidaan tallentaa kirjoja \"\"\"\n\n   def __init__(self):\n       self.kirjat = []\n\n   def lisaa_kirja(self, kirja: Kirja):\n       self.kirjat.append(kirja)\n\n   def listaa_kirjat(self):\n       for kirja in self.kirjat:\n           print(f\"{kirja.nimi} ({kirja.kirjailija})\")\n\nclass Kirjahylly(Kirjalaatikko):\n   \"\"\" Luokka mallintaa yksinkertaista kirjahyllyä \"\"\"\n\n   def __init__(self):\n       super().__init__()\n\n   def lisaa_kirja(self, kirja: Kirja, paikka: int):\n       self.kirjat.insert(paikka, kirja)\n\n

Luokassa Kirjahylly on määritelty metodi lisaa_kirja. Samanniminen metodi on määritelty myös yliluokassa Kirjalaatikko. Tällaisessa tapauksessa puhutaan metodin uudelleenmäärittelystä tai ylikirjoituksesta (overwriting): aliluokan samanniminen metodi korvaa yliluokan vastaavan metodin.

Esimerkissämme idea on, että kirjalaatikossa kirja asetetaan aina laatikossa päällimmäiseksi, mutta kirjahyllyssä voidaan määritellä asetuspaikka. Sen sijaan metodin listaa_kirjat uudelleenmäärittelyä ei ole nähty tarpeelliseksi - sama kirjojen listaus toimii niin laatikossa kuin hyllyssäkin (ainakin esimerkissämme).

Tarkastellaan esimerkkiä luokkien käyttämisestä:

\nif __name__ == \"__main__\":\n   # Luodaan pari kirjaa testiksi\n   k1 = Kirja(\"7 veljestä\", \"Aleksis Kivi\")\n   k2 = Kirja(\"Sinuhe\", \"Mika Waltari\")\n   k3 = Kirja(\"Tuntematon sotilas\", \"Väinö Linna\")\n\n   # Luodaan kirjalaatikko ja lisätään kirjat sinne\n   laatikko = Kirjalaatikko()\n   laatikko.lisaa_kirja(k1)\n   laatikko.lisaa_kirja(k2)\n   laatikko.lisaa_kirja(k3)\n\n   # Luodaan kirjahylly ja lisätään kirjat sinne (aina hyllyn alkupäähän)\n   hylly = Kirjahylly()\n   hylly.lisaa_kirja(k1, 0)\n   hylly.lisaa_kirja(k2, 0)\n   hylly.lisaa_kirja(k3, 0)\n\n\n   # Tulostetaan\n   print(\"Laatikossa:\")\n   laatikko.listaa_kirjat()\n\n   print()\n\n   print(\"Hyllyssä:\")\n   hylly.listaa_kirjat()\n

Laatikossa:\n7 veljestä (Aleksis Kivi)\nSinuhe (Mika Waltari)\nTuntematon sotilas (Väinö Linna)

Hyllyssä:\nTuntematon sotilas (Väinö Linna)\nSinuhe (Mika Waltari)\n7 veljestä (Aleksis Kivi)

Myös Kirjahylly-luokasta muodostettujen olioiden kautta voidaan käyttää metodia listaa_kirjat, koska perinnän ansiosta se on olemassa myös luokan Kirjahylly aliluokissa.

Piirteiden periytyminen

Aliluokka perii yliluokalta kaikki piirteet. Aliluokasta voidaan viitata suoraan yliluokan piirteisiin, paitsi jos yliluokassa on määritelty piirteet yksityisiksi (käyttämällä kahta alaviivaa muuttujan nimen edessä).

Niinpä esimerkiksi Kirjahylly-luokasta voitaisiin viitata yliluokan konstruktoriin sen sijaan että kirjoitettaisiin toiminnallisuus uudestaan:

\nclass Kirjahylly(Kirjalaatikko):\n\n   def __init__(self):\n       super().__init__()\n

Yliluokan konstuktoriin (tai yliluokkaan muutenkin) viitataan funktion super() avulla. Huomaa, että tässäkin tapauksessa parametri self lisätään automaattisesti.

Tarkastellaan toisena esimerkkinä luokkaa Gradu, joka perii luokan Kirja. Aliluokasta kutsutaan yliluokan konstruktoria:

\nclass Kirja:\n    \"\"\" Luokka mallintaa yksinkertaista kirjaa \"\"\"\n\n    def __init__(self, nimi: str, kirjailija: str):\n        self.nimi = nimi\n        self.kirjailija = kirjailija\n\n\nclass Gradu(Kirja):\n    \"\"\" Luokka mallintaa gradua eli ylemmän korkeakoulututkinnon lopputyötä \"\"\"\n\n    def __init__(self, nimi: str, kirjailija: str, arvosana: int):\n        super().__init__(nimi, kirjailija)\n        self.arvosana = arvosana\n

Nyt Gradu-luokan konstruktorista kutsutaan yliluokan (eli luokan Kirja) konstruktoria, jossa asetetaan attribuuttien nimi ja kirjailija arvot. Sen jälkeen aliluokan konstruktorissa asetetaan attribuutin arvosana arvo - tätä luonnollisesti ei voida tehdä yliluokan konstruktorissa, koska yliluokalla ei tällaista attribuuttia ole.

Luokkaa voidaan käyttää esimerkiksi näin:

\n# Testataan\nif __name__ == \"__main__\":\n    gradu = Gradu(\"Python ja maailmankaikkeus\", \"Pekka Python\", 3)\n\n    # Tulostetaan kenttien arvot\n    print(gradu.nimi)\n    print(gradu.kirjailija)\n    print(gradu.arvosana)\n

Python ja maailmankaikkeus\nPekka Python\n3

Koska aliluokka Gradu perii kaikki yliluokan piirteet, se perii myös attribuutit nimi ja kirjailija. Arvot osalle attribuuteista annetaan yliluokan sisältä löytyvässä konstruktorissa.

Aliluokka voi myös viitata yliluokan metodiin, vaikka metodi olisikin määritelty uudestaan aliluokassa. Seuraavassa esimerkissä luokasta Platinakortti kutsutaan uudelleenmääritellyssä metodissa bonuspisteet yliluokan vastaavaa metodia.

\nclass Tuote:\n\n    def __init__(self, nimi: str, hinta: float):\n        self.nimi = nimi\n        self.hinta = hinta\n\nclass Bonuskortti:\n\n    def __init__(self):\n        self.ostetut_tuotteet = []\n\n    def lisaa_tuote(self, tuote: Tuote):\n        self.ostetut_tuotteet.append(tuote)\n\n    def laske_bonus(self):\n        bonus = 0\n        for tuote in self.ostetut_tuotteet:\n            bonus += tuote.hinta * 0.05\n\n        return bonus\n\nclass Platinakortti(Bonuskortti):\n\n    def __init__(self):\n        super().__init__()\n\n    def laske_bonus(self):\n        # Kutsutaan yliluokan metodia...\n        bonus = super().laske_bonus()\n\n        # ...ja lisätään vielä viisi prosenttia päälle\n        bonus = bonus * 1.05\n        return bonus\n\n

Nyt platinakortin bonus lasketaan hyödyntämällä aluksi yliluokan vastaavaa metodia ja lisäämällä sitten ylimääräiset 5 prosenttia tähän bonukseen. Esimerkki luokkien käytöstä:

if __name__ == \"__main__\":\n    kortti = Bonuskortti()\n    kortti.lisaa_tuote(Tuote(\"Banaanit\", 6.50))\n    kortti.lisaa_tuote(Tuote(\"Mandariinit\", 7.95))\n    bonus = kortti.laske_bonus()\n\n    kortti2 = Platinakortti()\n    kortti2.lisaa_tuote(Tuote(\"Banaanit\", 6.50))\n    kortti2.lisaa_tuote(Tuote(\"Mandariinit\", 7.95))\n    bonus2 = kortti2.laske_bonus()\n\n    print(bonus)\n    print(bonus2)

0.7225\n0.7586250000000001

Tehtäväpohjassa on määritelty luokka Tietokone, jolla on attribuutit malli ja nopeus.

Kirjoita luokka KannettavaTietokone, joka perii luokan Tietokone. Luokka saa konstruktorissa luokan Tietokone attribuuttien lisäksi kolmannen kokonaislukutyyppisen attribuutin paino.

Kirjoita luokkaan lisäksi metodi __str__, jonka avulla voi tulostaa esimerkkisuorituksen mukaisen tulosteen olion tilasta.

Esimerkki:

ipm = KannettavaTietokone(\"IPM MikroMauri\", 1500, 2)\nprint(ipm)

IPM MikroMauri, 1500 MHz, 2 kg

Tehtäväpohjassa on määritelty luokat Tietokonepeli ja Pelivarasto. Pelivarastoon voidaan säilöä tietokonepelejä.

Tutustu luokkien ohjelmakoodiin ja kirjoita sitten uusi luokka Pelimuseo, joka perii luokan Pelivarasto.

Pelimuseo-luokassa uudelleentoteutetaan metodi anna_pelit() niin, että se palauttaa listassa ainoastaan ne pelit, jotka on tehty ennen vuotta 1990.

Lisäksi luokassa tulee olla konstruktori, josta kutsutaan yliluokan Pelivarasto konstruktoria. Konstruktorilla ei ole parametreja.

Esimerkiksi:

museo = Pelimuseo()\nmuseo.lisaa_peli(Tietokonepeli(\"Pacman\", \"Namco\", 1980))\nmuseo.lisaa_peli(Tietokonepeli(\"GTA 2\", \"Rockstar\", 1999))\nmuseo.lisaa_peli(Tietokonepeli(\"Bubble Bobble\", \"Taito\", 1986))\nfor peli in museo.anna_pelit():\n    print(peli.nimi)

Pacman\nBubble Bobble

Tehtäväpohjan mukana tulee luokka Suorakulmio joka nimensä mukaisesti mallintaa suorakulmiota. Luokkaa käytetään seuraavasti:

suorakulmio = Suorakulmio(2, 3)\nprint(suorakulmio)\nprint(\"pinta-ala:\", suorakulmio.pinta_ala())

suorakulmio 2x3\npinta-ala: 6

Neliö

Toteuta luokka Nelio joka perii luokan Suorakulmio. Suorakulmiosta poiketen neliön kaikki sivut ovat saman pituisia, eli neliö on eräänlainen yksinkertaisempi erikoistapaus suorakulmiosta. Luokka ei saa määritellä uusia attribuutteja!

Luokkaa käytetään seuraavasti:

nelio = Nelio(4)\nprint(nelio)\nprint(\"pinta-ala:\", nelio.pinta_ala())

neliö 4x4\npinta-ala: 16

Tehtäväpohja sisältää valmiin luokan Sanapeli, joka tarjoaa perustoiminnallisuuden erilaisten sanapelien pelaamiseen:

import random\n\nclass Sanapeli():\n    def __init__(self, kierrokset: int):\n        self.voitot1 = 0\n        self.voitot2 = 0\n        self.kierrokset = kierrokset\n\n    def kierroksen_voittaja(self, pelaaja1_sana: str, pelaaja2_sana: str):\n        # arvotaan voittaja\n        return random.randint(1, 2)\n\n    def pelaa(self):\n        print(\"Sanapeli:\")\n        for i in range(1, self.kierrokset+1):\n            print(f\"kierros {i}\")\n            vastaus1 = input(\"pelaaja1: \")\n            vastaus2 = input(\"pelaaja2: \")\n\n            if self.kierroksen_voittaja(vastaus1, vastaus2) == 1:\n                self.voitot1 += 1\n                print(\"pelaaja 1 voitti\")\n            elif self.kierroksen_voittaja(vastaus1, vastaus2) == 2:\n                self.voitot2 += 1\n                print(\"pelaaja 2 voitti\")\n            else:\n                pass # tasapeli\n\n        print(\"peli päättyi, voitot:\")\n        print(f\"pelaaja 1: {self.voitot1}\")\n        print(f\"pelaaja 2: {self.voitot2}\")

Peliä käytetään seuraavasti:

p = Sanapeli(3)\np.pelaa()

Esimerkkitulostus

Sanapeli:\nkierros 1\npelaaja1: pitkäsana\npelaaja2: ??\npelaaja 2 voitti\nkierros 2\npelaaja1: olen paras\npelaaja2: mitä?\npelaaja 1 voitti\nkierros 3\npelaaja1: kuka voittaa\npelaaja2: minä\npelaaja 1 voitti\npeli päättyi voitot:\npelaaja 1: 2\npelaaja 2: 1

Tässä pelin \"perusversiossa\" voittaja ratkaistaan arpomalla, pelaajien antamilla syötteillä ei ole tulokseen vaikutusta.

Pisin sana voittaa

Tee nyt luokka PisinSana eli pelin versio, missä kunkin kierroksen voittaja on sen kierroksen aikana pidemmän sanan syöttänyt käyttäjä.

Uusi versio toteuteaan perimällä luokka Sanapeli ja ylikirjoittamalla sen metodi kierroksen_voittaja sopivalla tavalla. Uuden luokan runko on siis seuraavanlainen

class PisinSana(Sanapeli):\n    def __init__(self, kierrokset: int):\n        super().__init__(kierrokset)\n\n    def kierroksen_voittaja(self, pelaaja1_sana: str, pelaaja2_sana: str):\n        # tänne voittajan ratkaiseva koodi

Esimerkki toiminnasta:

p = PisinSana(3)\np.pelaa()

Sanapeli:\nkierros 1\npelaaja1: lyhyt\npelaaja2: pitkäsana\npelaaja 2 voitti\nkierros 2\npelaaja1: sana\npelaaja2: vat?\nkierros 3\npelaaja1: olen paras\npelaaja2: minäpäs\npelaaja 1 voitti\npeli päättyi, voitot:\npelaaja 1: 1\npelaaja 2: 1

Eniten vokaaleja voittaa

Tee nyt luokka EnitenVokaaleja eli pelin versio, missä kunkin kierroksen voittaja on se pelaaja, jonka sanassa oli enemmän vokaaleja.

Kivi, paperi, sakset

Tee nyt luokka KiviPaperiSakset joka mallintaa nimensä mukaisesti kivi, paperi ja sakset -peliä.

Pelin säännöt ovat seuraavat:

    \n
  • kivi voittaa sakset (kivellä voi rikkoa sakset eikä saksilla voi leikata kiveä)
  • \n
  • paperi voittaa kiven (kiven voi peittää paperilla)
  • \n
  • sakset voittaa paperin (saksilla voi leikata paperia)
  • \n

Jos pelaajan syöte on epäkelpo, eli se ei ole mikään sanoista kivi, paperi, sakset pelaaja häviää kierroksen, ellei molempien syöte ole epäkelpo.

Esimerkki toiminnasta:

p = KiviPaperiSakset(4)\np.pelaa()

Sanapeli:\nkierros 1\npelaaja1: kivi\npelaaja2: kivi\nkierros 2\npelaaja1: kivi\npelaaja2: paperi\npelaaja 2 voitti\nkierros 3\npelaaja1: sakset\npelaaja2: paperi\npelaaja 1 voitti\nkierros 4\npelaaja1: paperi\npelaaja2: dynamiitti\npelaaja 1 voitti\npeli päättyi, voitot:\npelaaja 1: 2\npelaaja 2: 1

","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-10/1-luokkahierarkiat.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-10/2-nakyvyysmaareet/page-data.json b/page-data/osa-10/2-nakyvyysmaareet/page-data.json index 4673d98dc..08f102307 100644 --- a/page-data/osa-10/2-nakyvyysmaareet/page-data.json +++ b/page-data/osa-10/2-nakyvyysmaareet/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-10/2-nakyvyysmaareet", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät mitä eroa on näkyvyysmääreillä yksityinen ja suojattu"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten piirteiden näkyvyys määritetään Pythonissa"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aikaisemmin mainittiin, että yliluokassa yksityiseksi määritettyihin piirteisiin ei pääse käsiksi aliluokassa. Tarkastellaan esimerkkinä luokkaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Muistikirja"}]},{"type":"text","value":", jossa muistiinpanojen säilyttämiseen käytettävä lista-attribuutti on piilotettu asiakkailta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Muistikirja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Muistikirjaan voidaan tallentaa muistiinpanoja merkkijonoina \"\"\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# yksityinen attribuutti"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__muistiinpanot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_muistiinpano"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" muistiinpano"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"muistiinpano"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"palauta_muistiinpano"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" indeksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"indeksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kaikki_muistiinpanot"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\",\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokan sisäisen eheyden kannalta tietorakenteena toimivan listan piilottaminen asiakkaalta on sinänsä järkevää, koska luokka tarjoaa itse sopivat operaatiot muistiinpanojen lisäämiseksi ja selaamiseksi. Ongelmalliseksi tilanne muodostuu, jos yritetään kirjoittaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Muistikirja"}]},{"type":"text","value":"-luokan perivä luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ProMuistikirja"}]},{"type":"text","value":", johon halutaan lisätä muistiinpanojen etsiminen ja järjestäminen. Piilotettu attribuutti ei ole käytettävissä myöskään aliluokissa; metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"etsi_muistiinpanot"}]},{"type":"text","value":" antaa kutsuttaessa virheen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"MuistikirjaPro"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Muistikirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Parempi muistikirja haku- ja järjestystoiminnoilla \"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tämä on ok, koska luokan Muistikirja konstruktori"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# on julkinen"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"super"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__init__"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tämä antaa virheen"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"etsi_muistiinpanot"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" hakusana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n loydetty "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Attribuutti __muistiinpanot on yksityinen, eikä näy"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# aliluokalle"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" muistiinpano "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" hakusana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" muistiinpano"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n loydetty"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"muistiinpano"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" loydetty\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"AttributeError: 'MuistikirjaPro' object has no attribute '_MuistikirjaPro__muistiinpanot'"}]}]},{"type":"element","tagName":"h2","properties":{"id":"suojatut-piirteet","style":"position:relative;"},"children":[{"type":"text","value":"Suojatut piirteet"},{"type":"element","tagName":"a","properties":{"href":"#suojatut-piirteet","ariaLabel":"suojatut piirteet permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toisin kuin joistain muista ohjelmointikielistä, Pythonista ei suoraan löydy ominaisuutta joka piilottaa piirteet asiakkailta mutta samaan aikaan avaa ne mahdollisille aliluokille. Ratkaisuksi Python-yhteisö onkin päätynyt "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"konventioon"}]},{"type":"text","value":" eli yleisesti ymmärrettyyn merkintätapaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"suojatuille"}]},{"type":"text","value":" (eli "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"protected"}]},{"type":"text","value":") piirteille."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska piirre voidaan piilottaa kirjoittamalla sen tunnisteen (eli nimen) eteen kaksi alaviivaa"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__muistiinpanot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"on yleisesti sovittu että yhdellä alaviivalla alkavat piirteet ovat tarkoitettu ainoastaan luokan ja sen aliluokkien käyttöön, eikä niitä tulisi käyttää suoraan sen ulkopuolelta."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_muistiinpanot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Alla on esitetty koko muistikirjaesimerkki uudestaan niin, että muistiinpanot on merkitty suojatuiksi yliluokassa yksityisen sijasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Muistikirja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Muistikirjaan voidaan tallentaa muistiinpanoja merkkijonoina \"\"\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# suojattu attribuutti"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_muistiinpanot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_muistiinpano"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" muistiinpano"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"muistiinpano"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"palauta_muistiinpano"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" indeksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"indeksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kaikki_muistiinpanot"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\",\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"MuistikirjaPro"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Muistikirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Parempi muistikirja haku- ja järjestystoiminnoilla \"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tämä on ok, koska luokan Muistikirja konstruktori"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# on julkinen"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"super"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__init__"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Nyt metodi toimii, koska suojattu attribuutti näkyy"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# aliluokalle"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"etsi_muistiinpanot"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" hakusana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n loydetty "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" muistiinpano "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" hakusana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" muistiinpano"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n loydetty"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"muistiinpano"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" loydetty\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa taulukossa on vielä esitetty piirteiden näkyvyys kaikkien eri suojausmääreiden tapauksessa:"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Näkyvyysmääre"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Esimerkki"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Näkyy asiakkaalle"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Näkyy aliluokalle"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Julkinen"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self.nimi"}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"kyllä"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"kyllä"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Suojattu"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self._nimi"}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"ei"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"kyllä"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Yksityinen"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self.__nimi"}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"ei"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"ei"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Näkyvyysmääreet toimivat vastaavasti kaikkien piirteiden kanssa. Luokassa Henkilo oleva metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"isot_alkukirjaimet"}]},{"type":"text","value":" on suojattu, joten sitä voi käyttää myös aliluokassa Jalkapalloilija:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_isot_alkukirjaimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"_isot_alkukirjaimet"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nimi_isoilla "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nimi_isoilla"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"capitalize"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi_isoilla"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__repr__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Jalkapalloilija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lempinimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelipaikka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"super"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__init__"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# metodia voi kutsua, koska se on suojattu yliluokassa"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__lempinimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_isot_alkukirjaimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lempinimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__pelipaikka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pelipaikka\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__repr__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n r "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Jalkapalloilija - nimi:"}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", lempinimi: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__lempinimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"text","value":"\n r "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\", pelipaikka: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__pelipaikka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" r\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Testataan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n jp "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Jalkapalloilija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"petri pythonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pyttis\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hyökkääjä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jp"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jalkapalloilija - nimi:Petri Pythonen, lempinimi: Pyttis, pelipaikka: hyökkääjä"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Superryhmä","tmcname":"osa10-05_superryhma"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on valmiina luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"SuperSankari"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"SuperRyhma"}]},{"type":"text","value":", joka mallintaa supersankareista koostuvaa ryhmää. Luokalla pitää olla seuraava piirteet:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Suojatut"}]},{"type":"text","value":" attribuutit nimi (merkkijono), kotipaikka (merkkijono) ja jasenet (lista)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Konstruktori, joka saa parametrikseen tässä järjestyksessä nimen ja kotipaikan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Havainnointimetodit nimelle ja kotipaikalle"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_jasen(sankari: SuperSankari)"}]},{"type":"text","value":", joka lisää uuden jäsenen ryhmään"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta_ryhma"}]},{"type":"text","value":", joka tulostaa ryhmän ja sen jäsenten tiedot alla olevan esimerkin mukaisesti"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki luokan käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"supermiekkonen "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" SuperSankari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Supermiekkonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Supernopeus, supervoimakkuus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnakymaton "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" SuperSankari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Näkymätön Makkonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Näkymättömyys\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nryhma_z "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" SuperRyhma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ryhmä Z\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kälviä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nryhma_z"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_jasen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"supermiekkonen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nryhma_z"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_jasen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nakymaton"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nryhma_z"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_ryhma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ryhmä Z, Kälviä\nJäsenet:\nSupermiekkonen, superkyvyt: Supernopeus, supervoimakkuus\nNäkymätön Makkonen, superkyvyt: Näkymättömyys"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"/osa-9/3-kapselointi#asetus--ja-havainnointimetodit"},"children":[{"type":"text","value":"Tämän"}]},{"type":"text","value":" luvun kertaaminen voi olla hyödyksi."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Salainen taikajuoma","tmcname":"osa10-06_salainen_taikajuoma"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Taikajuoma"}]},{"type":"text","value":", johon käyttäjä voi tallentaa reseptin. Luokasta löytyy konstruktorin lisäksi metodit"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_aines(ainesosa: str, maara: float)"}]},{"type":"text","value":" ja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta_resepti()"}]}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Taikajuoma"}]},{"type":"text","value":"-luokan perivä luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"SalainenTaikajuoma"}]},{"type":"text","value":", jolla resepti voidaan suojata salasanalla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Uusi luokka saa konstruktorissa taikajuoman nimen lisäksi salasanan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisäksi luokalla on metodit"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_aines(ainesosa: str, maara: float, salasana: str)"}]},{"type":"text","value":" ja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta_resepti(salasana: str)"}]}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos metodeja kutsutaan väärällä salasanalla, ne antavat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ValueError"}]},{"type":"text","value":"-poikkeuksen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Uudet metodit kutsuvat perityn luokan metodeja, jos salasana on oikein! Älä siis leikkaa ja liimaa toteutuksia luokasta Taikajuoma."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki luokan käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kutistus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" SalainenTaikajuoma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kutistus maksimus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hokkuspokkus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkutistus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_aines"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kärpässieni\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1.5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hokkuspokkus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkutistus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_aines"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Taikahiekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hokkuspokkus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkutistus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_aines"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sammakonkutu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hokkuspokkus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkutistus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_resepti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hokkuspokkus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkutistus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_resepti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pokkushokkus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# VÄÄRÄ SALASANA!"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"text","value":"Kutistus maksimus:\nKärpässieni 1.5 grammaa\nTaikahiekka 3.0 grammaa\nSammakonkutu 4.0 grammaa\nTraceback (most recent call last):\nFile \"salaiset_taikajuomat.py\", line 98, in "},{"type":"element","tagName":"module","properties":{},"children":[{"type":"text","value":"\nraise ValueError(\"Väärä salasana!\")\nValueError: Väärä salasana!"}]}]}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät mitä eroa on näkyvyysmääreillä yksityinen ja suojattu
  • \n
  • Tiedät, miten piirteiden näkyvyys määritetään Pythonissa
  • \n

Aikaisemmin mainittiin, että yliluokassa yksityiseksi määritettyihin piirteisiin ei pääse käsiksi aliluokassa. Tarkastellaan esimerkkinä luokkaa Muistikirja, jossa muistiinpanojen säilyttämiseen käytettävä lista-attribuutti on piilotettu asiakkailta:

\nclass Muistikirja:\n    \"\"\" Muistikirjaan voidaan tallentaa muistiinpanoja merkkijonoina \"\"\"\n\n    def __init__(self):\n        # yksityinen attribuutti\n        self.__muistiinpanot = []\n\n    def lisaa_muistiinpano(self, muistiinpano):\n        self.__muistiinpanot.append(muistiinpano)\n\n    def palauta_muistiinpano(self, indeksi):\n        return self.__muistiinpanot[indeksi]\n\n    def kaikki_muistiinpanot(self):\n        return \",\".join(self.__muistiinpanot)\n

Luokan sisäisen eheyden kannalta tietorakenteena toimivan listan piilottaminen asiakkaalta on sinänsä järkevää, koska luokka tarjoaa itse sopivat operaatiot muistiinpanojen lisäämiseksi ja selaamiseksi. Ongelmalliseksi tilanne muodostuu, jos yritetään kirjoittaa Muistikirja-luokan perivä luokka ProMuistikirja, johon halutaan lisätä muistiinpanojen etsiminen ja järjestäminen. Piilotettu attribuutti ei ole käytettävissä myöskään aliluokissa; metodi etsi_muistiinpanot antaa kutsuttaessa virheen:

class MuistikirjaPro(Muistikirja):\n    \"\"\" Parempi muistikirja haku- ja järjestystoiminnoilla \"\"\"\n    def __init__(self):\n        # Tämä on ok, koska luokan Muistikirja konstruktori\n        # on julkinen\n        super().__init__()\n\n    # Tämä antaa virheen\n    def etsi_muistiinpanot(self, hakusana):\n        loydetty = []\n        # Attribuutti __muistiinpanot on yksityinen, eikä näy\n        # aliluokalle\n        for muistiinpano in self.__muistiinpanot:\n            if hakusana in muistiinpano:\n                loydetty.append(muistiinpano)\n\n        return loydetty\n

AttributeError: 'MuistikirjaPro' object has no attribute '_MuistikirjaPro__muistiinpanot'

Suojatut piirteet

Toisin kuin joistain muista ohjelmointikielistä, Pythonista ei suoraan löydy ominaisuutta joka piilottaa piirteet asiakkailta mutta samaan aikaan avaa ne mahdollisille aliluokille. Ratkaisuksi Python-yhteisö onkin päätynyt konventioon eli yleisesti ymmärrettyyn merkintätapaan suojatuille (eli protected) piirteille.

Koska piirre voidaan piilottaa kirjoittamalla sen tunnisteen (eli nimen) eteen kaksi alaviivaa

\ndef __init__(self):\n    self.__muistiinpanot = []\n

on yleisesti sovittu että yhdellä alaviivalla alkavat piirteet ovat tarkoitettu ainoastaan luokan ja sen aliluokkien käyttöön, eikä niitä tulisi käyttää suoraan sen ulkopuolelta.

\ndef __init__(self):\n    self._muistiinpanot = []\n

Alla on esitetty koko muistikirjaesimerkki uudestaan niin, että muistiinpanot on merkitty suojatuiksi yliluokassa yksityisen sijasta:

\nclass Muistikirja:\n    \"\"\" Muistikirjaan voidaan tallentaa muistiinpanoja merkkijonoina \"\"\"\n\n    def __init__(self):\n        # suojattu attribuutti\n        self._muistiinpanot = []\n\n    def lisaa_muistiinpano(self, muistiinpano):\n        self._muistiinpanot.append(muistiinpano)\n\n    def palauta_muistiinpano(self, indeksi):\n        return self._muistiinpanot[indeksi]\n\n    def kaikki_muistiinpanot(self):\n        return \",\".join(self._muistiinpanot)\n\nclass MuistikirjaPro(Muistikirja):\n    \"\"\" Parempi muistikirja haku- ja järjestystoiminnoilla \"\"\"\n    def __init__(self):\n        # Tämä on ok, koska luokan Muistikirja konstruktori\n        # on julkinen\n        super().__init__()\n\n    # Nyt metodi toimii, koska suojattu attribuutti näkyy\n    # aliluokalle\n    def etsi_muistiinpanot(self, hakusana):\n        loydetty = []\n        for muistiinpano in self._muistiinpanot:\n            if hakusana in muistiinpano:\n                loydetty.append(muistiinpano)\n\n        return loydetty\n

Seuraavassa taulukossa on vielä esitetty piirteiden näkyvyys kaikkien eri suojausmääreiden tapauksessa:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
NäkyvyysmääreEsimerkkiNäkyy asiakkaalleNäkyy aliluokalle
Julkinenself.nimikylläkyllä
Suojattuself._nimieikyllä
Yksityinenself.__nimieiei

Näkyvyysmääreet toimivat vastaavasti kaikkien piirteiden kanssa. Luokassa Henkilo oleva metodi isot_alkukirjaimet on suojattu, joten sitä voi käyttää myös aliluokassa Jalkapalloilija:

\nclass Henkilo:\n    def __init__(self, nimi: str):\n        self._nimi = self._isot_alkukirjaimet(nimi)\n\n    def _isot_alkukirjaimet(self, nimi):\n        nimi_isoilla = []\n        for n in nimi.split(\" \"):\n            nimi_isoilla.append(n.capitalize())\n\n        return \" \".join(nimi_isoilla)\n\n    def __repr__(self):\n        return self.__nimi\n\nclass Jalkapalloilija(Henkilo):\n\n    def __init__(self, nimi: str, lempinimi: str, pelipaikka: str):\n        super().__init__(nimi)\n        # metodia voi kutsua, koska se on suojattu yliluokassa\n        self.__lempinimi = self._isot_alkukirjaimet(lempinimi)\n        self.__pelipaikka = pelipaikka\n\n    def __repr__(self):\n        r =  f\"Jalkapalloilija - nimi:{self._nimi}, lempinimi: {self.__lempinimi}\"\n        r += f\", pelipaikka: {self.__pelipaikka}\"\n        return r\n\n# Testataan\nif __name__ == \"__main__\":\n    jp = Jalkapalloilija(\"petri pythonen\", \"pyttis\", \"hyökkääjä\")\n    print(jp)\n

Jalkapalloilija - nimi:Petri Pythonen, lempinimi: Pyttis, pelipaikka: hyökkääjä

Tehtäväpohjassa on valmiina luokka SuperSankari.

Kirjoita luokka SuperRyhma, joka mallintaa supersankareista koostuvaa ryhmää. Luokalla pitää olla seuraava piirteet:

    \n
  • Suojatut attribuutit nimi (merkkijono), kotipaikka (merkkijono) ja jasenet (lista)
  • \n
  • Konstruktori, joka saa parametrikseen tässä järjestyksessä nimen ja kotipaikan
  • \n
  • Havainnointimetodit nimelle ja kotipaikalle
  • \n
  • Metodi lisaa_jasen(sankari: SuperSankari), joka lisää uuden jäsenen ryhmään
  • \n
  • Metodi tulosta_ryhma, joka tulostaa ryhmän ja sen jäsenten tiedot alla olevan esimerkin mukaisesti
  • \n

Esimerkki luokan käytöstä:

supermiekkonen = SuperSankari(\"Supermiekkonen\", \"Supernopeus, supervoimakkuus\")\nnakymaton = SuperSankari(\"Näkymätön Makkonen\", \"Näkymättömyys\")\nryhma_z = SuperRyhma(\"Ryhmä Z\", \"Kälviä\")\n\nryhma_z.lisaa_jasen(supermiekkonen)\nryhma_z.lisaa_jasen(nakymaton)\nryhma_z.tulosta_ryhma()

Ryhmä Z, Kälviä\nJäsenet:\nSupermiekkonen, superkyvyt: Supernopeus, supervoimakkuus\nNäkymätön Makkonen, superkyvyt: Näkymättömyys

Tämän luvun kertaaminen voi olla hyödyksi.

Tehtäväpohjassa on luokka Taikajuoma, johon käyttäjä voi tallentaa reseptin. Luokasta löytyy konstruktorin lisäksi metodit

    \n
  • lisaa_aines(ainesosa: str, maara: float) ja
  • \n
  • tulosta_resepti()
  • \n

Kirjoita Taikajuoma-luokan perivä luokka SalainenTaikajuoma, jolla resepti voidaan suojata salasanalla.

Uusi luokka saa konstruktorissa taikajuoman nimen lisäksi salasanan.

Lisäksi luokalla on metodit

    \n
  • lisaa_aines(ainesosa: str, maara: float, salasana: str) ja
  • \n
  • tulosta_resepti(salasana: str)
  • \n

Jos metodeja kutsutaan väärällä salasanalla, ne antavat ValueError-poikkeuksen.

Uudet metodit kutsuvat perityn luokan metodeja, jos salasana on oikein! Älä siis leikkaa ja liimaa toteutuksia luokasta Taikajuoma.

Esimerkki luokan käytöstä:

kutistus = SalainenTaikajuoma(\"Kutistus maksimus\", \"hokkuspokkus\")\nkutistus.lisaa_aines(\"Kärpässieni\", 1.5, \"hokkuspokkus\")\nkutistus.lisaa_aines(\"Taikahiekka\", 3.0, \"hokkuspokkus\")\nkutistus.lisaa_aines(\"Sammakonkutu\", 4.0, \"hokkuspokkus\")\nkutistus.tulosta_resepti(\"hokkuspokkus\")\n\nkutistus.tulosta_resepti(\"pokkushokkus\") # VÄÄRÄ SALASANA!
Kutistus maksimus:\nKärpässieni 1.5 grammaa\nTaikahiekka 3.0 grammaa\nSammakonkutu 4.0 grammaa\nTraceback (most recent call last):\nFile \"salaiset_taikajuomat.py\", line 98, in \nraise ValueError(\"Väärä salasana!\")\nValueError: Väärä salasana!
","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-10/2-nakyvyysmaareet.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät mitä eroa on näkyvyysmääreillä yksityinen ja suojattu"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten piirteiden näkyvyys määritetään Pythonissa"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aikaisemmin mainittiin, että yliluokassa yksityiseksi määritettyihin piirteisiin ei pääse käsiksi aliluokassa. Tarkastellaan esimerkkinä luokkaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Muistikirja"}]},{"type":"text","value":", jossa muistiinpanojen säilyttämiseen käytettävä lista-attribuutti on piilotettu asiakkailta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Muistikirja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Muistikirjaan voidaan tallentaa muistiinpanoja merkkijonoina \"\"\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# yksityinen attribuutti"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__muistiinpanot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_muistiinpano"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" muistiinpano"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"muistiinpano"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"palauta_muistiinpano"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" indeksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"indeksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kaikki_muistiinpanot"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\",\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokan sisäisen eheyden kannalta tietorakenteena toimivan listan piilottaminen asiakkaalta on sinänsä järkevää, koska luokka tarjoaa itse sopivat operaatiot muistiinpanojen lisäämiseksi ja selaamiseksi. Ongelmalliseksi tilanne muodostuu, jos yritetään kirjoittaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Muistikirja"}]},{"type":"text","value":"-luokan perivä luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ProMuistikirja"}]},{"type":"text","value":", johon halutaan lisätä muistiinpanojen etsiminen ja järjestäminen. Piilotettu attribuutti ei ole käytettävissä myöskään aliluokissa; metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"etsi_muistiinpanot"}]},{"type":"text","value":" antaa kutsuttaessa virheen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"MuistikirjaPro"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Muistikirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Parempi muistikirja haku- ja järjestystoiminnoilla \"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tämä on ok, koska luokan Muistikirja konstruktori"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# on julkinen"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"super"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__init__"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tämä antaa virheen"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"etsi_muistiinpanot"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" hakusana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n loydetty "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Attribuutti __muistiinpanot on yksityinen, eikä näy"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# aliluokalle"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" muistiinpano "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" hakusana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" muistiinpano"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n loydetty"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"muistiinpano"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" loydetty\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"AttributeError: 'MuistikirjaPro' object has no attribute '_MuistikirjaPro__muistiinpanot'"}]}]},{"type":"element","tagName":"h2","properties":{"id":"suojatut-piirteet","style":"position:relative;"},"children":[{"type":"text","value":"Suojatut piirteet"},{"type":"element","tagName":"a","properties":{"href":"#suojatut-piirteet","ariaLabel":"suojatut piirteet permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toisin kuin joistain muista ohjelmointikielistä, Pythonista ei suoraan löydy ominaisuutta joka piilottaa piirteet asiakkailta mutta samaan aikaan avaa ne mahdollisille aliluokille. Ratkaisuksi Python-yhteisö onkin päätynyt "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"konventioon"}]},{"type":"text","value":" eli yleisesti ymmärrettyyn merkintätapaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"suojatuille"}]},{"type":"text","value":" (eli "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"protected"}]},{"type":"text","value":") piirteille."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska piirre voidaan piilottaa kirjoittamalla sen tunnisteen (eli nimen) eteen kaksi alaviivaa"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__muistiinpanot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"on yleisesti sovittu että yhdellä alaviivalla alkavat piirteet ovat tarkoitettu ainoastaan luokan ja sen aliluokkien käyttöön, eikä niitä tulisi käyttää suoraan sen ulkopuolelta."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_muistiinpanot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Alla on esitetty koko muistikirjaesimerkki uudestaan niin, että muistiinpanot on merkitty suojatuiksi yliluokassa yksityisen sijasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Muistikirja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Muistikirjaan voidaan tallentaa muistiinpanoja merkkijonoina \"\"\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# suojattu attribuutti"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_muistiinpanot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_muistiinpano"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" muistiinpano"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"muistiinpano"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"palauta_muistiinpano"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" indeksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"indeksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kaikki_muistiinpanot"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\",\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"MuistikirjaPro"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Muistikirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Parempi muistikirja haku- ja järjestystoiminnoilla \"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tämä on ok, koska luokan Muistikirja konstruktori"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# on julkinen"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"super"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__init__"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Nyt metodi toimii, koska suojattu attribuutti näkyy"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# aliluokalle"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"etsi_muistiinpanot"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" hakusana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n loydetty "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" muistiinpano "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" hakusana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" muistiinpano"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n loydetty"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"muistiinpano"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" loydetty\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa taulukossa on vielä esitetty piirteiden näkyvyys kaikkien eri suojausmääreiden tapauksessa:"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Näkyvyysmääre"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Esimerkki"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Näkyy asiakkaalle"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Näkyy aliluokalle"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Julkinen"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self.nimi"}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"kyllä"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"kyllä"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Suojattu"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self._nimi"}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"ei"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"kyllä"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Yksityinen"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self.__nimi"}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"ei"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"ei"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Näkyvyysmääreet toimivat vastaavasti kaikkien piirteiden kanssa. Luokassa Henkilo oleva metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"isot_alkukirjaimet"}]},{"type":"text","value":" on suojattu, joten sitä voi käyttää myös aliluokassa Jalkapalloilija:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_isot_alkukirjaimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"_isot_alkukirjaimet"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nimi_isoilla "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nimi_isoilla"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"capitalize"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi_isoilla"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__repr__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Jalkapalloilija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lempinimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelipaikka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"super"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__init__"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# metodia voi kutsua, koska se on suojattu yliluokassa"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__lempinimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_isot_alkukirjaimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lempinimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__pelipaikka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pelipaikka\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__repr__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n r "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Jalkapalloilija - nimi:"}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", lempinimi: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__lempinimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"text","value":"\n r "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\", pelipaikka: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__pelipaikka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" r\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Testataan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n jp "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Jalkapalloilija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"petri pythonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pyttis\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hyökkääjä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jp"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jalkapalloilija - nimi:Petri Pythonen, lempinimi: Pyttis, pelipaikka: hyökkääjä"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Superryhmä","tmcname":"osa10-05_superryhma"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on valmiina luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"SuperSankari"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"SuperRyhma"}]},{"type":"text","value":", joka mallintaa supersankareista koostuvaa ryhmää. Luokalla pitää olla seuraava piirteet:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Suojatut"}]},{"type":"text","value":" attribuutit nimi (merkkijono), kotipaikka (merkkijono) ja jasenet (lista)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Konstruktori, joka saa parametrikseen tässä järjestyksessä nimen ja kotipaikan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Havainnointimetodit nimelle ja kotipaikalle"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_jasen(sankari: SuperSankari)"}]},{"type":"text","value":", joka lisää uuden jäsenen ryhmään"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta_ryhma"}]},{"type":"text","value":", joka tulostaa ryhmän ja sen jäsenten tiedot alla olevan esimerkin mukaisesti"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki luokan käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"supermiekkonen "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" SuperSankari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Supermiekkonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Supernopeus, supervoimakkuus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnakymaton "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" SuperSankari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Näkymätön Makkonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Näkymättömyys\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nryhma_z "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" SuperRyhma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ryhmä Z\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kälviä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nryhma_z"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_jasen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"supermiekkonen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nryhma_z"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_jasen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nakymaton"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nryhma_z"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_ryhma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ryhmä Z, Kälviä\nJäsenet:\nSupermiekkonen, superkyvyt: Supernopeus, supervoimakkuus\nNäkymätön Makkonen, superkyvyt: Näkymättömyys"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"/osa-9/3-kapselointi#asetus--ja-havainnointimetodit"},"children":[{"type":"text","value":"Tämän"}]},{"type":"text","value":" luvun kertaaminen voi olla hyödyksi."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Salainen taikajuoma","tmcname":"osa10-06_salainen_taikajuoma"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Taikajuoma"}]},{"type":"text","value":", johon käyttäjä voi tallentaa reseptin. Luokasta löytyy konstruktorin lisäksi metodit"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_aines(ainesosa: str, maara: float)"}]},{"type":"text","value":" ja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta_resepti()"}]}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Taikajuoma"}]},{"type":"text","value":"-luokan perivä luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"SalainenTaikajuoma"}]},{"type":"text","value":", jolla resepti voidaan suojata salasanalla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Uusi luokka saa konstruktorissa taikajuoman nimen lisäksi salasanan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisäksi luokalla on metodit"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_aines(ainesosa: str, maara: float, salasana: str)"}]},{"type":"text","value":" ja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta_resepti(salasana: str)"}]}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos metodeja kutsutaan väärällä salasanalla, ne antavat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ValueError"}]},{"type":"text","value":"-poikkeuksen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Uudet metodit kutsuvat perityn luokan metodeja, jos salasana on oikein! Älä siis leikkaa ja liimaa toteutuksia luokasta Taikajuoma."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki luokan käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kutistus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" SalainenTaikajuoma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kutistus maksimus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hokkuspokkus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkutistus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_aines"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kärpässieni\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1.5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hokkuspokkus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkutistus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_aines"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Taikahiekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hokkuspokkus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkutistus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_aines"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sammakonkutu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hokkuspokkus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkutistus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_resepti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hokkuspokkus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkutistus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_resepti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pokkushokkus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# VÄÄRÄ SALASANA!"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"text","value":"Kutistus maksimus:\nKärpässieni 1.5 grammaa\nTaikahiekka 3.0 grammaa\nSammakonkutu 4.0 grammaa\nTraceback (most recent call last):\nFile \"salaiset_taikajuomat.py\", line 98, in "},{"type":"element","tagName":"module","properties":{},"children":[{"type":"text","value":"\nraise ValueError(\"Väärä salasana!\")\nValueError: Väärä salasana!"}]}]}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät mitä eroa on näkyvyysmääreillä yksityinen ja suojattu
  • \n
  • Tiedät, miten piirteiden näkyvyys määritetään Pythonissa
  • \n

Aikaisemmin mainittiin, että yliluokassa yksityiseksi määritettyihin piirteisiin ei pääse käsiksi aliluokassa. Tarkastellaan esimerkkinä luokkaa Muistikirja, jossa muistiinpanojen säilyttämiseen käytettävä lista-attribuutti on piilotettu asiakkailta:

\nclass Muistikirja:\n    \"\"\" Muistikirjaan voidaan tallentaa muistiinpanoja merkkijonoina \"\"\"\n\n    def __init__(self):\n        # yksityinen attribuutti\n        self.__muistiinpanot = []\n\n    def lisaa_muistiinpano(self, muistiinpano):\n        self.__muistiinpanot.append(muistiinpano)\n\n    def palauta_muistiinpano(self, indeksi):\n        return self.__muistiinpanot[indeksi]\n\n    def kaikki_muistiinpanot(self):\n        return \",\".join(self.__muistiinpanot)\n

Luokan sisäisen eheyden kannalta tietorakenteena toimivan listan piilottaminen asiakkaalta on sinänsä järkevää, koska luokka tarjoaa itse sopivat operaatiot muistiinpanojen lisäämiseksi ja selaamiseksi. Ongelmalliseksi tilanne muodostuu, jos yritetään kirjoittaa Muistikirja-luokan perivä luokka ProMuistikirja, johon halutaan lisätä muistiinpanojen etsiminen ja järjestäminen. Piilotettu attribuutti ei ole käytettävissä myöskään aliluokissa; metodi etsi_muistiinpanot antaa kutsuttaessa virheen:

class MuistikirjaPro(Muistikirja):\n    \"\"\" Parempi muistikirja haku- ja järjestystoiminnoilla \"\"\"\n    def __init__(self):\n        # Tämä on ok, koska luokan Muistikirja konstruktori\n        # on julkinen\n        super().__init__()\n\n    # Tämä antaa virheen\n    def etsi_muistiinpanot(self, hakusana):\n        loydetty = []\n        # Attribuutti __muistiinpanot on yksityinen, eikä näy\n        # aliluokalle\n        for muistiinpano in self.__muistiinpanot:\n            if hakusana in muistiinpano:\n                loydetty.append(muistiinpano)\n\n        return loydetty\n

AttributeError: 'MuistikirjaPro' object has no attribute '_MuistikirjaPro__muistiinpanot'

Suojatut piirteet

Toisin kuin joistain muista ohjelmointikielistä, Pythonista ei suoraan löydy ominaisuutta joka piilottaa piirteet asiakkailta mutta samaan aikaan avaa ne mahdollisille aliluokille. Ratkaisuksi Python-yhteisö onkin päätynyt konventioon eli yleisesti ymmärrettyyn merkintätapaan suojatuille (eli protected) piirteille.

Koska piirre voidaan piilottaa kirjoittamalla sen tunnisteen (eli nimen) eteen kaksi alaviivaa

\ndef __init__(self):\n    self.__muistiinpanot = []\n

on yleisesti sovittu että yhdellä alaviivalla alkavat piirteet ovat tarkoitettu ainoastaan luokan ja sen aliluokkien käyttöön, eikä niitä tulisi käyttää suoraan sen ulkopuolelta.

\ndef __init__(self):\n    self._muistiinpanot = []\n

Alla on esitetty koko muistikirjaesimerkki uudestaan niin, että muistiinpanot on merkitty suojatuiksi yliluokassa yksityisen sijasta:

\nclass Muistikirja:\n    \"\"\" Muistikirjaan voidaan tallentaa muistiinpanoja merkkijonoina \"\"\"\n\n    def __init__(self):\n        # suojattu attribuutti\n        self._muistiinpanot = []\n\n    def lisaa_muistiinpano(self, muistiinpano):\n        self._muistiinpanot.append(muistiinpano)\n\n    def palauta_muistiinpano(self, indeksi):\n        return self._muistiinpanot[indeksi]\n\n    def kaikki_muistiinpanot(self):\n        return \",\".join(self._muistiinpanot)\n\nclass MuistikirjaPro(Muistikirja):\n    \"\"\" Parempi muistikirja haku- ja järjestystoiminnoilla \"\"\"\n    def __init__(self):\n        # Tämä on ok, koska luokan Muistikirja konstruktori\n        # on julkinen\n        super().__init__()\n\n    # Nyt metodi toimii, koska suojattu attribuutti näkyy\n    # aliluokalle\n    def etsi_muistiinpanot(self, hakusana):\n        loydetty = []\n        for muistiinpano in self._muistiinpanot:\n            if hakusana in muistiinpano:\n                loydetty.append(muistiinpano)\n\n        return loydetty\n

Seuraavassa taulukossa on vielä esitetty piirteiden näkyvyys kaikkien eri suojausmääreiden tapauksessa:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
NäkyvyysmääreEsimerkkiNäkyy asiakkaalleNäkyy aliluokalle
Julkinenself.nimikylläkyllä
Suojattuself._nimieikyllä
Yksityinenself.__nimieiei

Näkyvyysmääreet toimivat vastaavasti kaikkien piirteiden kanssa. Luokassa Henkilo oleva metodi isot_alkukirjaimet on suojattu, joten sitä voi käyttää myös aliluokassa Jalkapalloilija:

\nclass Henkilo:\n    def __init__(self, nimi: str):\n        self._nimi = self._isot_alkukirjaimet(nimi)\n\n    def _isot_alkukirjaimet(self, nimi):\n        nimi_isoilla = []\n        for n in nimi.split(\" \"):\n            nimi_isoilla.append(n.capitalize())\n\n        return \" \".join(nimi_isoilla)\n\n    def __repr__(self):\n        return self.__nimi\n\nclass Jalkapalloilija(Henkilo):\n\n    def __init__(self, nimi: str, lempinimi: str, pelipaikka: str):\n        super().__init__(nimi)\n        # metodia voi kutsua, koska se on suojattu yliluokassa\n        self.__lempinimi = self._isot_alkukirjaimet(lempinimi)\n        self.__pelipaikka = pelipaikka\n\n    def __repr__(self):\n        r =  f\"Jalkapalloilija - nimi:{self._nimi}, lempinimi: {self.__lempinimi}\"\n        r += f\", pelipaikka: {self.__pelipaikka}\"\n        return r\n\n# Testataan\nif __name__ == \"__main__\":\n    jp = Jalkapalloilija(\"petri pythonen\", \"pyttis\", \"hyökkääjä\")\n    print(jp)\n

Jalkapalloilija - nimi:Petri Pythonen, lempinimi: Pyttis, pelipaikka: hyökkääjä

Tehtäväpohjassa on valmiina luokka SuperSankari.

Kirjoita luokka SuperRyhma, joka mallintaa supersankareista koostuvaa ryhmää. Luokalla pitää olla seuraava piirteet:

    \n
  • Suojatut attribuutit nimi (merkkijono), kotipaikka (merkkijono) ja jasenet (lista)
  • \n
  • Konstruktori, joka saa parametrikseen tässä järjestyksessä nimen ja kotipaikan
  • \n
  • Havainnointimetodit nimelle ja kotipaikalle
  • \n
  • Metodi lisaa_jasen(sankari: SuperSankari), joka lisää uuden jäsenen ryhmään
  • \n
  • Metodi tulosta_ryhma, joka tulostaa ryhmän ja sen jäsenten tiedot alla olevan esimerkin mukaisesti
  • \n

Esimerkki luokan käytöstä:

supermiekkonen = SuperSankari(\"Supermiekkonen\", \"Supernopeus, supervoimakkuus\")\nnakymaton = SuperSankari(\"Näkymätön Makkonen\", \"Näkymättömyys\")\nryhma_z = SuperRyhma(\"Ryhmä Z\", \"Kälviä\")\n\nryhma_z.lisaa_jasen(supermiekkonen)\nryhma_z.lisaa_jasen(nakymaton)\nryhma_z.tulosta_ryhma()

Ryhmä Z, Kälviä\nJäsenet:\nSupermiekkonen, superkyvyt: Supernopeus, supervoimakkuus\nNäkymätön Makkonen, superkyvyt: Näkymättömyys

Tämän luvun kertaaminen voi olla hyödyksi.

Tehtäväpohjassa on luokka Taikajuoma, johon käyttäjä voi tallentaa reseptin. Luokasta löytyy konstruktorin lisäksi metodit

    \n
  • lisaa_aines(ainesosa: str, maara: float) ja
  • \n
  • tulosta_resepti()
  • \n

Kirjoita Taikajuoma-luokan perivä luokka SalainenTaikajuoma, jolla resepti voidaan suojata salasanalla.

Uusi luokka saa konstruktorissa taikajuoman nimen lisäksi salasanan.

Lisäksi luokalla on metodit

    \n
  • lisaa_aines(ainesosa: str, maara: float, salasana: str) ja
  • \n
  • tulosta_resepti(salasana: str)
  • \n

Jos metodeja kutsutaan väärällä salasanalla, ne antavat ValueError-poikkeuksen.

Uudet metodit kutsuvat perityn luokan metodeja, jos salasana on oikein! Älä siis leikkaa ja liimaa toteutuksia luokasta Taikajuoma.

Esimerkki luokan käytöstä:

kutistus = SalainenTaikajuoma(\"Kutistus maksimus\", \"hokkuspokkus\")\nkutistus.lisaa_aines(\"Kärpässieni\", 1.5, \"hokkuspokkus\")\nkutistus.lisaa_aines(\"Taikahiekka\", 3.0, \"hokkuspokkus\")\nkutistus.lisaa_aines(\"Sammakonkutu\", 4.0, \"hokkuspokkus\")\nkutistus.tulosta_resepti(\"hokkuspokkus\")\n\nkutistus.tulosta_resepti(\"pokkushokkus\") # VÄÄRÄ SALASANA!
Kutistus maksimus:\nKärpässieni 1.5 grammaa\nTaikahiekka 3.0 grammaa\nSammakonkutu 4.0 grammaa\nTraceback (most recent call last):\nFile \"salaiset_taikajuomat.py\", line 98, in \nraise ValueError(\"Väärä salasana!\")\nValueError: Väärä salasana!
","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-10/2-nakyvyysmaareet.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-10/3-olio-ohjelmoinnin-tekniikoita/page-data.json b/page-data/osa-10/3-olio-ohjelmoinnin-tekniikoita/page-data.json index 6550cc2ed..e5b21e618 100644 --- a/page-data/osa-10/3-olio-ohjelmoinnin-tekniikoita/page-data.json +++ b/page-data/osa-10/3-olio-ohjelmoinnin-tekniikoita/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-10/3-olio-ohjelmoinnin-tekniikoita", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tunnet muuttujan self eri käyttötarkoituksia"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat ylikuormittaa operaattoreita omissa luokissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät miten muodostaa iteroitavan luokan"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokka voi palauttaa metodista myös sen itsensä tyyppisen olion. Luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tuote"}]},{"type":"text","value":" metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"alennustuote"}]},{"type":"text","value":" palauttaa uuden tuotteen, jolla on sama nimi kuin nykyisellä tuotteella, mutta 25% halvempi hinta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Tuote"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" hinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" hinta\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" (hinta "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"alennustuote"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n alennettu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.75"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" alennettu"}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"omena1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Omena\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2.99"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nomena2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" omena1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"alennustuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"omena1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"omena2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Omena (hinta 2.99)\nOmena (hinta 2.2425)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kerrataan vielä muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":" merkitys: luokan sisällä se viittaa nykyiseen olioon. Tyypillinen tapa käyttää muuttujaa onkin viitata olion omiin piirteisiin, esimerkiksi attribuuttien arvoihin. Muuttujaa voidaan käyttää myös palauttamaan koko olio (vaikka tälle onkin selvästi harvemmin tarvetta). Esimerkkiluokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tuote"}]},{"type":"text","value":" metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"halvempi"}]},{"type":"text","value":" osaa palauttaa halvemman tuotteen, kun sille annetaan parametriksi toinen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tuote"}]},{"type":"text","value":"-luokan olio:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Tuote"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" hinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" hinta\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" (hinta "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hinta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"halvempi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" tuote"}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"omena "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Omena\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2.99"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nappelsiini "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Appelsiini\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nbanaani "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5.25"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"appelsiini"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"halvempi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"omena"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"appelsiini"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"halvempi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"banaani"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Omena (2.99)\nAppelsiini (3.95)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkin vertailun toteutus vaikuttaa kuitenkin melko kömpelöltä - paljon parempi olisi, jos voisimme vertailla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tuote"}]},{"type":"text","value":"-olioita suoraan Pythonin vertailuoperaattoreilla."}]},{"type":"element","tagName":"h2","properties":{"id":"operaattorien-ylikuormitus","style":"position:relative;"},"children":[{"type":"text","value":"Operaattorien ylikuormitus"},{"type":"element","tagName":"a","properties":{"href":"#operaattorien-ylikuormitus","ariaLabel":"operaattorien ylikuormitus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonin lasku- ja vertailuoperaattorien käyttö omien olioiden kanssa on onneksi mahdollista. Tähän käytetään tekniikkaa, jonka nimi on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"operaattorien ylikuormitus"}]},{"type":"text","value":". Kun halutaan, että tietty operaattori toimii myös omasta luokasta muodostettujen olioiden kanssa, luokkaan kirjoitetaan vastaava metodi joka palauttaa oikean lopputuloksen. Periaate on vastaava kuin metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":" kanssa: Python osaa käyttää tietyllä tapaa nimettyjä metodeja tietyissä operaatioissa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan ensin esimerkkiä, jossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tuote"}]},{"type":"text","value":"-luokkaan on toteutettu metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__gt__"}]},{"type":"text","value":" (lyhenne sanoista "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"g"}]},{"type":"text","value":"reater "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"t"}]},{"type":"text","value":"han) joka toteuttaa suurempi kuin -operaattorin. Tarkemmin sanottuna metodi palauttaa arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", jos nykyinen olio on suurempi kuin parametrina annettu olio."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Tuote"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" hinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" hinta\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" (hinta "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hinta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__gt__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" toinen_tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" toinen_tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hinta"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__gt__"}]},{"type":"text","value":" palauttaa arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", jos nykyisen tuotteen hinta on suurempi kuin parametrina annetun tuotteen, ja muuten arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt luokan olioita voidaan vertailla käyttäen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":"-operaattoria samalla tavalla kuin vaikkapa kokonaislukuja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"appelsiini "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Appelsiini\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.90"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nomena "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Omena\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" appelsiini "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" omena"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Appelsiini on suurempi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Omena on suurempi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Appelsiini on suurempi"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olioiden suuruusluokan vertailua toteuttaessa täytyy päättää, millä perusteella suuruusjärjestys määritetään. Voisimme myös haluta, että tuotteet järjestetään hinnan sijasta nimen mukaiseen aakkosjärjestykseen. Tällöin omena olisikin appelsiinia \"suurempi\":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Tuote"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" hinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" hinta\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" (hinta "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hinta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"nimi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__gt__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" toinen_tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" toinen_tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"appelsiini "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Appelsiini\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.90"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nomena "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Omena\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" appelsiini "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" omena"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Appelsiini on suurempi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Omena on suurempi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Omena on suurempi"}]}]},{"type":"element","tagName":"h2","properties":{"id":"lisaa-operaattoreita","style":"position:relative;"},"children":[{"type":"text","value":"Lisää operaattoreita"},{"type":"element","tagName":"a","properties":{"href":"#lisaa-operaattoreita","ariaLabel":"lisaa operaattoreita permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tavalliset vertailuoperaattorit ja näitä vastaavat metodit on esitetty seuraavassa taulukossa:"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Operaattori"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Merkitys perinteisesti"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Metodin nimi"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<"}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Pienempi kuin"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__lt__(self, toinen)"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":">"}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Suurempi kuin"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__gt__(self, toinen)"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"=="}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Yhtä suuri kuin"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__eq__(self, toinen)"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"!="}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Eri suuri kuin"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__ne__(self, toinen)"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<="}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Pienempi tai yhtäsuuri kuin"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__le__(self, toinen)"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":">="}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Suurempi tai yhtäsuuri kuin"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__ge__(self, toinen)"}]}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisäksi luokissa voidaan toteuttaa tiettyjä muita operaattoreita, esimerkiksi:"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Operaattori"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Merkitys perinteisesti"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Metodin nimi"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"+"}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Yhdistäminen"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__add__(self, toinen)"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"-"}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Vähentäminen"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__sub__(self, toinen)"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"*"}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Monistaminen"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__mul__(self, toinen)"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"/"}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Jakaminen"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__truediv__(self, toinen)"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"//"}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Kokonaisjakaminen"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__floordiv__(self, toinen)"}]}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisää operaattoreita ja metodien nimien vastineita löydät helposti Googlella."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että vain hyvin harvoin on tarvetta toteuttaa kaikkia operaatioita omassa luokassa. Esimerkiksi jakaminen on operaatio, jolle on hankalaa keksiä luontevaa käyttöä useimmissa luokissa (mitä tulee, kun jaetaan opiskelija kolmella saati toisella opiskelijalla?). Tiettyjen operaattoreiden toteuttamisesta voi kuitenkin olla hyötyä, mikäli vastaavat operaatiot ovat loogisia luokalle."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkinä luokkaa joka mallintaa yhtä muistiinpanoa. Kahden muistiinpanon yhdistäminen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"-operaattorilla tuottaa uuden, yhdistetyn muistiinpanon, kun on toteutettu metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__add__"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" datetime\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Muistiinpano"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pvm"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" merkinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pvm "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pvm\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" merkinta\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pvm"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":": "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__add__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" toinen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Uuden muistiinpanon ajaksi nykyinen aika"}]},{"type":"text","value":"\n uusi_muistiinpano "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Muistiinpano"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"now"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n uusi_muistiinpano"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" ja \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" toinen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkinta\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" uusi_muistiinpano"}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"merkinta1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Muistiinpano"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2016"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"17"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Muista ostaa lahjoja\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmerkinta2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Muistiinpano"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2016"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"23"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Muista hakea kuusi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Nyt voidaan yhdistää plussalla - tämä kutsuu metodia __add__ luokassa Muistiipano"}]},{"type":"text","value":"\nmolemmat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" merkinta1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" merkinta2\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"molemmat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2020-09-09 14:13:02.163170: Muista ostaa lahjoja ja Muista hakea kuusi"}]}]},{"type":"element","tagName":"h2","properties":{"id":"olion-esitys-merkkijonona","style":"position:relative;"},"children":[{"type":"text","value":"Olion esitys merkkijonona"},{"type":"element","tagName":"a","properties":{"href":"#olion-esitys-merkkijonona","ariaLabel":"olion esitys merkkijonona permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olemme toteuttaneet luokkiin usein metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":", joka antaa merkkijonoesityksen olion sisällöstä. Toinen melko samanlainen metodi on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__repr__"}]},{"type":"text","value":", joka antaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"teknisen"}]},{"type":"text","value":" esityksen olion sisällöstä. Usein metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__repr__"}]},{"type":"text","value":" toteutetaan niin, että se antaa koodin, joka muodostaa olion."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"repr"}]},{"type":"text","value":" antaa olion teknisen merkkijonoesityksen, ja lisäksi tätä esitystä käytetään, jos oliossa ei ole määritelty "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":"-metodia. Seuraava luokka esittelee asiaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" ika\n \n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__repr__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Henkilo("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"repr"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python3"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python3"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python3"]},"children":[{"type":"text","value":"henkilo1 = Henkilo(\"Anna\", 25)\nhenkilo2 = Henkilo(\"Pekka\", 99)\nprint(henkilo1)\nprint(henkilo2)"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Henkilo('Anna', 25)\nHenkilo('Pekka', 99)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että metodissa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__repr__"}]},{"type":"text","value":" haetaan nimen tekninen esitys metodilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"repr"}]},{"type":"text","value":", jolloin tässä tapauksessa nimen ympärille tulee "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"'"}]},{"type":"text","value":"-merkit."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa luokassa on toteutettu sekä metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__repr__"}]},{"type":"text","value":" että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" ika\n \n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__repr__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Henkilo("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"repr"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" vuotta)\""}]}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python3"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python3"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python3"]},"children":[{"type":"text","value":"henkilo = Henkilo(\"Anna\", 25)\nprint(henkilo)\nprint(repr(henkilo))"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna (25 vuotta)\nHenkilo('Anna', 25)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun tietorakenteessa (kuten listassa) on olioita, Python käyttää vähän epäloogisesti metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__repr__"}]},{"type":"text","value":" olioiden merkkijonoesityksen muodostamiseen, kun lista tulostetaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python3"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python3"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python3"]},"children":[{"type":"text","value":"henkilot = []\nhenkilot.append(Henkilo(\"Anna\", 25))\nhenkilot.append(Henkilo(\"Pekka\", 99))\nhenkilot.append(Henkilo(\"Maija\", 55))\nprint(henkilot)"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[Henkilo('Anna', 25), Henkilo('Pekka', 99), Henkilo('Maija', 55)]"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Raha","tmcname":"osa10-07_raha"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjasta löytyy luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Raha"}]},{"type":"text","value":" runko. Tässä tehtävässä laajennetaan runkoa muutamilla operaattoreilla, ja korjataan pari rungossa olevaa pientä ongelmaa"}]},{"type":"element","tagName":"h2","properties":{"id":"korjaa-merkkijonoesitys","style":"position:relative;"},"children":[{"type":"text","value":"Korjaa merkkijonoesitys"},{"type":"element","tagName":"a","properties":{"href":"#korjaa-merkkijonoesitys","ariaLabel":"korjaa merkkijonoesitys permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rahan merkkijonoesityksen muodostava metodi ei ole nyt ihan kunnossa. Seuraavassa esimerkissä muodostetaan kaksi raha-olioa, joista jälkimmäinen ei tulostu oikein:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"e1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Raha"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ne2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Raha"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kaksi euroa ja viisi senttiä"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4.10\n2.5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Korjaa luokan metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__(self)"}]},{"type":"text","value":" siten, että tulostus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4.10 eur\n2.05 eur"}]}]},{"type":"element","tagName":"h2","properties":{"id":"yhtasuuruus","style":"position:relative;"},"children":[{"type":"text","value":"Yhtäsuuruus"},{"type":"element","tagName":"a","properties":{"href":"#yhtasuuruus","ariaLabel":"yhtasuuruus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Määrittele raha-oliolle metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__eq__(self, toinen)"}]},{"type":"text","value":", jonka avulla rahan yhtäsuuruusvertailu saadaan toimimaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"e1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Raha"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ne2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Raha"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ne3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Raha"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" e2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" e3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4.10 eur\n2.05 eur\n4.10 eur\nFalse\nTrue"}]}]},{"type":"element","tagName":"h2","properties":{"id":"muut-vertailut","style":"position:relative;"},"children":[{"type":"text","value":"Muut vertailut"},{"type":"element","tagName":"a","properties":{"href":"#muut-vertailut","ariaLabel":"muut vertailut permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta rahalle myös seuraavat vertailuoperaattorit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"!="}]},{"type":"text","value":"."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"e1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Raha"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ne2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Raha"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"!="}]},{"type":"text","value":" e2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" e2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" e2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\nFalse\nTrue"}]}]},{"type":"element","tagName":"h2","properties":{"id":"plus-ja-miinus","style":"position:relative;"},"children":[{"type":"text","value":"Plus ja miinus"},{"type":"element","tagName":"a","properties":{"href":"#plus-ja-miinus","ariaLabel":"plus ja miinus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta rahalle yhteen- ja vähennyslaskuoperaatiot. Molempien operaatioiden tulee palauttaa uusi rahaolio, ja ne eivät saa muuttaa olioa itseään tai parametrina olevaa olioa!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että rahan arvo ei voi olla negatiivinen. Negatiiviseen tulokseen päätyvän vähennyslaskuyrityksen tulee aiheuttaa ValueError-tyyppinen poikkeus."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"e1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Raha"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ne2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Raha"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ne3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" e1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" e2\ne4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" e1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" e2\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ne5 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" e2"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"e1"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"text","value":"7.00 eur\n1.10 eur\nTraceback (most recent call last):\nFile \"tiedosto.py\", line 416, in "},{"type":"element","tagName":"module","properties":{},"children":[{"type":"text","value":"\ne5 = e2-e1\nFile \"tiedosto.py\", line 404, in "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"sub"}]},{"type":"text","value":"\nraise ValueError(f\"negatiivinen tulos ei sallittu\")\nValueError: negatiivinen tulos ei sallittu"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"arvoa-ei-voi-muuttaa","style":"position:relative;"},"children":[{"type":"text","value":"Arvoa ei voi muuttaa"},{"type":"element","tagName":"a","properties":{"href":"#arvoa-ei-voi-muuttaa","ariaLabel":"arvoa ei voi muuttaa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokassa on tällä hetkellä vielä pieni ongelma, koska käyttäjä voi \"huijaamalla\" muuttaa rahan arvoa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ne1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"eurot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4.05 eur\n1000.05 eur"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuta luokan toteutus "},{"type":"element","tagName":"a","properties":{"href":"/osa-9/3-kapselointi#kapselointi"},"children":[{"type":"text","value":"kapseloiduksi"}]},{"type":"text","value":" siten, että yllä oleva huijaus ei onnistu. Luokalla ei siis saa olla kapseloimattomia attribuutteja eikä asetus- tai havainnointimetodeita euroille tai senteille!"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Päiväys","tmcname":"osa10-08_paivays"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä toteutetaan luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Paivays"}]},{"type":"text","value":", jonka avulla on mahdollista käsitellä päivämääriä. Oletetaan tässä tehtävässä yksinkertaisuuden vuoksi, että "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"jokaisessa kuussa on 30 päivää"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huom! Edellisestä johtuen tehtävässä ei poikkeuksellisesti kannata käyttää Pythonin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"datetime"}]},{"type":"text","value":"-moduulia, vaan toteutetaan luokka itse."}]},{"type":"element","tagName":"h2","properties":{"id":"vertailut","style":"position:relative;"},"children":[{"type":"text","value":"Vertailut"},{"type":"element","tagName":"a","properties":{"href":"#vertailut","ariaLabel":"vertailut permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta luokan runko ja sille vertailuoperaattorit <, >, == ja !=. Käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"p1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Paivays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\np2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Paivays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"28"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1985"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\np3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Paivays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"28"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1985"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" p2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"!="}]},{"type":"text","value":" p2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" p3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" p2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" p2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4.10.2020\n28.12.1985\nFalse\nTrue\nFalse\nFalse\nTrue"}]}]},{"type":"element","tagName":"h2","properties":{"id":"kasvatus","style":"position:relative;"},"children":[{"type":"text","value":"Kasvatus"},{"type":"element","tagName":"a","properties":{"href":"#kasvatus","ariaLabel":"kasvatus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta päiväykselle operaattori +. Operaattori luo uuden päivämäärän joka on lisättävän lukeman päiviä verran suurempi kuin alkuperäinen päivämäärä. Alkuperäinen päivä ei saa muuttua."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"p1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Paivays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\np2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Paivays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"28"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1985"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\np3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" p1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\np4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" p2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"400"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4.10.2020\n28.12.1985\n7.10.2020\n8.2.1987"}]}]},{"type":"element","tagName":"h2","properties":{"id":"erotus","style":"position:relative;"},"children":[{"type":"text","value":"Erotus"},{"type":"element","tagName":"a","properties":{"href":"#erotus","ariaLabel":"erotus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta päiväykselle operaattori -, joka palauttaa päivämäärien eron päivissä laskettuna. Huomaa, että koska oletamme jokaisessa kuukaudessa olevan 30 päivää, tässä tehtävässä vuosien päivien lukumäärä on 12*30 eli 360."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Operaattori toimii seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"p1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Paivays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\np2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Paivays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\np3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Paivays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"28"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1985"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p2"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"p1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p1"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"p2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p1"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"p3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"28\n28\n12516"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"iteraattorit","style":"position:relative;"},"children":[{"type":"text","value":"Iteraattorit"},{"type":"element","tagName":"a","properties":{"href":"#iteraattorit","ariaLabel":"iteraattorit permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olemme aikaisemmin käyttäneet for-lausetta erilaisten tietorakenteiden ja tiedostojen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"iterointiin"}]},{"type":"text","value":" eli läpikäyntiin. Tyypillinen tapaus olisi vaikkapa seuraavanlainen funktio:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"laske_positiiviset"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" n\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio käy läpi listan alkio kerrallaan ja laskee positiivisten alkioiden määärän."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Iterointi on mahdollista toteuttaa myös omiin luokkiin. Hyödyllistä tämä on silloin, kun luokasta muodostetut oliot tallentavat kokoelman alkioita. Esimerkiksi aikaisemmin kirjoitettiin luokka, joka mallintaa kirjahyllyä – olisi näppärä, jos kaikki kirjahyllyn kirjat voisi käydä läpi yhdessä silmukassa. Samalla tavalla opiskelijarekisterin kaikkien opiskelijoiden läpikäynti for-lauseella olisi kätevää."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Iterointi mahdollistuu toteuttamalla luokkaan iteraattorimetodit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__iter__"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__next__"}]},{"type":"text","value":". Käsitellään metodien toimintaa tarkemmin, kun on ensin tarkasteltu esimerkkinä kirjahyllyluokkaa, joka mahdollistaa kirjojen läpikäynnin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kirja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirjailija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sivuja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjailija "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kirjailija\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sivuja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sivuja\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kirjahylly"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_kirjat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_kirja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Iteraattorin alustusmetodi"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tässä tulee alustaa iteroinnissa käytettävä(t) muuttuja(t)"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__iter__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodi palauttaa viittauksen olioon itseensä, koska"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# iteraattori on toteutettu samassa luokassa"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodi palauttaa seuraavan alkion"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Jos ei ole enempää alkioita, heitetään tapahtuma"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# StopIteration"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__next__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Poimitaan listasta nykyinen"}]},{"type":"text","value":"\n kirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kasvatetaan laskuria yhdellä"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ...ja palautetaan"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" kirja\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Ei enempää kirjoja"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" StopIteration\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodissa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__iter__"}]},{"type":"text","value":" siis alustetaan iteroinnissa tarvittava muuttuja tai muuttujat - tässä tapauksessa riittää, että meillä on laskuri joka osoittaa listan nykyiseen alkioon. Lisäksi tarvitaan metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__next__"}]},{"type":"text","value":", joka palauttaa seuraavan alkion. Esimerkkitapauksessa palautetaan listasta alkio muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"n"}]},{"type":"text","value":" kohdalta ja kasvatetaan muuttujan arvoa yhdellä. Jos listassa ei ole enempää alkiota, \"nostetaan\" poikkeus "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"StopIteration"}]},{"type":"text","value":", joka kertoo iteroijalle (esim. for-silmukalle), että kaikki alkiot on käyty läpi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt voidaan käydä kirjahyllyn kirjat läpi esimerkiksi for-silmukassa näppärästi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n k1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Elämäni Pythoniassa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"123"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n k2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vanhus ja Java\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ernest Hemingjava\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"204"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n k3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"C-itsemän veljestä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Keijo Koodari\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"997"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n hylly "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirjahylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n hylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n hylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n hylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan kaikkien kirjojen nimet"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" kirja "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" hylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Elämäni Pythoniassa\nVanhus ja Java\nC-itsemän veljestä"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Iteroitava kauppalista","tmcname":"osa10-09_iteroitava_kauppalista"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on "},{"type":"element","tagName":"a","properties":{"href":"/osa-8/2-luokat-ja-oliot#programming-exercise-kauppalista"},"children":[{"type":"text","value":"osan 8 tehtävästä "}]},{"type":"text","value":" tuttu luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kauppalista"}]},{"type":"text","value":". Tee luokasta iteroitava, siten että sitä voi käyttää seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaanit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"omenat\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ananas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tuote "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":": "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" kpl\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"banaanit: 10 kpl\nomenat: 5 kpl\nananas: 1 kpl"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Iteraattorin metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__next__"}]},{"type":"text","value":" tulee palauttaa tupleja, joiden ensimmäinen alkio on tuotteen nimi ja toisen listalla olevan tuotteen lukumäärä."}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tunnet muuttujan self eri käyttötarkoituksia
  • \n
  • Osaat ylikuormittaa operaattoreita omissa luokissa
  • \n
  • Tiedät miten muodostaa iteroitavan luokan
  • \n

Luokka voi palauttaa metodista myös sen itsensä tyyppisen olion. Luokan Tuote metodi alennustuote palauttaa uuden tuotteen, jolla on sama nimi kuin nykyisellä tuotteella, mutta 25% halvempi hinta:

class Tuote:\n    def __init__(self, nimi: str, hinta: float):\n        self.__nimi = nimi\n        self.__hinta = hinta\n\n    def __str__(self):\n        return f\"{self.__nimi} (hinta {self.__hinta})\"\n\n    def alennustuote(self):\n        alennettu = Tuote(self.__nimi, self.__hinta * 0.75)\n        return alennettu
omena1 = Tuote(\"Omena\", 2.99)\nomena2 = omena1.alennustuote()\nprint(omena1)\nprint(omena2)

Omena (hinta 2.99)\nOmena (hinta 2.2425)

Kerrataan vielä muuttujan self merkitys: luokan sisällä se viittaa nykyiseen olioon. Tyypillinen tapa käyttää muuttujaa onkin viitata olion omiin piirteisiin, esimerkiksi attribuuttien arvoihin. Muuttujaa voidaan käyttää myös palauttamaan koko olio (vaikka tälle onkin selvästi harvemmin tarvetta). Esimerkkiluokan Tuote metodi halvempi osaa palauttaa halvemman tuotteen, kun sille annetaan parametriksi toinen Tuote-luokan olio:

class Tuote:\n    def __init__(self, nimi: str, hinta: float):\n        self.__nimi = nimi\n        self.__hinta = hinta\n\n    def __str__(self):\n        return f\"{self.__nimi} (hinta {self.__hinta})\"\n\n    @property\n    def hinta(self):\n        return self.__hinta\n\n    def halvempi(self, tuote):\n        if self.__hinta < tuote.hinta:\n            return self\n        else:\n            return tuote
omena = Tuote(\"Omena\", 2.99)\nappelsiini = Tuote(\"Appelsiini\", 3.95)\nbanaani = Tuote(\"Banaani\", 5.25)\n\nprint(appelsiini.halvempi(omena))\nprint(appelsiini.halvempi(banaani))

Omena (2.99)\nAppelsiini (3.95)

Esimerkin vertailun toteutus vaikuttaa kuitenkin melko kömpelöltä - paljon parempi olisi, jos voisimme vertailla Tuote-olioita suoraan Pythonin vertailuoperaattoreilla.

Operaattorien ylikuormitus

Pythonin lasku- ja vertailuoperaattorien käyttö omien olioiden kanssa on onneksi mahdollista. Tähän käytetään tekniikkaa, jonka nimi on operaattorien ylikuormitus. Kun halutaan, että tietty operaattori toimii myös omasta luokasta muodostettujen olioiden kanssa, luokkaan kirjoitetaan vastaava metodi joka palauttaa oikean lopputuloksen. Periaate on vastaava kuin metodin __str__ kanssa: Python osaa käyttää tietyllä tapaa nimettyjä metodeja tietyissä operaatioissa.

Tarkastellaan ensin esimerkkiä, jossa Tuote-luokkaan on toteutettu metodi __gt__ (lyhenne sanoista greater than) joka toteuttaa suurempi kuin -operaattorin. Tarkemmin sanottuna metodi palauttaa arvon True, jos nykyinen olio on suurempi kuin parametrina annettu olio.

class Tuote:\n    def __init__(self, nimi: str, hinta: float):\n        self.__nimi = nimi\n        self.__hinta = hinta\n\n    def __str__(self):\n        return f\"{self.__nimi} (hinta {self.__hinta})\"\n\n    @property\n    def hinta(self):\n        return self.__hinta\n\n    def __gt__(self, toinen_tuote):\n        return self.hinta > toinen_tuote.hinta

Metodi __gt__ palauttaa arvon True, jos nykyisen tuotteen hinta on suurempi kuin parametrina annetun tuotteen, ja muuten arvon False.

Nyt luokan olioita voidaan vertailla käyttäen >-operaattoria samalla tavalla kuin vaikkapa kokonaislukuja:

appelsiini = Tuote(\"Appelsiini\", 4.90)\nomena = Tuote(\"Omena\", 3.95)\n\nif appelsiini > omena:\n    print(\"Appelsiini on suurempi\")\nelse:\n    print(\"Omena on suurempi\")

Appelsiini on suurempi

Olioiden suuruusluokan vertailua toteuttaessa täytyy päättää, millä perusteella suuruusjärjestys määritetään. Voisimme myös haluta, että tuotteet järjestetään hinnan sijasta nimen mukaiseen aakkosjärjestykseen. Tällöin omena olisikin appelsiinia \"suurempi\":

class Tuote:\n    def __init__(self, nimi: str, hinta: float):\n        self.__nimi = nimi\n        self.__hinta = hinta\n\n    def __str__(self):\n        return f\"{self.__nimi} (hinta {self.__hinta})\"\n\n    @property\n    def hinta(self):\n        return self.__hinta\n\n    @property\n    def nimi(self):\n        return self.__nimi\n\n    def __gt__(self, toinen_tuote):\n        return self.nimi > toinen_tuote.nimi
appelsiini = Tuote(\"Appelsiini\", 4.90)\nomena = Tuote(\"Omena\", 3.95)\n\nif appelsiini > omena:\n    print(\"Appelsiini on suurempi\")\nelse:\n    print(\"Omena on suurempi\")

Omena on suurempi

Lisää operaattoreita

Tavalliset vertailuoperaattorit ja näitä vastaavat metodit on esitetty seuraavassa taulukossa:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
OperaattoriMerkitys perinteisestiMetodin nimi
<Pienempi kuin__lt__(self, toinen)
>Suurempi kuin__gt__(self, toinen)
==Yhtä suuri kuin__eq__(self, toinen)
!=Eri suuri kuin__ne__(self, toinen)
<=Pienempi tai yhtäsuuri kuin__le__(self, toinen)
>=Suurempi tai yhtäsuuri kuin__ge__(self, toinen)

Lisäksi luokissa voidaan toteuttaa tiettyjä muita operaattoreita, esimerkiksi:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
OperaattoriMerkitys perinteisestiMetodin nimi
+Yhdistäminen__add__(self, toinen)
-Vähentäminen__sub__(self, toinen)
*Monistaminen__mul__(self, toinen)
/Jakaminen__truediv__(self, toinen)
//Kokonaisjakaminen__floordiv__(self, toinen)

Lisää operaattoreita ja metodien nimien vastineita löydät helposti Googlella.

Huomaa, että vain hyvin harvoin on tarvetta toteuttaa kaikkia operaatioita omassa luokassa. Esimerkiksi jakaminen on operaatio, jolle on hankalaa keksiä luontevaa käyttöä useimmissa luokissa (mitä tulee, kun jaetaan opiskelija kolmella saati toisella opiskelijalla?). Tiettyjen operaattoreiden toteuttamisesta voi kuitenkin olla hyötyä, mikäli vastaavat operaatiot ovat loogisia luokalle.

Tarkastellaan esimerkkinä luokkaa joka mallintaa yhtä muistiinpanoa. Kahden muistiinpanon yhdistäminen +-operaattorilla tuottaa uuden, yhdistetyn muistiinpanon, kun on toteutettu metodi __add__:

from datetime import datetime\n\nclass Muistiinpano:\n    def __init__(self, pvm: datetime, merkinta: str):\n        self.pvm = pvm\n        self.merkinta = merkinta\n\n    def __str__(self):\n        return f\"{self.pvm}: {self.merkinta}\"\n\n    def __add__(self, toinen):\n        # Uuden muistiinpanon ajaksi nykyinen aika\n        uusi_muistiinpano = Muistiinpano(datetime.now(), \"\")\n        uusi_muistiinpano.merkinta = self.merkinta + \" ja \" + toinen.merkinta\n        return uusi_muistiinpano
merkinta1 = Muistiinpano(datetime(2016, 12, 17), \"Muista ostaa lahjoja\")\nmerkinta2 = Muistiinpano(datetime(2016, 12, 23), \"Muista hakea kuusi\")\n\n# Nyt voidaan yhdistää plussalla - tämä kutsuu metodia __add__ luokassa Muistiipano\nmolemmat = merkinta1 + merkinta2\nprint(molemmat)

2020-09-09 14:13:02.163170: Muista ostaa lahjoja ja Muista hakea kuusi

Olion esitys merkkijonona

Olemme toteuttaneet luokkiin usein metodin __str__, joka antaa merkkijonoesityksen olion sisällöstä. Toinen melko samanlainen metodi on __repr__, joka antaa teknisen esityksen olion sisällöstä. Usein metodi __repr__ toteutetaan niin, että se antaa koodin, joka muodostaa olion.

Funktio repr antaa olion teknisen merkkijonoesityksen, ja lisäksi tätä esitystä käytetään, jos oliossa ei ole määritelty __str__-metodia. Seuraava luokka esittelee asiaa:

class Henkilo:\n    def __init__(self, nimi: str, ika: int):\n        self.nimi = nimi\n        self.ika = ika\n        \n    def __repr__(self):\n        return f\"Henkilo({repr(self.nimi)}, {self.ika})\"
henkilo1 = Henkilo("Anna", 25)\nhenkilo2 = Henkilo("Pekka", 99)\nprint(henkilo1)\nprint(henkilo2)

Henkilo('Anna', 25)\nHenkilo('Pekka', 99)

Huomaa, että metodissa __repr__ haetaan nimen tekninen esitys metodilla repr, jolloin tässä tapauksessa nimen ympärille tulee '-merkit.

Seuraavassa luokassa on toteutettu sekä metodi __repr__ että __str__:

class Henkilo:\n    def __init__(self, nimi: str, ika: int):\n        self.nimi = nimi\n        self.ika = ika\n        \n    def __repr__(self):\n        return f\"Henkilo({repr(self.nimi)}, {self.ika})\"\n\n    def __str__(self):\n        return f\"{self.nimi} ({self.ika} vuotta)\"
henkilo = Henkilo("Anna", 25)\nprint(henkilo)\nprint(repr(henkilo))

Anna (25 vuotta)\nHenkilo('Anna', 25)

Kun tietorakenteessa (kuten listassa) on olioita, Python käyttää vähän epäloogisesti metodia __repr__ olioiden merkkijonoesityksen muodostamiseen, kun lista tulostetaan:

henkilot = []\nhenkilot.append(Henkilo("Anna", 25))\nhenkilot.append(Henkilo("Pekka", 99))\nhenkilot.append(Henkilo("Maija", 55))\nprint(henkilot)

[Henkilo('Anna', 25), Henkilo('Pekka', 99), Henkilo('Maija', 55)]

Tehtäväpohjasta löytyy luokan Raha runko. Tässä tehtävässä laajennetaan runkoa muutamilla operaattoreilla, ja korjataan pari rungossa olevaa pientä ongelmaa

Korjaa merkkijonoesitys

Rahan merkkijonoesityksen muodostava metodi ei ole nyt ihan kunnossa. Seuraavassa esimerkissä muodostetaan kaksi raha-olioa, joista jälkimmäinen ei tulostu oikein:

e1 = Raha(4, 10)\ne2 = Raha(2, 5)  # kaksi euroa ja viisi senttiä\n\nprint(e1)\nprint(e2)

4.10\n2.5

Korjaa luokan metodi __str__(self) siten, että tulostus on seuraava:

4.10 eur\n2.05 eur

Yhtäsuuruus

Määrittele raha-oliolle metodi __eq__(self, toinen), jonka avulla rahan yhtäsuuruusvertailu saadaan toimimaan:

e1 = Raha(4, 10)\ne2 = Raha(2, 5)\ne3 = Raha(4, 10)\n\nprint(e1)\nprint(e2)\nprint(e3)\nprint(e1 == e2)\nprint(e1 == e3)

4.10 eur\n2.05 eur\n4.10 eur\nFalse\nTrue

Muut vertailut

Toteuta rahalle myös seuraavat vertailuoperaattorit <, >, !=.

e1 = Raha(4, 10)\ne2 = Raha(2, 5)\n\nprint(e1 != e2)\nprint(e1 < e2)\nprint(e1 > e2)

True\nFalse\nTrue

Plus ja miinus

Toteuta rahalle yhteen- ja vähennyslaskuoperaatiot. Molempien operaatioiden tulee palauttaa uusi rahaolio, ja ne eivät saa muuttaa olioa itseään tai parametrina olevaa olioa!

Huomaa, että rahan arvo ei voi olla negatiivinen. Negatiiviseen tulokseen päätyvän vähennyslaskuyrityksen tulee aiheuttaa ValueError-tyyppinen poikkeus.

e1 = Raha(4, 5)\ne2 = Raha(2, 95)\n\ne3 = e1 + e2\ne4 = e1 - e2\n\nprint(e3)\nprint(e4)\n\ne5 = e2-e1
7.00 eur\n1.10 eur\nTraceback (most recent call last):\nFile \"tiedosto.py\", line 416, in \ne5 = e2-e1\nFile \"tiedosto.py\", line 404, in sub\nraise ValueError(f\"negatiivinen tulos ei sallittu\")\nValueError: negatiivinen tulos ei sallittu

Arvoa ei voi muuttaa

Luokassa on tällä hetkellä vielä pieni ongelma, koska käyttäjä voi \"huijaamalla\" muuttaa rahan arvoa:

print(e1)\ne1.eurot = 1000\nprint(e1)

4.05 eur\n1000.05 eur

Muuta luokan toteutus kapseloiduksi siten, että yllä oleva huijaus ei onnistu. Luokalla ei siis saa olla kapseloimattomia attribuutteja eikä asetus- tai havainnointimetodeita euroille tai senteille!

Tässä tehtävässä toteutetaan luokka Paivays, jonka avulla on mahdollista käsitellä päivämääriä. Oletetaan tässä tehtävässä yksinkertaisuuden vuoksi, että jokaisessa kuussa on 30 päivää.

Huom! Edellisestä johtuen tehtävässä ei poikkeuksellisesti kannata käyttää Pythonin datetime-moduulia, vaan toteutetaan luokka itse.

Vertailut

Toteuta luokan runko ja sille vertailuoperaattorit <, >, == ja !=. Käyttöesimerkki:

p1 = Paivays(4, 10, 2020)\np2 = Paivays(28, 12, 1985)\np3 = Paivays(28, 12, 1985)\n\nprint(p1)\nprint(p2)\nprint(p1 == p2)\nprint(p1 != p2)\nprint(p1 == p3)\nprint(p1 < p2)\nprint(p1 > p2)

4.10.2020\n28.12.1985\nFalse\nTrue\nFalse\nFalse\nTrue

Kasvatus

Toteuta päiväykselle operaattori +. Operaattori luo uuden päivämäärän joka on lisättävän lukeman päiviä verran suurempi kuin alkuperäinen päivämäärä. Alkuperäinen päivä ei saa muuttua.

p1 = Paivays(4, 10, 2020)\np2 = Paivays(28, 12, 1985)\n\np3 = p1 + 3\np4 = p2 + 400\n\nprint(p1)\nprint(p2)\nprint(p3)\nprint(p4)

4.10.2020\n28.12.1985\n7.10.2020\n8.2.1987

Erotus

Toteuta päiväykselle operaattori -, joka palauttaa päivämäärien eron päivissä laskettuna. Huomaa, että koska oletamme jokaisessa kuukaudessa olevan 30 päivää, tässä tehtävässä vuosien päivien lukumäärä on 12*30 eli 360.

Operaattori toimii seuraavasti

p1 = Paivays(4, 10, 2020)\np2 = Paivays(2, 11, 2020)\np3 = Paivays(28, 12, 1985)\n\nprint(p2-p1)\nprint(p1-p2)\nprint(p1-p3)

28\n28\n12516

Iteraattorit

Olemme aikaisemmin käyttäneet for-lausetta erilaisten tietorakenteiden ja tiedostojen iterointiin eli läpikäyntiin. Tyypillinen tapaus olisi vaikkapa seuraavanlainen funktio:

\ndef laske_positiiviset(lista: list):\n    n = 0\n    for alkio in lista:\n        if alkio > 0:\n            n += 1\n    return n\n

Funktio käy läpi listan alkio kerrallaan ja laskee positiivisten alkioiden määärän.

Iterointi on mahdollista toteuttaa myös omiin luokkiin. Hyödyllistä tämä on silloin, kun luokasta muodostetut oliot tallentavat kokoelman alkioita. Esimerkiksi aikaisemmin kirjoitettiin luokka, joka mallintaa kirjahyllyä – olisi näppärä, jos kaikki kirjahyllyn kirjat voisi käydä läpi yhdessä silmukassa. Samalla tavalla opiskelijarekisterin kaikkien opiskelijoiden läpikäynti for-lauseella olisi kätevää.

Iterointi mahdollistuu toteuttamalla luokkaan iteraattorimetodit __iter__ ja __next__. Käsitellään metodien toimintaa tarkemmin, kun on ensin tarkasteltu esimerkkinä kirjahyllyluokkaa, joka mahdollistaa kirjojen läpikäynnin:

\nclass Kirja:\n    def __init__(self, nimi: str, kirjailija: str, sivuja: int):\n        self.nimi = nimi\n        self.kirjailija = kirjailija\n        self.sivuja = sivuja\n\nclass Kirjahylly:\n    def __init__(self):\n        self._kirjat = []\n\n    def lisaa_kirja(self, kirja: Kirja):\n        self._kirjat.append(kirja)\n\n    # Iteraattorin alustusmetodi\n    # Tässä tulee alustaa iteroinnissa käytettävä(t) muuttuja(t)\n    def __iter__(self):\n        self.n = 0\n        # Metodi palauttaa viittauksen olioon itseensä, koska\n        # iteraattori on toteutettu samassa luokassa\n        return self\n\n    # Metodi palauttaa seuraavan alkion\n    # Jos ei ole enempää alkioita, heitetään tapahtuma\n    # StopIteration\n    def __next__(self):\n        if self.n < len(self._kirjat):\n            # Poimitaan listasta nykyinen\n            kirja = self._kirjat[self.n]\n            # Kasvatetaan laskuria yhdellä\n            self.n += 1\n            # ...ja palautetaan\n            return kirja\n        else:\n            # Ei enempää kirjoja\n            raise StopIteration\n

Metodissa __iter__ siis alustetaan iteroinnissa tarvittava muuttuja tai muuttujat - tässä tapauksessa riittää, että meillä on laskuri joka osoittaa listan nykyiseen alkioon. Lisäksi tarvitaan metodi __next__, joka palauttaa seuraavan alkion. Esimerkkitapauksessa palautetaan listasta alkio muuttujan n kohdalta ja kasvatetaan muuttujan arvoa yhdellä. Jos listassa ei ole enempää alkiota, \"nostetaan\" poikkeus StopIteration, joka kertoo iteroijalle (esim. for-silmukalle), että kaikki alkiot on käyty läpi.

Nyt voidaan käydä kirjahyllyn kirjat läpi esimerkiksi for-silmukassa näppärästi:

\nif __name__ == \"__main__\":\n    k1 = Kirja(\"Elämäni Pythoniassa\", \"Pekka Python\", 123)\n    k2 = Kirja(\"Vanhus ja Java\", \"Ernest Hemingjava\", 204)\n    k3 = Kirja(\"C-itsemän veljestä\", \"Keijo Koodari\", 997)\n\n    hylly = Kirjahylly()\n    hylly.lisaa_kirja(k1)\n    hylly.lisaa_kirja(k2)\n    hylly.lisaa_kirja(k3)\n\n    # Tulostetaan kaikkien kirjojen nimet\n    for kirja in hylly:\n        print(kirja.nimi)\n

Elämäni Pythoniassa\nVanhus ja Java\nC-itsemän veljestä

Tehtäväpohjassa on osan 8 tehtävästä tuttu luokka Kauppalista. Tee luokasta iteroitava, siten että sitä voi käyttää seuraavasti:

lista = Kauppalista()\nlista.lisaa(\"banaanit\", 10)\nlista.lisaa(\"omenat\", 5)\nlista.lisaa(\"ananas\", 1)\n\nfor tuote in lista:\n    print(f\"{tuote[0]}: {tuote[1]} kpl\")

banaanit: 10 kpl\nomenat: 5 kpl\nananas: 1 kpl

Iteraattorin metodin __next__ tulee palauttaa tupleja, joiden ensimmäinen alkio on tuotteen nimi ja toisen listalla olevan tuotteen lukumäärä.

","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-10/3-olio-ohjelmoinnin-tekniikoita.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tunnet muuttujan self eri käyttötarkoituksia"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat ylikuormittaa operaattoreita omissa luokissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät miten muodostaa iteroitavan luokan"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokka voi palauttaa metodista myös sen itsensä tyyppisen olion. Luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tuote"}]},{"type":"text","value":" metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"alennustuote"}]},{"type":"text","value":" palauttaa uuden tuotteen, jolla on sama nimi kuin nykyisellä tuotteella, mutta 25% halvempi hinta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Tuote"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" hinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" hinta\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" (hinta "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"alennustuote"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n alennettu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.75"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" alennettu"}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"omena1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Omena\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2.99"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nomena2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" omena1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"alennustuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"omena1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"omena2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Omena (hinta 2.99)\nOmena (hinta 2.2425)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kerrataan vielä muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":" merkitys: luokan sisällä se viittaa nykyiseen olioon. Tyypillinen tapa käyttää muuttujaa onkin viitata olion omiin piirteisiin, esimerkiksi attribuuttien arvoihin. Muuttujaa voidaan käyttää myös palauttamaan koko olio (vaikka tälle onkin selvästi harvemmin tarvetta). Esimerkkiluokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tuote"}]},{"type":"text","value":" metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"halvempi"}]},{"type":"text","value":" osaa palauttaa halvemman tuotteen, kun sille annetaan parametriksi toinen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tuote"}]},{"type":"text","value":"-luokan olio:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Tuote"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" hinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" hinta\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" (hinta "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hinta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"halvempi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" tuote"}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"omena "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Omena\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2.99"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nappelsiini "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Appelsiini\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nbanaani "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5.25"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"appelsiini"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"halvempi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"omena"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"appelsiini"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"halvempi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"banaani"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Omena (2.99)\nAppelsiini (3.95)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkin vertailun toteutus vaikuttaa kuitenkin melko kömpelöltä - paljon parempi olisi, jos voisimme vertailla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tuote"}]},{"type":"text","value":"-olioita suoraan Pythonin vertailuoperaattoreilla."}]},{"type":"element","tagName":"h2","properties":{"id":"operaattorien-ylikuormitus","style":"position:relative;"},"children":[{"type":"text","value":"Operaattorien ylikuormitus"},{"type":"element","tagName":"a","properties":{"href":"#operaattorien-ylikuormitus","ariaLabel":"operaattorien ylikuormitus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonin lasku- ja vertailuoperaattorien käyttö omien olioiden kanssa on onneksi mahdollista. Tähän käytetään tekniikkaa, jonka nimi on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"operaattorien ylikuormitus"}]},{"type":"text","value":". Kun halutaan, että tietty operaattori toimii myös omasta luokasta muodostettujen olioiden kanssa, luokkaan kirjoitetaan vastaava metodi joka palauttaa oikean lopputuloksen. Periaate on vastaava kuin metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":" kanssa: Python osaa käyttää tietyllä tapaa nimettyjä metodeja tietyissä operaatioissa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan ensin esimerkkiä, jossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tuote"}]},{"type":"text","value":"-luokkaan on toteutettu metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__gt__"}]},{"type":"text","value":" (lyhenne sanoista "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"g"}]},{"type":"text","value":"reater "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"t"}]},{"type":"text","value":"han) joka toteuttaa suurempi kuin -operaattorin. Tarkemmin sanottuna metodi palauttaa arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", jos nykyinen olio on suurempi kuin parametrina annettu olio."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Tuote"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" hinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" hinta\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" (hinta "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hinta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__gt__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" toinen_tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" toinen_tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hinta"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__gt__"}]},{"type":"text","value":" palauttaa arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", jos nykyisen tuotteen hinta on suurempi kuin parametrina annetun tuotteen, ja muuten arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt luokan olioita voidaan vertailla käyttäen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":"-operaattoria samalla tavalla kuin vaikkapa kokonaislukuja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"appelsiini "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Appelsiini\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.90"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nomena "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Omena\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" appelsiini "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" omena"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Appelsiini on suurempi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Omena on suurempi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Appelsiini on suurempi"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olioiden suuruusluokan vertailua toteuttaessa täytyy päättää, millä perusteella suuruusjärjestys määritetään. Voisimme myös haluta, että tuotteet järjestetään hinnan sijasta nimen mukaiseen aakkosjärjestykseen. Tällöin omena olisikin appelsiinia \"suurempi\":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Tuote"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" hinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" hinta\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" (hinta "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hinta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__hinta\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"nimi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__gt__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" toinen_tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" toinen_tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"appelsiini "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Appelsiini\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.90"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nomena "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Omena\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" appelsiini "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" omena"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Appelsiini on suurempi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Omena on suurempi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Omena on suurempi"}]}]},{"type":"element","tagName":"h2","properties":{"id":"lisaa-operaattoreita","style":"position:relative;"},"children":[{"type":"text","value":"Lisää operaattoreita"},{"type":"element","tagName":"a","properties":{"href":"#lisaa-operaattoreita","ariaLabel":"lisaa operaattoreita permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tavalliset vertailuoperaattorit ja näitä vastaavat metodit on esitetty seuraavassa taulukossa:"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Operaattori"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Merkitys perinteisesti"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Metodin nimi"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<"}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Pienempi kuin"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__lt__(self, toinen)"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":">"}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Suurempi kuin"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__gt__(self, toinen)"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"=="}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Yhtä suuri kuin"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__eq__(self, toinen)"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"!="}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Eri suuri kuin"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__ne__(self, toinen)"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<="}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Pienempi tai yhtäsuuri kuin"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__le__(self, toinen)"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":">="}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Suurempi tai yhtäsuuri kuin"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__ge__(self, toinen)"}]}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisäksi luokissa voidaan toteuttaa tiettyjä muita operaattoreita, esimerkiksi:"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Operaattori"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Merkitys perinteisesti"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Metodin nimi"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"+"}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Yhdistäminen"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__add__(self, toinen)"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"-"}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Vähentäminen"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__sub__(self, toinen)"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"*"}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Monistaminen"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__mul__(self, toinen)"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"/"}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Jakaminen"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__truediv__(self, toinen)"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"//"}]}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"Kokonaisjakaminen"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__floordiv__(self, toinen)"}]}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisää operaattoreita ja metodien nimien vastineita löydät helposti Googlella."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että vain hyvin harvoin on tarvetta toteuttaa kaikkia operaatioita omassa luokassa. Esimerkiksi jakaminen on operaatio, jolle on hankalaa keksiä luontevaa käyttöä useimmissa luokissa (mitä tulee, kun jaetaan opiskelija kolmella saati toisella opiskelijalla?). Tiettyjen operaattoreiden toteuttamisesta voi kuitenkin olla hyötyä, mikäli vastaavat operaatiot ovat loogisia luokalle."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkinä luokkaa joka mallintaa yhtä muistiinpanoa. Kahden muistiinpanon yhdistäminen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"-operaattorilla tuottaa uuden, yhdistetyn muistiinpanon, kun on toteutettu metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__add__"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" datetime\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Muistiinpano"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pvm"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" merkinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pvm "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pvm\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" merkinta\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pvm"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":": "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__add__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" toinen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Uuden muistiinpanon ajaksi nykyinen aika"}]},{"type":"text","value":"\n uusi_muistiinpano "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Muistiinpano"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"now"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n uusi_muistiinpano"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" ja \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" toinen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkinta\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" uusi_muistiinpano"}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"merkinta1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Muistiinpano"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2016"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"17"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Muista ostaa lahjoja\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmerkinta2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Muistiinpano"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2016"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"23"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Muista hakea kuusi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Nyt voidaan yhdistää plussalla - tämä kutsuu metodia __add__ luokassa Muistiipano"}]},{"type":"text","value":"\nmolemmat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" merkinta1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" merkinta2\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"molemmat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2020-09-09 14:13:02.163170: Muista ostaa lahjoja ja Muista hakea kuusi"}]}]},{"type":"element","tagName":"h2","properties":{"id":"olion-esitys-merkkijonona","style":"position:relative;"},"children":[{"type":"text","value":"Olion esitys merkkijonona"},{"type":"element","tagName":"a","properties":{"href":"#olion-esitys-merkkijonona","ariaLabel":"olion esitys merkkijonona permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olemme toteuttaneet luokkiin usein metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":", joka antaa merkkijonoesityksen olion sisällöstä. Toinen melko samanlainen metodi on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__repr__"}]},{"type":"text","value":", joka antaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"teknisen"}]},{"type":"text","value":" esityksen olion sisällöstä. Usein metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__repr__"}]},{"type":"text","value":" toteutetaan niin, että se antaa koodin, joka muodostaa olion."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"repr"}]},{"type":"text","value":" antaa olion teknisen merkkijonoesityksen, ja lisäksi tätä esitystä käytetään, jos oliossa ei ole määritelty "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":"-metodia. Seuraava luokka esittelee asiaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" ika\n \n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__repr__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Henkilo("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"repr"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python3"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python3"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python3"]},"children":[{"type":"text","value":"henkilo1 = Henkilo(\"Anna\", 25)\nhenkilo2 = Henkilo(\"Pekka\", 99)\nprint(henkilo1)\nprint(henkilo2)"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Henkilo('Anna', 25)\nHenkilo('Pekka', 99)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että metodissa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__repr__"}]},{"type":"text","value":" haetaan nimen tekninen esitys metodilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"repr"}]},{"type":"text","value":", jolloin tässä tapauksessa nimen ympärille tulee "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"'"}]},{"type":"text","value":"-merkit."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa luokassa on toteutettu sekä metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__repr__"}]},{"type":"text","value":" että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" ika\n \n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__repr__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Henkilo("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"repr"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" vuotta)\""}]}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python3"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python3"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python3"]},"children":[{"type":"text","value":"henkilo = Henkilo(\"Anna\", 25)\nprint(henkilo)\nprint(repr(henkilo))"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna (25 vuotta)\nHenkilo('Anna', 25)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun tietorakenteessa (kuten listassa) on olioita, Python käyttää vähän epäloogisesti metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__repr__"}]},{"type":"text","value":" olioiden merkkijonoesityksen muodostamiseen, kun lista tulostetaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python3"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python3"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python3"]},"children":[{"type":"text","value":"henkilot = []\nhenkilot.append(Henkilo(\"Anna\", 25))\nhenkilot.append(Henkilo(\"Pekka\", 99))\nhenkilot.append(Henkilo(\"Maija\", 55))\nprint(henkilot)"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[Henkilo('Anna', 25), Henkilo('Pekka', 99), Henkilo('Maija', 55)]"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Raha","tmcname":"osa10-07_raha"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjasta löytyy luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Raha"}]},{"type":"text","value":" runko. Tässä tehtävässä laajennetaan runkoa muutamilla operaattoreilla, ja korjataan pari rungossa olevaa pientä ongelmaa"}]},{"type":"element","tagName":"h2","properties":{"id":"korjaa-merkkijonoesitys","style":"position:relative;"},"children":[{"type":"text","value":"Korjaa merkkijonoesitys"},{"type":"element","tagName":"a","properties":{"href":"#korjaa-merkkijonoesitys","ariaLabel":"korjaa merkkijonoesitys permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rahan merkkijonoesityksen muodostava metodi ei ole nyt ihan kunnossa. Seuraavassa esimerkissä muodostetaan kaksi raha-olioa, joista jälkimmäinen ei tulostu oikein:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"e1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Raha"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ne2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Raha"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kaksi euroa ja viisi senttiä"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4.10\n2.5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Korjaa luokan metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__(self)"}]},{"type":"text","value":" siten, että tulostus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4.10 eur\n2.05 eur"}]}]},{"type":"element","tagName":"h2","properties":{"id":"yhtasuuruus","style":"position:relative;"},"children":[{"type":"text","value":"Yhtäsuuruus"},{"type":"element","tagName":"a","properties":{"href":"#yhtasuuruus","ariaLabel":"yhtasuuruus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Määrittele raha-oliolle metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__eq__(self, toinen)"}]},{"type":"text","value":", jonka avulla rahan yhtäsuuruusvertailu saadaan toimimaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"e1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Raha"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ne2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Raha"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ne3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Raha"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" e2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" e3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4.10 eur\n2.05 eur\n4.10 eur\nFalse\nTrue"}]}]},{"type":"element","tagName":"h2","properties":{"id":"muut-vertailut","style":"position:relative;"},"children":[{"type":"text","value":"Muut vertailut"},{"type":"element","tagName":"a","properties":{"href":"#muut-vertailut","ariaLabel":"muut vertailut permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta rahalle myös seuraavat vertailuoperaattorit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"!="}]},{"type":"text","value":"."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"e1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Raha"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ne2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Raha"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"!="}]},{"type":"text","value":" e2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" e2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" e2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\nFalse\nTrue"}]}]},{"type":"element","tagName":"h2","properties":{"id":"plus-ja-miinus","style":"position:relative;"},"children":[{"type":"text","value":"Plus ja miinus"},{"type":"element","tagName":"a","properties":{"href":"#plus-ja-miinus","ariaLabel":"plus ja miinus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta rahalle yhteen- ja vähennyslaskuoperaatiot. Molempien operaatioiden tulee palauttaa uusi rahaolio, ja ne eivät saa muuttaa olioa itseään tai parametrina olevaa olioa!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että rahan arvo ei voi olla negatiivinen. Negatiiviseen tulokseen päätyvän vähennyslaskuyrityksen tulee aiheuttaa ValueError-tyyppinen poikkeus."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"e1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Raha"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ne2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Raha"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ne3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" e1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" e2\ne4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" e1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" e2\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ne5 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" e2"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"e1"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"text","value":"7.00 eur\n1.10 eur\nTraceback (most recent call last):\nFile \"tiedosto.py\", line 416, in "},{"type":"element","tagName":"module","properties":{},"children":[{"type":"text","value":"\ne5 = e2-e1\nFile \"tiedosto.py\", line 404, in "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"sub"}]},{"type":"text","value":"\nraise ValueError(f\"negatiivinen tulos ei sallittu\")\nValueError: negatiivinen tulos ei sallittu"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"arvoa-ei-voi-muuttaa","style":"position:relative;"},"children":[{"type":"text","value":"Arvoa ei voi muuttaa"},{"type":"element","tagName":"a","properties":{"href":"#arvoa-ei-voi-muuttaa","ariaLabel":"arvoa ei voi muuttaa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokassa on tällä hetkellä vielä pieni ongelma, koska käyttäjä voi \"huijaamalla\" muuttaa rahan arvoa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ne1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"eurot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4.05 eur\n1000.05 eur"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuta luokan toteutus "},{"type":"element","tagName":"a","properties":{"href":"/osa-9/3-kapselointi#kapselointi"},"children":[{"type":"text","value":"kapseloiduksi"}]},{"type":"text","value":" siten, että yllä oleva huijaus ei onnistu. Luokalla ei siis saa olla kapseloimattomia attribuutteja eikä asetus- tai havainnointimetodeita euroille tai senteille!"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Päiväys","tmcname":"osa10-08_paivays"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä toteutetaan luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Paivays"}]},{"type":"text","value":", jonka avulla on mahdollista käsitellä päivämääriä. Oletetaan tässä tehtävässä yksinkertaisuuden vuoksi, että "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"jokaisessa kuussa on 30 päivää"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huom! Edellisestä johtuen tehtävässä ei poikkeuksellisesti kannata käyttää Pythonin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"datetime"}]},{"type":"text","value":"-moduulia, vaan toteutetaan luokka itse."}]},{"type":"element","tagName":"h2","properties":{"id":"vertailut","style":"position:relative;"},"children":[{"type":"text","value":"Vertailut"},{"type":"element","tagName":"a","properties":{"href":"#vertailut","ariaLabel":"vertailut permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta luokan runko ja sille vertailuoperaattorit <, >, == ja !=. Käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"p1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Paivays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\np2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Paivays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"28"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1985"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\np3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Paivays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"28"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1985"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" p2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"!="}]},{"type":"text","value":" p2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" p3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" p2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" p2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4.10.2020\n28.12.1985\nFalse\nTrue\nFalse\nFalse\nTrue"}]}]},{"type":"element","tagName":"h2","properties":{"id":"kasvatus","style":"position:relative;"},"children":[{"type":"text","value":"Kasvatus"},{"type":"element","tagName":"a","properties":{"href":"#kasvatus","ariaLabel":"kasvatus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta päiväykselle operaattori +. Operaattori luo uuden päivämäärän joka on lisättävän lukeman päiviä verran suurempi kuin alkuperäinen päivämäärä. Alkuperäinen päivä ei saa muuttua."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"p1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Paivays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\np2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Paivays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"28"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1985"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\np3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" p1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\np4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" p2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"400"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4.10.2020\n28.12.1985\n7.10.2020\n8.2.1987"}]}]},{"type":"element","tagName":"h2","properties":{"id":"erotus","style":"position:relative;"},"children":[{"type":"text","value":"Erotus"},{"type":"element","tagName":"a","properties":{"href":"#erotus","ariaLabel":"erotus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta päiväykselle operaattori -, joka palauttaa päivämäärien eron päivissä laskettuna. Huomaa, että koska oletamme jokaisessa kuukaudessa olevan 30 päivää, tässä tehtävässä vuosien päivien lukumäärä on 12*30 eli 360."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Operaattori toimii seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"p1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Paivays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\np2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Paivays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\np3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Paivays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"28"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1985"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p2"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"p1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p1"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"p2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p1"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"p3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"28\n28\n12516"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"iteraattorit","style":"position:relative;"},"children":[{"type":"text","value":"Iteraattorit"},{"type":"element","tagName":"a","properties":{"href":"#iteraattorit","ariaLabel":"iteraattorit permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olemme aikaisemmin käyttäneet for-lausetta erilaisten tietorakenteiden ja tiedostojen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"iterointiin"}]},{"type":"text","value":" eli läpikäyntiin. Tyypillinen tapaus olisi vaikkapa seuraavanlainen funktio:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"laske_positiiviset"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" n\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio käy läpi listan alkio kerrallaan ja laskee positiivisten alkioiden määärän."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Iterointi on mahdollista toteuttaa myös omiin luokkiin. Hyödyllistä tämä on silloin, kun luokasta muodostetut oliot tallentavat kokoelman alkioita. Esimerkiksi aikaisemmin kirjoitettiin luokka, joka mallintaa kirjahyllyä – olisi näppärä, jos kaikki kirjahyllyn kirjat voisi käydä läpi yhdessä silmukassa. Samalla tavalla opiskelijarekisterin kaikkien opiskelijoiden läpikäynti for-lauseella olisi kätevää."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Iterointi mahdollistuu toteuttamalla luokkaan iteraattorimetodit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__iter__"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__next__"}]},{"type":"text","value":". Käsitellään metodien toimintaa tarkemmin, kun on ensin tarkasteltu esimerkkinä kirjahyllyluokkaa, joka mahdollistaa kirjojen läpikäynnin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kirja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirjailija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sivuja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjailija "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kirjailija\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sivuja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sivuja\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kirjahylly"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_kirjat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_kirja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Iteraattorin alustusmetodi"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tässä tulee alustaa iteroinnissa käytettävä(t) muuttuja(t)"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__iter__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodi palauttaa viittauksen olioon itseensä, koska"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# iteraattori on toteutettu samassa luokassa"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodi palauttaa seuraavan alkion"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Jos ei ole enempää alkioita, heitetään tapahtuma"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# StopIteration"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__next__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Poimitaan listasta nykyinen"}]},{"type":"text","value":"\n kirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kasvatetaan laskuria yhdellä"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ...ja palautetaan"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" kirja\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Ei enempää kirjoja"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" StopIteration\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodissa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__iter__"}]},{"type":"text","value":" siis alustetaan iteroinnissa tarvittava muuttuja tai muuttujat - tässä tapauksessa riittää, että meillä on laskuri joka osoittaa listan nykyiseen alkioon. Lisäksi tarvitaan metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__next__"}]},{"type":"text","value":", joka palauttaa seuraavan alkion. Esimerkkitapauksessa palautetaan listasta alkio muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"n"}]},{"type":"text","value":" kohdalta ja kasvatetaan muuttujan arvoa yhdellä. Jos listassa ei ole enempää alkiota, \"nostetaan\" poikkeus "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"StopIteration"}]},{"type":"text","value":", joka kertoo iteroijalle (esim. for-silmukalle), että kaikki alkiot on käyty läpi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt voidaan käydä kirjahyllyn kirjat läpi esimerkiksi for-silmukassa näppärästi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n k1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Elämäni Pythoniassa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"123"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n k2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vanhus ja Java\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ernest Hemingjava\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"204"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n k3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"C-itsemän veljestä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Keijo Koodari\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"997"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n hylly "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirjahylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n hylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n hylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n hylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan kaikkien kirjojen nimet"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" kirja "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" hylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Elämäni Pythoniassa\nVanhus ja Java\nC-itsemän veljestä"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Iteroitava kauppalista","tmcname":"osa10-09_iteroitava_kauppalista"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on "},{"type":"element","tagName":"a","properties":{"href":"/osa-8/2-luokat-ja-oliot#programming-exercise-kauppalista"},"children":[{"type":"text","value":"osan 8 tehtävästä "}]},{"type":"text","value":" tuttu luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kauppalista"}]},{"type":"text","value":". Tee luokasta iteroitava, siten että sitä voi käyttää seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaanit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"omenat\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ananas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tuote "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":": "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" kpl\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"banaanit: 10 kpl\nomenat: 5 kpl\nananas: 1 kpl"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Iteraattorin metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__next__"}]},{"type":"text","value":" tulee palauttaa tupleja, joiden ensimmäinen alkio on tuotteen nimi ja toisen listalla olevan tuotteen lukumäärä."}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tunnet muuttujan self eri käyttötarkoituksia
  • \n
  • Osaat ylikuormittaa operaattoreita omissa luokissa
  • \n
  • Tiedät miten muodostaa iteroitavan luokan
  • \n

Luokka voi palauttaa metodista myös sen itsensä tyyppisen olion. Luokan Tuote metodi alennustuote palauttaa uuden tuotteen, jolla on sama nimi kuin nykyisellä tuotteella, mutta 25% halvempi hinta:

class Tuote:\n    def __init__(self, nimi: str, hinta: float):\n        self.__nimi = nimi\n        self.__hinta = hinta\n\n    def __str__(self):\n        return f\"{self.__nimi} (hinta {self.__hinta})\"\n\n    def alennustuote(self):\n        alennettu = Tuote(self.__nimi, self.__hinta * 0.75)\n        return alennettu
omena1 = Tuote(\"Omena\", 2.99)\nomena2 = omena1.alennustuote()\nprint(omena1)\nprint(omena2)

Omena (hinta 2.99)\nOmena (hinta 2.2425)

Kerrataan vielä muuttujan self merkitys: luokan sisällä se viittaa nykyiseen olioon. Tyypillinen tapa käyttää muuttujaa onkin viitata olion omiin piirteisiin, esimerkiksi attribuuttien arvoihin. Muuttujaa voidaan käyttää myös palauttamaan koko olio (vaikka tälle onkin selvästi harvemmin tarvetta). Esimerkkiluokan Tuote metodi halvempi osaa palauttaa halvemman tuotteen, kun sille annetaan parametriksi toinen Tuote-luokan olio:

class Tuote:\n    def __init__(self, nimi: str, hinta: float):\n        self.__nimi = nimi\n        self.__hinta = hinta\n\n    def __str__(self):\n        return f\"{self.__nimi} (hinta {self.__hinta})\"\n\n    @property\n    def hinta(self):\n        return self.__hinta\n\n    def halvempi(self, tuote):\n        if self.__hinta < tuote.hinta:\n            return self\n        else:\n            return tuote
omena = Tuote(\"Omena\", 2.99)\nappelsiini = Tuote(\"Appelsiini\", 3.95)\nbanaani = Tuote(\"Banaani\", 5.25)\n\nprint(appelsiini.halvempi(omena))\nprint(appelsiini.halvempi(banaani))

Omena (2.99)\nAppelsiini (3.95)

Esimerkin vertailun toteutus vaikuttaa kuitenkin melko kömpelöltä - paljon parempi olisi, jos voisimme vertailla Tuote-olioita suoraan Pythonin vertailuoperaattoreilla.

Operaattorien ylikuormitus

Pythonin lasku- ja vertailuoperaattorien käyttö omien olioiden kanssa on onneksi mahdollista. Tähän käytetään tekniikkaa, jonka nimi on operaattorien ylikuormitus. Kun halutaan, että tietty operaattori toimii myös omasta luokasta muodostettujen olioiden kanssa, luokkaan kirjoitetaan vastaava metodi joka palauttaa oikean lopputuloksen. Periaate on vastaava kuin metodin __str__ kanssa: Python osaa käyttää tietyllä tapaa nimettyjä metodeja tietyissä operaatioissa.

Tarkastellaan ensin esimerkkiä, jossa Tuote-luokkaan on toteutettu metodi __gt__ (lyhenne sanoista greater than) joka toteuttaa suurempi kuin -operaattorin. Tarkemmin sanottuna metodi palauttaa arvon True, jos nykyinen olio on suurempi kuin parametrina annettu olio.

class Tuote:\n    def __init__(self, nimi: str, hinta: float):\n        self.__nimi = nimi\n        self.__hinta = hinta\n\n    def __str__(self):\n        return f\"{self.__nimi} (hinta {self.__hinta})\"\n\n    @property\n    def hinta(self):\n        return self.__hinta\n\n    def __gt__(self, toinen_tuote):\n        return self.hinta > toinen_tuote.hinta

Metodi __gt__ palauttaa arvon True, jos nykyisen tuotteen hinta on suurempi kuin parametrina annetun tuotteen, ja muuten arvon False.

Nyt luokan olioita voidaan vertailla käyttäen >-operaattoria samalla tavalla kuin vaikkapa kokonaislukuja:

appelsiini = Tuote(\"Appelsiini\", 4.90)\nomena = Tuote(\"Omena\", 3.95)\n\nif appelsiini > omena:\n    print(\"Appelsiini on suurempi\")\nelse:\n    print(\"Omena on suurempi\")

Appelsiini on suurempi

Olioiden suuruusluokan vertailua toteuttaessa täytyy päättää, millä perusteella suuruusjärjestys määritetään. Voisimme myös haluta, että tuotteet järjestetään hinnan sijasta nimen mukaiseen aakkosjärjestykseen. Tällöin omena olisikin appelsiinia \"suurempi\":

class Tuote:\n    def __init__(self, nimi: str, hinta: float):\n        self.__nimi = nimi\n        self.__hinta = hinta\n\n    def __str__(self):\n        return f\"{self.__nimi} (hinta {self.__hinta})\"\n\n    @property\n    def hinta(self):\n        return self.__hinta\n\n    @property\n    def nimi(self):\n        return self.__nimi\n\n    def __gt__(self, toinen_tuote):\n        return self.nimi > toinen_tuote.nimi
appelsiini = Tuote(\"Appelsiini\", 4.90)\nomena = Tuote(\"Omena\", 3.95)\n\nif appelsiini > omena:\n    print(\"Appelsiini on suurempi\")\nelse:\n    print(\"Omena on suurempi\")

Omena on suurempi

Lisää operaattoreita

Tavalliset vertailuoperaattorit ja näitä vastaavat metodit on esitetty seuraavassa taulukossa:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
OperaattoriMerkitys perinteisestiMetodin nimi
<Pienempi kuin__lt__(self, toinen)
>Suurempi kuin__gt__(self, toinen)
==Yhtä suuri kuin__eq__(self, toinen)
!=Eri suuri kuin__ne__(self, toinen)
<=Pienempi tai yhtäsuuri kuin__le__(self, toinen)
>=Suurempi tai yhtäsuuri kuin__ge__(self, toinen)

Lisäksi luokissa voidaan toteuttaa tiettyjä muita operaattoreita, esimerkiksi:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
OperaattoriMerkitys perinteisestiMetodin nimi
+Yhdistäminen__add__(self, toinen)
-Vähentäminen__sub__(self, toinen)
*Monistaminen__mul__(self, toinen)
/Jakaminen__truediv__(self, toinen)
//Kokonaisjakaminen__floordiv__(self, toinen)

Lisää operaattoreita ja metodien nimien vastineita löydät helposti Googlella.

Huomaa, että vain hyvin harvoin on tarvetta toteuttaa kaikkia operaatioita omassa luokassa. Esimerkiksi jakaminen on operaatio, jolle on hankalaa keksiä luontevaa käyttöä useimmissa luokissa (mitä tulee, kun jaetaan opiskelija kolmella saati toisella opiskelijalla?). Tiettyjen operaattoreiden toteuttamisesta voi kuitenkin olla hyötyä, mikäli vastaavat operaatiot ovat loogisia luokalle.

Tarkastellaan esimerkkinä luokkaa joka mallintaa yhtä muistiinpanoa. Kahden muistiinpanon yhdistäminen +-operaattorilla tuottaa uuden, yhdistetyn muistiinpanon, kun on toteutettu metodi __add__:

from datetime import datetime\n\nclass Muistiinpano:\n    def __init__(self, pvm: datetime, merkinta: str):\n        self.pvm = pvm\n        self.merkinta = merkinta\n\n    def __str__(self):\n        return f\"{self.pvm}: {self.merkinta}\"\n\n    def __add__(self, toinen):\n        # Uuden muistiinpanon ajaksi nykyinen aika\n        uusi_muistiinpano = Muistiinpano(datetime.now(), \"\")\n        uusi_muistiinpano.merkinta = self.merkinta + \" ja \" + toinen.merkinta\n        return uusi_muistiinpano
merkinta1 = Muistiinpano(datetime(2016, 12, 17), \"Muista ostaa lahjoja\")\nmerkinta2 = Muistiinpano(datetime(2016, 12, 23), \"Muista hakea kuusi\")\n\n# Nyt voidaan yhdistää plussalla - tämä kutsuu metodia __add__ luokassa Muistiipano\nmolemmat = merkinta1 + merkinta2\nprint(molemmat)

2020-09-09 14:13:02.163170: Muista ostaa lahjoja ja Muista hakea kuusi

Olion esitys merkkijonona

Olemme toteuttaneet luokkiin usein metodin __str__, joka antaa merkkijonoesityksen olion sisällöstä. Toinen melko samanlainen metodi on __repr__, joka antaa teknisen esityksen olion sisällöstä. Usein metodi __repr__ toteutetaan niin, että se antaa koodin, joka muodostaa olion.

Funktio repr antaa olion teknisen merkkijonoesityksen, ja lisäksi tätä esitystä käytetään, jos oliossa ei ole määritelty __str__-metodia. Seuraava luokka esittelee asiaa:

class Henkilo:\n    def __init__(self, nimi: str, ika: int):\n        self.nimi = nimi\n        self.ika = ika\n        \n    def __repr__(self):\n        return f\"Henkilo({repr(self.nimi)}, {self.ika})\"
henkilo1 = Henkilo("Anna", 25)\nhenkilo2 = Henkilo("Pekka", 99)\nprint(henkilo1)\nprint(henkilo2)

Henkilo('Anna', 25)\nHenkilo('Pekka', 99)

Huomaa, että metodissa __repr__ haetaan nimen tekninen esitys metodilla repr, jolloin tässä tapauksessa nimen ympärille tulee '-merkit.

Seuraavassa luokassa on toteutettu sekä metodi __repr__ että __str__:

class Henkilo:\n    def __init__(self, nimi: str, ika: int):\n        self.nimi = nimi\n        self.ika = ika\n        \n    def __repr__(self):\n        return f\"Henkilo({repr(self.nimi)}, {self.ika})\"\n\n    def __str__(self):\n        return f\"{self.nimi} ({self.ika} vuotta)\"
henkilo = Henkilo("Anna", 25)\nprint(henkilo)\nprint(repr(henkilo))

Anna (25 vuotta)\nHenkilo('Anna', 25)

Kun tietorakenteessa (kuten listassa) on olioita, Python käyttää vähän epäloogisesti metodia __repr__ olioiden merkkijonoesityksen muodostamiseen, kun lista tulostetaan:

henkilot = []\nhenkilot.append(Henkilo("Anna", 25))\nhenkilot.append(Henkilo("Pekka", 99))\nhenkilot.append(Henkilo("Maija", 55))\nprint(henkilot)

[Henkilo('Anna', 25), Henkilo('Pekka', 99), Henkilo('Maija', 55)]

Tehtäväpohjasta löytyy luokan Raha runko. Tässä tehtävässä laajennetaan runkoa muutamilla operaattoreilla, ja korjataan pari rungossa olevaa pientä ongelmaa

Korjaa merkkijonoesitys

Rahan merkkijonoesityksen muodostava metodi ei ole nyt ihan kunnossa. Seuraavassa esimerkissä muodostetaan kaksi raha-olioa, joista jälkimmäinen ei tulostu oikein:

e1 = Raha(4, 10)\ne2 = Raha(2, 5)  # kaksi euroa ja viisi senttiä\n\nprint(e1)\nprint(e2)

4.10\n2.5

Korjaa luokan metodi __str__(self) siten, että tulostus on seuraava:

4.10 eur\n2.05 eur

Yhtäsuuruus

Määrittele raha-oliolle metodi __eq__(self, toinen), jonka avulla rahan yhtäsuuruusvertailu saadaan toimimaan:

e1 = Raha(4, 10)\ne2 = Raha(2, 5)\ne3 = Raha(4, 10)\n\nprint(e1)\nprint(e2)\nprint(e3)\nprint(e1 == e2)\nprint(e1 == e3)

4.10 eur\n2.05 eur\n4.10 eur\nFalse\nTrue

Muut vertailut

Toteuta rahalle myös seuraavat vertailuoperaattorit <, >, !=.

e1 = Raha(4, 10)\ne2 = Raha(2, 5)\n\nprint(e1 != e2)\nprint(e1 < e2)\nprint(e1 > e2)

True\nFalse\nTrue

Plus ja miinus

Toteuta rahalle yhteen- ja vähennyslaskuoperaatiot. Molempien operaatioiden tulee palauttaa uusi rahaolio, ja ne eivät saa muuttaa olioa itseään tai parametrina olevaa olioa!

Huomaa, että rahan arvo ei voi olla negatiivinen. Negatiiviseen tulokseen päätyvän vähennyslaskuyrityksen tulee aiheuttaa ValueError-tyyppinen poikkeus.

e1 = Raha(4, 5)\ne2 = Raha(2, 95)\n\ne3 = e1 + e2\ne4 = e1 - e2\n\nprint(e3)\nprint(e4)\n\ne5 = e2-e1
7.00 eur\n1.10 eur\nTraceback (most recent call last):\nFile \"tiedosto.py\", line 416, in \ne5 = e2-e1\nFile \"tiedosto.py\", line 404, in sub\nraise ValueError(f\"negatiivinen tulos ei sallittu\")\nValueError: negatiivinen tulos ei sallittu

Arvoa ei voi muuttaa

Luokassa on tällä hetkellä vielä pieni ongelma, koska käyttäjä voi \"huijaamalla\" muuttaa rahan arvoa:

print(e1)\ne1.eurot = 1000\nprint(e1)

4.05 eur\n1000.05 eur

Muuta luokan toteutus kapseloiduksi siten, että yllä oleva huijaus ei onnistu. Luokalla ei siis saa olla kapseloimattomia attribuutteja eikä asetus- tai havainnointimetodeita euroille tai senteille!

Tässä tehtävässä toteutetaan luokka Paivays, jonka avulla on mahdollista käsitellä päivämääriä. Oletetaan tässä tehtävässä yksinkertaisuuden vuoksi, että jokaisessa kuussa on 30 päivää.

Huom! Edellisestä johtuen tehtävässä ei poikkeuksellisesti kannata käyttää Pythonin datetime-moduulia, vaan toteutetaan luokka itse.

Vertailut

Toteuta luokan runko ja sille vertailuoperaattorit <, >, == ja !=. Käyttöesimerkki:

p1 = Paivays(4, 10, 2020)\np2 = Paivays(28, 12, 1985)\np3 = Paivays(28, 12, 1985)\n\nprint(p1)\nprint(p2)\nprint(p1 == p2)\nprint(p1 != p2)\nprint(p1 == p3)\nprint(p1 < p2)\nprint(p1 > p2)

4.10.2020\n28.12.1985\nFalse\nTrue\nFalse\nFalse\nTrue

Kasvatus

Toteuta päiväykselle operaattori +. Operaattori luo uuden päivämäärän joka on lisättävän lukeman päiviä verran suurempi kuin alkuperäinen päivämäärä. Alkuperäinen päivä ei saa muuttua.

p1 = Paivays(4, 10, 2020)\np2 = Paivays(28, 12, 1985)\n\np3 = p1 + 3\np4 = p2 + 400\n\nprint(p1)\nprint(p2)\nprint(p3)\nprint(p4)

4.10.2020\n28.12.1985\n7.10.2020\n8.2.1987

Erotus

Toteuta päiväykselle operaattori -, joka palauttaa päivämäärien eron päivissä laskettuna. Huomaa, että koska oletamme jokaisessa kuukaudessa olevan 30 päivää, tässä tehtävässä vuosien päivien lukumäärä on 12*30 eli 360.

Operaattori toimii seuraavasti

p1 = Paivays(4, 10, 2020)\np2 = Paivays(2, 11, 2020)\np3 = Paivays(28, 12, 1985)\n\nprint(p2-p1)\nprint(p1-p2)\nprint(p1-p3)

28\n28\n12516

Iteraattorit

Olemme aikaisemmin käyttäneet for-lausetta erilaisten tietorakenteiden ja tiedostojen iterointiin eli läpikäyntiin. Tyypillinen tapaus olisi vaikkapa seuraavanlainen funktio:

\ndef laske_positiiviset(lista: list):\n    n = 0\n    for alkio in lista:\n        if alkio > 0:\n            n += 1\n    return n\n

Funktio käy läpi listan alkio kerrallaan ja laskee positiivisten alkioiden määärän.

Iterointi on mahdollista toteuttaa myös omiin luokkiin. Hyödyllistä tämä on silloin, kun luokasta muodostetut oliot tallentavat kokoelman alkioita. Esimerkiksi aikaisemmin kirjoitettiin luokka, joka mallintaa kirjahyllyä – olisi näppärä, jos kaikki kirjahyllyn kirjat voisi käydä läpi yhdessä silmukassa. Samalla tavalla opiskelijarekisterin kaikkien opiskelijoiden läpikäynti for-lauseella olisi kätevää.

Iterointi mahdollistuu toteuttamalla luokkaan iteraattorimetodit __iter__ ja __next__. Käsitellään metodien toimintaa tarkemmin, kun on ensin tarkasteltu esimerkkinä kirjahyllyluokkaa, joka mahdollistaa kirjojen läpikäynnin:

\nclass Kirja:\n    def __init__(self, nimi: str, kirjailija: str, sivuja: int):\n        self.nimi = nimi\n        self.kirjailija = kirjailija\n        self.sivuja = sivuja\n\nclass Kirjahylly:\n    def __init__(self):\n        self._kirjat = []\n\n    def lisaa_kirja(self, kirja: Kirja):\n        self._kirjat.append(kirja)\n\n    # Iteraattorin alustusmetodi\n    # Tässä tulee alustaa iteroinnissa käytettävä(t) muuttuja(t)\n    def __iter__(self):\n        self.n = 0\n        # Metodi palauttaa viittauksen olioon itseensä, koska\n        # iteraattori on toteutettu samassa luokassa\n        return self\n\n    # Metodi palauttaa seuraavan alkion\n    # Jos ei ole enempää alkioita, heitetään tapahtuma\n    # StopIteration\n    def __next__(self):\n        if self.n < len(self._kirjat):\n            # Poimitaan listasta nykyinen\n            kirja = self._kirjat[self.n]\n            # Kasvatetaan laskuria yhdellä\n            self.n += 1\n            # ...ja palautetaan\n            return kirja\n        else:\n            # Ei enempää kirjoja\n            raise StopIteration\n

Metodissa __iter__ siis alustetaan iteroinnissa tarvittava muuttuja tai muuttujat - tässä tapauksessa riittää, että meillä on laskuri joka osoittaa listan nykyiseen alkioon. Lisäksi tarvitaan metodi __next__, joka palauttaa seuraavan alkion. Esimerkkitapauksessa palautetaan listasta alkio muuttujan n kohdalta ja kasvatetaan muuttujan arvoa yhdellä. Jos listassa ei ole enempää alkiota, \"nostetaan\" poikkeus StopIteration, joka kertoo iteroijalle (esim. for-silmukalle), että kaikki alkiot on käyty läpi.

Nyt voidaan käydä kirjahyllyn kirjat läpi esimerkiksi for-silmukassa näppärästi:

\nif __name__ == \"__main__\":\n    k1 = Kirja(\"Elämäni Pythoniassa\", \"Pekka Python\", 123)\n    k2 = Kirja(\"Vanhus ja Java\", \"Ernest Hemingjava\", 204)\n    k3 = Kirja(\"C-itsemän veljestä\", \"Keijo Koodari\", 997)\n\n    hylly = Kirjahylly()\n    hylly.lisaa_kirja(k1)\n    hylly.lisaa_kirja(k2)\n    hylly.lisaa_kirja(k3)\n\n    # Tulostetaan kaikkien kirjojen nimet\n    for kirja in hylly:\n        print(kirja.nimi)\n

Elämäni Pythoniassa\nVanhus ja Java\nC-itsemän veljestä

Tehtäväpohjassa on osan 8 tehtävästä tuttu luokka Kauppalista. Tee luokasta iteroitava, siten että sitä voi käyttää seuraavasti:

lista = Kauppalista()\nlista.lisaa(\"banaanit\", 10)\nlista.lisaa(\"omenat\", 5)\nlista.lisaa(\"ananas\", 1)\n\nfor tuote in lista:\n    print(f\"{tuote[0]}: {tuote[1]} kpl\")

banaanit: 10 kpl\nomenat: 5 kpl\nananas: 1 kpl

Iteraattorin metodin __next__ tulee palauttaa tupleja, joiden ensimmäinen alkio on tuotteen nimi ja toisen listalla olevan tuotteen lukumäärä.

","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-10/3-olio-ohjelmoinnin-tekniikoita.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-10/4-lisaa-esimerkkeja/page-data.json b/page-data/osa-10/4-lisaa-esimerkkeja/page-data.json index 54cefdd3a..83b0c7401 100644 --- a/page-data/osa-10/4-lisaa-esimerkkeja/page-data.json +++ b/page-data/osa-10/4-lisaa-esimerkkeja/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-10/4-lisaa-esimerkkeja", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä osiossa"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Käydään läpi hieman laajemman sovelluksen tekemiseen liittyviä seikkoja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Erityinen fokus on sovelluksen eri osa-alueiden (käyttöliittymä, sovelluslogiikka ja tiedostojen käsittely) eriyttämisessä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Harjoitellaan laajemman sovelluksen toteuttamista itse"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmoinnin perusteiden ja jatkokurssin aikana on esitelty suuri määrä Pythonin tarjoamia ominaisuuksia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmoinnin perusteissa tutustuttiin kielen kontrollirakenteisiin (while ja for), funktioihin sekä perustietorakenteisiin eli listaan ja sanakirjaan. Näytti jo hetken siltä että muuta ei tarvitakaan. Periaatteessa näin onkin: ohjelmoinnin perusteiden kalustolla pystyy ilmaisemaan kaiken mikä Pythonilla on ylipäätään ilmaistavissa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jatkokurssin alussa, eli kurssin osassa 8 pakkaa ruvettiin kuitenkin hämmentämään tuomalla mukaan luokat ja oliot. Milloin ja ylipäätään "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"miksi"}]},{"type":"text","value":" olioita tulisi käyttää jos kurssin osien 1-7 kalusto on jo ilmaisuvoimaltaan riittävä?"}]},{"type":"element","tagName":"h2","properties":{"id":"monimutkaisuuden-hallintaa","style":"position:relative;"},"children":[{"type":"text","value":"Monimutkaisuuden hallintaa"},{"type":"element","tagName":"a","properties":{"href":"#monimutkaisuuden-hallintaa","ariaLabel":"monimutkaisuuden hallintaa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Monissa tilanteissa voi ja varmasti kannattaakin olla käyttämättä oliota. Esimerkiksi jos koodataan pieni \"kertakäyttöinen\" apuohjelma, ei ehkä ole mitään tarvetta olioille. Tilanne alkaa muuttua, kun siirrytään hieman suuremman kokoluokan ohjelmiin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun ohjelma laajenee, alkaa sen sisältämien yksityiskohtien määrä nousta hallitsemattomaksi, ellei ohjelmaa jäsennellä jollain järkevällä tavalla. Itse asiassa jo ohjelmoinnin perusteiden tehtävissä oli havaittavissa varsin monimutkaisia ratkaisuja, joiden ymmärtämisessä jopa alan ammattilaisilla on vaikeuksia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käsite "},{"type":"element","tagName":"a","properties":{"href":"https://en.wikipedia.org/wiki/Separation_of_concerns","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Separation of concerns"}]},{"type":"text","value":" on ollut jo vuosikymmeniä eräs ohjelmoinnin ja koko tietojenkäsittelyn keskeisiä teemoja. Wikipedian mukaan käsitteellä tarkoitetaan seuraavaa"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Separation of concerns is a design principle for separating a computer program into distinct sections such that each section addresses a separate concern. A concern is a set of information that affects the code of a computer program"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kyse on ohjelman suunnittelua ohjaavasta periaatteesta, jonka mukaan ohjelmakoodi jäsennellään pienempiin osiin, joista kukin huolehtii vain omasta \"tontistaan\". Kuhunkin osaan tehdyt muutokset vaikuttavat - periaatteen mukaisesti - vain rajattuun alueeseen ohjelmassa, joten ohjelmien väistämätöntä monimutkaisuutta on helpompi hallita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiot ovat yksi mekanismi tämän tavoitteen saavuttamiseen. Sen sijaan että ohjelma kirjoitetaan yhtenä isona kokonaisuutena, koostetaan se pienistä funktioista, joista kukin ratkaisee pienen osan ongelmasta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olio-ohjelmointi tarjoaa funktioita jossain määrin ilmaisuvoimaisemman ja joidenkin mielestä \"paremman\" tavan saavuttaa sama tavoite. Kuten olemme nähneet, olioiden avulla on mahdollista koota samaan asiaan liittyvä data ja sitä käsittelevä koodi, eli olion metodit, samaan paikkaan. Oliot tarjoavat myös mekanismin käsittelemänsä datan kapselointiin, joka taas tavallaan on keino piilottaa \"turhia\" yksityiskohtia olion ulkopuoliselta osalta ohjelmaa."}]},{"type":"element","tagName":"h2","properties":{"id":"esimerkki-puhelinluettelo","style":"position:relative;"},"children":[{"type":"text","value":"Esimerkki: puhelinluettelo"},{"type":"element","tagName":"a","properties":{"href":"#esimerkki-puhelinluettelo","ariaLabel":"esimerkki puhelinluettelo permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Miten ohjelma sitten tulisi jakaa luokkiin ja olioihin? Kysymys ei ole helppo, ja asiaa on helpompi pohdiskella konkreettisen esimerkin kautta. Toteutetaan esimerkkinä olio-ohjelmointia hyödyntäen hieman samantyylinen puhelinluettelo, joka oli aiheena ohjelmoinnin perusteiden viidennen osan "},{"type":"element","tagName":"a","properties":{"href":"/osa-5/3-dictionary#programming-exercise-puhelinluettelo-versio-2"},"children":[{"type":"text","value":"tehtävässä"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Separation of concerns -periaatetta noudatellen koodi tulee jakaa osiin, joista kukin käsittelee omaa asiaansa. Olio-ohjelmoinnin piirissä tätä periaatetta ilmentää niin sanottu "},{"type":"element","tagName":"a","properties":{"href":"https://en.wikipedia.org/wiki/Single-responsibility_principle","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"yhden vastuun (single responsibility)"}]},{"type":"text","value":" -periaate. Ei mennä sen tarkemmin periaatteen yksityiskohtiin, mutta maalaisjärjellä ajatellen periaatteen nimi jo kertoo mistä on kyse: "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"yksittäisen luokan olioiden tulisi olla vastuussa yhdestä asiasta"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olioita käytettäessä ohjelmointiongelman \"reaalimaailman asioita\" vastaa yleensä oma luokkansa. Puhelinluettelon tapauksessa tälläisiä reaalimaailman asioita olisivat esimerkiksi:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"henkilö"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"puhelinnumero"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Näistä nimi ja puhelinnumero ovat kenties liian vähäpätöisiä ollakseen omia luokkiaan, mutta "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"henkilö"}]},{"type":"text","value":" voisi hyvinkin olla oma luokkansa, jonka vastuulla on sitoa yhteen tietty nimi ja siihen liittyvät puhelinnumerot."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Myös "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"puhelinluettelo"}]},{"type":"text","value":" itsessään on potentiaalinen luokka, sen vastuulla on hallinnoida eri henkilöiden tietoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nämä kaksi luokkaa eli "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"puhelinluettelo"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"henkilö"}]},{"type":"text","value":" muodostavat sovelluksen ytimen, eli niin sanotun "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"sovelluslogiikan"}]},{"type":"text","value":". Näiden lisäksi ohjelma tarvitsee muutaman muunkin luokan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käyttäjän kanssa tapahtuvasta interaktiosta huolehtivaa luokkaa ei kannata sotkea sovelluslogiikan kanssa samaan luokkaan - sehän on kokonaan oma vastuunsa. Eli sovelluslogiikan luokkien lisäksi ohjelmalle tulee myös luokka, joka huolehtii ohjelman käyttöliittymästä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Talletamme puhelinluettelon tiedot tiedostoon. Myös tiedoston käsittely on selkeästi oma vastuunsa, joten tulemme sisällyttämään siihen käytettävän koodin omaan luokkaansa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun ohjelman luokkarakenne alkaa pikkuhiljaa hahmottua, nousee kysymykseksi se, mistä ohjelmointi kannattaa aloittaa. Usein paras tapa aloittaa on pienellä palalla sovelluslogiikka."}]},{"type":"element","tagName":"h2","properties":{"id":"vaihe-1-sovelluslogiikan-runko","style":"position:relative;"},"children":[{"type":"text","value":"Vaihe 1: sovelluslogiikan runko"},{"type":"element","tagName":"a","properties":{"href":"#vaihe-1-sovelluslogiikan-runko","ariaLabel":"vaihe 1 sovelluslogiikan runko permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aloitetaan luokasta "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Puhelinluettelo"}]},{"type":"text","value":". Runko voisi näyttää seuraavalta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Puhelinluettelo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__henkilot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_numero"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hae_numerot"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokka pitää siis sisällään listan henkilöitä ja tarjoaa metodit tietojen lisäämiseen ja hakemiseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jokaiseen henkilöön voi liittyä useita numeroita, joten toteutetaan luettelon sisäinen tila sanakirjan avulla, koska sanakirjasta on helppo hakea nimen perusteella. Sanakirjaan on helppo tallettaa suoraan myös nimeen liittyvät numerot, joten ainakaan tässä vaiheessa ei tarvita erillistä luokkaa yksittäisen henkilön tietojen tallettamiseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokka laajenee seuraavasti. Mukana on myös pieni toiminnan varmistava koodinpätkä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Puhelinluettelo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__henkilot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_numero"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# henkilöön liittyy lista puhelinnumeroja"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hae_numerot"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"None"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# testikoodi"}]},{"type":"text","value":"\nluettelo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Puhelinluettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"02-123456\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_numerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_numerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Testikoodin tulostus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['02-123456']\nNone"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae_numerot"}]},{"type":"text","value":" siis palauttaa arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"None"}]},{"type":"text","value":", jos henkilö ei löydy luettelosta, jos henkilö löytyy, palautetaan lista joka sisältää henkilön puhelinnumerot."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmoidessa mitä tahansa ohjelmaa kannattaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"aina"}]},{"type":"text","value":" kokeilla, että koodi toimii kuten sen olettaa toimivan, ennen kun etenee muuhun koodiin.\nUsein tämä testikoodi on poisheitettävää koodia, ja sikäli voisi ajatella testaamisesta olevan ylimääräistä vaivaa. Lähes 100% tapauksissa ei näin kuitenkaan ole."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodiin tullut bugi kannattaa saada kiinni ja korjata niin pian kuin mahdollista. Jos koodin toimivuuden varmistaa lähes jokaisen uuden koodirivin jälkeen, on debuggaus ja korjaaminen yleensä vaivatonta ja nopeaa, koska tällöin voi olla melko varma siitä, että ongelma johtuu hetki sitten lisätyistä koodiriveistä. Jos taas koodia testataan vasta sen jälkeen kun siihen on lisätty kymmeniä koodirivejä, on virhelähteitä moninkertaisesti."}]},{"type":"element","tagName":"h2","properties":{"id":"vaihe-2-kayttoliittyman-runko","style":"position:relative;"},"children":[{"type":"text","value":"Vaihe 2: käyttöliittymän runko"},{"type":"element","tagName":"a","properties":{"href":"#vaihe-2-kayttoliittyman-runko","ariaLabel":"vaihe 2 kayttoliittyman runko permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun sovelluslogiikan ydintoiminnallisuus on kunnossa, voidaan edetä sovelluksen tekstikäyttöliittymään. Tehdään sitä varten oma luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"text","value":", jonka runko on seuraava:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Puhelinluettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"ohje"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"komennot: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"0 lopetus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"suorita"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ohje"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"komento: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"0\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n\nsovellus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" PuhelinluetteloSovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"suorita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokka saattaa vaikuttaa vielä hämmentävältä, mutta tässä luodaan tosiaan vasta runko toiminnalle. Konstruktori luo puhelinluettelon, jonka olio pitää sisällään. Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suorita(self)"}]},{"type":"text","value":" käynnistää sovelluksen tekstikäyttöliittymän, jonka ytimen muodostaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":"-silmukka, joka kyselee käyttäjältä mikä komento halutaan suorittaa. Ennen toistolauseeseen menemistä ohjelma tulostaa käyttöohjeet, kutsumalla metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ohje(self)"}]},{"type":"text","value":". Varsinaiset toiminnot toteutetaan seuraavaksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajennetaan käyttöliittymää siten, että luetteloon voidaan lisätä uusia tietoja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Puhelinluettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"ohje"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"komennot: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"0 lopetus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1 lisäys\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"suorita"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ohje"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"komento: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"0\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n numero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"numero: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsovellus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" PuhelinluetteloSovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"suorita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos valittu komento on tietojen lisäys (eli komento on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"), kysyy käyttöliittymä nimen ja numeron käyttäjältä, ja lisää tiedot puhelinluetteloon kutsumalla sopivaa luettelon metodia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käyttöliittymä on siis vastuussa ainoastaan siitä, että se kommunikoi käyttäjän kanssa. Puhelinnumeron säilöminen nimen yhteyteen on jätetty kokonaisuudessan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Puhelinluettelo"}]},{"type":"text","value":"-olion vastuulle."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käyttöliittymän rakennetta on mahdollista vielä parannella siten, että tietojen lisäys eriytetään omaan metodiinsa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"lisays(self)"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Puhelinluettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"ohje"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"komennot: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"0 lopetus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1 lisäys\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# eriytetään uusien tietojen lisääminen omaksi metodiksi"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisays"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n numero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"numero: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"suorita"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ohje"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"komento: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"0\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsovellus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" PuhelinluetteloSovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"suorita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Erillisen metodin käyttämisen taustallakin on sama "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"separation of concerns"}]},{"type":"text","value":" -periaate. Sen sijaan että koko käyttöliittymän toiminnallisuus sijoitettaisiin ison "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":"-silmukan sisälle, tehdään jokaisesta yksittäisestä toiminnosta oma metodinsa. Tämä helpottaa kokonaisuuden hallintaa. Jos halutaan muokata tietojen lisäämisen toiminnallisuutta, tiedetään heti missä päin relevantti koodi sijaitsee."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisätään käyttöliittymään toiminnallisuus numeroiden hakemista varten. Sijoitetaan sen hoitava koodi heti omaan metodiinsa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Puhelinluettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"ohje"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"komennot: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"0 lopetus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1 lisäys\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"2 haku\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisays"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n numero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"numero: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"haku"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n numerot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_numerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" numerot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"None"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"numero ei tiedossa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" numero "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" numerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"suorita"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ohje"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"komento: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"0\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"haku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ohje"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsovellus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" PuhelinluetteloSovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"suorita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sovelluksen perusversio toimii nyt. Seuraavassa esimerkki sovelluksen käytöstä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komennot:\n0 lopetus\n1 lisäys\n2 haku"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Erkki"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"02-123456"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Erkki"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"045-4356713"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Erkki"}]},{"type":"text","value":"\n02-123456\n045-4356713"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nnimi: Emilia\nnumero ei tiedossa"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodia on aika paljon, todennäköisesti enemmän kuin jos kaikki olisi ohjelmoitu yhteen pötköön. Koodin rakenne on kuitenkin siistihkö, ja koodin laajentamisenkaan ei pitäisi olla kovin hankalaa."}]},{"type":"element","tagName":"h2","properties":{"id":"vaihe-3-tietojen-haku-tiedostosta","style":"position:relative;"},"children":[{"type":"text","value":"Vaihe 3: tietojen haku tiedostosta"},{"type":"element","tagName":"a","properties":{"href":"#vaihe-3-tietojen-haku-tiedostosta","ariaLabel":"vaihe 3 tietojen haku tiedostosta permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajennetaan ohjelmaa siten, että se lataa käynnistäessään puhelinluettelon tiedostosta, joka on seuraavaa muotoa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"csv"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"Erkki;02-1234567;045-4356713"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"Emilia;040-324344"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedoston käsittely on selkeästi oma vastuualueensa, eli toteutetaan sitä varten oma luokka:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Tiedostonkasittelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tiedosto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tiedosto\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lataa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nimet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" f"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" f"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"strip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"';'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":"numerot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" osat\n nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" numerot\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" nimet"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Konstruktorin parametrina annetaan tiedoston nimi. Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lataa(self)"}]},{"type":"text","value":" lukee tiedoston, ja pilkkoo sen rivit sanakirjaksi, missä avain on nimi ja arvona ovat nimeen liittyvät numerot."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi käyttää erästä Pythonin kätevää ominaisuutta: listasta on mahdollista ottaa ensin yksittäisiä alkioita erikseen nimettyinä muuttujina, sekä loput alkiot uutena listana, kuten seuraavasta esimerkistä käy ilmi. "},{"type":"element","tagName":"a","properties":{"href":"osa-6/1-tiedostojen-lukeminen#csv-tiedoston-lukeminen"},"children":[{"type":"text","value":"Luvusta 6"}]},{"type":"text","value":" muistamme että merkkijonojen metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"split"}]},{"type":"text","value":" tuottaa nimenomaan listan."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\neka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" toka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":"loput "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lista\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"toka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"loput"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1\n2\n[3, 4, 5]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sijoituslauseen viimeisen muuttujan nimen edessä on *, ja se tarkoittaa, että viimeiseen muuttujaan kerätään taulukosta loput, eli kolmas ja sitä seuraavat alkiot."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedostonkäsittelijääkin kannattaa ehdottomasti testata, ennen kuin se pultataan muuhun koodiin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"t "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tiedostonkasittelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"luettelo.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lataa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"{'Erkki': ['02-1234567', '045-4356713'], 'Emilia': ['040-324344']}"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun tiedostosta lukemisen todetaan toimivan, liitetään koodi muuhun ohjelmaan. Looginen paikka tiedoston lukemiseen on se hetki kun sovellus käynnistyy, eli luokan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"text","value":" konstruktori:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Puhelinluettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tiedosto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tiedostonkasittelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"luettelo.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# listään tiedostossa olevat nimet luetteloon"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numerot "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lataa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"items"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" numero "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" numerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muu koodi"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedoston lukua osana PuhelinLuetteloSovellusta kannattaa myös testata. Kun on varmistettu, että tiedoston sisältö saadaan ladattua luetteloon, voidaan edetä viimeiseen vaiheeseen."}]},{"type":"element","tagName":"h2","properties":{"id":"vaihe-4-tietojen-talletus-tiedostoon","style":"position:relative;"},"children":[{"type":"text","value":"Vaihe 4: tietojen talletus tiedostoon"},{"type":"element","tagName":"a","properties":{"href":"#vaihe-4-tietojen-talletus-tiedostoon","ariaLabel":"vaihe 4 tietojen talletus tiedostoon permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Viimeistellään ohjelman alustava versio vielä siten, että se tallentaa lopetettaessa puhelinluettelon takaisin tiedostoon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tätä varten luokkaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Puhelinluettelo"}]},{"type":"text","value":" tulee laajentaa siten, että sieltä saadaan tallennusta varten kaikki tiedot ulos:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Puhelinluettelo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__henkilot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# palautetaan tiedostoon tallentamista varten kaikki tiedot"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kaikki_tiedot"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__henkilot"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tallennus on luonnollisesti luokan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Tiedostonkasittelija"}]},{"type":"text","value":" vastuulla, eli laajennetaan sitä metodilla "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"talleta"}]},{"type":"text","value":", joka saa parametriksi puhelinluetteloa edustavan sanakirjan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Tiedostonkasittelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tiedosto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tiedosto\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lataa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"talleta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"dict"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"w\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" f"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numerot "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"items"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" numerot\n f"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\";\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tallennus tapahtuu samalla kun sovelluksen käyttö lopetetaan. Tehdään tätäkin tarkoitusta varten oma metodinsa ja kutsutaan sitä sopivassa kohdassa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muu koodi"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# metodi, joka suoritetaan lopetettaessa sovelluksen käyttö"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lopetus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"talleta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kaikki_tiedot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"suorita"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ohje"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"komento: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"0\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lopetus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"haku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ohje"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Puhelinluettelon laajennus, osa 1","tmcname":"osa10-10_puhelinluettelo_osa1"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä tehdään pieni laajennus puhelinluettelosovellukseen. Yllä kehitetty koodi löytyy tehtäväpohjasta. Laajenna ratkaisuasi komennolla, joka mahdollistaa nimen etsimisen numeron perusteella. Laajennuksen jälkeen sovelluksen pitäisi toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komennot:\n0 lopetus\n1 lisäys\n2 haku\n3 haku numeron perusteella"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Erkki"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"02-123456"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Erkki"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"045-4356713"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"02-123456"}]},{"type":"text","value":"\nErkki"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0100100"}]},{"type":"text","value":"\ntuntematon numero"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee laajennus sitten, että kunnioitat ohjelman rakennetta. Eli lisää luokkaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"text","value":" uutta ominaisuutta varten sopiva apumetodi sekä oma haara while-silmukkaan. Lisää myös sovelluslogiikkaan eli luokkaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Puhelinluettelo"}]},{"type":"text","value":" metodi, joka mahdollistaa nimen hakemisen numeron perusteella."}]}]},{"type":"element","tagName":"h2","properties":{"id":"olioita-sanakirjassa","style":"position:relative;"},"children":[{"type":"text","value":"Olioita sanakirjassa"},{"type":"element","tagName":"a","properties":{"href":"#olioita-sanakirjassa","ariaLabel":"olioita sanakirjassa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa tehtävässä on tarkoitus muuttaa puhelinluetteloa siten, että sanakirjan arvoksi talletetaan tavallisten listojen sijaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"olioita"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Periaatteessa asiassa ei ole mitään ihmeellistä, mutta kurssilla ei vielä ole näin tehty, joten tutkitaan ennen tehtävää hieman samantapaista, mutta yksinkertaisempaa esimerkkiä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehdään sovellus, jonka avulla voidaan pitää kirjaa siitä, kuinka monta tehtävää opiskelijat ovat tehneet kurssin aikana. Kunkin opiskelijan tehtävämäärä lasketaan yksinkertaisen olion avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Tehtavalaskuri"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tehtavia "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"merkkaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tehtavia "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tehtyja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tehtavia"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkaa käyttävä pääohjelma on seuraavassa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"opiskelijat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"merkataan tehtäviä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"opiskelija: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# luodaan tarvittaessa olio tehtävämäärän laskemista varten"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tehtavalaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# merkataan tehdyksi nimeä vastaavaan olioon"}]},{"type":"text","value":"\n opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkkaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tehdyt tehtävät:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tehtavat "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"items"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" tehtäviä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"tehtavat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehtyja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" kpl\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käyttöesimerkki"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"merkataan tehtäviä\nopiskelija: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pekka"}]},{"type":"text","value":"\nopiskelija: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"sara"}]},{"type":"text","value":"\nopiskelija: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"antti"}]},{"type":"text","value":"\nopiskelija: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"sara"}]},{"type":"text","value":"\nopiskelija: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"juuso"}]},{"type":"text","value":"\nopiskelija: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"juuso"}]},{"type":"text","value":"\nopiskelija: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"antti"}]},{"type":"text","value":"\nopiskelija: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"sara"}]},{"type":"text","value":"\nopiskelija:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tehdyt tehtävät:\npekka tehtäviä 1 kpl\nantti tehtäviä 2 kpl\nsara tehtäviä 3 kpl\njuuso tehtäviä 2 kpl"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkissä on parikin huomionarvoista seikkaa. Kun opiskelijan nimi syötetään, tarkastetaan aina ensin onko opiskelijaa vastaava olio jo sanakirjassa. Jos olioa ei ole, luodaan se:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tehtavalaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän jälkeen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tiedetään"}]},{"type":"text","value":" että olio on olemassa. Se on joko luotu juuri äsken tai jo aiemmalla silmukan kierroksella. Haetaan olio sanakirjasta, ja kutsutaan sen metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"merkkaa"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkkaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rivillä tapahtuu oikeastaan kaksi asiaa, ja sama voitaisiin kirjoittaa siten, että sanakirjasta haettu olio sijoitettaisiin apumuuttujaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"opiskelijan_laskuri "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nopiskelijan_laskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkkaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että vaikka olio sijoitettaisiin apumuuttujaan, se "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei tarkoita"}]},{"type":"text","value":" että olio poistuisi sanakirjasta tai oliosta syntyisi kopio. Apumuuttuja on ainoastaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"viite"}]},{"type":"text","value":" sanakirjassa olevaan olioon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkin koodia kannattaa "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ehdottomasti"}]},{"type":"text","value":" kokeilla "},{"type":"element","tagName":"a","properties":{"href":"http://www.pythontutor.com/visualize.html#mode=edit","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"visualisaattorissa"}]},{"type":"text","value":" jos ei ole aivan 100% varma siitä, miten koodi toimii."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Puhelinluettelon laajennus, osa 2","tmcname":"osa10-11_puhelinluettelo_osa2"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä laajennetaan puhelinluettelosovellusta siten, että henkilöihin voi liittyä myös osoite. Yksinkertaisuuden vuoksi koodista on kuitenkin poistettu tiedostoon tallentaminen. Myös muutama metodi on uudelleennimetty vastaamaan paremmin laajennuksen jälkeistä tilannetta."}]},{"type":"element","tagName":"h2","properties":{"id":"luokka-henkilon-tietojen-esittamiseen","style":"position:relative;"},"children":[{"type":"text","value":"Luokka henkilön tietojen esittämiseen"},{"type":"element","tagName":"a","properties":{"href":"#luokka-henkilon-tietojen-esittamiseen","ariaLabel":"luokka henkilon tietojen esittamiseen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Siirretään henkilön tietojen (eli puhelinnumerojen sekä osoitteen) esittäminen oman luokkansa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"text","value":" vastuulle. Toteuta luokka siten, että se toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"numerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"osoite"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhenkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"040-123456\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhenkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_osoite"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mannerheimintie 10 Helsinki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"numerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"osoite"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Erkki\n[]\nNone\n['040-123456']\nMannerheimintie 10 Helsinki"}]}]},{"type":"element","tagName":"h2","properties":{"id":"puhelinluettelo-kayttamaan-luokkaa-henkilo","style":"position:relative;"},"children":[{"type":"text","value":"Puhelinluettelo käyttämään luokkaa Henkilo"},{"type":"element","tagName":"a","properties":{"href":"#puhelinluettelo-kayttamaan-luokkaa-henkilo","ariaLabel":"puhelinluettelo kayttamaan luokkaa henkilo permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuta koodiasi siten, että se toimii käyttäjän näkökulmasta täysin samoin kuin aiemmin, mutta luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Puhelinluettelo"}]},{"type":"text","value":" tallettaakin henkilöt sisäisesti käyttäen luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"text","value":" olioita. Käytännössä siis oliomuuttujana "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__henkilot"}]},{"type":"text","value":" tulee olla sanakirja, johon listojen sijaan talletetaan henkilö-olioita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"VAROITUS:"}]},{"type":"text","value":" kun teet koodiin tämän tehtävän kaltaista rakenteellista muutosta, etene pienin askelin. Älä missään tapauksessa yritä tehdä kaikkea kerrallaan, se on "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"varma keino ajautua pahoihin ongelmiin"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sopiva pieni askel nyt voi olla se, että tarkastat ensin erikseen luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Puhelinluettelo"}]},{"type":"text","value":" toimivuuden. Esimerkiksi seuraavan koodin tulee toimia kuten olettaa saattaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luettelo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Puhelinluettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"02-123456\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_tiedot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_tiedot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtävässä ei tarkisteta, millainen tulostusasu "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae_tiedot"}]},{"type":"text","value":"-metodin palauttamalla tuloksella on, mutta varmista ettei koodi aiheuta virheitä, ja että tulos on järkevä. Kun olet 100% varma, että kaikki toimii luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Puhelinluettelo"}]},{"type":"text","value":" osalta, voit edetä varmistamaan, että kaikki toimii edelleen entiseen tapaan käyttöliittymää käytettäessä."}]},{"type":"element","tagName":"h2","properties":{"id":"osoitteen-lisaaminen","style":"position:relative;"},"children":[{"type":"text","value":"Osoitteen lisääminen"},{"type":"element","tagName":"a","properties":{"href":"#osoitteen-lisaaminen","ariaLabel":"osoitteen lisaaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajenna nyt sovellusta siten, että puhelinluetteloon on mahdollista tallettaa myös henkilöiden osoitteet. Ohjelman tulisi toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komennot:\n0 lopetus\n1 nimen lisäys\n2 haku\n3 osoitteen lisäys"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Erkki"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"02-123456"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Emilia"}]},{"type":"text","value":"\nosoite: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Viherlaaksontie 7, Espoo"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Erkki"}]},{"type":"text","value":"\n02-123456\nosoite ei tiedossa"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Emilia"}]},{"type":"text","value":"\nnumero ei tiedossa\nViherlaaksontie 7, Espoo"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Erkki"}]},{"type":"text","value":"\nosoite: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Linnankatu 75, Turku"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: 2\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Erkki"}]},{"type":"text","value":"\n02-123456\nLinnankatu 75, Turku"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Wilhelm"}]},{"type":"text","value":"\nosoite ei tiedossa\nnumero ei tiedossa"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"VAROITUS ja vihje:"}]},{"type":"text","value":" kuten tehtävän edellisessä osassa sanottiin, älä missään tapauksessa yritä tehdä kaikkea kerrallaan, se on "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"varma keino ajautua pahoihin ongelmiin"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Varmista ensin että voit lisätä osoitteita luokkaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Puhelinluettelo"}]},{"type":"text","value":" ja kun olet 100% varma, että se toimii, voit laajentaa sovelluksen käyttöliittymää uuden toiminnallisuuden osalta."}]}]},{"type":"element","tagName":"h2","properties":{"id":"erinaisia-huomioita","style":"position:relative;"},"children":[{"type":"text","value":"Erinäisiä huomioita"},{"type":"element","tagName":"a","properties":{"href":"#erinaisia-huomioita","ariaLabel":"erinaisia huomioita permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Puhelinluetteloesimerkki noudattaa rakenteeltaan melko klassisia hyvän olio-ohjelmoinnin periaatteita. Kantavana ideana on siis ohjelman eri vastuualueiden jaottelu erillisiin luokkiin ja metodeihin. Eräs suurimmista motiiveista tällaiselle jaottelulle on monimutkaisuuden hallinta. Toinen tärkeä syy on se, että oikein tehty koodin jaottelu - tai "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"modularisointi"}]},{"type":"text","value":" kuten ammattijargon asian ilmaisee - tekee koodista potentiaalisesti helpomman ylläpitää ja laajentaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oikeissa ohjelmistoissa ylivoimaisesti suurimman kustannuserän aiheuttaa juuri ylläpito (eli bugien korjailu) sekä ohjelman laajentaminen, joten tällä seikalla on taloudellisesti erittäin suuri merkitys."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nostetaan esimerkistä esiin vielä pari tärkeää seikkaa. Koodi ilmentää hyvin sitä, miten sovelluslogiikan varsinainen ydin on eriytetty sekä käyttöliittymästä, että datan tallettamisesta. Tämä on tärkeää muutamastakin syystä. Ensinnäkin se mahdollistaa koodin testailun pienemmissä yksiköissä, luokka ja metodi kerrallaan. Toisaalta koska sovelluslogiikka ei nyt riipu käyttöliittymästä tai tiedon talletustavasta, on esim. käyttöliittymää mahdollista muuttaa (ainakin johonkin pisteeseen asti) rikkomatta muuta sovellusta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedostojen käsittelyn suhteen kannattaa myös huomata se, että ohjelma lukee tiedostoa ainoastaan kerran, käynnistysvaiheessa. Tämän jälkeen kaikki tieto säilytetään ohjelman muuttujissa. Ohjelma tallettaa tiedot kokonaisuudessaan, eli käytännössä uudelleenkirjoittaa tiedoston joka kerta kokonaan uudestaan. Tiedostojen käsittely kannattaa lähes kaikissa tapauksissa tehdä näin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hyvän koodin kirjoittamisesta kerrotaan lisää esimerkiksi Robert Martinin mainiossa kirjassa "},{"type":"element","tagName":"a","properties":{"href":"https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Clean Code"}]},{"type":"text","value":". Kirjan koodiesimerkit on kuitenkin toteutettu Javalla, eli esimerkkien lukeminen saattaa tässä vaiheessa olla vielä varsin työlästä. Paneudumme ylläpidettävyydeltään ja laajennettavuudeltaan laadukkaan koodin toteuttamiseen tarkemmin kursseilla "},{"type":"element","tagName":"a","properties":{"href":"https://studies.helsinki.fi/opintotarjonta/cu/hy-CU-118024742-2020-08-01","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Ohjelmistotekniikka"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"a","properties":{"href":"https://studies.helsinki.fi/opintotarjonta/cu/hy-CU-118024909-2020-08-01","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Ohjelmistotuotanto"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hyvän olio-ohjelmoinnin periaatteiden mukaisen koodin kirjoittamisella on myös hintansa. Koodia tulee todennäköisesti enemmän kuin jos sama ongelma ratkaistaisiin yhteen pötköön kirjoitetulla spagettikoodilla. Ohjelmoijan onkin aina ratkaistava se, minkälainen lähestymistapa on paras kuhunkin tilanteeseen. Joskus voi olla vain parasta häkkeröidä kasaan nopeasti jotain joka toimii nyt. Jos taas on odotettavissa, että samaa koodia tullaan jatkossa laajentamaan. joko koodarin itsensä tai jonkun muun toimesta, on todennäköisesti kannattavaa panostaa koodin luettavuuteen ja jäsentämiseen jossain määrin jo alkuvaiheissa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Harjoitellaan vielä isomman ohjelmakokonaisuuden toteuttamista yhden ohjelmointitehtävän verran."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Opintorekisteri","tmcname":"osa10-12_opintorekisteri"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee interaktiivinen ohjelma, jonka avulla voit pitää kirjaa opintomenestyksestäsi. Sovelluksen rakenteen saat päättää itse, mutta nyt on hyvä tilaisuus harjoitella Puhelinluettelo-esimerkin kaltaisen oliorakenteen muodostamista."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1 lisää suoritus\n2 hae suoritus\n3 tilastot\n0 lopetus"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkurssi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Ohpe"}]},{"type":"text","value":"\narvosana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nopintopisteet: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nkurssi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Ohpe"}]},{"type":"text","value":"\nOhpe (5 op) arvosana 3"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkurssi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Ohpe"}]},{"type":"text","value":"\narvosana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nopintopisteet: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nkurssi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Ohpe"}]},{"type":"text","value":"\nOhpe (5 op) arvosana 5"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkurssi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Ohpe"}]},{"type":"text","value":"\narvosana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nopintopisteet: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nkurssi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Ohpe"}]},{"type":"text","value":"\nOhpe (5 op) arvosana 5"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nkurssi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Java-ohjelmointi"}]},{"type":"text","value":"\nei suoritusta"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkurssi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Tira"}]},{"type":"text","value":"\narvosana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nopintopisteet: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkurssi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Tilpe"}]},{"type":"text","value":"\narvosana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nopintopisteet: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkurssi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Lapio"}]},{"type":"text","value":"\narvosana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nopintopisteet: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkurssi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Lama"}]},{"type":"text","value":"\narvosana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nopintopisteet: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"8"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nsuorituksia 5 kurssilta, yhteensä 29 opintopistettä\nkeskiarvo 3.4\narvosanajakauma\n5: xx\n4: x\n3:\n2: x\n1: x"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muutama huomio: kultakin kurssilta tallentuu ainoastaan yksi arvosana. Arvosanaa voi korottaa, mutta se ei voi laskea."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtävästä on tarjolla kaksi tehtäväpistettä. Ensimmäisen pisteen saa jos toiminnot 1 ja 2 sekä lopetus toimivat. Toisen pisteen saa jos myös toiminto 3 on toteutettu."}]}]},{"type":"element","tagName":"h2","properties":{"id":"epilogi","style":"position:relative;"},"children":[{"type":"text","value":"Epilogi"},{"type":"element","tagName":"a","properties":{"href":"#epilogi","ariaLabel":"epilogi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Palataan vielä hetkeksi tarkastelemaan puhelinluetteloesimerkkiä, ja sen käyttöliittymän toteuttavaa luokkaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Puhelinluettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tiedosto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tiedostonkasittelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"luettelo.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muu koodi"}]},{"type":"text","value":"\n\nsovellus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" PuhelinluetteloSovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"suorita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"text","value":"-olio pitää siis sisällään sekä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Puhelinluettelo"}]},{"type":"text","value":"-olion että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tiedostonkasittelija"}]},{"type":"text","value":"-olion. Jos olisimme ammattikoodareita, tekisimme sovellukseen pienen muutoksen. Nyt nimittäin se, että sovellus käyttää nimenomaan tiedostoa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"luettelo.txt"}]},{"type":"text","value":" tallentamaan luettelon tiedot, on sovelluksen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"käyttöliittymän"}]},{"type":"text","value":" kannalta täysin turha deltaji. Jos tiedosto haluttaisiin vaihtaa, edellyttäisi se muutosta luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"text","value":" koodiin. Tämä taas ei ole hyvä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"separation of concerns"}]},{"type":"text","value":" -periaatetta ajatellen, sillä puhelinluettelon tallentaminen ei kuulu ollenkaan käyttöliittymästä huolehtivan luokan vastuisiin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Parempi vaihtoehto olisikin luoda tiedostokäsittelijä muualla ja antaa se "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"text","value":"-oliolle, esimerkiksi konstruktorin parametrina:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Puhelinluettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tiedosto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tiedosto\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muu koodi"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# luodaan tallennuksen hoitava olio"}]},{"type":"text","value":"\ntallennuspalvelu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tiedostonkasittelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"luettelo.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ja annetaan se PuhelinluetteloSovellus-oliolle konsturuktorin parametrina"}]},{"type":"text","value":"\nsovellus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" PuhelinluetteloSovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tallennuspalvelu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"suorita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Näin on saatu poistettua luokalta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"text","value":" "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"turha riippuvuus"}]},{"type":"text","value":" käsiteltävän tiedoston nimeen. Jos tiedoston nimi muuttuu, ei luokan koodiin tarvitse koskea ollenkaan. Riittää ainoastaan, että oliolle annetaan hieman erilainen konstruktoriparametri:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Puhelinluettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tiedosto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tiedosto\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muu koodi"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# vaihdetaan tiedostoa"}]},{"type":"text","value":"\ntallennuspalvelu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tiedostonkasittelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"uusi_luettelotiedosto.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsovellus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" PuhelinluetteloSovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tallennuspalvelu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"suorita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä sama tekniikka mahdollistaa sen, että siirrytäänkin tallentamaan puhelinluettelo tiedoston sijaan esimerkiksi internetissä olevaan pilvipalveluun. On vain kirjoitettava pilvipalvelua käyttävä luokka, joka tarjoaa puhelinluettelosovellukselle samanlaiset metodit kuin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tiedostonkasittelija"}]},{"type":"text","value":". Tämän luokan olio voidaan antaa sovellukselle, ilman että sovelluksen koodista tulee muuttaa riviäkään:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"InternetTallennin"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# koodi joka tallentaa luettelon tiedot internetissä olevaan pilvipalveluun"}]},{"type":"text","value":"\n\ntallennuspalvelu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" InternetTallennin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"amazon-cloud\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"mluukkai\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"passwrd\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsovellus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" PuhelinluetteloSovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tallennuspalvelu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"suorita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten aiemmin todettiin, on tämän kaltaisten tekniikoiden käytöllä oma hintansa: koodia tulee enemmän, ja ohjelmoijan tulee harkita milloin se hinta kannattaa maksaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä esitelty tekniikka (joka kulkee ammattijargonissa nimellä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"dependency injection"}]},{"type":"text","value":"), missä oliolle annetaan ulkopuolelta käsin sen tarvitsema "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"riippuvuus"}]},{"type":"text","value":" (eli käytännössä jokin muu olio) on erittäin tyypillinen kikka ammattimaisessa koodauksessa, muun muassa siksi, että se helpottaa ohjelmistojen laajentamista sekä niiden automatisoitua testaamista. Jatkamme teeman käsittelyä kursseilla "},{"type":"element","tagName":"a","properties":{"href":"https://studies.helsinki.fi/opintotarjonta/cu/hy-CU-118024742-2020-08-01","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Ohjelmistotekniikka"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"a","properties":{"href":"https://studies.helsinki.fi/opintotarjonta/cu/hy-CU-118024909-2020-08-01","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Ohjelmistotuotanto"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa lopuksi osion loppukyselyyn:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"adf5276f-057a-5ac0-85b1-024443782145"},"children":[]}]}]},"html":"

Tässä osiossa

    \n
  • Käydään läpi hieman laajemman sovelluksen tekemiseen liittyviä seikkoja
  • \n
  • Erityinen fokus on sovelluksen eri osa-alueiden (käyttöliittymä, sovelluslogiikka ja tiedostojen käsittely) eriyttämisessä
  • \n
  • Harjoitellaan laajemman sovelluksen toteuttamista itse
  • \n

Ohjelmoinnin perusteiden ja jatkokurssin aikana on esitelty suuri määrä Pythonin tarjoamia ominaisuuksia.

Ohjelmoinnin perusteissa tutustuttiin kielen kontrollirakenteisiin (while ja for), funktioihin sekä perustietorakenteisiin eli listaan ja sanakirjaan. Näytti jo hetken siltä että muuta ei tarvitakaan. Periaatteessa näin onkin: ohjelmoinnin perusteiden kalustolla pystyy ilmaisemaan kaiken mikä Pythonilla on ylipäätään ilmaistavissa.

Jatkokurssin alussa, eli kurssin osassa 8 pakkaa ruvettiin kuitenkin hämmentämään tuomalla mukaan luokat ja oliot. Milloin ja ylipäätään miksi olioita tulisi käyttää jos kurssin osien 1-7 kalusto on jo ilmaisuvoimaltaan riittävä?

Monimutkaisuuden hallintaa

Monissa tilanteissa voi ja varmasti kannattaakin olla käyttämättä oliota. Esimerkiksi jos koodataan pieni \"kertakäyttöinen\" apuohjelma, ei ehkä ole mitään tarvetta olioille. Tilanne alkaa muuttua, kun siirrytään hieman suuremman kokoluokan ohjelmiin.

Kun ohjelma laajenee, alkaa sen sisältämien yksityiskohtien määrä nousta hallitsemattomaksi, ellei ohjelmaa jäsennellä jollain järkevällä tavalla. Itse asiassa jo ohjelmoinnin perusteiden tehtävissä oli havaittavissa varsin monimutkaisia ratkaisuja, joiden ymmärtämisessä jopa alan ammattilaisilla on vaikeuksia.

Käsite Separation of concerns on ollut jo vuosikymmeniä eräs ohjelmoinnin ja koko tietojenkäsittelyn keskeisiä teemoja. Wikipedian mukaan käsitteellä tarkoitetaan seuraavaa

Separation of concerns is a design principle for separating a computer program into distinct sections such that each section addresses a separate concern. A concern is a set of information that affects the code of a computer program

Kyse on ohjelman suunnittelua ohjaavasta periaatteesta, jonka mukaan ohjelmakoodi jäsennellään pienempiin osiin, joista kukin huolehtii vain omasta \"tontistaan\". Kuhunkin osaan tehdyt muutokset vaikuttavat - periaatteen mukaisesti - vain rajattuun alueeseen ohjelmassa, joten ohjelmien väistämätöntä monimutkaisuutta on helpompi hallita.

Funktiot ovat yksi mekanismi tämän tavoitteen saavuttamiseen. Sen sijaan että ohjelma kirjoitetaan yhtenä isona kokonaisuutena, koostetaan se pienistä funktioista, joista kukin ratkaisee pienen osan ongelmasta.

Olio-ohjelmointi tarjoaa funktioita jossain määrin ilmaisuvoimaisemman ja joidenkin mielestä \"paremman\" tavan saavuttaa sama tavoite. Kuten olemme nähneet, olioiden avulla on mahdollista koota samaan asiaan liittyvä data ja sitä käsittelevä koodi, eli olion metodit, samaan paikkaan. Oliot tarjoavat myös mekanismin käsittelemänsä datan kapselointiin, joka taas tavallaan on keino piilottaa \"turhia\" yksityiskohtia olion ulkopuoliselta osalta ohjelmaa.

Esimerkki: puhelinluettelo

Miten ohjelma sitten tulisi jakaa luokkiin ja olioihin? Kysymys ei ole helppo, ja asiaa on helpompi pohdiskella konkreettisen esimerkin kautta. Toteutetaan esimerkkinä olio-ohjelmointia hyödyntäen hieman samantyylinen puhelinluettelo, joka oli aiheena ohjelmoinnin perusteiden viidennen osan tehtävässä.

Separation of concerns -periaatetta noudatellen koodi tulee jakaa osiin, joista kukin käsittelee omaa asiaansa. Olio-ohjelmoinnin piirissä tätä periaatetta ilmentää niin sanottu yhden vastuun (single responsibility) -periaate. Ei mennä sen tarkemmin periaatteen yksityiskohtiin, mutta maalaisjärjellä ajatellen periaatteen nimi jo kertoo mistä on kyse: yksittäisen luokan olioiden tulisi olla vastuussa yhdestä asiasta.

Olioita käytettäessä ohjelmointiongelman \"reaalimaailman asioita\" vastaa yleensä oma luokkansa. Puhelinluettelon tapauksessa tälläisiä reaalimaailman asioita olisivat esimerkiksi:

    \n
  • henkilö
  • \n
  • nimi
  • \n
  • puhelinnumero
  • \n

Näistä nimi ja puhelinnumero ovat kenties liian vähäpätöisiä ollakseen omia luokkiaan, mutta henkilö voisi hyvinkin olla oma luokkansa, jonka vastuulla on sitoa yhteen tietty nimi ja siihen liittyvät puhelinnumerot.

Myös puhelinluettelo itsessään on potentiaalinen luokka, sen vastuulla on hallinnoida eri henkilöiden tietoja.

Nämä kaksi luokkaa eli puhelinluettelo ja henkilö muodostavat sovelluksen ytimen, eli niin sanotun sovelluslogiikan. Näiden lisäksi ohjelma tarvitsee muutaman muunkin luokan.

Käyttäjän kanssa tapahtuvasta interaktiosta huolehtivaa luokkaa ei kannata sotkea sovelluslogiikan kanssa samaan luokkaan - sehän on kokonaan oma vastuunsa. Eli sovelluslogiikan luokkien lisäksi ohjelmalle tulee myös luokka, joka huolehtii ohjelman käyttöliittymästä.

Talletamme puhelinluettelon tiedot tiedostoon. Myös tiedoston käsittely on selkeästi oma vastuunsa, joten tulemme sisällyttämään siihen käytettävän koodin omaan luokkaansa.

Kun ohjelman luokkarakenne alkaa pikkuhiljaa hahmottua, nousee kysymykseksi se, mistä ohjelmointi kannattaa aloittaa. Usein paras tapa aloittaa on pienellä palalla sovelluslogiikka.

Vaihe 1: sovelluslogiikan runko

Aloitetaan luokasta Puhelinluettelo. Runko voisi näyttää seuraavalta:

class Puhelinluettelo:\n    def __init__(self):\n        self.__henkilot = []\n\n    def lisaa_numero(self, nimi: str, numero: str):\n        pass\n\n    def hae_numerot(self, nimi: str):\n        pass\n

Luokka pitää siis sisällään listan henkilöitä ja tarjoaa metodit tietojen lisäämiseen ja hakemiseen.

Jokaiseen henkilöön voi liittyä useita numeroita, joten toteutetaan luettelon sisäinen tila sanakirjan avulla, koska sanakirjasta on helppo hakea nimen perusteella. Sanakirjaan on helppo tallettaa suoraan myös nimeen liittyvät numerot, joten ainakaan tässä vaiheessa ei tarvita erillistä luokkaa yksittäisen henkilön tietojen tallettamiseen.

Luokka laajenee seuraavasti. Mukana on myös pieni toiminnan varmistava koodinpätkä:

class Puhelinluettelo:\n    def __init__(self):\n        self.__henkilot = {}\n\n    def lisaa_numero(self, nimi: str, numero: str):\n        if not nimi in self.__henkilot:\n            # henkilöön liittyy lista puhelinnumeroja\n            self.__henkilot[nimi] = []\n\n        self.__henkilot[nimi].append(numero)\n\n    def hae_numerot(self, nimi: str):\n        if not nimi in self.__henkilot:\n            return None\n\n        return self.__henkilot[nimi]\n\n# testikoodi\nluettelo = Puhelinluettelo()\nluettelo.lisaa_numero(\"Erkki\", \"02-123456\")\nprint(luettelo.hae_numerot(\"Erkki\"))\nprint(luettelo.hae_numerot(\"Emilia\"))

Testikoodin tulostus on seuraava:

['02-123456']\nNone

Metodi hae_numerot siis palauttaa arvon None, jos henkilö ei löydy luettelosta, jos henkilö löytyy, palautetaan lista joka sisältää henkilön puhelinnumerot.

Ohjelmoidessa mitä tahansa ohjelmaa kannattaa aina kokeilla, että koodi toimii kuten sen olettaa toimivan, ennen kun etenee muuhun koodiin.\nUsein tämä testikoodi on poisheitettävää koodia, ja sikäli voisi ajatella testaamisesta olevan ylimääräistä vaivaa. Lähes 100% tapauksissa ei näin kuitenkaan ole.

Koodiin tullut bugi kannattaa saada kiinni ja korjata niin pian kuin mahdollista. Jos koodin toimivuuden varmistaa lähes jokaisen uuden koodirivin jälkeen, on debuggaus ja korjaaminen yleensä vaivatonta ja nopeaa, koska tällöin voi olla melko varma siitä, että ongelma johtuu hetki sitten lisätyistä koodiriveistä. Jos taas koodia testataan vasta sen jälkeen kun siihen on lisätty kymmeniä koodirivejä, on virhelähteitä moninkertaisesti.

Vaihe 2: käyttöliittymän runko

Kun sovelluslogiikan ydintoiminnallisuus on kunnossa, voidaan edetä sovelluksen tekstikäyttöliittymään. Tehdään sitä varten oma luokka PuhelinluetteloSovellus, jonka runko on seuraava:

class PuhelinluetteloSovellus:\n    def __init__(self):\n        self.__luettelo = Puhelinluettelo()\n\n    def ohje(self):\n        print(\"komennot: \")\n        print(\"0 lopetus\")\n\n    def suorita(self):\n        self.ohje()\n        while True:\n            print(\"\")\n            komento = input(\"komento: \")\n            if komento == \"0\":\n                break\n\nsovellus = PuhelinluetteloSovellus()\nsovellus.suorita()

Luokka saattaa vaikuttaa vielä hämmentävältä, mutta tässä luodaan tosiaan vasta runko toiminnalle. Konstruktori luo puhelinluettelon, jonka olio pitää sisällään. Metodi suorita(self) käynnistää sovelluksen tekstikäyttöliittymän, jonka ytimen muodostaa while-silmukka, joka kyselee käyttäjältä mikä komento halutaan suorittaa. Ennen toistolauseeseen menemistä ohjelma tulostaa käyttöohjeet, kutsumalla metodia ohje(self). Varsinaiset toiminnot toteutetaan seuraavaksi.

Laajennetaan käyttöliittymää siten, että luetteloon voidaan lisätä uusia tietoja:

class PuhelinluetteloSovellus:\n    def __init__(self):\n        self.__luettelo = Puhelinluettelo()\n\n    def ohje(self):\n        print(\"komennot: \")\n        print(\"0 lopetus\")\n        print(\"1 lisäys\")\n\n    def suorita(self):\n        self.ohje()\n        while True:\n            print(\"\")\n            komento = input(\"komento: \")\n            if komento == \"0\":\n                break\n            elif komento == \"1\":\n                nimi = input(\"nimi: \")\n                numero = input(\"numero: \")\n                self.__luettelo.lisaa_numero(nimi, numero)\n\nsovellus = PuhelinluetteloSovellus()\nsovellus.suorita()

Jos valittu komento on tietojen lisäys (eli komento on 1), kysyy käyttöliittymä nimen ja numeron käyttäjältä, ja lisää tiedot puhelinluetteloon kutsumalla sopivaa luettelon metodia.

Käyttöliittymä on siis vastuussa ainoastaan siitä, että se kommunikoi käyttäjän kanssa. Puhelinnumeron säilöminen nimen yhteyteen on jätetty kokonaisuudessan Puhelinluettelo-olion vastuulle.

Käyttöliittymän rakennetta on mahdollista vielä parannella siten, että tietojen lisäys eriytetään omaan metodiinsa lisays(self):

class PuhelinluetteloSovellus:\n    def __init__(self):\n        self.__luettelo = Puhelinluettelo()\n\n    def ohje(self):\n        print(\"komennot: \")\n        print(\"0 lopetus\")\n        print(\"1 lisäys\")\n\n    # eriytetään uusien tietojen lisääminen omaksi metodiksi\n    def lisays(self):\n        nimi = input(\"nimi: \")\n        numero = input(\"numero: \")\n        self.__luettelo.lisaa_numero(nimi, numero)\n\n    def suorita(self):\n        self.ohje()\n        while True:\n            print(\"\")\n            komento = input(\"komento: \")\n            if komento == \"0\":\n                break\n            elif komento == \"1\":\n                self.lisays()\n\nsovellus = PuhelinluetteloSovellus()\nsovellus.suorita()

Erillisen metodin käyttämisen taustallakin on sama separation of concerns -periaate. Sen sijaan että koko käyttöliittymän toiminnallisuus sijoitettaisiin ison while-silmukan sisälle, tehdään jokaisesta yksittäisestä toiminnosta oma metodinsa. Tämä helpottaa kokonaisuuden hallintaa. Jos halutaan muokata tietojen lisäämisen toiminnallisuutta, tiedetään heti missä päin relevantti koodi sijaitsee.

Lisätään käyttöliittymään toiminnallisuus numeroiden hakemista varten. Sijoitetaan sen hoitava koodi heti omaan metodiinsa:

\nclass PuhelinluetteloSovellus:\n    def __init__(self):\n        self.__luettelo = Puhelinluettelo()\n\n    def ohje(self):\n        print(\"komennot: \")\n        print(\"0 lopetus\")\n        print(\"1 lisäys\")\n        print(\"2 haku\")\n\n    def lisays(self):\n        nimi = input(\"nimi: \")\n        numero = input(\"numero: \")\n        self.__luettelo.lisaa_numero(nimi, numero)\n\n    def haku(self):\n        nimi = input(\"nimi: \")\n        numerot = self.__luettelo.hae_numerot(nimi)\n        if numerot == None:\n            print(\"numero ei tiedossa\")\n            return\n        for numero in numerot:\n            print(numero)\n\n    def suorita(self):\n        self.ohje()\n        while True:\n            print(\"\")\n            komento = input(\"komento: \")\n            if komento == \"0\":\n                break\n            elif komento == \"1\":\n                self.lisays()\n            elif komento == \"2\":\n                self.haku()\n            else:\n                self.ohje()\n\nsovellus = PuhelinluetteloSovellus()\nsovellus.suorita()

Sovelluksen perusversio toimii nyt. Seuraavassa esimerkki sovelluksen käytöstä:

komennot:\n0 lopetus\n1 lisäys\n2 haku

komento: 1\nnimi: Erkki\nnumero: 02-123456

komento: 1\nnimi: Erkki\nnumero: 045-4356713

komento: 2\nnimi: Erkki\n02-123456\n045-4356713

komento: 2\nnimi: Emilia\nnumero ei tiedossa

komento: 0

Koodia on aika paljon, todennäköisesti enemmän kuin jos kaikki olisi ohjelmoitu yhteen pötköön. Koodin rakenne on kuitenkin siistihkö, ja koodin laajentamisenkaan ei pitäisi olla kovin hankalaa.

Vaihe 3: tietojen haku tiedostosta

Laajennetaan ohjelmaa siten, että se lataa käynnistäessään puhelinluettelon tiedostosta, joka on seuraavaa muotoa:

Erkki;02-1234567;045-4356713\nEmilia;040-324344

Tiedoston käsittely on selkeästi oma vastuualueensa, eli toteutetaan sitä varten oma luokka:

class Tiedostonkasittelija():\n    def __init__(self, tiedosto):\n        self.__tiedosto = tiedosto\n\n    def lataa(self):\n        nimet = {}\n        with open(self.__tiedosto) as f:\n            for rivi in f:\n                osat = rivi.strip().split(';')\n                nimi, *numerot = osat\n                nimet[nimi] = numerot\n\n        return nimet

Konstruktorin parametrina annetaan tiedoston nimi. Metodi lataa(self) lukee tiedoston, ja pilkkoo sen rivit sanakirjaksi, missä avain on nimi ja arvona ovat nimeen liittyvät numerot.

Metodi käyttää erästä Pythonin kätevää ominaisuutta: listasta on mahdollista ottaa ensin yksittäisiä alkioita erikseen nimettyinä muuttujina, sekä loput alkiot uutena listana, kuten seuraavasta esimerkistä käy ilmi. Luvusta 6 muistamme että merkkijonojen metodi split tuottaa nimenomaan listan.

lista = [1, 2, 3, 4, 5]\neka, toka, *loput = lista\nprint(eka)\nprint(toka)\nprint(loput)

1\n2\n[3, 4, 5]

Sijoituslauseen viimeisen muuttujan nimen edessä on *, ja se tarkoittaa, että viimeiseen muuttujaan kerätään taulukosta loput, eli kolmas ja sitä seuraavat alkiot.

Tiedostonkäsittelijääkin kannattaa ehdottomasti testata, ennen kuin se pultataan muuhun koodiin:

t = Tiedostonkasittelija(\"luettelo.txt\")\nprint(t.lataa())

{'Erkki': ['02-1234567', '045-4356713'], 'Emilia': ['040-324344']}

Kun tiedostosta lukemisen todetaan toimivan, liitetään koodi muuhun ohjelmaan. Looginen paikka tiedoston lukemiseen on se hetki kun sovellus käynnistyy, eli luokan PuhelinluetteloSovellus konstruktori:

class PuhelinluetteloSovellus:\n    def __init__(self):\n        self.__luettelo = Puhelinluettelo()\n        self.__tiedosto = Tiedostonkasittelija(\"luettelo.txt\")\n\n        # listään tiedostossa olevat nimet luetteloon\n        for nimi, numerot in self.__tiedosto.lataa().items():\n            for numero in numerot:\n                self.__luettelo.lisaa_numero(nimi, numero)\n\n    # muu koodi

Tiedoston lukua osana PuhelinLuetteloSovellusta kannattaa myös testata. Kun on varmistettu, että tiedoston sisältö saadaan ladattua luetteloon, voidaan edetä viimeiseen vaiheeseen.

Vaihe 4: tietojen talletus tiedostoon

Viimeistellään ohjelman alustava versio vielä siten, että se tallentaa lopetettaessa puhelinluettelon takaisin tiedostoon.

Tätä varten luokkaa Puhelinluettelo tulee laajentaa siten, että sieltä saadaan tallennusta varten kaikki tiedot ulos:

class Puhelinluettelo:\n    def __init__(self):\n        self.__henkilot = {}\n\n    # ...\n\n    # palautetaan tiedostoon tallentamista varten kaikki tiedot\n    def kaikki_tiedot(self):\n        return self.__henkilot

Tallennus on luonnollisesti luokan Tiedostonkasittelija vastuulla, eli laajennetaan sitä metodilla talleta, joka saa parametriksi puhelinluetteloa edustavan sanakirjan:

class Tiedostonkasittelija():\n    def __init__(self, tiedosto):\n        self.__tiedosto = tiedosto\n\n    def lataa(self):\n        # ...\n\n    def talleta(self, luettelo: dict):\n        with open(self.__tiedosto, \"w\") as f:\n            for nimi, numerot in luettelo.items():\n                rivi = [nimi] + numerot\n                f.write(\";\".join(rivi) + \"\\n\")

Tallennus tapahtuu samalla kun sovelluksen käyttö lopetetaan. Tehdään tätäkin tarkoitusta varten oma metodinsa ja kutsutaan sitä sopivassa kohdassa:

\nclass PuhelinluetteloSovellus:\n    # muu koodi\n\n    # metodi, joka suoritetaan lopetettaessa sovelluksen käyttö\n    def lopetus(self):\n        self.__tiedosto.talleta(self.__luettelo.kaikki_tiedot())\n\n    def suorita(self):\n        self.ohje()\n        while True:\n            print(\"\")\n            komento = input(\"komento: \")\n            if komento == \"0\":\n\n                self.lopetus()\n                break\n            elif komento == \"1\":\n                self.lisays()\n            elif komento == \"2\":\n                self.haku()\n            else:\n                self.ohje()

Tässä tehtävässä tehdään pieni laajennus puhelinluettelosovellukseen. Yllä kehitetty koodi löytyy tehtäväpohjasta. Laajenna ratkaisuasi komennolla, joka mahdollistaa nimen etsimisen numeron perusteella. Laajennuksen jälkeen sovelluksen pitäisi toimia seuraavasti:

komennot:\n0 lopetus\n1 lisäys\n2 haku\n3 haku numeron perusteella

komento: 1\nnimi: Erkki\nnumero: 02-123456

komento: 1\nnimi: Erkki\nnumero: 045-4356713

komento: 3\nnumero: 02-123456\nErkki

komento: 3\nnumero: 0100100\ntuntematon numero

komento: 0

Tee laajennus sitten, että kunnioitat ohjelman rakennetta. Eli lisää luokkaan PuhelinluetteloSovellus uutta ominaisuutta varten sopiva apumetodi sekä oma haara while-silmukkaan. Lisää myös sovelluslogiikkaan eli luokkaan Puhelinluettelo metodi, joka mahdollistaa nimen hakemisen numeron perusteella.

Olioita sanakirjassa

Seuraavassa tehtävässä on tarkoitus muuttaa puhelinluetteloa siten, että sanakirjan arvoksi talletetaan tavallisten listojen sijaan olioita.

Periaatteessa asiassa ei ole mitään ihmeellistä, mutta kurssilla ei vielä ole näin tehty, joten tutkitaan ennen tehtävää hieman samantapaista, mutta yksinkertaisempaa esimerkkiä.

Tehdään sovellus, jonka avulla voidaan pitää kirjaa siitä, kuinka monta tehtävää opiskelijat ovat tehneet kurssin aikana. Kunkin opiskelijan tehtävämäärä lasketaan yksinkertaisen olion avulla:

class Tehtavalaskuri:\n    def __init__(self):\n        self.__tehtavia = 0\n\n    def merkkaa(self):\n        self.__tehtavia += 1\n\n    def tehtyja(self):\n        return self.__tehtavia

Luokkaa käyttävä pääohjelma on seuraavassa:

opiskelijat = {}\n\nprint(\"merkataan tehtäviä\")\nwhile True:\n    nimi = input(\"opiskelija: \")\n    if len(nimi) == 0:\n        break\n\n    # luodaan tarvittaessa olio tehtävämäärän laskemista varten\n    if not nimi in opiskelijat:\n        opiskelijat[nimi] = Tehtavalaskuri()\n\n    # merkataan tehdyksi nimeä vastaavaan olioon\n    opiskelijat[nimi].merkkaa()\n\nprint()\nprint(\"tehdyt tehtävät:\")\n\nfor opiskelija, tehtavat in opiskelijat.items():\n    print(f\"{opiskelija} tehtäviä {tehtavat.tehtyja()} kpl\")

Käyttöesimerkki

merkataan tehtäviä\nopiskelija: pekka\nopiskelija: sara\nopiskelija: antti\nopiskelija: sara\nopiskelija: juuso\nopiskelija: juuso\nopiskelija: antti\nopiskelija: sara\nopiskelija:

tehdyt tehtävät:\npekka tehtäviä 1 kpl\nantti tehtäviä 2 kpl\nsara tehtäviä 3 kpl\njuuso tehtäviä 2 kpl

Esimerkissä on parikin huomionarvoista seikkaa. Kun opiskelijan nimi syötetään, tarkastetaan aina ensin onko opiskelijaa vastaava olio jo sanakirjassa. Jos olioa ei ole, luodaan se:

if not nimi in opiskelijat:\n    opiskelijat[nimi] = Tehtavalaskuri()

Tämän jälkeen tiedetään että olio on olemassa. Se on joko luotu juuri äsken tai jo aiemmalla silmukan kierroksella. Haetaan olio sanakirjasta, ja kutsutaan sen metodia merkkaa:

opiskelijat[nimi].merkkaa()

Rivillä tapahtuu oikeastaan kaksi asiaa, ja sama voitaisiin kirjoittaa siten, että sanakirjasta haettu olio sijoitettaisiin apumuuttujaan:

opiskelijan_laskuri = opiskelijat[nimi]\nopiskelijan_laskuri.merkkaa()

Huomaa, että vaikka olio sijoitettaisiin apumuuttujaan, se ei tarkoita että olio poistuisi sanakirjasta tai oliosta syntyisi kopio. Apumuuttuja on ainoastaan viite sanakirjassa olevaan olioon.

Esimerkin koodia kannattaa ehdottomasti kokeilla visualisaattorissa jos ei ole aivan 100% varma siitä, miten koodi toimii.

Tässä tehtävässä laajennetaan puhelinluettelosovellusta siten, että henkilöihin voi liittyä myös osoite. Yksinkertaisuuden vuoksi koodista on kuitenkin poistettu tiedostoon tallentaminen. Myös muutama metodi on uudelleennimetty vastaamaan paremmin laajennuksen jälkeistä tilannetta.

Luokka henkilön tietojen esittämiseen

Siirretään henkilön tietojen (eli puhelinnumerojen sekä osoitteen) esittäminen oman luokkansa Henkilo vastuulle. Toteuta luokka siten, että se toimii seuraavasti:

henkilo = Henkilo(\"Erkki\")\nprint(henkilo.nimi())\nprint(henkilo.numerot())\nprint(henkilo.osoite())\nhenkilo.lisaa_numero(\"040-123456\")\nhenkilo.lisaa_osoite(\"Mannerheimintie 10 Helsinki\")\nprint(henkilo.numerot())\nprint(henkilo.osoite())

Erkki\n[]\nNone\n['040-123456']\nMannerheimintie 10 Helsinki

Puhelinluettelo käyttämään luokkaa Henkilo

Muuta koodiasi siten, että se toimii käyttäjän näkökulmasta täysin samoin kuin aiemmin, mutta luokka Puhelinluettelo tallettaakin henkilöt sisäisesti käyttäen luokan Henkilo olioita. Käytännössä siis oliomuuttujana __henkilot tulee olla sanakirja, johon listojen sijaan talletetaan henkilö-olioita.

VAROITUS: kun teet koodiin tämän tehtävän kaltaista rakenteellista muutosta, etene pienin askelin. Älä missään tapauksessa yritä tehdä kaikkea kerrallaan, se on varma keino ajautua pahoihin ongelmiin.

Sopiva pieni askel nyt voi olla se, että tarkastat ensin erikseen luokan Puhelinluettelo toimivuuden. Esimerkiksi seuraavan koodin tulee toimia kuten olettaa saattaa:

luettelo = Puhelinluettelo()\nluettelo.lisaa_numero(\"Erkki\", \"02-123456\")\nprint(luettelo.hae_tiedot(\"Erkki\"))\nprint(luettelo.hae_tiedot(\"Emilia\"))

Tehtävässä ei tarkisteta, millainen tulostusasu hae_tiedot-metodin palauttamalla tuloksella on, mutta varmista ettei koodi aiheuta virheitä, ja että tulos on järkevä. Kun olet 100% varma, että kaikki toimii luokan Puhelinluettelo osalta, voit edetä varmistamaan, että kaikki toimii edelleen entiseen tapaan käyttöliittymää käytettäessä.

Osoitteen lisääminen

Laajenna nyt sovellusta siten, että puhelinluetteloon on mahdollista tallettaa myös henkilöiden osoitteet. Ohjelman tulisi toimia seuraavasti:

komennot:\n0 lopetus\n1 nimen lisäys\n2 haku\n3 osoitteen lisäys

komento: 1\nnimi: Erkki\nnumero: 02-123456

komento: 3\nnimi: Emilia\nosoite: Viherlaaksontie 7, Espoo

komento: 2\nnimi: Erkki\n02-123456\nosoite ei tiedossa

komento: 2\nnimi: Emilia\nnumero ei tiedossa\nViherlaaksontie 7, Espoo

komento: 3\nnimi: Erkki\nosoite: Linnankatu 75, Turku

komento: 2\nnimi: Erkki\n02-123456\nLinnankatu 75, Turku

komento: 2\nnimi: Wilhelm\nosoite ei tiedossa\nnumero ei tiedossa

komento: 0

VAROITUS ja vihje: kuten tehtävän edellisessä osassa sanottiin, älä missään tapauksessa yritä tehdä kaikkea kerrallaan, se on varma keino ajautua pahoihin ongelmiin.

Varmista ensin että voit lisätä osoitteita luokkaan Puhelinluettelo ja kun olet 100% varma, että se toimii, voit laajentaa sovelluksen käyttöliittymää uuden toiminnallisuuden osalta.

Erinäisiä huomioita

Puhelinluetteloesimerkki noudattaa rakenteeltaan melko klassisia hyvän olio-ohjelmoinnin periaatteita. Kantavana ideana on siis ohjelman eri vastuualueiden jaottelu erillisiin luokkiin ja metodeihin. Eräs suurimmista motiiveista tällaiselle jaottelulle on monimutkaisuuden hallinta. Toinen tärkeä syy on se, että oikein tehty koodin jaottelu - tai modularisointi kuten ammattijargon asian ilmaisee - tekee koodista potentiaalisesti helpomman ylläpitää ja laajentaa.

Oikeissa ohjelmistoissa ylivoimaisesti suurimman kustannuserän aiheuttaa juuri ylläpito (eli bugien korjailu) sekä ohjelman laajentaminen, joten tällä seikalla on taloudellisesti erittäin suuri merkitys.

Nostetaan esimerkistä esiin vielä pari tärkeää seikkaa. Koodi ilmentää hyvin sitä, miten sovelluslogiikan varsinainen ydin on eriytetty sekä käyttöliittymästä, että datan tallettamisesta. Tämä on tärkeää muutamastakin syystä. Ensinnäkin se mahdollistaa koodin testailun pienemmissä yksiköissä, luokka ja metodi kerrallaan. Toisaalta koska sovelluslogiikka ei nyt riipu käyttöliittymästä tai tiedon talletustavasta, on esim. käyttöliittymää mahdollista muuttaa (ainakin johonkin pisteeseen asti) rikkomatta muuta sovellusta.

Tiedostojen käsittelyn suhteen kannattaa myös huomata se, että ohjelma lukee tiedostoa ainoastaan kerran, käynnistysvaiheessa. Tämän jälkeen kaikki tieto säilytetään ohjelman muuttujissa. Ohjelma tallettaa tiedot kokonaisuudessaan, eli käytännössä uudelleenkirjoittaa tiedoston joka kerta kokonaan uudestaan. Tiedostojen käsittely kannattaa lähes kaikissa tapauksissa tehdä näin.

Hyvän koodin kirjoittamisesta kerrotaan lisää esimerkiksi Robert Martinin mainiossa kirjassa Clean Code. Kirjan koodiesimerkit on kuitenkin toteutettu Javalla, eli esimerkkien lukeminen saattaa tässä vaiheessa olla vielä varsin työlästä. Paneudumme ylläpidettävyydeltään ja laajennettavuudeltaan laadukkaan koodin toteuttamiseen tarkemmin kursseilla Ohjelmistotekniikka ja Ohjelmistotuotanto.

Hyvän olio-ohjelmoinnin periaatteiden mukaisen koodin kirjoittamisella on myös hintansa. Koodia tulee todennäköisesti enemmän kuin jos sama ongelma ratkaistaisiin yhteen pötköön kirjoitetulla spagettikoodilla. Ohjelmoijan onkin aina ratkaistava se, minkälainen lähestymistapa on paras kuhunkin tilanteeseen. Joskus voi olla vain parasta häkkeröidä kasaan nopeasti jotain joka toimii nyt. Jos taas on odotettavissa, että samaa koodia tullaan jatkossa laajentamaan. joko koodarin itsensä tai jonkun muun toimesta, on todennäköisesti kannattavaa panostaa koodin luettavuuteen ja jäsentämiseen jossain määrin jo alkuvaiheissa.

Harjoitellaan vielä isomman ohjelmakokonaisuuden toteuttamista yhden ohjelmointitehtävän verran.

Tee interaktiivinen ohjelma, jonka avulla voit pitää kirjaa opintomenestyksestäsi. Sovelluksen rakenteen saat päättää itse, mutta nyt on hyvä tilaisuus harjoitella Puhelinluettelo-esimerkin kaltaisen oliorakenteen muodostamista.

Ohjelman tulee toimia seuraavasti:

1 lisää suoritus\n2 hae suoritus\n3 tilastot\n0 lopetus

komento: 1\nkurssi: Ohpe\narvosana: 3\nopintopisteet: 5

komento: 2\nkurssi: Ohpe\nOhpe (5 op) arvosana 3

komento: 1\nkurssi: Ohpe\narvosana: 5\nopintopisteet: 5

komento: 2\nkurssi: Ohpe\nOhpe (5 op) arvosana 5

komento: 1\nkurssi: Ohpe\narvosana: 1\nopintopisteet: 5

komento: 2\nkurssi: Ohpe\nOhpe (5 op) arvosana 5

komento: 2\nkurssi: Java-ohjelmointi\nei suoritusta

komento: 1\nkurssi: Tira\narvosana: 1\nopintopisteet: 10

komento: 1\nkurssi: Tilpe\narvosana: 2\nopintopisteet: 5

komento: 1\nkurssi: Lapio\narvosana: 4\nopintopisteet: 1

komento: 1\nkurssi: Lama\narvosana: 5\nopintopisteet: 8

komento: 3\nsuorituksia 5 kurssilta, yhteensä 29 opintopistettä\nkeskiarvo 3.4\narvosanajakauma\n5: xx\n4: x\n3:\n2: x\n1: x

komento: 0

Muutama huomio: kultakin kurssilta tallentuu ainoastaan yksi arvosana. Arvosanaa voi korottaa, mutta se ei voi laskea.

Tehtävästä on tarjolla kaksi tehtäväpistettä. Ensimmäisen pisteen saa jos toiminnot 1 ja 2 sekä lopetus toimivat. Toisen pisteen saa jos myös toiminto 3 on toteutettu.

Epilogi

Palataan vielä hetkeksi tarkastelemaan puhelinluetteloesimerkkiä, ja sen käyttöliittymän toteuttavaa luokkaa:

class PuhelinluetteloSovellus:\n    def __init__(self):\n        self.__luettelo = Puhelinluettelo()\n        self.__tiedosto = Tiedostonkasittelija(\"luettelo.txt\")\n\n    # muu koodi\n\nsovellus = PuhelinluetteloSovellus()\nsovellus.suorita()

PuhelinluetteloSovellus-olio pitää siis sisällään sekä Puhelinluettelo-olion että Tiedostonkasittelija-olion. Jos olisimme ammattikoodareita, tekisimme sovellukseen pienen muutoksen. Nyt nimittäin se, että sovellus käyttää nimenomaan tiedostoa luettelo.txt tallentamaan luettelon tiedot, on sovelluksen käyttöliittymän kannalta täysin turha deltaji. Jos tiedosto haluttaisiin vaihtaa, edellyttäisi se muutosta luokan PuhelinluetteloSovellus koodiin. Tämä taas ei ole hyvä separation of concerns -periaatetta ajatellen, sillä puhelinluettelon tallentaminen ei kuulu ollenkaan käyttöliittymästä huolehtivan luokan vastuisiin.

Parempi vaihtoehto olisikin luoda tiedostokäsittelijä muualla ja antaa se PuhelinluetteloSovellus-oliolle, esimerkiksi konstruktorin parametrina:

class PuhelinluetteloSovellus:\n    def __init__(self, tiedosto):\n        self.__luettelo = Puhelinluettelo()\n        self.__tiedosto = tiedosto\n\n    # muu koodi\n\n# luodaan tallennuksen hoitava olio\ntallennuspalvelu = Tiedostonkasittelija(\"luettelo.txt\")\n# ja annetaan se PuhelinluetteloSovellus-oliolle konsturuktorin parametrina\nsovellus = PuhelinluetteloSovellus(tallennuspalvelu)\nsovellus.suorita()

Näin on saatu poistettua luokalta PuhelinluetteloSovellus turha riippuvuus käsiteltävän tiedoston nimeen. Jos tiedoston nimi muuttuu, ei luokan koodiin tarvitse koskea ollenkaan. Riittää ainoastaan, että oliolle annetaan hieman erilainen konstruktoriparametri:

class PuhelinluetteloSovellus:\n    def __init__(self, tiedosto):\n        self.__luettelo = Puhelinluettelo()\n        self.__tiedosto = tiedosto\n\n    # muu koodi\n\n# vaihdetaan tiedostoa\ntallennuspalvelu = Tiedostonkasittelija(\"uusi_luettelotiedosto.txt\")\nsovellus = PuhelinluetteloSovellus(tallennuspalvelu)\nsovellus.suorita()

Tämä sama tekniikka mahdollistaa sen, että siirrytäänkin tallentamaan puhelinluettelo tiedoston sijaan esimerkiksi internetissä olevaan pilvipalveluun. On vain kirjoitettava pilvipalvelua käyttävä luokka, joka tarjoaa puhelinluettelosovellukselle samanlaiset metodit kuin Tiedostonkasittelija. Tämän luokan olio voidaan antaa sovellukselle, ilman että sovelluksen koodista tulee muuttaa riviäkään:

class InternetTallennin:\n    # koodi joka tallentaa luettelon tiedot internetissä olevaan pilvipalveluun\n\ntallennuspalvelu = InternetTallennin(\"amazon-cloud\", \"mluukkai\", \"passwrd\")\nsovellus = PuhelinluetteloSovellus(tallennuspalvelu)\nsovellus.suorita()

Kuten aiemmin todettiin, on tämän kaltaisten tekniikoiden käytöllä oma hintansa: koodia tulee enemmän, ja ohjelmoijan tulee harkita milloin se hinta kannattaa maksaa.

Tässä esitelty tekniikka (joka kulkee ammattijargonissa nimellä dependency injection), missä oliolle annetaan ulkopuolelta käsin sen tarvitsema riippuvuus (eli käytännössä jokin muu olio) on erittäin tyypillinen kikka ammattimaisessa koodauksessa, muun muassa siksi, että se helpottaa ohjelmistojen laajentamista sekä niiden automatisoitua testaamista. Jatkamme teeman käsittelyä kursseilla Ohjelmistotekniikka ja Ohjelmistotuotanto.

Vastaa lopuksi osion loppukyselyyn:

","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-10/4-laajempi-sovellus.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä osiossa"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Käydään läpi hieman laajemman sovelluksen tekemiseen liittyviä seikkoja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Erityinen fokus on sovelluksen eri osa-alueiden (käyttöliittymä, sovelluslogiikka ja tiedostojen käsittely) eriyttämisessä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Harjoitellaan laajemman sovelluksen toteuttamista itse"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmoinnin perusteiden ja jatkokurssin aikana on esitelty suuri määrä Pythonin tarjoamia ominaisuuksia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmoinnin perusteissa tutustuttiin kielen kontrollirakenteisiin (while ja for), funktioihin sekä perustietorakenteisiin eli listaan ja sanakirjaan. Näytti jo hetken siltä että muuta ei tarvitakaan. Periaatteessa näin onkin: ohjelmoinnin perusteiden kalustolla pystyy ilmaisemaan kaiken mikä Pythonilla on ylipäätään ilmaistavissa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jatkokurssin alussa, eli kurssin osassa 8 pakkaa ruvettiin kuitenkin hämmentämään tuomalla mukaan luokat ja oliot. Milloin ja ylipäätään "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"miksi"}]},{"type":"text","value":" olioita tulisi käyttää jos kurssin osien 1-7 kalusto on jo ilmaisuvoimaltaan riittävä?"}]},{"type":"element","tagName":"h2","properties":{"id":"monimutkaisuuden-hallintaa","style":"position:relative;"},"children":[{"type":"text","value":"Monimutkaisuuden hallintaa"},{"type":"element","tagName":"a","properties":{"href":"#monimutkaisuuden-hallintaa","ariaLabel":"monimutkaisuuden hallintaa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Monissa tilanteissa voi ja varmasti kannattaakin olla käyttämättä oliota. Esimerkiksi jos koodataan pieni \"kertakäyttöinen\" apuohjelma, ei ehkä ole mitään tarvetta olioille. Tilanne alkaa muuttua, kun siirrytään hieman suuremman kokoluokan ohjelmiin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun ohjelma laajenee, alkaa sen sisältämien yksityiskohtien määrä nousta hallitsemattomaksi, ellei ohjelmaa jäsennellä jollain järkevällä tavalla. Itse asiassa jo ohjelmoinnin perusteiden tehtävissä oli havaittavissa varsin monimutkaisia ratkaisuja, joiden ymmärtämisessä jopa alan ammattilaisilla on vaikeuksia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käsite "},{"type":"element","tagName":"a","properties":{"href":"https://en.wikipedia.org/wiki/Separation_of_concerns","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Separation of concerns"}]},{"type":"text","value":" on ollut jo vuosikymmeniä eräs ohjelmoinnin ja koko tietojenkäsittelyn keskeisiä teemoja. Wikipedian mukaan käsitteellä tarkoitetaan seuraavaa"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Separation of concerns is a design principle for separating a computer program into distinct sections such that each section addresses a separate concern. A concern is a set of information that affects the code of a computer program"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kyse on ohjelman suunnittelua ohjaavasta periaatteesta, jonka mukaan ohjelmakoodi jäsennellään pienempiin osiin, joista kukin huolehtii vain omasta \"tontistaan\". Kuhunkin osaan tehdyt muutokset vaikuttavat - periaatteen mukaisesti - vain rajattuun alueeseen ohjelmassa, joten ohjelmien väistämätöntä monimutkaisuutta on helpompi hallita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiot ovat yksi mekanismi tämän tavoitteen saavuttamiseen. Sen sijaan että ohjelma kirjoitetaan yhtenä isona kokonaisuutena, koostetaan se pienistä funktioista, joista kukin ratkaisee pienen osan ongelmasta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olio-ohjelmointi tarjoaa funktioita jossain määrin ilmaisuvoimaisemman ja joidenkin mielestä \"paremman\" tavan saavuttaa sama tavoite. Kuten olemme nähneet, olioiden avulla on mahdollista koota samaan asiaan liittyvä data ja sitä käsittelevä koodi, eli olion metodit, samaan paikkaan. Oliot tarjoavat myös mekanismin käsittelemänsä datan kapselointiin, joka taas tavallaan on keino piilottaa \"turhia\" yksityiskohtia olion ulkopuoliselta osalta ohjelmaa."}]},{"type":"element","tagName":"h2","properties":{"id":"esimerkki-puhelinluettelo","style":"position:relative;"},"children":[{"type":"text","value":"Esimerkki: puhelinluettelo"},{"type":"element","tagName":"a","properties":{"href":"#esimerkki-puhelinluettelo","ariaLabel":"esimerkki puhelinluettelo permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Miten ohjelma sitten tulisi jakaa luokkiin ja olioihin? Kysymys ei ole helppo, ja asiaa on helpompi pohdiskella konkreettisen esimerkin kautta. Toteutetaan esimerkkinä olio-ohjelmointia hyödyntäen hieman samantyylinen puhelinluettelo, joka oli aiheena ohjelmoinnin perusteiden viidennen osan "},{"type":"element","tagName":"a","properties":{"href":"/osa-5/3-dictionary#programming-exercise-puhelinluettelo-versio-2"},"children":[{"type":"text","value":"tehtävässä"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Separation of concerns -periaatetta noudatellen koodi tulee jakaa osiin, joista kukin käsittelee omaa asiaansa. Olio-ohjelmoinnin piirissä tätä periaatetta ilmentää niin sanottu "},{"type":"element","tagName":"a","properties":{"href":"https://en.wikipedia.org/wiki/Single-responsibility_principle","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"yhden vastuun (single responsibility)"}]},{"type":"text","value":" -periaate. Ei mennä sen tarkemmin periaatteen yksityiskohtiin, mutta maalaisjärjellä ajatellen periaatteen nimi jo kertoo mistä on kyse: "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"yksittäisen luokan olioiden tulisi olla vastuussa yhdestä asiasta"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olioita käytettäessä ohjelmointiongelman \"reaalimaailman asioita\" vastaa yleensä oma luokkansa. Puhelinluettelon tapauksessa tälläisiä reaalimaailman asioita olisivat esimerkiksi:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"henkilö"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"puhelinnumero"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Näistä nimi ja puhelinnumero ovat kenties liian vähäpätöisiä ollakseen omia luokkiaan, mutta "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"henkilö"}]},{"type":"text","value":" voisi hyvinkin olla oma luokkansa, jonka vastuulla on sitoa yhteen tietty nimi ja siihen liittyvät puhelinnumerot."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Myös "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"puhelinluettelo"}]},{"type":"text","value":" itsessään on potentiaalinen luokka, sen vastuulla on hallinnoida eri henkilöiden tietoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nämä kaksi luokkaa eli "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"puhelinluettelo"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"henkilö"}]},{"type":"text","value":" muodostavat sovelluksen ytimen, eli niin sanotun "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"sovelluslogiikan"}]},{"type":"text","value":". Näiden lisäksi ohjelma tarvitsee muutaman muunkin luokan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käyttäjän kanssa tapahtuvasta interaktiosta huolehtivaa luokkaa ei kannata sotkea sovelluslogiikan kanssa samaan luokkaan - sehän on kokonaan oma vastuunsa. Eli sovelluslogiikan luokkien lisäksi ohjelmalle tulee myös luokka, joka huolehtii ohjelman käyttöliittymästä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Talletamme puhelinluettelon tiedot tiedostoon. Myös tiedoston käsittely on selkeästi oma vastuunsa, joten tulemme sisällyttämään siihen käytettävän koodin omaan luokkaansa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun ohjelman luokkarakenne alkaa pikkuhiljaa hahmottua, nousee kysymykseksi se, mistä ohjelmointi kannattaa aloittaa. Usein paras tapa aloittaa on pienellä palalla sovelluslogiikka."}]},{"type":"element","tagName":"h2","properties":{"id":"vaihe-1-sovelluslogiikan-runko","style":"position:relative;"},"children":[{"type":"text","value":"Vaihe 1: sovelluslogiikan runko"},{"type":"element","tagName":"a","properties":{"href":"#vaihe-1-sovelluslogiikan-runko","ariaLabel":"vaihe 1 sovelluslogiikan runko permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aloitetaan luokasta "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Puhelinluettelo"}]},{"type":"text","value":". Runko voisi näyttää seuraavalta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Puhelinluettelo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__henkilot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_numero"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hae_numerot"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokka pitää siis sisällään listan henkilöitä ja tarjoaa metodit tietojen lisäämiseen ja hakemiseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jokaiseen henkilöön voi liittyä useita numeroita, joten toteutetaan luettelon sisäinen tila sanakirjan avulla, koska sanakirjasta on helppo hakea nimen perusteella. Sanakirjaan on helppo tallettaa suoraan myös nimeen liittyvät numerot, joten ainakaan tässä vaiheessa ei tarvita erillistä luokkaa yksittäisen henkilön tietojen tallettamiseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokka laajenee seuraavasti. Mukana on myös pieni toiminnan varmistava koodinpätkä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Puhelinluettelo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__henkilot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_numero"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# henkilöön liittyy lista puhelinnumeroja"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hae_numerot"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"None"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# testikoodi"}]},{"type":"text","value":"\nluettelo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Puhelinluettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"02-123456\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_numerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_numerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Testikoodin tulostus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['02-123456']\nNone"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae_numerot"}]},{"type":"text","value":" siis palauttaa arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"None"}]},{"type":"text","value":", jos henkilö ei löydy luettelosta, jos henkilö löytyy, palautetaan lista joka sisältää henkilön puhelinnumerot."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmoidessa mitä tahansa ohjelmaa kannattaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"aina"}]},{"type":"text","value":" kokeilla, että koodi toimii kuten sen olettaa toimivan, ennen kun etenee muuhun koodiin.\nUsein tämä testikoodi on poisheitettävää koodia, ja sikäli voisi ajatella testaamisesta olevan ylimääräistä vaivaa. Lähes 100% tapauksissa ei näin kuitenkaan ole."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodiin tullut bugi kannattaa saada kiinni ja korjata niin pian kuin mahdollista. Jos koodin toimivuuden varmistaa lähes jokaisen uuden koodirivin jälkeen, on debuggaus ja korjaaminen yleensä vaivatonta ja nopeaa, koska tällöin voi olla melko varma siitä, että ongelma johtuu hetki sitten lisätyistä koodiriveistä. Jos taas koodia testataan vasta sen jälkeen kun siihen on lisätty kymmeniä koodirivejä, on virhelähteitä moninkertaisesti."}]},{"type":"element","tagName":"h2","properties":{"id":"vaihe-2-kayttoliittyman-runko","style":"position:relative;"},"children":[{"type":"text","value":"Vaihe 2: käyttöliittymän runko"},{"type":"element","tagName":"a","properties":{"href":"#vaihe-2-kayttoliittyman-runko","ariaLabel":"vaihe 2 kayttoliittyman runko permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun sovelluslogiikan ydintoiminnallisuus on kunnossa, voidaan edetä sovelluksen tekstikäyttöliittymään. Tehdään sitä varten oma luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"text","value":", jonka runko on seuraava:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Puhelinluettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"ohje"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"komennot: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"0 lopetus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"suorita"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ohje"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"komento: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"0\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n\nsovellus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" PuhelinluetteloSovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"suorita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokka saattaa vaikuttaa vielä hämmentävältä, mutta tässä luodaan tosiaan vasta runko toiminnalle. Konstruktori luo puhelinluettelon, jonka olio pitää sisällään. Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suorita(self)"}]},{"type":"text","value":" käynnistää sovelluksen tekstikäyttöliittymän, jonka ytimen muodostaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":"-silmukka, joka kyselee käyttäjältä mikä komento halutaan suorittaa. Ennen toistolauseeseen menemistä ohjelma tulostaa käyttöohjeet, kutsumalla metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ohje(self)"}]},{"type":"text","value":". Varsinaiset toiminnot toteutetaan seuraavaksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajennetaan käyttöliittymää siten, että luetteloon voidaan lisätä uusia tietoja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Puhelinluettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"ohje"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"komennot: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"0 lopetus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1 lisäys\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"suorita"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ohje"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"komento: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"0\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n numero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"numero: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsovellus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" PuhelinluetteloSovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"suorita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos valittu komento on tietojen lisäys (eli komento on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"), kysyy käyttöliittymä nimen ja numeron käyttäjältä, ja lisää tiedot puhelinluetteloon kutsumalla sopivaa luettelon metodia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käyttöliittymä on siis vastuussa ainoastaan siitä, että se kommunikoi käyttäjän kanssa. Puhelinnumeron säilöminen nimen yhteyteen on jätetty kokonaisuudessan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Puhelinluettelo"}]},{"type":"text","value":"-olion vastuulle."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käyttöliittymän rakennetta on mahdollista vielä parannella siten, että tietojen lisäys eriytetään omaan metodiinsa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"lisays(self)"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Puhelinluettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"ohje"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"komennot: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"0 lopetus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1 lisäys\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# eriytetään uusien tietojen lisääminen omaksi metodiksi"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisays"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n numero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"numero: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"suorita"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ohje"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"komento: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"0\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsovellus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" PuhelinluetteloSovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"suorita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Erillisen metodin käyttämisen taustallakin on sama "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"separation of concerns"}]},{"type":"text","value":" -periaate. Sen sijaan että koko käyttöliittymän toiminnallisuus sijoitettaisiin ison "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":"-silmukan sisälle, tehdään jokaisesta yksittäisestä toiminnosta oma metodinsa. Tämä helpottaa kokonaisuuden hallintaa. Jos halutaan muokata tietojen lisäämisen toiminnallisuutta, tiedetään heti missä päin relevantti koodi sijaitsee."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisätään käyttöliittymään toiminnallisuus numeroiden hakemista varten. Sijoitetaan sen hoitava koodi heti omaan metodiinsa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Puhelinluettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"ohje"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"komennot: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"0 lopetus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1 lisäys\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"2 haku\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisays"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n numero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"numero: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"haku"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n numerot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_numerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" numerot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"None"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"numero ei tiedossa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" numero "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" numerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"suorita"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ohje"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"komento: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"0\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"haku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ohje"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsovellus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" PuhelinluetteloSovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"suorita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sovelluksen perusversio toimii nyt. Seuraavassa esimerkki sovelluksen käytöstä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komennot:\n0 lopetus\n1 lisäys\n2 haku"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Erkki"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"02-123456"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Erkki"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"045-4356713"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Erkki"}]},{"type":"text","value":"\n02-123456\n045-4356713"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nnimi: Emilia\nnumero ei tiedossa"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodia on aika paljon, todennäköisesti enemmän kuin jos kaikki olisi ohjelmoitu yhteen pötköön. Koodin rakenne on kuitenkin siistihkö, ja koodin laajentamisenkaan ei pitäisi olla kovin hankalaa."}]},{"type":"element","tagName":"h2","properties":{"id":"vaihe-3-tietojen-haku-tiedostosta","style":"position:relative;"},"children":[{"type":"text","value":"Vaihe 3: tietojen haku tiedostosta"},{"type":"element","tagName":"a","properties":{"href":"#vaihe-3-tietojen-haku-tiedostosta","ariaLabel":"vaihe 3 tietojen haku tiedostosta permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajennetaan ohjelmaa siten, että se lataa käynnistäessään puhelinluettelon tiedostosta, joka on seuraavaa muotoa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"csv"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"Erkki;02-1234567;045-4356713"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"Emilia;040-324344"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedoston käsittely on selkeästi oma vastuualueensa, eli toteutetaan sitä varten oma luokka:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Tiedostonkasittelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tiedosto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tiedosto\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lataa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nimet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" f"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" f"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"strip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"';'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":"numerot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" osat\n nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" numerot\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" nimet"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Konstruktorin parametrina annetaan tiedoston nimi. Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lataa(self)"}]},{"type":"text","value":" lukee tiedoston, ja pilkkoo sen rivit sanakirjaksi, missä avain on nimi ja arvona ovat nimeen liittyvät numerot."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi käyttää erästä Pythonin kätevää ominaisuutta: listasta on mahdollista ottaa ensin yksittäisiä alkioita erikseen nimettyinä muuttujina, sekä loput alkiot uutena listana, kuten seuraavasta esimerkistä käy ilmi. "},{"type":"element","tagName":"a","properties":{"href":"osa-6/1-tiedostojen-lukeminen#csv-tiedoston-lukeminen"},"children":[{"type":"text","value":"Luvusta 6"}]},{"type":"text","value":" muistamme että merkkijonojen metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"split"}]},{"type":"text","value":" tuottaa nimenomaan listan."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\neka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" toka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":"loput "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lista\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"toka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"loput"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1\n2\n[3, 4, 5]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sijoituslauseen viimeisen muuttujan nimen edessä on *, ja se tarkoittaa, että viimeiseen muuttujaan kerätään taulukosta loput, eli kolmas ja sitä seuraavat alkiot."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedostonkäsittelijääkin kannattaa ehdottomasti testata, ennen kuin se pultataan muuhun koodiin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"t "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tiedostonkasittelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"luettelo.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lataa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"{'Erkki': ['02-1234567', '045-4356713'], 'Emilia': ['040-324344']}"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun tiedostosta lukemisen todetaan toimivan, liitetään koodi muuhun ohjelmaan. Looginen paikka tiedoston lukemiseen on se hetki kun sovellus käynnistyy, eli luokan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"text","value":" konstruktori:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Puhelinluettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tiedosto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tiedostonkasittelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"luettelo.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# listään tiedostossa olevat nimet luetteloon"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numerot "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lataa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"items"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" numero "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" numerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muu koodi"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedoston lukua osana PuhelinLuetteloSovellusta kannattaa myös testata. Kun on varmistettu, että tiedoston sisältö saadaan ladattua luetteloon, voidaan edetä viimeiseen vaiheeseen."}]},{"type":"element","tagName":"h2","properties":{"id":"vaihe-4-tietojen-talletus-tiedostoon","style":"position:relative;"},"children":[{"type":"text","value":"Vaihe 4: tietojen talletus tiedostoon"},{"type":"element","tagName":"a","properties":{"href":"#vaihe-4-tietojen-talletus-tiedostoon","ariaLabel":"vaihe 4 tietojen talletus tiedostoon permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Viimeistellään ohjelman alustava versio vielä siten, että se tallentaa lopetettaessa puhelinluettelon takaisin tiedostoon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tätä varten luokkaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Puhelinluettelo"}]},{"type":"text","value":" tulee laajentaa siten, että sieltä saadaan tallennusta varten kaikki tiedot ulos:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Puhelinluettelo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__henkilot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# palautetaan tiedostoon tallentamista varten kaikki tiedot"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kaikki_tiedot"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__henkilot"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tallennus on luonnollisesti luokan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Tiedostonkasittelija"}]},{"type":"text","value":" vastuulla, eli laajennetaan sitä metodilla "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"talleta"}]},{"type":"text","value":", joka saa parametriksi puhelinluetteloa edustavan sanakirjan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Tiedostonkasittelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tiedosto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tiedosto\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lataa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"talleta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"dict"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"w\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" f"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numerot "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"items"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" numerot\n f"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\";\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tallennus tapahtuu samalla kun sovelluksen käyttö lopetetaan. Tehdään tätäkin tarkoitusta varten oma metodinsa ja kutsutaan sitä sopivassa kohdassa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muu koodi"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# metodi, joka suoritetaan lopetettaessa sovelluksen käyttö"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lopetus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"talleta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kaikki_tiedot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"suorita"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ohje"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"komento: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"0\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lopetus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" komento "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"haku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ohje"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Puhelinluettelon laajennus, osa 1","tmcname":"osa10-10_puhelinluettelo_osa1"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä tehdään pieni laajennus puhelinluettelosovellukseen. Yllä kehitetty koodi löytyy tehtäväpohjasta. Laajenna ratkaisuasi komennolla, joka mahdollistaa nimen etsimisen numeron perusteella. Laajennuksen jälkeen sovelluksen pitäisi toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komennot:\n0 lopetus\n1 lisäys\n2 haku\n3 haku numeron perusteella"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Erkki"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"02-123456"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Erkki"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"045-4356713"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"02-123456"}]},{"type":"text","value":"\nErkki"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0100100"}]},{"type":"text","value":"\ntuntematon numero"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee laajennus sitten, että kunnioitat ohjelman rakennetta. Eli lisää luokkaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"text","value":" uutta ominaisuutta varten sopiva apumetodi sekä oma haara while-silmukkaan. Lisää myös sovelluslogiikkaan eli luokkaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Puhelinluettelo"}]},{"type":"text","value":" metodi, joka mahdollistaa nimen hakemisen numeron perusteella."}]}]},{"type":"element","tagName":"h2","properties":{"id":"olioita-sanakirjassa","style":"position:relative;"},"children":[{"type":"text","value":"Olioita sanakirjassa"},{"type":"element","tagName":"a","properties":{"href":"#olioita-sanakirjassa","ariaLabel":"olioita sanakirjassa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa tehtävässä on tarkoitus muuttaa puhelinluetteloa siten, että sanakirjan arvoksi talletetaan tavallisten listojen sijaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"olioita"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Periaatteessa asiassa ei ole mitään ihmeellistä, mutta kurssilla ei vielä ole näin tehty, joten tutkitaan ennen tehtävää hieman samantapaista, mutta yksinkertaisempaa esimerkkiä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehdään sovellus, jonka avulla voidaan pitää kirjaa siitä, kuinka monta tehtävää opiskelijat ovat tehneet kurssin aikana. Kunkin opiskelijan tehtävämäärä lasketaan yksinkertaisen olion avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Tehtavalaskuri"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tehtavia "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"merkkaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tehtavia "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tehtyja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tehtavia"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkaa käyttävä pääohjelma on seuraavassa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"opiskelijat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"merkataan tehtäviä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"opiskelija: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# luodaan tarvittaessa olio tehtävämäärän laskemista varten"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tehtavalaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# merkataan tehdyksi nimeä vastaavaan olioon"}]},{"type":"text","value":"\n opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkkaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tehdyt tehtävät:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tehtavat "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"items"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" tehtäviä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"tehtavat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehtyja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" kpl\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käyttöesimerkki"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"merkataan tehtäviä\nopiskelija: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pekka"}]},{"type":"text","value":"\nopiskelija: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"sara"}]},{"type":"text","value":"\nopiskelija: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"antti"}]},{"type":"text","value":"\nopiskelija: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"sara"}]},{"type":"text","value":"\nopiskelija: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"juuso"}]},{"type":"text","value":"\nopiskelija: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"juuso"}]},{"type":"text","value":"\nopiskelija: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"antti"}]},{"type":"text","value":"\nopiskelija: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"sara"}]},{"type":"text","value":"\nopiskelija:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tehdyt tehtävät:\npekka tehtäviä 1 kpl\nantti tehtäviä 2 kpl\nsara tehtäviä 3 kpl\njuuso tehtäviä 2 kpl"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkissä on parikin huomionarvoista seikkaa. Kun opiskelijan nimi syötetään, tarkastetaan aina ensin onko opiskelijaa vastaava olio jo sanakirjassa. Jos olioa ei ole, luodaan se:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tehtavalaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän jälkeen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tiedetään"}]},{"type":"text","value":" että olio on olemassa. Se on joko luotu juuri äsken tai jo aiemmalla silmukan kierroksella. Haetaan olio sanakirjasta, ja kutsutaan sen metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"merkkaa"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkkaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rivillä tapahtuu oikeastaan kaksi asiaa, ja sama voitaisiin kirjoittaa siten, että sanakirjasta haettu olio sijoitettaisiin apumuuttujaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"opiskelijan_laskuri "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nopiskelijan_laskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkkaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että vaikka olio sijoitettaisiin apumuuttujaan, se "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei tarkoita"}]},{"type":"text","value":" että olio poistuisi sanakirjasta tai oliosta syntyisi kopio. Apumuuttuja on ainoastaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"viite"}]},{"type":"text","value":" sanakirjassa olevaan olioon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkin koodia kannattaa "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ehdottomasti"}]},{"type":"text","value":" kokeilla "},{"type":"element","tagName":"a","properties":{"href":"http://www.pythontutor.com/visualize.html#mode=edit","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"visualisaattorissa"}]},{"type":"text","value":" jos ei ole aivan 100% varma siitä, miten koodi toimii."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Puhelinluettelon laajennus, osa 2","tmcname":"osa10-11_puhelinluettelo_osa2"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä laajennetaan puhelinluettelosovellusta siten, että henkilöihin voi liittyä myös osoite. Yksinkertaisuuden vuoksi koodista on kuitenkin poistettu tiedostoon tallentaminen. Myös muutama metodi on uudelleennimetty vastaamaan paremmin laajennuksen jälkeistä tilannetta."}]},{"type":"element","tagName":"h2","properties":{"id":"luokka-henkilon-tietojen-esittamiseen","style":"position:relative;"},"children":[{"type":"text","value":"Luokka henkilön tietojen esittämiseen"},{"type":"element","tagName":"a","properties":{"href":"#luokka-henkilon-tietojen-esittamiseen","ariaLabel":"luokka henkilon tietojen esittamiseen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Siirretään henkilön tietojen (eli puhelinnumerojen sekä osoitteen) esittäminen oman luokkansa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"text","value":" vastuulle. Toteuta luokka siten, että se toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"numerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"osoite"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhenkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"040-123456\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhenkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_osoite"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mannerheimintie 10 Helsinki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"numerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"osoite"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Erkki\n[]\nNone\n['040-123456']\nMannerheimintie 10 Helsinki"}]}]},{"type":"element","tagName":"h2","properties":{"id":"puhelinluettelo-kayttamaan-luokkaa-henkilo","style":"position:relative;"},"children":[{"type":"text","value":"Puhelinluettelo käyttämään luokkaa Henkilo"},{"type":"element","tagName":"a","properties":{"href":"#puhelinluettelo-kayttamaan-luokkaa-henkilo","ariaLabel":"puhelinluettelo kayttamaan luokkaa henkilo permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuta koodiasi siten, että se toimii käyttäjän näkökulmasta täysin samoin kuin aiemmin, mutta luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Puhelinluettelo"}]},{"type":"text","value":" tallettaakin henkilöt sisäisesti käyttäen luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"text","value":" olioita. Käytännössä siis oliomuuttujana "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__henkilot"}]},{"type":"text","value":" tulee olla sanakirja, johon listojen sijaan talletetaan henkilö-olioita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"VAROITUS:"}]},{"type":"text","value":" kun teet koodiin tämän tehtävän kaltaista rakenteellista muutosta, etene pienin askelin. Älä missään tapauksessa yritä tehdä kaikkea kerrallaan, se on "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"varma keino ajautua pahoihin ongelmiin"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sopiva pieni askel nyt voi olla se, että tarkastat ensin erikseen luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Puhelinluettelo"}]},{"type":"text","value":" toimivuuden. Esimerkiksi seuraavan koodin tulee toimia kuten olettaa saattaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luettelo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Puhelinluettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"02-123456\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_tiedot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_tiedot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtävässä ei tarkisteta, millainen tulostusasu "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae_tiedot"}]},{"type":"text","value":"-metodin palauttamalla tuloksella on, mutta varmista ettei koodi aiheuta virheitä, ja että tulos on järkevä. Kun olet 100% varma, että kaikki toimii luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Puhelinluettelo"}]},{"type":"text","value":" osalta, voit edetä varmistamaan, että kaikki toimii edelleen entiseen tapaan käyttöliittymää käytettäessä."}]},{"type":"element","tagName":"h2","properties":{"id":"osoitteen-lisaaminen","style":"position:relative;"},"children":[{"type":"text","value":"Osoitteen lisääminen"},{"type":"element","tagName":"a","properties":{"href":"#osoitteen-lisaaminen","ariaLabel":"osoitteen lisaaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajenna nyt sovellusta siten, että puhelinluetteloon on mahdollista tallettaa myös henkilöiden osoitteet. Ohjelman tulisi toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komennot:\n0 lopetus\n1 nimen lisäys\n2 haku\n3 osoitteen lisäys"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Erkki"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"02-123456"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Emilia"}]},{"type":"text","value":"\nosoite: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Viherlaaksontie 7, Espoo"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Erkki"}]},{"type":"text","value":"\n02-123456\nosoite ei tiedossa"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Emilia"}]},{"type":"text","value":"\nnumero ei tiedossa\nViherlaaksontie 7, Espoo"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Erkki"}]},{"type":"text","value":"\nosoite: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Linnankatu 75, Turku"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: 2\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Erkki"}]},{"type":"text","value":"\n02-123456\nLinnankatu 75, Turku"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Wilhelm"}]},{"type":"text","value":"\nosoite ei tiedossa\nnumero ei tiedossa"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"VAROITUS ja vihje:"}]},{"type":"text","value":" kuten tehtävän edellisessä osassa sanottiin, älä missään tapauksessa yritä tehdä kaikkea kerrallaan, se on "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"varma keino ajautua pahoihin ongelmiin"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Varmista ensin että voit lisätä osoitteita luokkaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Puhelinluettelo"}]},{"type":"text","value":" ja kun olet 100% varma, että se toimii, voit laajentaa sovelluksen käyttöliittymää uuden toiminnallisuuden osalta."}]}]},{"type":"element","tagName":"h2","properties":{"id":"erinaisia-huomioita","style":"position:relative;"},"children":[{"type":"text","value":"Erinäisiä huomioita"},{"type":"element","tagName":"a","properties":{"href":"#erinaisia-huomioita","ariaLabel":"erinaisia huomioita permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Puhelinluetteloesimerkki noudattaa rakenteeltaan melko klassisia hyvän olio-ohjelmoinnin periaatteita. Kantavana ideana on siis ohjelman eri vastuualueiden jaottelu erillisiin luokkiin ja metodeihin. Eräs suurimmista motiiveista tällaiselle jaottelulle on monimutkaisuuden hallinta. Toinen tärkeä syy on se, että oikein tehty koodin jaottelu - tai "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"modularisointi"}]},{"type":"text","value":" kuten ammattijargon asian ilmaisee - tekee koodista potentiaalisesti helpomman ylläpitää ja laajentaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oikeissa ohjelmistoissa ylivoimaisesti suurimman kustannuserän aiheuttaa juuri ylläpito (eli bugien korjailu) sekä ohjelman laajentaminen, joten tällä seikalla on taloudellisesti erittäin suuri merkitys."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nostetaan esimerkistä esiin vielä pari tärkeää seikkaa. Koodi ilmentää hyvin sitä, miten sovelluslogiikan varsinainen ydin on eriytetty sekä käyttöliittymästä, että datan tallettamisesta. Tämä on tärkeää muutamastakin syystä. Ensinnäkin se mahdollistaa koodin testailun pienemmissä yksiköissä, luokka ja metodi kerrallaan. Toisaalta koska sovelluslogiikka ei nyt riipu käyttöliittymästä tai tiedon talletustavasta, on esim. käyttöliittymää mahdollista muuttaa (ainakin johonkin pisteeseen asti) rikkomatta muuta sovellusta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedostojen käsittelyn suhteen kannattaa myös huomata se, että ohjelma lukee tiedostoa ainoastaan kerran, käynnistysvaiheessa. Tämän jälkeen kaikki tieto säilytetään ohjelman muuttujissa. Ohjelma tallettaa tiedot kokonaisuudessaan, eli käytännössä uudelleenkirjoittaa tiedoston joka kerta kokonaan uudestaan. Tiedostojen käsittely kannattaa lähes kaikissa tapauksissa tehdä näin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hyvän koodin kirjoittamisesta kerrotaan lisää esimerkiksi Robert Martinin mainiossa kirjassa "},{"type":"element","tagName":"a","properties":{"href":"https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Clean Code"}]},{"type":"text","value":". Kirjan koodiesimerkit on kuitenkin toteutettu Javalla, eli esimerkkien lukeminen saattaa tässä vaiheessa olla vielä varsin työlästä. Paneudumme ylläpidettävyydeltään ja laajennettavuudeltaan laadukkaan koodin toteuttamiseen tarkemmin kursseilla "},{"type":"element","tagName":"a","properties":{"href":"https://studies.helsinki.fi/opintotarjonta/cu/hy-CU-118024742-2020-08-01","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Ohjelmistotekniikka"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"a","properties":{"href":"https://studies.helsinki.fi/opintotarjonta/cu/hy-CU-118024909-2020-08-01","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Ohjelmistotuotanto"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hyvän olio-ohjelmoinnin periaatteiden mukaisen koodin kirjoittamisella on myös hintansa. Koodia tulee todennäköisesti enemmän kuin jos sama ongelma ratkaistaisiin yhteen pötköön kirjoitetulla spagettikoodilla. Ohjelmoijan onkin aina ratkaistava se, minkälainen lähestymistapa on paras kuhunkin tilanteeseen. Joskus voi olla vain parasta häkkeröidä kasaan nopeasti jotain joka toimii nyt. Jos taas on odotettavissa, että samaa koodia tullaan jatkossa laajentamaan. joko koodarin itsensä tai jonkun muun toimesta, on todennäköisesti kannattavaa panostaa koodin luettavuuteen ja jäsentämiseen jossain määrin jo alkuvaiheissa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Harjoitellaan vielä isomman ohjelmakokonaisuuden toteuttamista yhden ohjelmointitehtävän verran."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Opintorekisteri","tmcname":"osa10-12_opintorekisteri"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee interaktiivinen ohjelma, jonka avulla voit pitää kirjaa opintomenestyksestäsi. Sovelluksen rakenteen saat päättää itse, mutta nyt on hyvä tilaisuus harjoitella Puhelinluettelo-esimerkin kaltaisen oliorakenteen muodostamista."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1 lisää suoritus\n2 hae suoritus\n3 tilastot\n0 lopetus"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkurssi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Ohpe"}]},{"type":"text","value":"\narvosana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nopintopisteet: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nkurssi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Ohpe"}]},{"type":"text","value":"\nOhpe (5 op) arvosana 3"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkurssi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Ohpe"}]},{"type":"text","value":"\narvosana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nopintopisteet: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nkurssi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Ohpe"}]},{"type":"text","value":"\nOhpe (5 op) arvosana 5"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkurssi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Ohpe"}]},{"type":"text","value":"\narvosana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nopintopisteet: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nkurssi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Ohpe"}]},{"type":"text","value":"\nOhpe (5 op) arvosana 5"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nkurssi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Java-ohjelmointi"}]},{"type":"text","value":"\nei suoritusta"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkurssi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Tira"}]},{"type":"text","value":"\narvosana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nopintopisteet: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkurssi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Tilpe"}]},{"type":"text","value":"\narvosana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nopintopisteet: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkurssi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Lapio"}]},{"type":"text","value":"\narvosana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nopintopisteet: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkurssi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Lama"}]},{"type":"text","value":"\narvosana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nopintopisteet: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"8"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nsuorituksia 5 kurssilta, yhteensä 29 opintopistettä\nkeskiarvo 3.4\narvosanajakauma\n5: xx\n4: x\n3:\n2: x\n1: x"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muutama huomio: kultakin kurssilta tallentuu ainoastaan yksi arvosana. Arvosanaa voi korottaa, mutta se ei voi laskea."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtävästä on tarjolla kaksi tehtäväpistettä. Ensimmäisen pisteen saa jos toiminnot 1 ja 2 sekä lopetus toimivat. Toisen pisteen saa jos myös toiminto 3 on toteutettu."}]}]},{"type":"element","tagName":"h2","properties":{"id":"epilogi","style":"position:relative;"},"children":[{"type":"text","value":"Epilogi"},{"type":"element","tagName":"a","properties":{"href":"#epilogi","ariaLabel":"epilogi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Palataan vielä hetkeksi tarkastelemaan puhelinluetteloesimerkkiä, ja sen käyttöliittymän toteuttavaa luokkaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Puhelinluettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tiedosto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tiedostonkasittelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"luettelo.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muu koodi"}]},{"type":"text","value":"\n\nsovellus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" PuhelinluetteloSovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"suorita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"text","value":"-olio pitää siis sisällään sekä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Puhelinluettelo"}]},{"type":"text","value":"-olion että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tiedostonkasittelija"}]},{"type":"text","value":"-olion. Jos olisimme ammattikoodareita, tekisimme sovellukseen pienen muutoksen. Nyt nimittäin se, että sovellus käyttää nimenomaan tiedostoa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"luettelo.txt"}]},{"type":"text","value":" tallentamaan luettelon tiedot, on sovelluksen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"käyttöliittymän"}]},{"type":"text","value":" kannalta täysin turha deltaji. Jos tiedosto haluttaisiin vaihtaa, edellyttäisi se muutosta luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"text","value":" koodiin. Tämä taas ei ole hyvä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"separation of concerns"}]},{"type":"text","value":" -periaatetta ajatellen, sillä puhelinluettelon tallentaminen ei kuulu ollenkaan käyttöliittymästä huolehtivan luokan vastuisiin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Parempi vaihtoehto olisikin luoda tiedostokäsittelijä muualla ja antaa se "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"text","value":"-oliolle, esimerkiksi konstruktorin parametrina:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Puhelinluettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tiedosto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tiedosto\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muu koodi"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# luodaan tallennuksen hoitava olio"}]},{"type":"text","value":"\ntallennuspalvelu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tiedostonkasittelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"luettelo.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ja annetaan se PuhelinluetteloSovellus-oliolle konsturuktorin parametrina"}]},{"type":"text","value":"\nsovellus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" PuhelinluetteloSovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tallennuspalvelu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"suorita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Näin on saatu poistettua luokalta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"text","value":" "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"turha riippuvuus"}]},{"type":"text","value":" käsiteltävän tiedoston nimeen. Jos tiedoston nimi muuttuu, ei luokan koodiin tarvitse koskea ollenkaan. Riittää ainoastaan, että oliolle annetaan hieman erilainen konstruktoriparametri:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"PuhelinluetteloSovellus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__luettelo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Puhelinluettelo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tiedosto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tiedosto\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muu koodi"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# vaihdetaan tiedostoa"}]},{"type":"text","value":"\ntallennuspalvelu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tiedostonkasittelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"uusi_luettelotiedosto.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsovellus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" PuhelinluetteloSovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tallennuspalvelu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"suorita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä sama tekniikka mahdollistaa sen, että siirrytäänkin tallentamaan puhelinluettelo tiedoston sijaan esimerkiksi internetissä olevaan pilvipalveluun. On vain kirjoitettava pilvipalvelua käyttävä luokka, joka tarjoaa puhelinluettelosovellukselle samanlaiset metodit kuin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tiedostonkasittelija"}]},{"type":"text","value":". Tämän luokan olio voidaan antaa sovellukselle, ilman että sovelluksen koodista tulee muuttaa riviäkään:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"InternetTallennin"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# koodi joka tallentaa luettelon tiedot internetissä olevaan pilvipalveluun"}]},{"type":"text","value":"\n\ntallennuspalvelu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" InternetTallennin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"amazon-cloud\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"mluukkai\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"passwrd\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsovellus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" PuhelinluetteloSovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tallennuspalvelu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsovellus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"suorita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten aiemmin todettiin, on tämän kaltaisten tekniikoiden käytöllä oma hintansa: koodia tulee enemmän, ja ohjelmoijan tulee harkita milloin se hinta kannattaa maksaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä esitelty tekniikka (joka kulkee ammattijargonissa nimellä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"dependency injection"}]},{"type":"text","value":"), missä oliolle annetaan ulkopuolelta käsin sen tarvitsema "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"riippuvuus"}]},{"type":"text","value":" (eli käytännössä jokin muu olio) on erittäin tyypillinen kikka ammattimaisessa koodauksessa, muun muassa siksi, että se helpottaa ohjelmistojen laajentamista sekä niiden automatisoitua testaamista. Jatkamme teeman käsittelyä kursseilla "},{"type":"element","tagName":"a","properties":{"href":"https://studies.helsinki.fi/opintotarjonta/cu/hy-CU-118024742-2020-08-01","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Ohjelmistotekniikka"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"a","properties":{"href":"https://studies.helsinki.fi/opintotarjonta/cu/hy-CU-118024909-2020-08-01","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Ohjelmistotuotanto"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa lopuksi osion loppukyselyyn:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"adf5276f-057a-5ac0-85b1-024443782145"},"children":[]}]}]},"html":"

Tässä osiossa

    \n
  • Käydään läpi hieman laajemman sovelluksen tekemiseen liittyviä seikkoja
  • \n
  • Erityinen fokus on sovelluksen eri osa-alueiden (käyttöliittymä, sovelluslogiikka ja tiedostojen käsittely) eriyttämisessä
  • \n
  • Harjoitellaan laajemman sovelluksen toteuttamista itse
  • \n

Ohjelmoinnin perusteiden ja jatkokurssin aikana on esitelty suuri määrä Pythonin tarjoamia ominaisuuksia.

Ohjelmoinnin perusteissa tutustuttiin kielen kontrollirakenteisiin (while ja for), funktioihin sekä perustietorakenteisiin eli listaan ja sanakirjaan. Näytti jo hetken siltä että muuta ei tarvitakaan. Periaatteessa näin onkin: ohjelmoinnin perusteiden kalustolla pystyy ilmaisemaan kaiken mikä Pythonilla on ylipäätään ilmaistavissa.

Jatkokurssin alussa, eli kurssin osassa 8 pakkaa ruvettiin kuitenkin hämmentämään tuomalla mukaan luokat ja oliot. Milloin ja ylipäätään miksi olioita tulisi käyttää jos kurssin osien 1-7 kalusto on jo ilmaisuvoimaltaan riittävä?

Monimutkaisuuden hallintaa

Monissa tilanteissa voi ja varmasti kannattaakin olla käyttämättä oliota. Esimerkiksi jos koodataan pieni \"kertakäyttöinen\" apuohjelma, ei ehkä ole mitään tarvetta olioille. Tilanne alkaa muuttua, kun siirrytään hieman suuremman kokoluokan ohjelmiin.

Kun ohjelma laajenee, alkaa sen sisältämien yksityiskohtien määrä nousta hallitsemattomaksi, ellei ohjelmaa jäsennellä jollain järkevällä tavalla. Itse asiassa jo ohjelmoinnin perusteiden tehtävissä oli havaittavissa varsin monimutkaisia ratkaisuja, joiden ymmärtämisessä jopa alan ammattilaisilla on vaikeuksia.

Käsite Separation of concerns on ollut jo vuosikymmeniä eräs ohjelmoinnin ja koko tietojenkäsittelyn keskeisiä teemoja. Wikipedian mukaan käsitteellä tarkoitetaan seuraavaa

Separation of concerns is a design principle for separating a computer program into distinct sections such that each section addresses a separate concern. A concern is a set of information that affects the code of a computer program

Kyse on ohjelman suunnittelua ohjaavasta periaatteesta, jonka mukaan ohjelmakoodi jäsennellään pienempiin osiin, joista kukin huolehtii vain omasta \"tontistaan\". Kuhunkin osaan tehdyt muutokset vaikuttavat - periaatteen mukaisesti - vain rajattuun alueeseen ohjelmassa, joten ohjelmien väistämätöntä monimutkaisuutta on helpompi hallita.

Funktiot ovat yksi mekanismi tämän tavoitteen saavuttamiseen. Sen sijaan että ohjelma kirjoitetaan yhtenä isona kokonaisuutena, koostetaan se pienistä funktioista, joista kukin ratkaisee pienen osan ongelmasta.

Olio-ohjelmointi tarjoaa funktioita jossain määrin ilmaisuvoimaisemman ja joidenkin mielestä \"paremman\" tavan saavuttaa sama tavoite. Kuten olemme nähneet, olioiden avulla on mahdollista koota samaan asiaan liittyvä data ja sitä käsittelevä koodi, eli olion metodit, samaan paikkaan. Oliot tarjoavat myös mekanismin käsittelemänsä datan kapselointiin, joka taas tavallaan on keino piilottaa \"turhia\" yksityiskohtia olion ulkopuoliselta osalta ohjelmaa.

Esimerkki: puhelinluettelo

Miten ohjelma sitten tulisi jakaa luokkiin ja olioihin? Kysymys ei ole helppo, ja asiaa on helpompi pohdiskella konkreettisen esimerkin kautta. Toteutetaan esimerkkinä olio-ohjelmointia hyödyntäen hieman samantyylinen puhelinluettelo, joka oli aiheena ohjelmoinnin perusteiden viidennen osan tehtävässä.

Separation of concerns -periaatetta noudatellen koodi tulee jakaa osiin, joista kukin käsittelee omaa asiaansa. Olio-ohjelmoinnin piirissä tätä periaatetta ilmentää niin sanottu yhden vastuun (single responsibility) -periaate. Ei mennä sen tarkemmin periaatteen yksityiskohtiin, mutta maalaisjärjellä ajatellen periaatteen nimi jo kertoo mistä on kyse: yksittäisen luokan olioiden tulisi olla vastuussa yhdestä asiasta.

Olioita käytettäessä ohjelmointiongelman \"reaalimaailman asioita\" vastaa yleensä oma luokkansa. Puhelinluettelon tapauksessa tälläisiä reaalimaailman asioita olisivat esimerkiksi:

    \n
  • henkilö
  • \n
  • nimi
  • \n
  • puhelinnumero
  • \n

Näistä nimi ja puhelinnumero ovat kenties liian vähäpätöisiä ollakseen omia luokkiaan, mutta henkilö voisi hyvinkin olla oma luokkansa, jonka vastuulla on sitoa yhteen tietty nimi ja siihen liittyvät puhelinnumerot.

Myös puhelinluettelo itsessään on potentiaalinen luokka, sen vastuulla on hallinnoida eri henkilöiden tietoja.

Nämä kaksi luokkaa eli puhelinluettelo ja henkilö muodostavat sovelluksen ytimen, eli niin sanotun sovelluslogiikan. Näiden lisäksi ohjelma tarvitsee muutaman muunkin luokan.

Käyttäjän kanssa tapahtuvasta interaktiosta huolehtivaa luokkaa ei kannata sotkea sovelluslogiikan kanssa samaan luokkaan - sehän on kokonaan oma vastuunsa. Eli sovelluslogiikan luokkien lisäksi ohjelmalle tulee myös luokka, joka huolehtii ohjelman käyttöliittymästä.

Talletamme puhelinluettelon tiedot tiedostoon. Myös tiedoston käsittely on selkeästi oma vastuunsa, joten tulemme sisällyttämään siihen käytettävän koodin omaan luokkaansa.

Kun ohjelman luokkarakenne alkaa pikkuhiljaa hahmottua, nousee kysymykseksi se, mistä ohjelmointi kannattaa aloittaa. Usein paras tapa aloittaa on pienellä palalla sovelluslogiikka.

Vaihe 1: sovelluslogiikan runko

Aloitetaan luokasta Puhelinluettelo. Runko voisi näyttää seuraavalta:

class Puhelinluettelo:\n    def __init__(self):\n        self.__henkilot = []\n\n    def lisaa_numero(self, nimi: str, numero: str):\n        pass\n\n    def hae_numerot(self, nimi: str):\n        pass\n

Luokka pitää siis sisällään listan henkilöitä ja tarjoaa metodit tietojen lisäämiseen ja hakemiseen.

Jokaiseen henkilöön voi liittyä useita numeroita, joten toteutetaan luettelon sisäinen tila sanakirjan avulla, koska sanakirjasta on helppo hakea nimen perusteella. Sanakirjaan on helppo tallettaa suoraan myös nimeen liittyvät numerot, joten ainakaan tässä vaiheessa ei tarvita erillistä luokkaa yksittäisen henkilön tietojen tallettamiseen.

Luokka laajenee seuraavasti. Mukana on myös pieni toiminnan varmistava koodinpätkä:

class Puhelinluettelo:\n    def __init__(self):\n        self.__henkilot = {}\n\n    def lisaa_numero(self, nimi: str, numero: str):\n        if not nimi in self.__henkilot:\n            # henkilöön liittyy lista puhelinnumeroja\n            self.__henkilot[nimi] = []\n\n        self.__henkilot[nimi].append(numero)\n\n    def hae_numerot(self, nimi: str):\n        if not nimi in self.__henkilot:\n            return None\n\n        return self.__henkilot[nimi]\n\n# testikoodi\nluettelo = Puhelinluettelo()\nluettelo.lisaa_numero(\"Erkki\", \"02-123456\")\nprint(luettelo.hae_numerot(\"Erkki\"))\nprint(luettelo.hae_numerot(\"Emilia\"))

Testikoodin tulostus on seuraava:

['02-123456']\nNone

Metodi hae_numerot siis palauttaa arvon None, jos henkilö ei löydy luettelosta, jos henkilö löytyy, palautetaan lista joka sisältää henkilön puhelinnumerot.

Ohjelmoidessa mitä tahansa ohjelmaa kannattaa aina kokeilla, että koodi toimii kuten sen olettaa toimivan, ennen kun etenee muuhun koodiin.\nUsein tämä testikoodi on poisheitettävää koodia, ja sikäli voisi ajatella testaamisesta olevan ylimääräistä vaivaa. Lähes 100% tapauksissa ei näin kuitenkaan ole.

Koodiin tullut bugi kannattaa saada kiinni ja korjata niin pian kuin mahdollista. Jos koodin toimivuuden varmistaa lähes jokaisen uuden koodirivin jälkeen, on debuggaus ja korjaaminen yleensä vaivatonta ja nopeaa, koska tällöin voi olla melko varma siitä, että ongelma johtuu hetki sitten lisätyistä koodiriveistä. Jos taas koodia testataan vasta sen jälkeen kun siihen on lisätty kymmeniä koodirivejä, on virhelähteitä moninkertaisesti.

Vaihe 2: käyttöliittymän runko

Kun sovelluslogiikan ydintoiminnallisuus on kunnossa, voidaan edetä sovelluksen tekstikäyttöliittymään. Tehdään sitä varten oma luokka PuhelinluetteloSovellus, jonka runko on seuraava:

class PuhelinluetteloSovellus:\n    def __init__(self):\n        self.__luettelo = Puhelinluettelo()\n\n    def ohje(self):\n        print(\"komennot: \")\n        print(\"0 lopetus\")\n\n    def suorita(self):\n        self.ohje()\n        while True:\n            print(\"\")\n            komento = input(\"komento: \")\n            if komento == \"0\":\n                break\n\nsovellus = PuhelinluetteloSovellus()\nsovellus.suorita()

Luokka saattaa vaikuttaa vielä hämmentävältä, mutta tässä luodaan tosiaan vasta runko toiminnalle. Konstruktori luo puhelinluettelon, jonka olio pitää sisällään. Metodi suorita(self) käynnistää sovelluksen tekstikäyttöliittymän, jonka ytimen muodostaa while-silmukka, joka kyselee käyttäjältä mikä komento halutaan suorittaa. Ennen toistolauseeseen menemistä ohjelma tulostaa käyttöohjeet, kutsumalla metodia ohje(self). Varsinaiset toiminnot toteutetaan seuraavaksi.

Laajennetaan käyttöliittymää siten, että luetteloon voidaan lisätä uusia tietoja:

class PuhelinluetteloSovellus:\n    def __init__(self):\n        self.__luettelo = Puhelinluettelo()\n\n    def ohje(self):\n        print(\"komennot: \")\n        print(\"0 lopetus\")\n        print(\"1 lisäys\")\n\n    def suorita(self):\n        self.ohje()\n        while True:\n            print(\"\")\n            komento = input(\"komento: \")\n            if komento == \"0\":\n                break\n            elif komento == \"1\":\n                nimi = input(\"nimi: \")\n                numero = input(\"numero: \")\n                self.__luettelo.lisaa_numero(nimi, numero)\n\nsovellus = PuhelinluetteloSovellus()\nsovellus.suorita()

Jos valittu komento on tietojen lisäys (eli komento on 1), kysyy käyttöliittymä nimen ja numeron käyttäjältä, ja lisää tiedot puhelinluetteloon kutsumalla sopivaa luettelon metodia.

Käyttöliittymä on siis vastuussa ainoastaan siitä, että se kommunikoi käyttäjän kanssa. Puhelinnumeron säilöminen nimen yhteyteen on jätetty kokonaisuudessan Puhelinluettelo-olion vastuulle.

Käyttöliittymän rakennetta on mahdollista vielä parannella siten, että tietojen lisäys eriytetään omaan metodiinsa lisays(self):

class PuhelinluetteloSovellus:\n    def __init__(self):\n        self.__luettelo = Puhelinluettelo()\n\n    def ohje(self):\n        print(\"komennot: \")\n        print(\"0 lopetus\")\n        print(\"1 lisäys\")\n\n    # eriytetään uusien tietojen lisääminen omaksi metodiksi\n    def lisays(self):\n        nimi = input(\"nimi: \")\n        numero = input(\"numero: \")\n        self.__luettelo.lisaa_numero(nimi, numero)\n\n    def suorita(self):\n        self.ohje()\n        while True:\n            print(\"\")\n            komento = input(\"komento: \")\n            if komento == \"0\":\n                break\n            elif komento == \"1\":\n                self.lisays()\n\nsovellus = PuhelinluetteloSovellus()\nsovellus.suorita()

Erillisen metodin käyttämisen taustallakin on sama separation of concerns -periaate. Sen sijaan että koko käyttöliittymän toiminnallisuus sijoitettaisiin ison while-silmukan sisälle, tehdään jokaisesta yksittäisestä toiminnosta oma metodinsa. Tämä helpottaa kokonaisuuden hallintaa. Jos halutaan muokata tietojen lisäämisen toiminnallisuutta, tiedetään heti missä päin relevantti koodi sijaitsee.

Lisätään käyttöliittymään toiminnallisuus numeroiden hakemista varten. Sijoitetaan sen hoitava koodi heti omaan metodiinsa:

\nclass PuhelinluetteloSovellus:\n    def __init__(self):\n        self.__luettelo = Puhelinluettelo()\n\n    def ohje(self):\n        print(\"komennot: \")\n        print(\"0 lopetus\")\n        print(\"1 lisäys\")\n        print(\"2 haku\")\n\n    def lisays(self):\n        nimi = input(\"nimi: \")\n        numero = input(\"numero: \")\n        self.__luettelo.lisaa_numero(nimi, numero)\n\n    def haku(self):\n        nimi = input(\"nimi: \")\n        numerot = self.__luettelo.hae_numerot(nimi)\n        if numerot == None:\n            print(\"numero ei tiedossa\")\n            return\n        for numero in numerot:\n            print(numero)\n\n    def suorita(self):\n        self.ohje()\n        while True:\n            print(\"\")\n            komento = input(\"komento: \")\n            if komento == \"0\":\n                break\n            elif komento == \"1\":\n                self.lisays()\n            elif komento == \"2\":\n                self.haku()\n            else:\n                self.ohje()\n\nsovellus = PuhelinluetteloSovellus()\nsovellus.suorita()

Sovelluksen perusversio toimii nyt. Seuraavassa esimerkki sovelluksen käytöstä:

komennot:\n0 lopetus\n1 lisäys\n2 haku

komento: 1\nnimi: Erkki\nnumero: 02-123456

komento: 1\nnimi: Erkki\nnumero: 045-4356713

komento: 2\nnimi: Erkki\n02-123456\n045-4356713

komento: 2\nnimi: Emilia\nnumero ei tiedossa

komento: 0

Koodia on aika paljon, todennäköisesti enemmän kuin jos kaikki olisi ohjelmoitu yhteen pötköön. Koodin rakenne on kuitenkin siistihkö, ja koodin laajentamisenkaan ei pitäisi olla kovin hankalaa.

Vaihe 3: tietojen haku tiedostosta

Laajennetaan ohjelmaa siten, että se lataa käynnistäessään puhelinluettelon tiedostosta, joka on seuraavaa muotoa:

Erkki;02-1234567;045-4356713\nEmilia;040-324344

Tiedoston käsittely on selkeästi oma vastuualueensa, eli toteutetaan sitä varten oma luokka:

class Tiedostonkasittelija():\n    def __init__(self, tiedosto):\n        self.__tiedosto = tiedosto\n\n    def lataa(self):\n        nimet = {}\n        with open(self.__tiedosto) as f:\n            for rivi in f:\n                osat = rivi.strip().split(';')\n                nimi, *numerot = osat\n                nimet[nimi] = numerot\n\n        return nimet

Konstruktorin parametrina annetaan tiedoston nimi. Metodi lataa(self) lukee tiedoston, ja pilkkoo sen rivit sanakirjaksi, missä avain on nimi ja arvona ovat nimeen liittyvät numerot.

Metodi käyttää erästä Pythonin kätevää ominaisuutta: listasta on mahdollista ottaa ensin yksittäisiä alkioita erikseen nimettyinä muuttujina, sekä loput alkiot uutena listana, kuten seuraavasta esimerkistä käy ilmi. Luvusta 6 muistamme että merkkijonojen metodi split tuottaa nimenomaan listan.

lista = [1, 2, 3, 4, 5]\neka, toka, *loput = lista\nprint(eka)\nprint(toka)\nprint(loput)

1\n2\n[3, 4, 5]

Sijoituslauseen viimeisen muuttujan nimen edessä on *, ja se tarkoittaa, että viimeiseen muuttujaan kerätään taulukosta loput, eli kolmas ja sitä seuraavat alkiot.

Tiedostonkäsittelijääkin kannattaa ehdottomasti testata, ennen kuin se pultataan muuhun koodiin:

t = Tiedostonkasittelija(\"luettelo.txt\")\nprint(t.lataa())

{'Erkki': ['02-1234567', '045-4356713'], 'Emilia': ['040-324344']}

Kun tiedostosta lukemisen todetaan toimivan, liitetään koodi muuhun ohjelmaan. Looginen paikka tiedoston lukemiseen on se hetki kun sovellus käynnistyy, eli luokan PuhelinluetteloSovellus konstruktori:

class PuhelinluetteloSovellus:\n    def __init__(self):\n        self.__luettelo = Puhelinluettelo()\n        self.__tiedosto = Tiedostonkasittelija(\"luettelo.txt\")\n\n        # listään tiedostossa olevat nimet luetteloon\n        for nimi, numerot in self.__tiedosto.lataa().items():\n            for numero in numerot:\n                self.__luettelo.lisaa_numero(nimi, numero)\n\n    # muu koodi

Tiedoston lukua osana PuhelinLuetteloSovellusta kannattaa myös testata. Kun on varmistettu, että tiedoston sisältö saadaan ladattua luetteloon, voidaan edetä viimeiseen vaiheeseen.

Vaihe 4: tietojen talletus tiedostoon

Viimeistellään ohjelman alustava versio vielä siten, että se tallentaa lopetettaessa puhelinluettelon takaisin tiedostoon.

Tätä varten luokkaa Puhelinluettelo tulee laajentaa siten, että sieltä saadaan tallennusta varten kaikki tiedot ulos:

class Puhelinluettelo:\n    def __init__(self):\n        self.__henkilot = {}\n\n    # ...\n\n    # palautetaan tiedostoon tallentamista varten kaikki tiedot\n    def kaikki_tiedot(self):\n        return self.__henkilot

Tallennus on luonnollisesti luokan Tiedostonkasittelija vastuulla, eli laajennetaan sitä metodilla talleta, joka saa parametriksi puhelinluetteloa edustavan sanakirjan:

class Tiedostonkasittelija():\n    def __init__(self, tiedosto):\n        self.__tiedosto = tiedosto\n\n    def lataa(self):\n        # ...\n\n    def talleta(self, luettelo: dict):\n        with open(self.__tiedosto, \"w\") as f:\n            for nimi, numerot in luettelo.items():\n                rivi = [nimi] + numerot\n                f.write(\";\".join(rivi) + \"\\n\")

Tallennus tapahtuu samalla kun sovelluksen käyttö lopetetaan. Tehdään tätäkin tarkoitusta varten oma metodinsa ja kutsutaan sitä sopivassa kohdassa:

\nclass PuhelinluetteloSovellus:\n    # muu koodi\n\n    # metodi, joka suoritetaan lopetettaessa sovelluksen käyttö\n    def lopetus(self):\n        self.__tiedosto.talleta(self.__luettelo.kaikki_tiedot())\n\n    def suorita(self):\n        self.ohje()\n        while True:\n            print(\"\")\n            komento = input(\"komento: \")\n            if komento == \"0\":\n\n                self.lopetus()\n                break\n            elif komento == \"1\":\n                self.lisays()\n            elif komento == \"2\":\n                self.haku()\n            else:\n                self.ohje()

Tässä tehtävässä tehdään pieni laajennus puhelinluettelosovellukseen. Yllä kehitetty koodi löytyy tehtäväpohjasta. Laajenna ratkaisuasi komennolla, joka mahdollistaa nimen etsimisen numeron perusteella. Laajennuksen jälkeen sovelluksen pitäisi toimia seuraavasti:

komennot:\n0 lopetus\n1 lisäys\n2 haku\n3 haku numeron perusteella

komento: 1\nnimi: Erkki\nnumero: 02-123456

komento: 1\nnimi: Erkki\nnumero: 045-4356713

komento: 3\nnumero: 02-123456\nErkki

komento: 3\nnumero: 0100100\ntuntematon numero

komento: 0

Tee laajennus sitten, että kunnioitat ohjelman rakennetta. Eli lisää luokkaan PuhelinluetteloSovellus uutta ominaisuutta varten sopiva apumetodi sekä oma haara while-silmukkaan. Lisää myös sovelluslogiikkaan eli luokkaan Puhelinluettelo metodi, joka mahdollistaa nimen hakemisen numeron perusteella.

Olioita sanakirjassa

Seuraavassa tehtävässä on tarkoitus muuttaa puhelinluetteloa siten, että sanakirjan arvoksi talletetaan tavallisten listojen sijaan olioita.

Periaatteessa asiassa ei ole mitään ihmeellistä, mutta kurssilla ei vielä ole näin tehty, joten tutkitaan ennen tehtävää hieman samantapaista, mutta yksinkertaisempaa esimerkkiä.

Tehdään sovellus, jonka avulla voidaan pitää kirjaa siitä, kuinka monta tehtävää opiskelijat ovat tehneet kurssin aikana. Kunkin opiskelijan tehtävämäärä lasketaan yksinkertaisen olion avulla:

class Tehtavalaskuri:\n    def __init__(self):\n        self.__tehtavia = 0\n\n    def merkkaa(self):\n        self.__tehtavia += 1\n\n    def tehtyja(self):\n        return self.__tehtavia

Luokkaa käyttävä pääohjelma on seuraavassa:

opiskelijat = {}\n\nprint(\"merkataan tehtäviä\")\nwhile True:\n    nimi = input(\"opiskelija: \")\n    if len(nimi) == 0:\n        break\n\n    # luodaan tarvittaessa olio tehtävämäärän laskemista varten\n    if not nimi in opiskelijat:\n        opiskelijat[nimi] = Tehtavalaskuri()\n\n    # merkataan tehdyksi nimeä vastaavaan olioon\n    opiskelijat[nimi].merkkaa()\n\nprint()\nprint(\"tehdyt tehtävät:\")\n\nfor opiskelija, tehtavat in opiskelijat.items():\n    print(f\"{opiskelija} tehtäviä {tehtavat.tehtyja()} kpl\")

Käyttöesimerkki

merkataan tehtäviä\nopiskelija: pekka\nopiskelija: sara\nopiskelija: antti\nopiskelija: sara\nopiskelija: juuso\nopiskelija: juuso\nopiskelija: antti\nopiskelija: sara\nopiskelija:

tehdyt tehtävät:\npekka tehtäviä 1 kpl\nantti tehtäviä 2 kpl\nsara tehtäviä 3 kpl\njuuso tehtäviä 2 kpl

Esimerkissä on parikin huomionarvoista seikkaa. Kun opiskelijan nimi syötetään, tarkastetaan aina ensin onko opiskelijaa vastaava olio jo sanakirjassa. Jos olioa ei ole, luodaan se:

if not nimi in opiskelijat:\n    opiskelijat[nimi] = Tehtavalaskuri()

Tämän jälkeen tiedetään että olio on olemassa. Se on joko luotu juuri äsken tai jo aiemmalla silmukan kierroksella. Haetaan olio sanakirjasta, ja kutsutaan sen metodia merkkaa:

opiskelijat[nimi].merkkaa()

Rivillä tapahtuu oikeastaan kaksi asiaa, ja sama voitaisiin kirjoittaa siten, että sanakirjasta haettu olio sijoitettaisiin apumuuttujaan:

opiskelijan_laskuri = opiskelijat[nimi]\nopiskelijan_laskuri.merkkaa()

Huomaa, että vaikka olio sijoitettaisiin apumuuttujaan, se ei tarkoita että olio poistuisi sanakirjasta tai oliosta syntyisi kopio. Apumuuttuja on ainoastaan viite sanakirjassa olevaan olioon.

Esimerkin koodia kannattaa ehdottomasti kokeilla visualisaattorissa jos ei ole aivan 100% varma siitä, miten koodi toimii.

Tässä tehtävässä laajennetaan puhelinluettelosovellusta siten, että henkilöihin voi liittyä myös osoite. Yksinkertaisuuden vuoksi koodista on kuitenkin poistettu tiedostoon tallentaminen. Myös muutama metodi on uudelleennimetty vastaamaan paremmin laajennuksen jälkeistä tilannetta.

Luokka henkilön tietojen esittämiseen

Siirretään henkilön tietojen (eli puhelinnumerojen sekä osoitteen) esittäminen oman luokkansa Henkilo vastuulle. Toteuta luokka siten, että se toimii seuraavasti:

henkilo = Henkilo(\"Erkki\")\nprint(henkilo.nimi())\nprint(henkilo.numerot())\nprint(henkilo.osoite())\nhenkilo.lisaa_numero(\"040-123456\")\nhenkilo.lisaa_osoite(\"Mannerheimintie 10 Helsinki\")\nprint(henkilo.numerot())\nprint(henkilo.osoite())

Erkki\n[]\nNone\n['040-123456']\nMannerheimintie 10 Helsinki

Puhelinluettelo käyttämään luokkaa Henkilo

Muuta koodiasi siten, että se toimii käyttäjän näkökulmasta täysin samoin kuin aiemmin, mutta luokka Puhelinluettelo tallettaakin henkilöt sisäisesti käyttäen luokan Henkilo olioita. Käytännössä siis oliomuuttujana __henkilot tulee olla sanakirja, johon listojen sijaan talletetaan henkilö-olioita.

VAROITUS: kun teet koodiin tämän tehtävän kaltaista rakenteellista muutosta, etene pienin askelin. Älä missään tapauksessa yritä tehdä kaikkea kerrallaan, se on varma keino ajautua pahoihin ongelmiin.

Sopiva pieni askel nyt voi olla se, että tarkastat ensin erikseen luokan Puhelinluettelo toimivuuden. Esimerkiksi seuraavan koodin tulee toimia kuten olettaa saattaa:

luettelo = Puhelinluettelo()\nluettelo.lisaa_numero(\"Erkki\", \"02-123456\")\nprint(luettelo.hae_tiedot(\"Erkki\"))\nprint(luettelo.hae_tiedot(\"Emilia\"))

Tehtävässä ei tarkisteta, millainen tulostusasu hae_tiedot-metodin palauttamalla tuloksella on, mutta varmista ettei koodi aiheuta virheitä, ja että tulos on järkevä. Kun olet 100% varma, että kaikki toimii luokan Puhelinluettelo osalta, voit edetä varmistamaan, että kaikki toimii edelleen entiseen tapaan käyttöliittymää käytettäessä.

Osoitteen lisääminen

Laajenna nyt sovellusta siten, että puhelinluetteloon on mahdollista tallettaa myös henkilöiden osoitteet. Ohjelman tulisi toimia seuraavasti:

komennot:\n0 lopetus\n1 nimen lisäys\n2 haku\n3 osoitteen lisäys

komento: 1\nnimi: Erkki\nnumero: 02-123456

komento: 3\nnimi: Emilia\nosoite: Viherlaaksontie 7, Espoo

komento: 2\nnimi: Erkki\n02-123456\nosoite ei tiedossa

komento: 2\nnimi: Emilia\nnumero ei tiedossa\nViherlaaksontie 7, Espoo

komento: 3\nnimi: Erkki\nosoite: Linnankatu 75, Turku

komento: 2\nnimi: Erkki\n02-123456\nLinnankatu 75, Turku

komento: 2\nnimi: Wilhelm\nosoite ei tiedossa\nnumero ei tiedossa

komento: 0

VAROITUS ja vihje: kuten tehtävän edellisessä osassa sanottiin, älä missään tapauksessa yritä tehdä kaikkea kerrallaan, se on varma keino ajautua pahoihin ongelmiin.

Varmista ensin että voit lisätä osoitteita luokkaan Puhelinluettelo ja kun olet 100% varma, että se toimii, voit laajentaa sovelluksen käyttöliittymää uuden toiminnallisuuden osalta.

Erinäisiä huomioita

Puhelinluetteloesimerkki noudattaa rakenteeltaan melko klassisia hyvän olio-ohjelmoinnin periaatteita. Kantavana ideana on siis ohjelman eri vastuualueiden jaottelu erillisiin luokkiin ja metodeihin. Eräs suurimmista motiiveista tällaiselle jaottelulle on monimutkaisuuden hallinta. Toinen tärkeä syy on se, että oikein tehty koodin jaottelu - tai modularisointi kuten ammattijargon asian ilmaisee - tekee koodista potentiaalisesti helpomman ylläpitää ja laajentaa.

Oikeissa ohjelmistoissa ylivoimaisesti suurimman kustannuserän aiheuttaa juuri ylläpito (eli bugien korjailu) sekä ohjelman laajentaminen, joten tällä seikalla on taloudellisesti erittäin suuri merkitys.

Nostetaan esimerkistä esiin vielä pari tärkeää seikkaa. Koodi ilmentää hyvin sitä, miten sovelluslogiikan varsinainen ydin on eriytetty sekä käyttöliittymästä, että datan tallettamisesta. Tämä on tärkeää muutamastakin syystä. Ensinnäkin se mahdollistaa koodin testailun pienemmissä yksiköissä, luokka ja metodi kerrallaan. Toisaalta koska sovelluslogiikka ei nyt riipu käyttöliittymästä tai tiedon talletustavasta, on esim. käyttöliittymää mahdollista muuttaa (ainakin johonkin pisteeseen asti) rikkomatta muuta sovellusta.

Tiedostojen käsittelyn suhteen kannattaa myös huomata se, että ohjelma lukee tiedostoa ainoastaan kerran, käynnistysvaiheessa. Tämän jälkeen kaikki tieto säilytetään ohjelman muuttujissa. Ohjelma tallettaa tiedot kokonaisuudessaan, eli käytännössä uudelleenkirjoittaa tiedoston joka kerta kokonaan uudestaan. Tiedostojen käsittely kannattaa lähes kaikissa tapauksissa tehdä näin.

Hyvän koodin kirjoittamisesta kerrotaan lisää esimerkiksi Robert Martinin mainiossa kirjassa Clean Code. Kirjan koodiesimerkit on kuitenkin toteutettu Javalla, eli esimerkkien lukeminen saattaa tässä vaiheessa olla vielä varsin työlästä. Paneudumme ylläpidettävyydeltään ja laajennettavuudeltaan laadukkaan koodin toteuttamiseen tarkemmin kursseilla Ohjelmistotekniikka ja Ohjelmistotuotanto.

Hyvän olio-ohjelmoinnin periaatteiden mukaisen koodin kirjoittamisella on myös hintansa. Koodia tulee todennäköisesti enemmän kuin jos sama ongelma ratkaistaisiin yhteen pötköön kirjoitetulla spagettikoodilla. Ohjelmoijan onkin aina ratkaistava se, minkälainen lähestymistapa on paras kuhunkin tilanteeseen. Joskus voi olla vain parasta häkkeröidä kasaan nopeasti jotain joka toimii nyt. Jos taas on odotettavissa, että samaa koodia tullaan jatkossa laajentamaan. joko koodarin itsensä tai jonkun muun toimesta, on todennäköisesti kannattavaa panostaa koodin luettavuuteen ja jäsentämiseen jossain määrin jo alkuvaiheissa.

Harjoitellaan vielä isomman ohjelmakokonaisuuden toteuttamista yhden ohjelmointitehtävän verran.

Tee interaktiivinen ohjelma, jonka avulla voit pitää kirjaa opintomenestyksestäsi. Sovelluksen rakenteen saat päättää itse, mutta nyt on hyvä tilaisuus harjoitella Puhelinluettelo-esimerkin kaltaisen oliorakenteen muodostamista.

Ohjelman tulee toimia seuraavasti:

1 lisää suoritus\n2 hae suoritus\n3 tilastot\n0 lopetus

komento: 1\nkurssi: Ohpe\narvosana: 3\nopintopisteet: 5

komento: 2\nkurssi: Ohpe\nOhpe (5 op) arvosana 3

komento: 1\nkurssi: Ohpe\narvosana: 5\nopintopisteet: 5

komento: 2\nkurssi: Ohpe\nOhpe (5 op) arvosana 5

komento: 1\nkurssi: Ohpe\narvosana: 1\nopintopisteet: 5

komento: 2\nkurssi: Ohpe\nOhpe (5 op) arvosana 5

komento: 2\nkurssi: Java-ohjelmointi\nei suoritusta

komento: 1\nkurssi: Tira\narvosana: 1\nopintopisteet: 10

komento: 1\nkurssi: Tilpe\narvosana: 2\nopintopisteet: 5

komento: 1\nkurssi: Lapio\narvosana: 4\nopintopisteet: 1

komento: 1\nkurssi: Lama\narvosana: 5\nopintopisteet: 8

komento: 3\nsuorituksia 5 kurssilta, yhteensä 29 opintopistettä\nkeskiarvo 3.4\narvosanajakauma\n5: xx\n4: x\n3:\n2: x\n1: x

komento: 0

Muutama huomio: kultakin kurssilta tallentuu ainoastaan yksi arvosana. Arvosanaa voi korottaa, mutta se ei voi laskea.

Tehtävästä on tarjolla kaksi tehtäväpistettä. Ensimmäisen pisteen saa jos toiminnot 1 ja 2 sekä lopetus toimivat. Toisen pisteen saa jos myös toiminto 3 on toteutettu.

Epilogi

Palataan vielä hetkeksi tarkastelemaan puhelinluetteloesimerkkiä, ja sen käyttöliittymän toteuttavaa luokkaa:

class PuhelinluetteloSovellus:\n    def __init__(self):\n        self.__luettelo = Puhelinluettelo()\n        self.__tiedosto = Tiedostonkasittelija(\"luettelo.txt\")\n\n    # muu koodi\n\nsovellus = PuhelinluetteloSovellus()\nsovellus.suorita()

PuhelinluetteloSovellus-olio pitää siis sisällään sekä Puhelinluettelo-olion että Tiedostonkasittelija-olion. Jos olisimme ammattikoodareita, tekisimme sovellukseen pienen muutoksen. Nyt nimittäin se, että sovellus käyttää nimenomaan tiedostoa luettelo.txt tallentamaan luettelon tiedot, on sovelluksen käyttöliittymän kannalta täysin turha deltaji. Jos tiedosto haluttaisiin vaihtaa, edellyttäisi se muutosta luokan PuhelinluetteloSovellus koodiin. Tämä taas ei ole hyvä separation of concerns -periaatetta ajatellen, sillä puhelinluettelon tallentaminen ei kuulu ollenkaan käyttöliittymästä huolehtivan luokan vastuisiin.

Parempi vaihtoehto olisikin luoda tiedostokäsittelijä muualla ja antaa se PuhelinluetteloSovellus-oliolle, esimerkiksi konstruktorin parametrina:

class PuhelinluetteloSovellus:\n    def __init__(self, tiedosto):\n        self.__luettelo = Puhelinluettelo()\n        self.__tiedosto = tiedosto\n\n    # muu koodi\n\n# luodaan tallennuksen hoitava olio\ntallennuspalvelu = Tiedostonkasittelija(\"luettelo.txt\")\n# ja annetaan se PuhelinluetteloSovellus-oliolle konsturuktorin parametrina\nsovellus = PuhelinluetteloSovellus(tallennuspalvelu)\nsovellus.suorita()

Näin on saatu poistettua luokalta PuhelinluetteloSovellus turha riippuvuus käsiteltävän tiedoston nimeen. Jos tiedoston nimi muuttuu, ei luokan koodiin tarvitse koskea ollenkaan. Riittää ainoastaan, että oliolle annetaan hieman erilainen konstruktoriparametri:

class PuhelinluetteloSovellus:\n    def __init__(self, tiedosto):\n        self.__luettelo = Puhelinluettelo()\n        self.__tiedosto = tiedosto\n\n    # muu koodi\n\n# vaihdetaan tiedostoa\ntallennuspalvelu = Tiedostonkasittelija(\"uusi_luettelotiedosto.txt\")\nsovellus = PuhelinluetteloSovellus(tallennuspalvelu)\nsovellus.suorita()

Tämä sama tekniikka mahdollistaa sen, että siirrytäänkin tallentamaan puhelinluettelo tiedoston sijaan esimerkiksi internetissä olevaan pilvipalveluun. On vain kirjoitettava pilvipalvelua käyttävä luokka, joka tarjoaa puhelinluettelosovellukselle samanlaiset metodit kuin Tiedostonkasittelija. Tämän luokan olio voidaan antaa sovellukselle, ilman että sovelluksen koodista tulee muuttaa riviäkään:

class InternetTallennin:\n    # koodi joka tallentaa luettelon tiedot internetissä olevaan pilvipalveluun\n\ntallennuspalvelu = InternetTallennin(\"amazon-cloud\", \"mluukkai\", \"passwrd\")\nsovellus = PuhelinluetteloSovellus(tallennuspalvelu)\nsovellus.suorita()

Kuten aiemmin todettiin, on tämän kaltaisten tekniikoiden käytöllä oma hintansa: koodia tulee enemmän, ja ohjelmoijan tulee harkita milloin se hinta kannattaa maksaa.

Tässä esitelty tekniikka (joka kulkee ammattijargonissa nimellä dependency injection), missä oliolle annetaan ulkopuolelta käsin sen tarvitsema riippuvuus (eli käytännössä jokin muu olio) on erittäin tyypillinen kikka ammattimaisessa koodauksessa, muun muassa siksi, että se helpottaa ohjelmistojen laajentamista sekä niiden automatisoitua testaamista. Jatkamme teeman käsittelyä kursseilla Ohjelmistotekniikka ja Ohjelmistotuotanto.

Vastaa lopuksi osion loppukyselyyn:

","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-10/4-laajempi-sovellus.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-10/page-data.json b/page-data/osa-10/page-data.json index 4821da2f1..417ddddb7 100644 --- a/page-data/osa-10/page-data.json +++ b/page-data/osa-10/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-part-overview-template-js", "path": "/osa-10", - "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-10","title":"Osa 10"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-10/index.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-10","title":"Osa 10"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-10/index.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-11/1-koosteet/page-data.json b/page-data/osa-11/1-koosteet/page-data.json index a6a07b7ed..b19df4c7a 100644 --- a/page-data/osa-11/1-koosteet/page-data.json +++ b/page-data/osa-11/1-koosteet/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-11/1-koosteet", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät mitä tarkoitetaan koosteella (comprehension)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat hyödyntää koosteita uusien listojen muodostamiseen"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmointiin liittyy usein erilaisten sekvenssien (eli sarjojen) käsittely. Aikaisemmissa osissa on käytetty runsaasti aikaa merkkijonojen, listojen ja sanakirjojen käsittelyyn eri tavoilla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oletetaan tilanne, jossa meillä on lista kokonaislukuja. Tämän listan perusteella meidän pitäisi luoda vastaava merkkijonolista."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Perinteinen tapa toteuttaa operaatio näyttäisi esimerkiksi tältä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nmerkkijonot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n merkkijonot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"listakooste","style":"position:relative;"},"children":[{"type":"text","value":"Listakooste"},{"type":"element","tagName":"a","properties":{"href":"#listakooste","ariaLabel":"listakooste permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python tarjoaa kuitenin \"pythonmaisemman\" tavan uuden listan muodostamiseksi vanhan perusteella. Menetelmää voidaan kutsua \"listakoosteeksi\", mutta huomattavasti yleisempää on käyttää englanninkielistä nimeä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"list comprehension"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Menetelmässä ideana on kuvata yhden rivin lausekkeella, mikä operaatio listan kaikille alkioille tehdään, ennen kuin ne tallennetaan uuteen listaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi yllä esitetty ohjelma, joka luo merkkijonolistan kokonaislukulistan perusteella, näyttäisi listakoostetta hyödyntäen tältä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nmerkkijonot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koosteessa näyttää siis olevan jotakuinkin samat elementit kuin perinteisessäkin toteutuksessa, mutta syntaksi on uudenlainen. Yleisemmin listakoosteen syntaksi voitaisiin esittää esimerkiksi näin:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[ for in ]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koosteen ympärillä olevat hakasulkeet kertovat, että lopputuloksena on uusi lista. Koosteessa poimitaan yksi kerrallaan alkio alkuperäisestä sarjasta (esimerkkimme tapauksessa listasta) ja tallennetaan siihen liittyvän lausekkeen arvo uuteen listaan. Lopputuloksena on lista, jossa on yhtä paljon alkioita kuin alkuperäisessä listassa ja kaikki alkiot on käsitelty samalla tavalla."}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 301px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/3f079cde22be6cf33b7be317492aa108/fb933/11_1_2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 131.7391304347826%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAaCAYAAAC3g3x9AAAACXBIWXMAAAsTAAALEwEAmpwYAAACRUlEQVRIx42V16oCQQyG5/0fyStBRUQUbCCiggWx995y+AJZouyuJxAmk/JvJpnJBkmhx+Mh1WpVCoWCtFot+Q+F7XYrSbzb7eRyucj5fJbT6SRpvsZhNptpJtfrVZBZ2S8WCzkejyqv12vl5/OpOmxxMchhs9lE6XqZ7HCCyA62MmCLi0EOq9UqUiyXS3m/3yqT0e12U5msYAgdNghfYozACvP5XFMdjUZ6FHg8HuuKMzI+MDI6k82fWDDQB/sSGez3e/0SK42ACMBO/ew02LwvsXayYAJER+kUxAqI1ZIggExnPsQYgRX8Brrf7+pIrQ6HgwbAAGIjI2w0gL2P1Qy9wtbX66VgMLWyOgICIHp84mIjwG/mWLySSqUimUxGyuWyNJtN1WGLi4kAPagV2u5dHPmm+LgPQJ82R6P4dDiXy0mpVJJ8Pi/ZbDZqkjXPgyUC4kzBAbULTlPsqOx/AvrUAQMIEDrc7Xal1+upTEOw2bOMPbLvlO80GQ0GA6nVasrI6HyHU7tsZPeNZwaADQdkdNjsDn7Hf7wUvmz3jGDGEmyAtseGD76W7cdLofg4UGiuBAH2lnn42GFkuzbmQwyx2DVDXkC/39cacU2m06leXmQmCKOf1cvY8DGZWDB02vh5ljQP7Rn+mofIqRPbjsHRrAR+2sRO7OFwqA58FRklexu4yJPJRJl62UBFjy8xxLJHDrQ/iX0H/U1Iiwlp/1iuRaPRkHa7LfV6XYrFYvTkEv/LcWPIGkMjOp2OHhFG/p4y3/wHBFfbIcHIViUAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/3f079cde22be6cf33b7be317492aa108/a0b58/11_1_2.webp 230w","/static/3f079cde22be6cf33b7be317492aa108/c4c4c/11_1_2.webp 301w"],"sizes":"(max-width: 301px) 100vw, 301px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/3f079cde22be6cf33b7be317492aa108/81c8e/11_1_2.png 230w","/static/3f079cde22be6cf33b7be317492aa108/fb933/11_1_2.png 301w"],"sizes":"(max-width: 301px) 100vw, 301px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/3f079cde22be6cf33b7be317492aa108/fb933/11_1_2.png","alt":"11 1 2","title":"11 1 2","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toisessa esimerkissä jokainen alkuperäisen listan alkio kerrotaan kymmenellä ja tallennetaan uuteen listaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nluvut_kerrottuna "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut_kerrottuna"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 2, 3, 4, 5, 6, 7, 8, 9]\n[10, 20, 30, 40, 50, 60, 70, 80, 90]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lauseke voi olla mikä tahansa Pythonin lauseke. Esimerkiksi koosteessa voidaan kutsua itse määriteltyä funktiota:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kertoma"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Funktio laskee positiivisen luvun n kertoman n! \"\"\""}]},{"type":"text","value":"\n k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*="}]},{"type":"text","value":" n\n n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" k\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n kertomat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"kertoma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kertomat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[120, 2, 24, 6, 1]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sama ohjelma esitettynä perinteisellä silmukalla näyttäisi tältä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kertoma"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Funktio laskee positiivisen luvun n kertoman n! \"\"\""}]},{"type":"text","value":"\n k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*="}]},{"type":"text","value":" n\n n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" k\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n kertomat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n kertomat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kertoma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kertomat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koosteen avulla on siis mahdollista ilmaista sama toiminnallisuus tiiviimmin ja silti yhä helposti luettavassa muodossa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Palauttamalla funktiosta suoraan kooste saadaan aikaiseksi hyvin tiivistä koodia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kertomat"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"kertoma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Neliojuuret","tmcname":"osa11-01_neliojuuret"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"neliojuuret(luvut: list)"}]},{"type":"text","value":", joka saa parametriksi listan kokonaislukuja. Funktio palauttaa listan parametrina olevien lukujen neliöjuurista. Neliöjuuren laskemiseen löytyy sopiva funktio moduulista "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/math.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"math"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion tulee käyttää listakoostetta. Funktion maksimipituus on siis (mukaanlukien "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":"-sanalla alkava otsikkorivi) kokonaisuudessaan kaksi riviä!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"rivit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" neliojuuret"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" rivit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1.0\n1.4142135623730951\n1.7320508075688772\n2.0"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Tähtirivit","tmcname":"osa11-02_tahtirivit"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tahtirivit(luvut: list)"}]},{"type":"text","value":", joka saa parametriksi listan kokonaislukuja. Funktio palauttaa listan, joka koostuu tähtiriveistä, joiden pituus vastaa parametrina olevan listan lukuja. Funktion tulee käyttää listakoostetta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion maksimipituus on siis (mukaanlukien "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":"-sanalla alkava otsikkorivi) kokonaisuudessaan kaksi riviä!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"rivit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tahtirivit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" rivit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nrivit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tahtirivit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" rivit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"*\n**\n***\n****\n\n****\n***\n**\n*\n**********\n"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Paras koetulos","tmcname":"osa11-03_paras_koetulos"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on valmiina luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Koesuoritus"}]},{"type":"text","value":", jolla on seuraavat julkiset attribuutit:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"arvosana1"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"arvosana2"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"arvosana3"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"parhaat_tulokset(suoritukset: list)"}]},{"type":"text","value":". Funktio saa parametrikseen listan koesuoritusolioita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa listakoostetta käyttäen uuden listan, johon on tallennettu jokaisen suorituksen paras arvosana."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion maksimipituus on siis (mukaanlukien def-sanalla alkava otsikkorivi) kokonaisuudessaan kaksi riviä!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki suorituksesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"suoritus1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Koesuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsuoritus2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Koesuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pirjo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsuoritus3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Koesuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Paavo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsuoritukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"suoritus1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" suoritus2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" suoritus3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"parhaat_tulokset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[5, 4, 3]"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Pituudet","tmcname":"osa11-04_pituudet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pituudet(listat: list)"}]},{"type":"text","value":" joka saa parametriksi listan, joka sisältää listoja, jotka sisältävät kokonaislukuja. Funktio palauttaa listan, joka sisältää parametrina olevien listojen pituudet."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio tulee toteuttaa listakoosteen avulla. Funktion maksimipituus on siis (mukaanlukien "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":"-sanalla alkava otsikkorivi) kokonaisuudessaan kaksi riviä!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"listat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"324"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"31"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pituudet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"listat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[5, 4, 0]"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"alkioiden-suodatus","style":"position:relative;"},"children":[{"type":"text","value":"Alkioiden suodatus"},{"type":"element","tagName":"a","properties":{"href":"#alkioiden-suodatus","ariaLabel":"alkioiden suodatus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellisissä esimerkeissä uusi lista muodostettiin kaikista alkuperäisen listan alkioista. Joskus on kuitenkin näppärää, jos voitaisiin valita alkuperäiseltä listalta vain tietyt alkiot. Koosteessa tämä onnistuu yhdistämällä siihen ehto-osa. Yleinen syntaksi on seuraava:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[ for in if ]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Erotuksena aiempaan koosteen loppuun kirjoitetaan siis ehtolause. Ainoastaan ne alkiot poimitaan mukaan tuloslistaan, joiden kohdalla ehtolauseke on tosi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkissä poimitaan kaikki parilliset alkiot uuteen listaan. Huomaa, että lausekkeena on esimerkissä ainoastaan listan alkio eli poimittavia alkioita ei käsitellä minkään operaation avulla ennen sijoittamista uuteen listaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nparilliset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"parilliset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[2, 4, 6, 4, 10, 12]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos lausekkeeksi on määritelty jotain muuta kuin pelkkä alkio, mukaan otetuille alkioille toteutetaan tämä operaatio kuten ennenkin. Muokataan edellistä esimerkkiä niin, että uudessa listassa on kaikki alkuperäisen listan parilliset alkiot kerrottuna kymmenellä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nparilliset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"alkio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"parilliset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[20, 40, 60, 40, 100, 120]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa esimerkissä lasketaan ainoastaan positiivisten alkioiden kertoma:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kertoma"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Funktio laskee positiivisen luvun n kertoman n! \"\"\""}]},{"type":"text","value":"\n k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*="}]},{"type":"text","value":" n\n n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" k\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n kertomat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"kertoma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kertomat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[6, 24, 120, 1]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan vielä edellisestä jatkettua esimerkkiä, jossa kertoma lasketaan vain parillisista positiivista luvuista. Lisäksi listaan tallennetaan tuplessa sekä alkuperäinen alkio että kertoma:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kertoma"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Funktio laskee positiivisen luvun n kertoman n! \"\"\""}]},{"type":"text","value":"\n k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*="}]},{"type":"text","value":" n\n n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" k\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n kertomat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kertoma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kertomat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[(2, 2), (4, 24), (6, 720)]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkissä lauseke on siis "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(luku, kertoma(luku))"}]},{"type":"text","value":", joka muodostaa tuplen, jossa ensimmäinen alkio on alkio alkuperäisestä listasta ja toinen alkio kertoma-funktion palauttama arvo. Ehtolauseke on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku > 0 and luku % 2 == 0"}]},{"type":"text","value":", jossa valikoidaan mukaan vain alkiot, jotka ovat sekä positiivisia että jaollisia kahdella."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Poista pienemmät","tmcname":"osa11-05_poista_pienemmat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"poista_pienemmat(luvut: list, raja: int)"}]},{"type":"text","value":", joka saa parametrikseen listan kokonaislukuja sekä raja-arvon, joka on myös kokonaisluku."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio muodostaa listakoostetta käyttäen uuden listan, josta on jätetty pois raja-arvoa pienemmät luvut."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion maksimipituus on siis (mukaanlukien "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":"-sanalla alkava otsikkorivi) kokonaisuudessaan kaksi riviä!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lukuja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"65"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"32"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"poista_pienemmat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lukuja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"poista_pienemmat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[65, 32, 11]\n[7, 8]"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Vokaalilla alkavat","tmcname":"osa11-06_vokaalilla_alkavat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vokaalilla_alkavat(sanat: list)"}]},{"type":"text","value":", joka saa parametrikseen listan merkkijonoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtävänäsi on listakoostetta hyödyntäen muodostaa ja palauttaa uusi lista, joka sisältää vain alkuperäisen listan ne sanat, jotka alkavat vokaalilla (a, e, i, o, u, y, ä, ö). Sekä pienien että suurten kirjaimien pitää kelvata."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion maksimipituus on (mukaanlukien "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":"-sanalla alkava otsikkorivi) kokonaisuudessaan kaksi riviä!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"klista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"auto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"mopo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Etana\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kissa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Koira\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"OMENA\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"appelsiini\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" vok "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" vokaalilla_alkavat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"klista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vok"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"auto\nEtana\nOMENA\nappelsiini"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"vaihtoehtoinen-haara-suodatuksessa","style":"position:relative;"},"children":[{"type":"text","value":"Vaihtoehtoinen haara suodatuksessa"},{"type":"element","tagName":"a","properties":{"href":"#vaihtoehtoinen-haara-suodatuksessa","ariaLabel":"vaihtoehtoinen haara suodatuksessa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koosteessa voi käyttää ehtolauseen ohella myös vaihtoehtoista haaraa. Tämä onnistuu käyttämällä jo aiemmin mainittua "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ehtolauseketta"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":" if else "}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"...joka saa arvokseen joko lausekkeen 1 tai 2 arvon riippuen siitä, onko ehto tosi vai epätosi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Niinpä esim. ohjelma, joka tulostaa kahdesta luvusta suuremman yhdellä print-lauseella voisi näyttää tältä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku 1:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluku2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku 2:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku1 "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" luku2 "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"text","value":" luku2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun yhdistetään syntaksi listakoosteeseen, saadaan seuraavankaltainen rakenne:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[ if else for in ]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lopputuloksena syntyvässä listassa on yksi alkio jokaista alkuperäisen sarjan alkiota kohti. Jokaiselle alkiolle suoritetaan joko lauseke 1 tai lauseke 2 riippuen siitä onko ehtolauseke tosi vai ei."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava esimerkki muodostaa uuden listan, jossa alkuperäisen listan negatiiviset alkiot on käännetty vastaluvuikseen - positiiviset alkiot kelpuutetaan sellaisenaan. Käytännössä koostelause siis muodostaa listan alkuperäisen listan itseisarvoista."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\nluvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"45"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"110"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nitseisarvot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"itseisarvot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 3, 45, 110, 2, 9, 11]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Suoritettava lauseke on siis "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku"}]},{"type":"text","value":" (eli alkio sellaisenaan), jos ehto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku >= 0"}]},{"type":"text","value":" on tosi, muuten suoritetaan lauseke "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"-luku"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa esimerkissä funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"merkkijonojen_pituudet"}]},{"type":"text","value":" saa parametrikseen sekalaisia alkioita sisältävän listan. Funktio laskee merkkijonoista tuloslistaan pituuden, muun tyyppisten alkioiden kohdalle asetetaan -1."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"merkkijonojen_pituudet"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Funktio palauttaa uudessa listassa merkkijonojen pituudet \"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n testilista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"moi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kaikki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"123.344"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"heipparallaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n pituudet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" merkkijonojen_pituudet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"testilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pituudet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[3, -1, -1, 6, -1, 12, -1, -1]"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Lottorivi","tmcname":"osa11-07_lottorivi"},"children":[{"type":"element","tagName":"h2","properties":{"id":"lottorivi-osa-1","style":"position:relative;"},"children":[{"type":"text","value":"Lottorivi, osa 1"},{"type":"element","tagName":"a","properties":{"href":"#lottorivi-osa-1","ariaLabel":"lottorivi osa 1 permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lottorivi"}]},{"type":"text","value":", joka saa konstruktorissaan parametrikseen kierroksen numeron (kokonaisluku) sekä seitsemänalkioisen kokonaislukulistan. Lista kuvaa kierroksen oikeita numeroita (eli oikeaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"riviä"}]},{"type":"text","value":"). Kirjoita lisäksi luokalle metodi"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"osumien_maara(pelattu_rivi: list)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"...joka palauttaa kokonaislukuna tiedon siitä, kuinka monta osumaa rivissä oli. Metodin tulee käyttää listakoostetta! Metodin pituus kokonaisuudessaan (def-rivi mukaanlukien) saa olla korkeintaan 2 riviä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki luokan käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"oikea "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Lottorivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\noma_rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"13"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"19"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"oikea"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"osumien_maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"oma_rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3"}]}]},{"type":"element","tagName":"h2","properties":{"id":"lottorivi-osa-2","style":"position:relative;"},"children":[{"type":"text","value":"Lottorivi, osa 2"},{"type":"element","tagName":"a","properties":{"href":"#lottorivi-osa-2","ariaLabel":"lottorivi osa 2 permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita luokkaan metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"osumat_paikoillaan(pelattu_rivi)"}]},{"type":"text","value":", joka palauttaa uuden listan. Uudessa listassa on vanhoilla paikoillaan oikeat numerot (eli ne, jotka löytyvät myös oikeasta rivistä), muiden paikalla on -1."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodin tulee käyttää listakoostetta. Metodin pituus kokonaisuudessaan (def-rivi mukaanlukien) saa olla korkeintaan 2 riviä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki metodin käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"oikea "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Lottorivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"30"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"33"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\noma_rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"30"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"oikea"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"osumat_paikoillaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"oma_rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, -1, -1, 10, -1, 20, 30]"}]}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät mitä tarkoitetaan koosteella (comprehension)
  • \n
  • Osaat hyödyntää koosteita uusien listojen muodostamiseen
  • \n

Ohjelmointiin liittyy usein erilaisten sekvenssien (eli sarjojen) käsittely. Aikaisemmissa osissa on käytetty runsaasti aikaa merkkijonojen, listojen ja sanakirjojen käsittelyyn eri tavoilla.

Oletetaan tilanne, jossa meillä on lista kokonaislukuja. Tämän listan perusteella meidän pitäisi luoda vastaava merkkijonolista.

Perinteinen tapa toteuttaa operaatio näyttäisi esimerkiksi tältä:

luvut = [1, 2, 3, 6, 5, 4, 7]\n\nmerkkijonot = []\nfor luku in luvut:\n    merkkijonot.append(str(luku))

Listakooste

Python tarjoaa kuitenin \"pythonmaisemman\" tavan uuden listan muodostamiseksi vanhan perusteella. Menetelmää voidaan kutsua \"listakoosteeksi\", mutta huomattavasti yleisempää on käyttää englanninkielistä nimeä list comprehension.

Menetelmässä ideana on kuvata yhden rivin lausekkeella, mikä operaatio listan kaikille alkioille tehdään, ennen kuin ne tallennetaan uuteen listaan.

Esimerkiksi yllä esitetty ohjelma, joka luo merkkijonolistan kokonaislukulistan perusteella, näyttäisi listakoostetta hyödyntäen tältä:

luvut = [1, 2, 3, 6, 5, 4, 7]\nmerkkijonot = [str(luku) for luku in luvut]

Koosteessa näyttää siis olevan jotakuinkin samat elementit kuin perinteisessäkin toteutuksessa, mutta syntaksi on uudenlainen. Yleisemmin listakoosteen syntaksi voitaisiin esittää esimerkiksi näin:

[<lauseke> for <alkio> in <sarja>]

Koosteen ympärillä olevat hakasulkeet kertovat, että lopputuloksena on uusi lista. Koosteessa poimitaan yksi kerrallaan alkio alkuperäisestä sarjasta (esimerkkimme tapauksessa listasta) ja tallennetaan siihen liittyvän lausekkeen arvo uuteen listaan. Lopputuloksena on lista, jossa on yhtä paljon alkioita kuin alkuperäisessä listassa ja kaikki alkiot on käsitelty samalla tavalla.

\n \n

Tee funktio neliojuuret(luvut: list), joka saa parametriksi listan kokonaislukuja. Funktio palauttaa listan parametrina olevien lukujen neliöjuurista. Neliöjuuren laskemiseen löytyy sopiva funktio moduulista math

Funktion tulee käyttää listakoostetta. Funktion maksimipituus on siis (mukaanlukien def-sanalla alkava otsikkorivi) kokonaisuudessaan kaksi riviä!

Funktio toimii seuraavasti:

rivit = neliojuuret([1,2,3,4])\nfor rivi in rivit:\n    print(rivi)

1.0\n1.4142135623730951\n1.7320508075688772\n2.0

Tee funktio tahtirivit(luvut: list), joka saa parametriksi listan kokonaislukuja. Funktio palauttaa listan, joka koostuu tähtiriveistä, joiden pituus vastaa parametrina olevan listan lukuja. Funktion tulee käyttää listakoostetta.

Funktion maksimipituus on siis (mukaanlukien def-sanalla alkava otsikkorivi) kokonaisuudessaan kaksi riviä!

Funktio toimii seuraavasti:

rivit = tahtirivit([1,2,3,4])\nfor rivi in rivit:\n    print(rivi)\n\nprint()\n\nrivit = tahtirivit([4, 3, 2, 1, 10])\nfor rivi in rivit:\n    print(rivi)
\n*\n**\n***\n****\n\n****\n***\n**\n*\n**********\n

Tehtäväpohjassa on valmiina luokka Koesuoritus, jolla on seuraavat julkiset attribuutit:

    \n
  • nimi
  • \n
  • arvosana1
  • \n
  • arvosana2
  • \n
  • arvosana3
  • \n

Kirjoita funktio parhaat_tulokset(suoritukset: list). Funktio saa parametrikseen listan koesuoritusolioita.

Funktio palauttaa listakoostetta käyttäen uuden listan, johon on tallennettu jokaisen suorituksen paras arvosana.

Funktion maksimipituus on siis (mukaanlukien def-sanalla alkava otsikkorivi) kokonaisuudessaan kaksi riviä!

Esimerkki suorituksesta:

suoritus1 = Koesuoritus(\"Pekka\",5,3,4)\nsuoritus2 = Koesuoritus(\"Pirjo\",3,4,1)\nsuoritus3 = Koesuoritus(\"Paavo\",2,1,3)\nsuoritukset = [suoritus1, suoritus2, suoritus3]\nprint(parhaat_tulokset(suoritukset))

[5, 4, 3]

Tee funktio pituudet(listat: list) joka saa parametriksi listan, joka sisältää listoja, jotka sisältävät kokonaislukuja. Funktio palauttaa listan, joka sisältää parametrina olevien listojen pituudet.

Funktio tulee toteuttaa listakoosteen avulla. Funktion maksimipituus on siis (mukaanlukien def-sanalla alkava otsikkorivi) kokonaisuudessaan kaksi riviä!

Funktio toimii seuraavasti

listat = [[1,2,3,4,5], [324, -1, 31, 7],[]]\nprint(pituudet(listat))

[5, 4, 0]

Alkioiden suodatus

Edellisissä esimerkeissä uusi lista muodostettiin kaikista alkuperäisen listan alkioista. Joskus on kuitenkin näppärää, jos voitaisiin valita alkuperäiseltä listalta vain tietyt alkiot. Koosteessa tämä onnistuu yhdistämällä siihen ehto-osa. Yleinen syntaksi on seuraava:

[<lauseke> for <alkio> in <sarja> if <ehtolauseke>]

Erotuksena aiempaan koosteen loppuun kirjoitetaan siis ehtolause. Ainoastaan ne alkiot poimitaan mukaan tuloslistaan, joiden kohdalla ehtolauseke on tosi.

Esimerkissä poimitaan kaikki parilliset alkiot uuteen listaan. Huomaa, että lausekkeena on esimerkissä ainoastaan listan alkio eli poimittavia alkioita ei käsitellä minkään operaation avulla ennen sijoittamista uuteen listaan:

lista = [1, 1, 2, 3, 4, 6, 4, 5, 7, 10, 12, 3]\n\nparilliset = [alkio for alkio in lista if alkio % 2 == 0]\nprint(parilliset)

[2, 4, 6, 4, 10, 12]

Jos lausekkeeksi on määritelty jotain muuta kuin pelkkä alkio, mukaan otetuille alkioille toteutetaan tämä operaatio kuten ennenkin. Muokataan edellistä esimerkkiä niin, että uudessa listassa on kaikki alkuperäisen listan parilliset alkiot kerrottuna kymmenellä:

lista = [1, 1, 2, 3, 4, 6, 4, 5, 7, 10, 12, 3]\n\nparilliset = [alkio * 10 for alkio in lista if alkio % 2 == 0]\nprint(parilliset)

[20, 40, 60, 40, 100, 120]

Seuraavassa esimerkissä lasketaan ainoastaan positiivisten alkioiden kertoma:

def kertoma(n: int):\n    \"\"\" Funktio laskee positiivisen luvun n kertoman n! \"\"\"\n    k = 1\n    while n >= 2:\n        k *= n\n        n -= 1\n    return k\n\nif __name__ == \"__main__\":\n    lista = [-2, 3, -1, 4, -10, 5, 1]\n    kertomat = [kertoma(luku) for luku in lista if luku > 0]\n    print(kertomat)

[6, 24, 120, 1]

Tarkastellaan vielä edellisestä jatkettua esimerkkiä, jossa kertoma lasketaan vain parillisista positiivista luvuista. Lisäksi listaan tallennetaan tuplessa sekä alkuperäinen alkio että kertoma:

\ndef kertoma(n: int):\n    \"\"\" Funktio laskee positiivisen luvun n kertoman n! \"\"\"\n    k = 1\n    while n >= 2:\n        k *= n\n        n -= 1\n    return k\n\nif __name__ == \"__main__\":\n    lista = [-2, 3, 2, 1, 4, -10, 5, 1, 6]\n    kertomat = [(luku, kertoma(luku)) for luku in lista if luku > 0 and luku % 2 == 0]\n    print(kertomat)\n

[(2, 2), (4, 24), (6, 720)]

Esimerkissä lauseke on siis (luku, kertoma(luku)), joka muodostaa tuplen, jossa ensimmäinen alkio on alkio alkuperäisestä listasta ja toinen alkio kertoma-funktion palauttama arvo. Ehtolauseke on luku > 0 and luku % 2 == 0, jossa valikoidaan mukaan vain alkiot, jotka ovat sekä positiivisia että jaollisia kahdella.

Kirjoita funktio poista_pienemmat(luvut: list, raja: int), joka saa parametrikseen listan kokonaislukuja sekä raja-arvon, joka on myös kokonaisluku.

Funktio muodostaa listakoostetta käyttäen uuden listan, josta on jätetty pois raja-arvoa pienemmät luvut.

Funktion maksimipituus on siis (mukaanlukien def-sanalla alkava otsikkorivi) kokonaisuudessaan kaksi riviä!

Esimerkki funktion käytöstä:

lukuja = [1,65, 32, -6, 9, 11]\nprint(poista_pienemmat(lukuja, 10))\n\nprint(poista_pienemmat([-4, 7, 8, -100], 0))

[65, 32, 11]\n[7, 8]

Kirjoita funktio vokaalilla_alkavat(sanat: list), joka saa parametrikseen listan merkkijonoja.

Tehtävänäsi on listakoostetta hyödyntäen muodostaa ja palauttaa uusi lista, joka sisältää vain alkuperäisen listan ne sanat, jotka alkavat vokaalilla (a, e, i, o, u, y, ä, ö). Sekä pienien että suurten kirjaimien pitää kelvata.

Funktion maksimipituus on (mukaanlukien def-sanalla alkava otsikkorivi) kokonaisuudessaan kaksi riviä!

Esimerkki funktion käytöstä:

klista = [\"auto\",\"mopo\",\"Etana\",\"kissa\",\"Koira\",\"OMENA\",\"appelsiini\"]\nfor vok in vokaalilla_alkavat(klista):\n    print(vok)

auto\nEtana\nOMENA\nappelsiini

Vaihtoehtoinen haara suodatuksessa

Koosteessa voi käyttää ehtolauseen ohella myös vaihtoehtoista haaraa. Tämä onnistuu käyttämällä jo aiemmin mainittua ehtolauseketta:

<lauseke 1> if <ehto> else <lauseke 2>

...joka saa arvokseen joko lausekkeen 1 tai 2 arvon riippuen siitä, onko ehto tosi vai epätosi.

Niinpä esim. ohjelma, joka tulostaa kahdesta luvusta suuremman yhdellä print-lauseella voisi näyttää tältä:

luku1 = int(input(\"Anna luku 1:\"))\nluku2 = int(input(\"Anna luku 2:\"))\nprint (luku1 if luku1 > luku2 else luku2)

Kun yhdistetään syntaksi listakoosteeseen, saadaan seuraavankaltainen rakenne:

[<lauseke 1> if <ehto> else <lauseke 2> for <alkio> in <sarja>]

Lopputuloksena syntyvässä listassa on yksi alkio jokaista alkuperäisen sarjan alkiota kohti. Jokaiselle alkiolle suoritetaan joko lauseke 1 tai lauseke 2 riippuen siitä onko ehtolauseke tosi vai ei.

Seuraava esimerkki muodostaa uuden listan, jossa alkuperäisen listan negatiiviset alkiot on käännetty vastaluvuikseen - positiiviset alkiot kelpuutetaan sellaisenaan. Käytännössä koostelause siis muodostaa listan alkuperäisen listan itseisarvoista.

\nluvut = [1, -3, 45, -110, 2, 9, -11]\nitseisarvot = [luku if luku >= 0 else -luku for luku in luvut]\nprint(itseisarvot)\n

[1, 3, 45, 110, 2, 9, 11]

Suoritettava lauseke on siis luku (eli alkio sellaisenaan), jos ehto luku >= 0 on tosi, muuten suoritetaan lauseke -luku.

Seuraavassa esimerkissä funktio merkkijonojen_pituudet saa parametrikseen sekalaisia alkioita sisältävän listan. Funktio laskee merkkijonoista tuloslistaan pituuden, muun tyyppisten alkioiden kohdalle asetetaan -1.

\ndef merkkijonojen_pituudet(lista: list):\n    \"\"\" Funktio palauttaa uudessa listassa merkkijonojen pituudet \"\"\"\n    return [len(alkio) if type(alkio) == str else -1 for alkio in lista]\n\nif __name__ == \"__main__\":\n    testilista = [\"moi\", 3, True, \"kaikki\", -123.344, \"heipparallaa\", 2, False]\n    pituudet = merkkijonojen_pituudet(testilista)\n    print(pituudet)\n

[3, -1, -1, 6, -1, 12, -1, -1]

Lottorivi, osa 1

Kirjoita luokka Lottorivi, joka saa konstruktorissaan parametrikseen kierroksen numeron (kokonaisluku) sekä seitsemänalkioisen kokonaislukulistan. Lista kuvaa kierroksen oikeita numeroita (eli oikeaa riviä). Kirjoita lisäksi luokalle metodi

osumien_maara(pelattu_rivi: list)

...joka palauttaa kokonaislukuna tiedon siitä, kuinka monta osumaa rivissä oli. Metodin tulee käyttää listakoostetta! Metodin pituus kokonaisuudessaan (def-rivi mukaanlukien) saa olla korkeintaan 2 riviä.

Esimerkki luokan käytöstä:

oikea = Lottorivi(5, [1,2,3,4,5,6,7])\noma_rivi = [1,4,7,11,13,19,24]\n\nprint(oikea.osumien_maara(oma_rivi))

3

Lottorivi, osa 2

Kirjoita luokkaan metodi osumat_paikoillaan(pelattu_rivi), joka palauttaa uuden listan. Uudessa listassa on vanhoilla paikoillaan oikeat numerot (eli ne, jotka löytyvät myös oikeasta rivistä), muiden paikalla on -1.

Metodin tulee käyttää listakoostetta. Metodin pituus kokonaisuudessaan (def-rivi mukaanlukien) saa olla korkeintaan 2 riviä.

Esimerkki metodin käytöstä:

oikea = Lottorivi(8, [1,2,3,10,20,30,33])\noma_rivi = [1,4,7,10,11,20,30]\n\nprint(oikea.osumat_paikoillaan(oma_rivi))

[1, -1, -1, 10, -1, 20, 30]

","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-11/1-koosteet.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät mitä tarkoitetaan koosteella (comprehension)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat hyödyntää koosteita uusien listojen muodostamiseen"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmointiin liittyy usein erilaisten sekvenssien (eli sarjojen) käsittely. Aikaisemmissa osissa on käytetty runsaasti aikaa merkkijonojen, listojen ja sanakirjojen käsittelyyn eri tavoilla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oletetaan tilanne, jossa meillä on lista kokonaislukuja. Tämän listan perusteella meidän pitäisi luoda vastaava merkkijonolista."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Perinteinen tapa toteuttaa operaatio näyttäisi esimerkiksi tältä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nmerkkijonot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n merkkijonot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"listakooste","style":"position:relative;"},"children":[{"type":"text","value":"Listakooste"},{"type":"element","tagName":"a","properties":{"href":"#listakooste","ariaLabel":"listakooste permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python tarjoaa kuitenin \"pythonmaisemman\" tavan uuden listan muodostamiseksi vanhan perusteella. Menetelmää voidaan kutsua \"listakoosteeksi\", mutta huomattavasti yleisempää on käyttää englanninkielistä nimeä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"list comprehension"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Menetelmässä ideana on kuvata yhden rivin lausekkeella, mikä operaatio listan kaikille alkioille tehdään, ennen kuin ne tallennetaan uuteen listaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi yllä esitetty ohjelma, joka luo merkkijonolistan kokonaislukulistan perusteella, näyttäisi listakoostetta hyödyntäen tältä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nmerkkijonot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koosteessa näyttää siis olevan jotakuinkin samat elementit kuin perinteisessäkin toteutuksessa, mutta syntaksi on uudenlainen. Yleisemmin listakoosteen syntaksi voitaisiin esittää esimerkiksi näin:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[ for in ]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koosteen ympärillä olevat hakasulkeet kertovat, että lopputuloksena on uusi lista. Koosteessa poimitaan yksi kerrallaan alkio alkuperäisestä sarjasta (esimerkkimme tapauksessa listasta) ja tallennetaan siihen liittyvän lausekkeen arvo uuteen listaan. Lopputuloksena on lista, jossa on yhtä paljon alkioita kuin alkuperäisessä listassa ja kaikki alkiot on käsitelty samalla tavalla."}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 301px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/3f079cde22be6cf33b7be317492aa108/fb933/11_1_2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 131.7391304347826%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAaCAYAAAC3g3x9AAAACXBIWXMAAAsTAAALEwEAmpwYAAACRUlEQVRIx42V16oCQQyG5/0fyStBRUQUbCCiggWx995y+AJZouyuJxAmk/JvJpnJBkmhx+Mh1WpVCoWCtFot+Q+F7XYrSbzb7eRyucj5fJbT6SRpvsZhNptpJtfrVZBZ2S8WCzkejyqv12vl5/OpOmxxMchhs9lE6XqZ7HCCyA62MmCLi0EOq9UqUiyXS3m/3yqT0e12U5msYAgdNghfYozACvP5XFMdjUZ6FHg8HuuKMzI+MDI6k82fWDDQB/sSGez3e/0SK42ACMBO/ew02LwvsXayYAJER+kUxAqI1ZIggExnPsQYgRX8Brrf7+pIrQ6HgwbAAGIjI2w0gL2P1Qy9wtbX66VgMLWyOgICIHp84mIjwG/mWLySSqUimUxGyuWyNJtN1WGLi4kAPagV2u5dHPmm+LgPQJ82R6P4dDiXy0mpVJJ8Pi/ZbDZqkjXPgyUC4kzBAbULTlPsqOx/AvrUAQMIEDrc7Xal1+upTEOw2bOMPbLvlO80GQ0GA6nVasrI6HyHU7tsZPeNZwaADQdkdNjsDn7Hf7wUvmz3jGDGEmyAtseGD76W7cdLofg4UGiuBAH2lnn42GFkuzbmQwyx2DVDXkC/39cacU2m06leXmQmCKOf1cvY8DGZWDB02vh5ljQP7Rn+mofIqRPbjsHRrAR+2sRO7OFwqA58FRklexu4yJPJRJl62UBFjy8xxLJHDrQ/iX0H/U1Iiwlp/1iuRaPRkHa7LfV6XYrFYvTkEv/LcWPIGkMjOp2OHhFG/p4y3/wHBFfbIcHIViUAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/3f079cde22be6cf33b7be317492aa108/a0b58/11_1_2.webp 230w","/static/3f079cde22be6cf33b7be317492aa108/c4c4c/11_1_2.webp 301w"],"sizes":"(max-width: 301px) 100vw, 301px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/3f079cde22be6cf33b7be317492aa108/81c8e/11_1_2.png 230w","/static/3f079cde22be6cf33b7be317492aa108/fb933/11_1_2.png 301w"],"sizes":"(max-width: 301px) 100vw, 301px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/3f079cde22be6cf33b7be317492aa108/fb933/11_1_2.png","alt":"11 1 2","title":"11 1 2","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toisessa esimerkissä jokainen alkuperäisen listan alkio kerrotaan kymmenellä ja tallennetaan uuteen listaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nluvut_kerrottuna "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut_kerrottuna"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 2, 3, 4, 5, 6, 7, 8, 9]\n[10, 20, 30, 40, 50, 60, 70, 80, 90]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lauseke voi olla mikä tahansa Pythonin lauseke. Esimerkiksi koosteessa voidaan kutsua itse määriteltyä funktiota:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kertoma"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Funktio laskee positiivisen luvun n kertoman n! \"\"\""}]},{"type":"text","value":"\n k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*="}]},{"type":"text","value":" n\n n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" k\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n kertomat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"kertoma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kertomat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[120, 2, 24, 6, 1]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sama ohjelma esitettynä perinteisellä silmukalla näyttäisi tältä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kertoma"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Funktio laskee positiivisen luvun n kertoman n! \"\"\""}]},{"type":"text","value":"\n k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*="}]},{"type":"text","value":" n\n n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" k\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n kertomat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n kertomat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kertoma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kertomat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koosteen avulla on siis mahdollista ilmaista sama toiminnallisuus tiiviimmin ja silti yhä helposti luettavassa muodossa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Palauttamalla funktiosta suoraan kooste saadaan aikaiseksi hyvin tiivistä koodia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kertomat"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"kertoma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Neliojuuret","tmcname":"osa11-01_neliojuuret"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"neliojuuret(luvut: list)"}]},{"type":"text","value":", joka saa parametriksi listan kokonaislukuja. Funktio palauttaa listan parametrina olevien lukujen neliöjuurista. Neliöjuuren laskemiseen löytyy sopiva funktio moduulista "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/math.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"math"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion tulee käyttää listakoostetta. Funktion maksimipituus on siis (mukaanlukien "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":"-sanalla alkava otsikkorivi) kokonaisuudessaan kaksi riviä!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"rivit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" neliojuuret"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" rivit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1.0\n1.4142135623730951\n1.7320508075688772\n2.0"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Tähtirivit","tmcname":"osa11-02_tahtirivit"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tahtirivit(luvut: list)"}]},{"type":"text","value":", joka saa parametriksi listan kokonaislukuja. Funktio palauttaa listan, joka koostuu tähtiriveistä, joiden pituus vastaa parametrina olevan listan lukuja. Funktion tulee käyttää listakoostetta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion maksimipituus on siis (mukaanlukien "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":"-sanalla alkava otsikkorivi) kokonaisuudessaan kaksi riviä!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"rivit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tahtirivit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" rivit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nrivit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tahtirivit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" rivit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"*\n**\n***\n****\n\n****\n***\n**\n*\n**********\n"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Paras koetulos","tmcname":"osa11-03_paras_koetulos"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on valmiina luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Koesuoritus"}]},{"type":"text","value":", jolla on seuraavat julkiset attribuutit:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"arvosana1"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"arvosana2"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"arvosana3"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"parhaat_tulokset(suoritukset: list)"}]},{"type":"text","value":". Funktio saa parametrikseen listan koesuoritusolioita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa listakoostetta käyttäen uuden listan, johon on tallennettu jokaisen suorituksen paras arvosana."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion maksimipituus on siis (mukaanlukien def-sanalla alkava otsikkorivi) kokonaisuudessaan kaksi riviä!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki suorituksesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"suoritus1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Koesuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsuoritus2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Koesuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pirjo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsuoritus3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Koesuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Paavo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsuoritukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"suoritus1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" suoritus2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" suoritus3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"parhaat_tulokset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[5, 4, 3]"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Pituudet","tmcname":"osa11-04_pituudet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pituudet(listat: list)"}]},{"type":"text","value":" joka saa parametriksi listan, joka sisältää listoja, jotka sisältävät kokonaislukuja. Funktio palauttaa listan, joka sisältää parametrina olevien listojen pituudet."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio tulee toteuttaa listakoosteen avulla. Funktion maksimipituus on siis (mukaanlukien "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":"-sanalla alkava otsikkorivi) kokonaisuudessaan kaksi riviä!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"listat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"324"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"31"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pituudet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"listat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[5, 4, 0]"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"alkioiden-suodatus","style":"position:relative;"},"children":[{"type":"text","value":"Alkioiden suodatus"},{"type":"element","tagName":"a","properties":{"href":"#alkioiden-suodatus","ariaLabel":"alkioiden suodatus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellisissä esimerkeissä uusi lista muodostettiin kaikista alkuperäisen listan alkioista. Joskus on kuitenkin näppärää, jos voitaisiin valita alkuperäiseltä listalta vain tietyt alkiot. Koosteessa tämä onnistuu yhdistämällä siihen ehto-osa. Yleinen syntaksi on seuraava:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[ for in if ]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Erotuksena aiempaan koosteen loppuun kirjoitetaan siis ehtolause. Ainoastaan ne alkiot poimitaan mukaan tuloslistaan, joiden kohdalla ehtolauseke on tosi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkissä poimitaan kaikki parilliset alkiot uuteen listaan. Huomaa, että lausekkeena on esimerkissä ainoastaan listan alkio eli poimittavia alkioita ei käsitellä minkään operaation avulla ennen sijoittamista uuteen listaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nparilliset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"parilliset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[2, 4, 6, 4, 10, 12]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos lausekkeeksi on määritelty jotain muuta kuin pelkkä alkio, mukaan otetuille alkioille toteutetaan tämä operaatio kuten ennenkin. Muokataan edellistä esimerkkiä niin, että uudessa listassa on kaikki alkuperäisen listan parilliset alkiot kerrottuna kymmenellä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nparilliset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"alkio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"parilliset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[20, 40, 60, 40, 100, 120]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa esimerkissä lasketaan ainoastaan positiivisten alkioiden kertoma:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kertoma"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Funktio laskee positiivisen luvun n kertoman n! \"\"\""}]},{"type":"text","value":"\n k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*="}]},{"type":"text","value":" n\n n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" k\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n kertomat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"kertoma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kertomat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[6, 24, 120, 1]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan vielä edellisestä jatkettua esimerkkiä, jossa kertoma lasketaan vain parillisista positiivista luvuista. Lisäksi listaan tallennetaan tuplessa sekä alkuperäinen alkio että kertoma:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kertoma"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Funktio laskee positiivisen luvun n kertoman n! \"\"\""}]},{"type":"text","value":"\n k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*="}]},{"type":"text","value":" n\n n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" k\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n kertomat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kertoma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kertomat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[(2, 2), (4, 24), (6, 720)]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkissä lauseke on siis "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(luku, kertoma(luku))"}]},{"type":"text","value":", joka muodostaa tuplen, jossa ensimmäinen alkio on alkio alkuperäisestä listasta ja toinen alkio kertoma-funktion palauttama arvo. Ehtolauseke on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku > 0 and luku % 2 == 0"}]},{"type":"text","value":", jossa valikoidaan mukaan vain alkiot, jotka ovat sekä positiivisia että jaollisia kahdella."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Poista pienemmät","tmcname":"osa11-05_poista_pienemmat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"poista_pienemmat(luvut: list, raja: int)"}]},{"type":"text","value":", joka saa parametrikseen listan kokonaislukuja sekä raja-arvon, joka on myös kokonaisluku."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio muodostaa listakoostetta käyttäen uuden listan, josta on jätetty pois raja-arvoa pienemmät luvut."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion maksimipituus on siis (mukaanlukien "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":"-sanalla alkava otsikkorivi) kokonaisuudessaan kaksi riviä!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lukuja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"65"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"32"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"poista_pienemmat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lukuja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"poista_pienemmat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[65, 32, 11]\n[7, 8]"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Vokaalilla alkavat","tmcname":"osa11-06_vokaalilla_alkavat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vokaalilla_alkavat(sanat: list)"}]},{"type":"text","value":", joka saa parametrikseen listan merkkijonoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtävänäsi on listakoostetta hyödyntäen muodostaa ja palauttaa uusi lista, joka sisältää vain alkuperäisen listan ne sanat, jotka alkavat vokaalilla (a, e, i, o, u, y, ä, ö). Sekä pienien että suurten kirjaimien pitää kelvata."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion maksimipituus on (mukaanlukien "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":"-sanalla alkava otsikkorivi) kokonaisuudessaan kaksi riviä!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"klista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"auto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"mopo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Etana\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kissa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Koira\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"OMENA\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"appelsiini\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" vok "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" vokaalilla_alkavat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"klista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vok"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"auto\nEtana\nOMENA\nappelsiini"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"vaihtoehtoinen-haara-suodatuksessa","style":"position:relative;"},"children":[{"type":"text","value":"Vaihtoehtoinen haara suodatuksessa"},{"type":"element","tagName":"a","properties":{"href":"#vaihtoehtoinen-haara-suodatuksessa","ariaLabel":"vaihtoehtoinen haara suodatuksessa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koosteessa voi käyttää ehtolauseen ohella myös vaihtoehtoista haaraa. Tämä onnistuu käyttämällä jo aiemmin mainittua "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ehtolauseketta"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":" if else "}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"...joka saa arvokseen joko lausekkeen 1 tai 2 arvon riippuen siitä, onko ehto tosi vai epätosi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Niinpä esim. ohjelma, joka tulostaa kahdesta luvusta suuremman yhdellä print-lauseella voisi näyttää tältä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku 1:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluku2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku 2:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku1 "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" luku2 "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"text","value":" luku2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun yhdistetään syntaksi listakoosteeseen, saadaan seuraavankaltainen rakenne:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[ if else for in ]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lopputuloksena syntyvässä listassa on yksi alkio jokaista alkuperäisen sarjan alkiota kohti. Jokaiselle alkiolle suoritetaan joko lauseke 1 tai lauseke 2 riippuen siitä onko ehtolauseke tosi vai ei."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava esimerkki muodostaa uuden listan, jossa alkuperäisen listan negatiiviset alkiot on käännetty vastaluvuikseen - positiiviset alkiot kelpuutetaan sellaisenaan. Käytännössä koostelause siis muodostaa listan alkuperäisen listan itseisarvoista."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\nluvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"45"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"110"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nitseisarvot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"itseisarvot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 3, 45, 110, 2, 9, 11]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Suoritettava lauseke on siis "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku"}]},{"type":"text","value":" (eli alkio sellaisenaan), jos ehto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku >= 0"}]},{"type":"text","value":" on tosi, muuten suoritetaan lauseke "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"-luku"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa esimerkissä funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"merkkijonojen_pituudet"}]},{"type":"text","value":" saa parametrikseen sekalaisia alkioita sisältävän listan. Funktio laskee merkkijonoista tuloslistaan pituuden, muun tyyppisten alkioiden kohdalle asetetaan -1."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"merkkijonojen_pituudet"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Funktio palauttaa uudessa listassa merkkijonojen pituudet \"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n testilista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"moi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kaikki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"123.344"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"heipparallaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n pituudet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" merkkijonojen_pituudet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"testilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pituudet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[3, -1, -1, 6, -1, 12, -1, -1]"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Lottorivi","tmcname":"osa11-07_lottorivi"},"children":[{"type":"element","tagName":"h2","properties":{"id":"lottorivi-osa-1","style":"position:relative;"},"children":[{"type":"text","value":"Lottorivi, osa 1"},{"type":"element","tagName":"a","properties":{"href":"#lottorivi-osa-1","ariaLabel":"lottorivi osa 1 permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lottorivi"}]},{"type":"text","value":", joka saa konstruktorissaan parametrikseen kierroksen numeron (kokonaisluku) sekä seitsemänalkioisen kokonaislukulistan. Lista kuvaa kierroksen oikeita numeroita (eli oikeaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"riviä"}]},{"type":"text","value":"). Kirjoita lisäksi luokalle metodi"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"osumien_maara(pelattu_rivi: list)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"...joka palauttaa kokonaislukuna tiedon siitä, kuinka monta osumaa rivissä oli. Metodin tulee käyttää listakoostetta! Metodin pituus kokonaisuudessaan (def-rivi mukaanlukien) saa olla korkeintaan 2 riviä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki luokan käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"oikea "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Lottorivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\noma_rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"13"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"19"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"oikea"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"osumien_maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"oma_rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3"}]}]},{"type":"element","tagName":"h2","properties":{"id":"lottorivi-osa-2","style":"position:relative;"},"children":[{"type":"text","value":"Lottorivi, osa 2"},{"type":"element","tagName":"a","properties":{"href":"#lottorivi-osa-2","ariaLabel":"lottorivi osa 2 permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita luokkaan metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"osumat_paikoillaan(pelattu_rivi)"}]},{"type":"text","value":", joka palauttaa uuden listan. Uudessa listassa on vanhoilla paikoillaan oikeat numerot (eli ne, jotka löytyvät myös oikeasta rivistä), muiden paikalla on -1."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodin tulee käyttää listakoostetta. Metodin pituus kokonaisuudessaan (def-rivi mukaanlukien) saa olla korkeintaan 2 riviä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki metodin käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"oikea "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Lottorivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"30"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"33"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\noma_rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"30"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"oikea"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"osumat_paikoillaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"oma_rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, -1, -1, 10, -1, 20, 30]"}]}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät mitä tarkoitetaan koosteella (comprehension)
  • \n
  • Osaat hyödyntää koosteita uusien listojen muodostamiseen
  • \n

Ohjelmointiin liittyy usein erilaisten sekvenssien (eli sarjojen) käsittely. Aikaisemmissa osissa on käytetty runsaasti aikaa merkkijonojen, listojen ja sanakirjojen käsittelyyn eri tavoilla.

Oletetaan tilanne, jossa meillä on lista kokonaislukuja. Tämän listan perusteella meidän pitäisi luoda vastaava merkkijonolista.

Perinteinen tapa toteuttaa operaatio näyttäisi esimerkiksi tältä:

luvut = [1, 2, 3, 6, 5, 4, 7]\n\nmerkkijonot = []\nfor luku in luvut:\n    merkkijonot.append(str(luku))

Listakooste

Python tarjoaa kuitenin \"pythonmaisemman\" tavan uuden listan muodostamiseksi vanhan perusteella. Menetelmää voidaan kutsua \"listakoosteeksi\", mutta huomattavasti yleisempää on käyttää englanninkielistä nimeä list comprehension.

Menetelmässä ideana on kuvata yhden rivin lausekkeella, mikä operaatio listan kaikille alkioille tehdään, ennen kuin ne tallennetaan uuteen listaan.

Esimerkiksi yllä esitetty ohjelma, joka luo merkkijonolistan kokonaislukulistan perusteella, näyttäisi listakoostetta hyödyntäen tältä:

luvut = [1, 2, 3, 6, 5, 4, 7]\nmerkkijonot = [str(luku) for luku in luvut]

Koosteessa näyttää siis olevan jotakuinkin samat elementit kuin perinteisessäkin toteutuksessa, mutta syntaksi on uudenlainen. Yleisemmin listakoosteen syntaksi voitaisiin esittää esimerkiksi näin:

[<lauseke> for <alkio> in <sarja>]

Koosteen ympärillä olevat hakasulkeet kertovat, että lopputuloksena on uusi lista. Koosteessa poimitaan yksi kerrallaan alkio alkuperäisestä sarjasta (esimerkkimme tapauksessa listasta) ja tallennetaan siihen liittyvän lausekkeen arvo uuteen listaan. Lopputuloksena on lista, jossa on yhtä paljon alkioita kuin alkuperäisessä listassa ja kaikki alkiot on käsitelty samalla tavalla.

\n \n

Tee funktio neliojuuret(luvut: list), joka saa parametriksi listan kokonaislukuja. Funktio palauttaa listan parametrina olevien lukujen neliöjuurista. Neliöjuuren laskemiseen löytyy sopiva funktio moduulista math

Funktion tulee käyttää listakoostetta. Funktion maksimipituus on siis (mukaanlukien def-sanalla alkava otsikkorivi) kokonaisuudessaan kaksi riviä!

Funktio toimii seuraavasti:

rivit = neliojuuret([1,2,3,4])\nfor rivi in rivit:\n    print(rivi)

1.0\n1.4142135623730951\n1.7320508075688772\n2.0

Tee funktio tahtirivit(luvut: list), joka saa parametriksi listan kokonaislukuja. Funktio palauttaa listan, joka koostuu tähtiriveistä, joiden pituus vastaa parametrina olevan listan lukuja. Funktion tulee käyttää listakoostetta.

Funktion maksimipituus on siis (mukaanlukien def-sanalla alkava otsikkorivi) kokonaisuudessaan kaksi riviä!

Funktio toimii seuraavasti:

rivit = tahtirivit([1,2,3,4])\nfor rivi in rivit:\n    print(rivi)\n\nprint()\n\nrivit = tahtirivit([4, 3, 2, 1, 10])\nfor rivi in rivit:\n    print(rivi)
\n*\n**\n***\n****\n\n****\n***\n**\n*\n**********\n

Tehtäväpohjassa on valmiina luokka Koesuoritus, jolla on seuraavat julkiset attribuutit:

    \n
  • nimi
  • \n
  • arvosana1
  • \n
  • arvosana2
  • \n
  • arvosana3
  • \n

Kirjoita funktio parhaat_tulokset(suoritukset: list). Funktio saa parametrikseen listan koesuoritusolioita.

Funktio palauttaa listakoostetta käyttäen uuden listan, johon on tallennettu jokaisen suorituksen paras arvosana.

Funktion maksimipituus on siis (mukaanlukien def-sanalla alkava otsikkorivi) kokonaisuudessaan kaksi riviä!

Esimerkki suorituksesta:

suoritus1 = Koesuoritus(\"Pekka\",5,3,4)\nsuoritus2 = Koesuoritus(\"Pirjo\",3,4,1)\nsuoritus3 = Koesuoritus(\"Paavo\",2,1,3)\nsuoritukset = [suoritus1, suoritus2, suoritus3]\nprint(parhaat_tulokset(suoritukset))

[5, 4, 3]

Tee funktio pituudet(listat: list) joka saa parametriksi listan, joka sisältää listoja, jotka sisältävät kokonaislukuja. Funktio palauttaa listan, joka sisältää parametrina olevien listojen pituudet.

Funktio tulee toteuttaa listakoosteen avulla. Funktion maksimipituus on siis (mukaanlukien def-sanalla alkava otsikkorivi) kokonaisuudessaan kaksi riviä!

Funktio toimii seuraavasti

listat = [[1,2,3,4,5], [324, -1, 31, 7],[]]\nprint(pituudet(listat))

[5, 4, 0]

Alkioiden suodatus

Edellisissä esimerkeissä uusi lista muodostettiin kaikista alkuperäisen listan alkioista. Joskus on kuitenkin näppärää, jos voitaisiin valita alkuperäiseltä listalta vain tietyt alkiot. Koosteessa tämä onnistuu yhdistämällä siihen ehto-osa. Yleinen syntaksi on seuraava:

[<lauseke> for <alkio> in <sarja> if <ehtolauseke>]

Erotuksena aiempaan koosteen loppuun kirjoitetaan siis ehtolause. Ainoastaan ne alkiot poimitaan mukaan tuloslistaan, joiden kohdalla ehtolauseke on tosi.

Esimerkissä poimitaan kaikki parilliset alkiot uuteen listaan. Huomaa, että lausekkeena on esimerkissä ainoastaan listan alkio eli poimittavia alkioita ei käsitellä minkään operaation avulla ennen sijoittamista uuteen listaan:

lista = [1, 1, 2, 3, 4, 6, 4, 5, 7, 10, 12, 3]\n\nparilliset = [alkio for alkio in lista if alkio % 2 == 0]\nprint(parilliset)

[2, 4, 6, 4, 10, 12]

Jos lausekkeeksi on määritelty jotain muuta kuin pelkkä alkio, mukaan otetuille alkioille toteutetaan tämä operaatio kuten ennenkin. Muokataan edellistä esimerkkiä niin, että uudessa listassa on kaikki alkuperäisen listan parilliset alkiot kerrottuna kymmenellä:

lista = [1, 1, 2, 3, 4, 6, 4, 5, 7, 10, 12, 3]\n\nparilliset = [alkio * 10 for alkio in lista if alkio % 2 == 0]\nprint(parilliset)

[20, 40, 60, 40, 100, 120]

Seuraavassa esimerkissä lasketaan ainoastaan positiivisten alkioiden kertoma:

def kertoma(n: int):\n    \"\"\" Funktio laskee positiivisen luvun n kertoman n! \"\"\"\n    k = 1\n    while n >= 2:\n        k *= n\n        n -= 1\n    return k\n\nif __name__ == \"__main__\":\n    lista = [-2, 3, -1, 4, -10, 5, 1]\n    kertomat = [kertoma(luku) for luku in lista if luku > 0]\n    print(kertomat)

[6, 24, 120, 1]

Tarkastellaan vielä edellisestä jatkettua esimerkkiä, jossa kertoma lasketaan vain parillisista positiivista luvuista. Lisäksi listaan tallennetaan tuplessa sekä alkuperäinen alkio että kertoma:

\ndef kertoma(n: int):\n    \"\"\" Funktio laskee positiivisen luvun n kertoman n! \"\"\"\n    k = 1\n    while n >= 2:\n        k *= n\n        n -= 1\n    return k\n\nif __name__ == \"__main__\":\n    lista = [-2, 3, 2, 1, 4, -10, 5, 1, 6]\n    kertomat = [(luku, kertoma(luku)) for luku in lista if luku > 0 and luku % 2 == 0]\n    print(kertomat)\n

[(2, 2), (4, 24), (6, 720)]

Esimerkissä lauseke on siis (luku, kertoma(luku)), joka muodostaa tuplen, jossa ensimmäinen alkio on alkio alkuperäisestä listasta ja toinen alkio kertoma-funktion palauttama arvo. Ehtolauseke on luku > 0 and luku % 2 == 0, jossa valikoidaan mukaan vain alkiot, jotka ovat sekä positiivisia että jaollisia kahdella.

Kirjoita funktio poista_pienemmat(luvut: list, raja: int), joka saa parametrikseen listan kokonaislukuja sekä raja-arvon, joka on myös kokonaisluku.

Funktio muodostaa listakoostetta käyttäen uuden listan, josta on jätetty pois raja-arvoa pienemmät luvut.

Funktion maksimipituus on siis (mukaanlukien def-sanalla alkava otsikkorivi) kokonaisuudessaan kaksi riviä!

Esimerkki funktion käytöstä:

lukuja = [1,65, 32, -6, 9, 11]\nprint(poista_pienemmat(lukuja, 10))\n\nprint(poista_pienemmat([-4, 7, 8, -100], 0))

[65, 32, 11]\n[7, 8]

Kirjoita funktio vokaalilla_alkavat(sanat: list), joka saa parametrikseen listan merkkijonoja.

Tehtävänäsi on listakoostetta hyödyntäen muodostaa ja palauttaa uusi lista, joka sisältää vain alkuperäisen listan ne sanat, jotka alkavat vokaalilla (a, e, i, o, u, y, ä, ö). Sekä pienien että suurten kirjaimien pitää kelvata.

Funktion maksimipituus on (mukaanlukien def-sanalla alkava otsikkorivi) kokonaisuudessaan kaksi riviä!

Esimerkki funktion käytöstä:

klista = [\"auto\",\"mopo\",\"Etana\",\"kissa\",\"Koira\",\"OMENA\",\"appelsiini\"]\nfor vok in vokaalilla_alkavat(klista):\n    print(vok)

auto\nEtana\nOMENA\nappelsiini

Vaihtoehtoinen haara suodatuksessa

Koosteessa voi käyttää ehtolauseen ohella myös vaihtoehtoista haaraa. Tämä onnistuu käyttämällä jo aiemmin mainittua ehtolauseketta:

<lauseke 1> if <ehto> else <lauseke 2>

...joka saa arvokseen joko lausekkeen 1 tai 2 arvon riippuen siitä, onko ehto tosi vai epätosi.

Niinpä esim. ohjelma, joka tulostaa kahdesta luvusta suuremman yhdellä print-lauseella voisi näyttää tältä:

luku1 = int(input(\"Anna luku 1:\"))\nluku2 = int(input(\"Anna luku 2:\"))\nprint (luku1 if luku1 > luku2 else luku2)

Kun yhdistetään syntaksi listakoosteeseen, saadaan seuraavankaltainen rakenne:

[<lauseke 1> if <ehto> else <lauseke 2> for <alkio> in <sarja>]

Lopputuloksena syntyvässä listassa on yksi alkio jokaista alkuperäisen sarjan alkiota kohti. Jokaiselle alkiolle suoritetaan joko lauseke 1 tai lauseke 2 riippuen siitä onko ehtolauseke tosi vai ei.

Seuraava esimerkki muodostaa uuden listan, jossa alkuperäisen listan negatiiviset alkiot on käännetty vastaluvuikseen - positiiviset alkiot kelpuutetaan sellaisenaan. Käytännössä koostelause siis muodostaa listan alkuperäisen listan itseisarvoista.

\nluvut = [1, -3, 45, -110, 2, 9, -11]\nitseisarvot = [luku if luku >= 0 else -luku for luku in luvut]\nprint(itseisarvot)\n

[1, 3, 45, 110, 2, 9, 11]

Suoritettava lauseke on siis luku (eli alkio sellaisenaan), jos ehto luku >= 0 on tosi, muuten suoritetaan lauseke -luku.

Seuraavassa esimerkissä funktio merkkijonojen_pituudet saa parametrikseen sekalaisia alkioita sisältävän listan. Funktio laskee merkkijonoista tuloslistaan pituuden, muun tyyppisten alkioiden kohdalle asetetaan -1.

\ndef merkkijonojen_pituudet(lista: list):\n    \"\"\" Funktio palauttaa uudessa listassa merkkijonojen pituudet \"\"\"\n    return [len(alkio) if type(alkio) == str else -1 for alkio in lista]\n\nif __name__ == \"__main__\":\n    testilista = [\"moi\", 3, True, \"kaikki\", -123.344, \"heipparallaa\", 2, False]\n    pituudet = merkkijonojen_pituudet(testilista)\n    print(pituudet)\n

[3, -1, -1, 6, -1, 12, -1, -1]

Lottorivi, osa 1

Kirjoita luokka Lottorivi, joka saa konstruktorissaan parametrikseen kierroksen numeron (kokonaisluku) sekä seitsemänalkioisen kokonaislukulistan. Lista kuvaa kierroksen oikeita numeroita (eli oikeaa riviä). Kirjoita lisäksi luokalle metodi

osumien_maara(pelattu_rivi: list)

...joka palauttaa kokonaislukuna tiedon siitä, kuinka monta osumaa rivissä oli. Metodin tulee käyttää listakoostetta! Metodin pituus kokonaisuudessaan (def-rivi mukaanlukien) saa olla korkeintaan 2 riviä.

Esimerkki luokan käytöstä:

oikea = Lottorivi(5, [1,2,3,4,5,6,7])\noma_rivi = [1,4,7,11,13,19,24]\n\nprint(oikea.osumien_maara(oma_rivi))

3

Lottorivi, osa 2

Kirjoita luokkaan metodi osumat_paikoillaan(pelattu_rivi), joka palauttaa uuden listan. Uudessa listassa on vanhoilla paikoillaan oikeat numerot (eli ne, jotka löytyvät myös oikeasta rivistä), muiden paikalla on -1.

Metodin tulee käyttää listakoostetta. Metodin pituus kokonaisuudessaan (def-rivi mukaanlukien) saa olla korkeintaan 2 riviä.

Esimerkki metodin käytöstä:

oikea = Lottorivi(8, [1,2,3,10,20,30,33])\noma_rivi = [1,4,7,10,11,20,30]\n\nprint(oikea.osumat_paikoillaan(oma_rivi))

[1, -1, -1, 10, -1, 20, 30]

","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-11/1-koosteet.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-11/2-lisaa-koosteesta/page-data.json b/page-data/osa-11/2-lisaa-koosteesta/page-data.json index 3c1f99856..b358da23e 100644 --- a/page-data/osa-11/2-lisaa-koosteesta/page-data.json +++ b/page-data/osa-11/2-lisaa-koosteesta/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-11/2-lisaa-koosteesta", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten koosteita voidaan hyödyntää merkkijonojen kanssa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää omia olioita koosteissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat muodostaa myös sanakirjakoosteita"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska koosteen lähteenä voi olla mikä tahansa sarja, voidaan sitä soveltaa myös merkkijonojen käsittelyyn. Merkkijonon läpikäynnissä poimitaan merkit yksitellen jonosta, suoritetaan nille annettu lauseke ja tallennetaan lopputulos uuden listan alkioksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\nnimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"text","value":"\n\nisot_kirjaimet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"merkki"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"upper"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"isot_kirjaimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['P', 'E', 'K', 'K', 'A', ' ', 'P', 'Y', 'T', 'H', 'O', 'N']"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että lopputuloksena on lista. Jos halutaan muodostaa merkkijonon perusteella uusi merkkijono, voidaan hyödyntää aikaisemmin esiteltyä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"join"}]},{"type":"text","value":"-metodia. Metodin avulla voidaan yhdistää listan alkiot merkkijonoksi. Metodi kohdistuu välimerkkiin, jolla alkiot yhdistetään."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi toimii siis esimerkiksi näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\nnimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"text","value":"\nlista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\",\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" ja \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['P', 'e', 'k', 'k', 'a']\nPekka\nP e k k a\nP,e,k,k,a\nP ja e ja k ja k ja a"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun yhdistetään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"join"}]},{"type":"text","value":"-metodin koosteeseen, voidaan muodostaa merkkijonosta uusi merkkijono helposti. Tarkastellaan esimerkkiä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"join"}]},{"type":"text","value":"-metodin ja koosteen yhdistelmästä, joka muodostaa alkuperäisen merkkijonon pohjalta uuden merkkijonon, jossa on ainoastaan vokaalit:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\ntestijono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Heippa vaan kaikki, tämä on testi\""}]},{"type":"text","value":"\n\nvokaalit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" testijono "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"aeiouyåäö\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nuusijono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vokaalit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"uusijono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"eiaaaaiiääoei"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkissä on selkeyden vuoksi jaettu kooste ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"join"}]},{"type":"text","value":"-metodin kutsu omille riveilleen, mutta toki ne voi kirjoittaa myös yhdeksi lausekkeeksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\ntestijono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Heippa vaan kaikki, tämä on testi\""}]},{"type":"text","value":"\n\nvokaalijono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" testijono "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"aeiouyåäö\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vokaalijono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hyödyntämällä samassa yhteydessä vielä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"split"}]},{"type":"text","value":"-metodia, voidaan käsitellä esimerkiksi kokonaisia lauseita tehokkaasti yhdellä lausekkeella. Esimerkissä poistetaan lauseen jokaisesta sanasta ensimmäinen kirjain:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\nlause "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vesihiisi se kuulkaa vaan sihisi hississä\""}]},{"type":"text","value":"\n\nlause_ilman_alkuja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause_ilman_alkuja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"esihiisi e uulkaa aan ihisi ississä"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käydään läpi tarkemmin mitä koko lausekkeessa tapahtuu:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sana[1:]"}]},{"type":"text","value":" ottaa osajonon sanasta alkaen toisesta merkistä (eli indeksistä 1)\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lause.split()"}]},{"type":"text","value":" purkaa merkkijonon listaksi annetun välimerkin kohdalta. Kun välimerkkiä ei ole määritelty, käytetään oletuksena tyhjiä välejä\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\" \".join()"}]},{"type":"text","value":" yhdistää listan palaset uudeksi jonoksi käyttäen välilyöntiä palojen välissä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sama esimerkki perinteisemmällä tavalla näyttäisi esimerkiksi tältä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\nlause "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vesihiisi se kuulkaa vaan sihisi hississä\""}]},{"type":"text","value":"\n\nsanalista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nsanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n sana_ilman_alkua "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n sanalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana_ilman_alkua"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nlause_ilman_alkuja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause_ilman_alkuja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Suodata kielletyt","tmcname":"osa11-08_suodata_kielletyt"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suodata_kielletyt(merkkijono: str, kielletyt: str)"}]},{"type":"text","value":" joka palauttaa sen parametrina olevasta merkkijonosta version, joka ei sisällä yhtään merkkiä sen toisena parametrina olevasta \"kiellettyjen merkkien\" merkkijonosta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion tulee käyttää listakoostetta. Funktio saa sisältää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":"-rivi mukaanlukien maksimissaan 3 riviä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion käytöstä"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lause "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suo! kuokka, ja python: hieno yhdistelmä!??!?!\""}]},{"type":"text","value":"\nsuodatettu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" suodata_kielletyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"!?:,.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suodatettu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Suo kuokka ja python hieno yhdistelmä"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"omat-oliot-koosteissa","style":"position:relative;"},"children":[{"type":"text","value":"Omat oliot koosteissa"},{"type":"element","tagName":"a","properties":{"href":"#omat-oliot-koosteissa","ariaLabel":"omat oliot koosteissa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joskus omia olioita on näppärä käsitellä tai muodostaa koosteiden avulla. Tarkastellaan seuraavaksi muutamaa esimerkkiä tähän liittyen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ensimmäisessä esimerkissä luokka Maa mallintaa yhtä maata asukaslukuineen. Koosteessa poimitaan listalta kaikkien sellaisten maiden nimet, joiden asukasluku on suurempi kuin 5 miljoonaa."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Maa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Luokka mallintaa yhtä maata asukaslukuineen \"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" asukasluku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"asukasluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" asukasluku\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n suomi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suomi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6000000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n malta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Malta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"500000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n ruotsi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ruotsi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10000000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n islanti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Islanti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"350000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n maat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"suomi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" malta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" ruotsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" islanti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n isommat_maat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" maa "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" maat "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"asukasluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5000000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" maa "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" isommat_maat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Suomi\nRuotsi"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen vaihtoehto olisi luoda lista maa-olioista ja tulostaa sen jälkeen nimet. Tämä vaihtoehto olisi järkevämpi, jos maita tarvittaisiin vielä myöhemminkin (tai mikäli haluttaisiin esimerkiksi tarkemmin tarkastella maiden asukaslukuja silmukassa):"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n suomi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suomi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6000000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n malta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Malta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"500000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n ruotsi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ruotsi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10000000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n islanti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Islanti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"350000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n maat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"suomi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" malta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" ruotsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" islanti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n isommat_maat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"maa "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" maa "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" maat "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"asukasluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5000000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" maa "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" isommat_maat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toisessa esimerkissä luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Juoksumatka"}]},{"type":"text","value":" mallintaa yhtä juoksumatkaa nimineen ja pituuksineen. Nyt koosteen avulla luodaan lista "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Juoksumatka"}]},{"type":"text","value":"-olioita annettujen pituuksien mukaaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Juoksumatka"}]},{"type":"text","value":"-luokan konstruktorissa parametrilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":" on oletusarvo, eikä sitä olioita luodessa esimerkissä erikseen annetakaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Juoksumatka"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Luokka mallintaa yhtä n metrin pituista juoksumatkaa \"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" matka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ei nimeä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"matka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" matka\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__repr__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"matka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" m. ("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n pituudet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"200"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"42195"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n matkat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"Juoksumatka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" pituus "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pituudet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tulostetaan kaikki"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matkat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Poimitaan yksi listasta ja nimetään se"}]},{"type":"text","value":"\n maraton "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" matkat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# viimeisenä listassa"}]},{"type":"text","value":"\n maraton"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maraton\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan vielä uudella nimellä"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matkat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[100 m. (ei nimeä), 200 m. (ei nimeä), 1500 m. (ei nimeä), 3000 m. (ei nimeä), 42195 m. (ei nimeä)]\n[100 m. (ei nimeä), 200 m. (ei nimeä), 1500 m. (ei nimeä), 3000 m. (ei nimeä), 42195 m. (Maraton)]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos oma luokka on viime kerran esimerkin mukaisesti iteroitava, voidaan sitä käyttää lähteenä listakoosteessa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kirja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirjailija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sivuja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjailija "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kirjailija\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sivuja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sivuja\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kirjahylly"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_kirjat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_kirja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Iteraattorin alustusmetodi"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tässä tulee alustaa iteroinnissa käytettävä(t) muuttuja(t)"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__iter__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodi palauttaa viittauksen olioon itseensä, koska"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# iteraattori on toteutettu samassa luokassa"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodi palauttaa seuraavan alkion"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Jos ei ole enempää alkioita, heitetään tapahtuma"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# StopIteration"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__next__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Poimitaan listasta nykyinen"}]},{"type":"text","value":"\n kirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kasvatetaan laskuria yhdellä"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ...ja palautetaan"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" kirja\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Ei enempää kirjoja"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" StopIteration\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Testataan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n k1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Elämäni Pythoniassa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"123"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n k2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vanhus ja Java\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ernest Hemingjava\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"204"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n k3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"C-itsemän veljestä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Keijo Koodari\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"997"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n hylly "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirjahylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n hylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n hylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n hylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luodaan lista, jossa kaikkien kirjojen nimet"}]},{"type":"text","value":"\n kirjojen_nimet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" kirja "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" hylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirjojen_nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kauppalistan tuotteet","tmcname":"osa11-09_kauppalistan_tuotteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Osan 10 tehtävässä teimme "},{"type":"element","tagName":"a","properties":{"href":"/osa-10/3-olio-ohjelmoinnin-tekniikoita#programming-exercise-iteroitava-kauppalista"},"children":[{"type":"text","value":"Kauppalista-luokasta iteroitavan"}]},{"type":"text","value":". Iteroitavan luokan oliota voidaan käyttää listakoosteiden yhteydessä. Tehtäväpohjassa on mukana luokasta typistetty versio, jonka toiminnallisuus riittää tähän tehtävään."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee nyt funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kauppalistan_tuotteet(kauppalista, maara: int)"}]},{"type":"text","value":" joka saa parametriksi kauppalista-olion. Funktio palauttaa kauppalistan ostoksista niiden tuotteiden nimet, joita on listalla vähintään parametrin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"maara"}]},{"type":"text","value":" verran."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio tulee toteuttaa listakoosteen avulla, ja sen pituus saa olla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":"-määrittelyriveineen yhteensä korkeintaan kaksi riviä. Luokan Kauppalista koodia ei saa muuttaa!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaanit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"omenat\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"alkoholiton olut\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ananas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kauppalistalla vähintään 8 seuraavia tuotteita:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tuote "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" kauppalistan_tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"kauppalistalla vähintään 8 seuraavia tuotteita:\nbanaanit\nalkoholiton olut"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Halvempien hintaero","tmcname":"osa11-10_halvempien_hintaero"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Osan 9 tehtävässä teimme luokan "},{"type":"element","tagName":"a","properties":{"href":"/osa-9/1-oliot-ja-viittaukset#programming-exercise-asuntovertailu"},"children":[{"type":"text","value":"Asunto"}]},{"type":"text","value":". Tässä tehtävässä on käytössä hieman laajennettu versio luokasta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"halvemmat(asunnot: list, verrattava: Asunto)"}]},{"type":"text","value":", joka saa parametriksi listan asuntoja sekä yksittäisen vertailtavan asunnon. Funktio palauttaa listan, jolla on asunnoista ne, jotka ovat hinnaltaan halvempia kuin vertailtava asunto, sekä näiden hintaeron. Palautettavan listan alkiot ovat tupleja, joiden ensimmäinen jäsen on asunto ja toisena sen hintaero vertailtavaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio tulee toteuttaa listakoosteen avulla. Funktion maksimipituus "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":"-määrittelyrivi mukaanluettuna on 2 riviä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Asunto"}]},{"type":"text","value":" koodia ei saa muuttaa!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"a1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"16"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Eira yksiö\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\na2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"38"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4200"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kallio kaksio\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\na3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"78"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jakomäki kolmio\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\na4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"215"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suomussalmi omakotitalo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\na5 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"105"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1700"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kerava 4h ja keittiö\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\na6 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"25"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1200"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Haikon kartano\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nasunnot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"a1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" a2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" a3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" a4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" a5"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" a6"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"asuntoa "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"a3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kuvaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" halvemmat vaihtoehdot:\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" halvemmat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"asunnot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" a3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kuvaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","format-spec"]},"children":[{"type":"text","value":"30"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" hintaero "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" euroa\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"asuntoa Jakomäki kolmio halvemmat vaihtoehdot:\nEira yksiö hintaero 107000 euroa\nKallio kaksio hintaero 35400 euroa\nSuomussalmi omakotitalo hintaero 87500 euroa\nKerava 4h ja keittiö hintaero 16500 euroa"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"koosteet-sanakirjan-kanssa","style":"position:relative;"},"children":[{"type":"text","value":"Koosteet sanakirjan kanssa"},{"type":"element","tagName":"a","properties":{"href":"#koosteet-sanakirjan-kanssa","ariaLabel":"koosteet sanakirjan kanssa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koosteet toimivat samalla tavalla myös sanakirjan kanssa: jos vaihdetaan hakasulkeet aaltosulkeiksi, syntyy koosteen seurauksena listan sijasta sanakirja. Koska sanakirjan alkio muodostuu kahdesta komponentista - arvosta ja avaimesta, tulee molemmat komponentit antaa myös koostetta luodessa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lähteenä voidaan edelleen käyttää mitä tahansa sarjaa, eli esimerkiksi listaa, merkkijonoa, tuplea, sanakirjaa tai omaa iteroinnin toteuttavaa luokkaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki, joka luo merkkijonon pohjalta sanakirjan, joka sisältää kaikki merkkijonon kirjaimet ja niiden esiintymämäärät:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\nlause "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hei kaikki\""}]},{"type":"text","value":"\n\nmerkkimäärät "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"kirjain "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"count"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirjain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" kirjain "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"merkkimäärät"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"{'H': 1, 'e': 1, 'i': 3, ' ': 1, 'k': 3, 'a': 1}"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Periaate on siis täsmälleen sama, mutta yksittäisen arvon sijasta annetaan erikseen avain ja arvo. Yleisesti merkittynä siis:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"{ : for in }"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan vielä toisena esimerkkinä ohjelmaa, joka laskee kaikkien listalla olevien positiivisten lukujen kertomat, mutta tällä kertaa sanakirjaan. Luku toimii avaimena ja kertoma arvona:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kertoma"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Funktio laskee positiivisen luvun n kertoman n! \"\"\""}]},{"type":"text","value":"\n k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*="}]},{"type":"text","value":" n\n n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" k\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n kertomat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" kertoma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kertomat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"{3: 6, 2: 2, 1: 1, 4: 24, 5: 120, 6: 720}"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Merkkijonojen pituudet","tmcname":"osa11-11_merkkijonojen_pituudet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pituudet(merkkijonot: list)"}]},{"type":"text","value":", joka saa parametriksi listan merkkijonoja. Funktio palauttaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"sanakirjan"}]},{"type":"text","value":", jossa avaimina on listan merkkijonot ja arvoina merkkijonojen pituudet."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio tulee toteuttaa sanakirjakoosteen avulla. Funktion maksimipituus def-määrittelyrivi mukaanlukien on kaksi riviä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sanalista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"suo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kuokka\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ja\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodari\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nsanojen_pituudet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pituudet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanojen_pituudet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"{'suo': 3, 'kuokka': 6, 'python': 6, 'ja': 2, 'koodari': 7}"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Yleisimmät sanat","tmcname":"osa11-12_yleisimmat_sanat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"yleisimmat_sanat(tiedoston_nimi: str, raja: int)"}]},{"type":"text","value":", joka saa parametrikseen tiedoston nimen. Funktio palauttaa sanakirjan, joka sisältää tiedostossa olevien sanojen esiintymislukumäärän niiden sanojen osalta, joilla on vähintään toisen parametrin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"raja"}]},{"type":"text","value":" verran esiintymiä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esim. jos funktiolla tarkasteltaisiin tiedostoa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"comprehensions.txt"}]},{"type":"text","value":" jonka sisältö on seuraava"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"txt"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-txt"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-txt"]},"children":[{"type":"text","value":"List comprehension is an elegant way to define and create lists based on existing lists.\nList comprehension is generally more compact and faster than normal functions and loops for creating list.\nHowever, we should avoid writing very long list comprehensions in one line to ensure that code is user-friendly.\nRemember, every list comprehension can be rewritten in for loop, but every for loop can’t be rewritten in the form of list comprehension."}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kutsuttaessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"yleisimmat_sanat(\"comprehensions.txt\", 3)"}]},{"type":"text","value":" funktion palauttama sanakirja näyttäisi seuraavalta:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"{'comprehension': 4, 'is': 3, 'and': 3, 'for': 3, 'list': 4, 'in': 3}"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että kirjainkoko vaikuttaa ja vain kokonaiset sanat lasketaan - sanat 'List' ja 'lists' eivät siis saa kasvattaa sanan 'list' lukumäärää. Lisäksi kaikki sanoissa olevat välimerkit tulee poistaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion toteutustapa on vapaa, helpoimmalla pääset hyödyntämällä lista- ja sanakirjakoosteita."}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, miten koosteita voidaan hyödyntää merkkijonojen kanssa
  • \n
  • Osaat käyttää omia olioita koosteissa
  • \n
  • Osaat muodostaa myös sanakirjakoosteita
  • \n

Koska koosteen lähteenä voi olla mikä tahansa sarja, voidaan sitä soveltaa myös merkkijonojen käsittelyyn. Merkkijonon läpikäynnissä poimitaan merkit yksitellen jonosta, suoritetaan nille annettu lauseke ja tallennetaan lopputulos uuden listan alkioksi.

Esimerkiksi

\nnimi = \"Pekka Python\"\n\nisot_kirjaimet = [merkki.upper() for merkki in nimi]\nprint(isot_kirjaimet)\n

['P', 'E', 'K', 'K', 'A', ' ', 'P', 'Y', 'T', 'H', 'O', 'N']

Huomaa, että lopputuloksena on lista. Jos halutaan muodostaa merkkijonon perusteella uusi merkkijono, voidaan hyödyntää aikaisemmin esiteltyä join-metodia. Metodin avulla voidaan yhdistää listan alkiot merkkijonoksi. Metodi kohdistuu välimerkkiin, jolla alkiot yhdistetään.

Metodi toimii siis esimerkiksi näin:

\nnimi = \"Pekka\"\nlista = list(nimi)\nprint(lista)\n\nprint(\"\".join(lista))\nprint(\" \".join(lista))\nprint(\",\".join(lista))\nprint(\" ja \".join(lista))\n

['P', 'e', 'k', 'k', 'a']\nPekka\nP e k k a\nP,e,k,k,a\nP ja e ja k ja k ja a

Kun yhdistetään join-metodin koosteeseen, voidaan muodostaa merkkijonosta uusi merkkijono helposti. Tarkastellaan esimerkkiä join-metodin ja koosteen yhdistelmästä, joka muodostaa alkuperäisen merkkijonon pohjalta uuden merkkijonon, jossa on ainoastaan vokaalit:

\ntestijono = \"Heippa vaan kaikki, tämä on testi\"\n\nvokaalit = [merkki for merkki in testijono if merkki in \"aeiouyåäö\"]\nuusijono = \"\".join(vokaalit)\n\nprint(uusijono)\n

eiaaaaiiääoei

Esimerkissä on selkeyden vuoksi jaettu kooste ja join-metodin kutsu omille riveilleen, mutta toki ne voi kirjoittaa myös yhdeksi lausekkeeksi:

\ntestijono = \"Heippa vaan kaikki, tämä on testi\"\n\nvokaalijono = \"\".join([merkki for merkki in testijono if merkki in \"aeiouyåäö\"])\n\nprint(vokaalijono)\n

Hyödyntämällä samassa yhteydessä vielä split-metodia, voidaan käsitellä esimerkiksi kokonaisia lauseita tehokkaasti yhdellä lausekkeella. Esimerkissä poistetaan lauseen jokaisesta sanasta ensimmäinen kirjain:

\nlause = \"Vesihiisi se kuulkaa vaan sihisi hississä\"\n\nlause_ilman_alkuja = \" \".join([sana[1:] for sana in lause.split()])\nprint(lause_ilman_alkuja)\n

esihiisi e uulkaa aan ihisi ississä

Käydään läpi tarkemmin mitä koko lausekkeessa tapahtuu:

sana[1:] ottaa osajonon sanasta alkaen toisesta merkistä (eli indeksistä 1)\nlause.split() purkaa merkkijonon listaksi annetun välimerkin kohdalta. Kun välimerkkiä ei ole määritelty, käytetään oletuksena tyhjiä välejä\n\" \".join() yhdistää listan palaset uudeksi jonoksi käyttäen välilyöntiä palojen välissä.

Sama esimerkki perinteisemmällä tavalla näyttäisi esimerkiksi tältä:

\nlause = \"Vesihiisi se kuulkaa vaan sihisi hississä\"\n\nsanalista = []\nsanat = lause.split()\nfor sana in sanat:\n    sana_ilman_alkua = sana[1:]\n    sanalista.append(sana_ilman_alkua)\n\nlause_ilman_alkuja = \" \".join(sanalista)\n\n\nprint(lause_ilman_alkuja)\n

Tee funktio suodata_kielletyt(merkkijono: str, kielletyt: str) joka palauttaa sen parametrina olevasta merkkijonosta version, joka ei sisällä yhtään merkkiä sen toisena parametrina olevasta \"kiellettyjen merkkien\" merkkijonosta.

Funktion tulee käyttää listakoostetta. Funktio saa sisältää def-rivi mukaanlukien maksimissaan 3 riviä.

Esimerkki funktion käytöstä

lause = \"Suo! kuokka, ja python: hieno yhdistelmä!??!?!\"\nsuodatettu = suodata_kielletyt(lause, \"!?:,.\")\nprint(suodatettu)

Suo kuokka ja python hieno yhdistelmä

Omat oliot koosteissa

Joskus omia olioita on näppärä käsitellä tai muodostaa koosteiden avulla. Tarkastellaan seuraavaksi muutamaa esimerkkiä tähän liittyen.

Ensimmäisessä esimerkissä luokka Maa mallintaa yhtä maata asukaslukuineen. Koosteessa poimitaan listalta kaikkien sellaisten maiden nimet, joiden asukasluku on suurempi kuin 5 miljoonaa.

\nclass Maa:\n    \"\"\" Luokka mallintaa yhtä maata asukaslukuineen \"\"\"\n    def __init__(self, nimi: str, asukasluku: int):\n        self.nimi = nimi\n        self.asukasluku = asukasluku\n\nif __name__ == \"__main__\":\n    suomi = Maa(\"Suomi\", 6000000)\n    malta = Maa(\"Malta\", 500000)\n    ruotsi = Maa(\"Ruotsi\", 10000000)\n    islanti = Maa(\"Islanti\", 350000)\n\n    maat = [suomi, malta, ruotsi, islanti]\n\n    isommat_maat = [maa.nimi for maa in maat if maa.asukasluku > 5000000]\n    for maa in isommat_maat:\n        print(maa)\n\n

Suomi\nRuotsi

Toinen vaihtoehto olisi luoda lista maa-olioista ja tulostaa sen jälkeen nimet. Tämä vaihtoehto olisi järkevämpi, jos maita tarvittaisiin vielä myöhemminkin (tai mikäli haluttaisiin esimerkiksi tarkemmin tarkastella maiden asukaslukuja silmukassa):

\nif __name__ == \"__main__\":\n    suomi = Maa(\"Suomi\", 6000000)\n    malta = Maa(\"Malta\", 500000)\n    ruotsi = Maa(\"Ruotsi\", 10000000)\n    islanti = Maa(\"Islanti\", 350000)\n\n    maat = [suomi, malta, ruotsi, islanti]\n\n    isommat_maat = [maa for maa in maat if maa.asukasluku > 5000000]\n    for maa in isommat_maat:\n        print(maa.nimi)

Toisessa esimerkissä luokka Juoksumatka mallintaa yhtä juoksumatkaa nimineen ja pituuksineen. Nyt koosteen avulla luodaan lista Juoksumatka-olioita annettujen pituuksien mukaaan.

Huomaa, että Juoksumatka-luokan konstruktorissa parametrilla nimi on oletusarvo, eikä sitä olioita luodessa esimerkissä erikseen annetakaan:

\nclass Juoksumatka:\n    \"\"\" Luokka mallintaa yhtä n metrin pituista juoksumatkaa \"\"\"\n    def __init__(self, matka:int, nimi:str = \"ei nimeä\"):\n        self.matka = matka\n        self.nimi = nimi\n\n    def __repr__(self):\n        return f\"{self.matka} m. ({self.nimi})\"\n\nif __name__ == \"__main__\":\n    pituudet = [100, 200, 1500, 3000, 42195]\n    matkat = [Juoksumatka(pituus) for pituus in pituudet]\n\n    # tulostetaan kaikki\n    print(matkat)\n\n    # Poimitaan yksi listasta ja nimetään se\n    maraton = matkat[-1] # viimeisenä listassa\n    maraton.nimi = \"Maraton\"\n\n    # Tulostetaan vielä uudella nimellä\n    print(matkat)\n

[100 m. (ei nimeä), 200 m. (ei nimeä), 1500 m. (ei nimeä), 3000 m. (ei nimeä), 42195 m. (ei nimeä)]\n[100 m. (ei nimeä), 200 m. (ei nimeä), 1500 m. (ei nimeä), 3000 m. (ei nimeä), 42195 m. (Maraton)]

Jos oma luokka on viime kerran esimerkin mukaisesti iteroitava, voidaan sitä käyttää lähteenä listakoosteessa:

\nclass Kirja:\n    def __init__(self, nimi: str, kirjailija: str, sivuja: int):\n        self.nimi = nimi\n        self.kirjailija = kirjailija\n        self.sivuja = sivuja\n\nclass Kirjahylly:\n    def __init__(self):\n        self._kirjat = []\n\n    def lisaa_kirja(self, kirja: Kirja):\n        self._kirjat.append(kirja)\n\n    # Iteraattorin alustusmetodi\n    # Tässä tulee alustaa iteroinnissa käytettävä(t) muuttuja(t)\n    def __iter__(self):\n        self.n = 0\n        # Metodi palauttaa viittauksen olioon itseensä, koska\n        # iteraattori on toteutettu samassa luokassa\n        return self\n\n    # Metodi palauttaa seuraavan alkion\n    # Jos ei ole enempää alkioita, heitetään tapahtuma\n    # StopIteration\n    def __next__(self):\n        if self.n < len(self._kirjat):\n            # Poimitaan listasta nykyinen\n            kirja = self._kirjat[self.n]\n            # Kasvatetaan laskuria yhdellä\n            self.n += 1\n            # ...ja palautetaan\n            return kirja\n        else:\n            # Ei enempää kirjoja\n            raise StopIteration\n\n# Testataan\nif __name__ == \"__main__\":\n    k1 = Kirja(\"Elämäni Pythoniassa\", \"Pekka Python\", 123)\n    k2 = Kirja(\"Vanhus ja Java\", \"Ernest Hemingjava\", 204)\n    k3 = Kirja(\"C-itsemän veljestä\", \"Keijo Koodari\", 997)\n\n    hylly = Kirjahylly()\n    hylly.lisaa_kirja(k1)\n    hylly.lisaa_kirja(k2)\n    hylly.lisaa_kirja(k3)\n\n    # Luodaan lista, jossa kaikkien kirjojen nimet\n    kirjojen_nimet = [kirja.nimi for kirja in hylly]\n    print(kirjojen_nimet)\n

Osan 10 tehtävässä teimme Kauppalista-luokasta iteroitavan. Iteroitavan luokan oliota voidaan käyttää listakoosteiden yhteydessä. Tehtäväpohjassa on mukana luokasta typistetty versio, jonka toiminnallisuus riittää tähän tehtävään.

Tee nyt funktio kauppalistan_tuotteet(kauppalista, maara: int) joka saa parametriksi kauppalista-olion. Funktio palauttaa kauppalistan ostoksista niiden tuotteiden nimet, joita on listalla vähintään parametrin maara verran.

Funktio tulee toteuttaa listakoosteen avulla, ja sen pituus saa olla def-määrittelyriveineen yhteensä korkeintaan kaksi riviä. Luokan Kauppalista koodia ei saa muuttaa!

Funktio toimii seuraavasti

lista = Kauppalista()\nlista.lisaa(\"banaanit\", 10)\nlista.lisaa(\"omenat\", 5)\nlista.lisaa(\"alkoholiton olut\", 24)\nlista.lisaa(\"ananas\", 1)\n\nprint(\"kauppalistalla vähintään 8 seuraavia tuotteita:\")\nfor tuote in kauppalistan_tuotteet(lista, 8):\n    print(tuote)

kauppalistalla vähintään 8 seuraavia tuotteita:\nbanaanit\nalkoholiton olut

Osan 9 tehtävässä teimme luokan Asunto. Tässä tehtävässä on käytössä hieman laajennettu versio luokasta.

Tee funktio halvemmat(asunnot: list, verrattava: Asunto), joka saa parametriksi listan asuntoja sekä yksittäisen vertailtavan asunnon. Funktio palauttaa listan, jolla on asunnoista ne, jotka ovat hinnaltaan halvempia kuin vertailtava asunto, sekä näiden hintaeron. Palautettavan listan alkiot ovat tupleja, joiden ensimmäinen jäsen on asunto ja toisena sen hintaero vertailtavaan.

Funktio tulee toteuttaa listakoosteen avulla. Funktion maksimipituus def-määrittelyrivi mukaanluettuna on 2 riviä.

Luokan Asunto koodia ei saa muuttaa!

Funktio toimii seuraavasti

a1 = Asunto(1, 16, 5500, \"Eira yksiö\")\na2 = Asunto(2, 38, 4200, \"Kallio kaksio\")\na3 = Asunto(3, 78, 2500, \"Jakomäki kolmio\")\na4 = Asunto(6, 215, 500, \"Suomussalmi omakotitalo\")\na5 = Asunto(4, 105, 1700, \"Kerava 4h ja keittiö\")\na6 = Asunto(25, 1200, 2500, \"Haikon kartano\")\n\nasunnot = [a1, a2, a3, a4, a5, a6]\n\nprint(f\"asuntoa {a3.kuvaus} halvemmat vaihtoehdot:\")\nfor alkio in halvemmat(asunnot, a3):\n    print(f\"{alkio[0].kuvaus:30} hintaero {alkio[1]} euroa\")

asuntoa Jakomäki kolmio halvemmat vaihtoehdot:\nEira yksiö hintaero 107000 euroa\nKallio kaksio hintaero 35400 euroa\nSuomussalmi omakotitalo hintaero 87500 euroa\nKerava 4h ja keittiö hintaero 16500 euroa

Koosteet sanakirjan kanssa

Koosteet toimivat samalla tavalla myös sanakirjan kanssa: jos vaihdetaan hakasulkeet aaltosulkeiksi, syntyy koosteen seurauksena listan sijasta sanakirja. Koska sanakirjan alkio muodostuu kahdesta komponentista - arvosta ja avaimesta, tulee molemmat komponentit antaa myös koostetta luodessa.

Lähteenä voidaan edelleen käyttää mitä tahansa sarjaa, eli esimerkiksi listaa, merkkijonoa, tuplea, sanakirjaa tai omaa iteroinnin toteuttavaa luokkaa.

Esimerkki, joka luo merkkijonon pohjalta sanakirjan, joka sisältää kaikki merkkijonon kirjaimet ja niiden esiintymämäärät:

\nlause = \"Hei kaikki\"\n\nmerkkimäärät = {kirjain : lause.count(kirjain) for kirjain in lause}\nprint(merkkimäärät)\n

{'H': 1, 'e': 1, 'i': 3, ' ': 1, 'k': 3, 'a': 1}

Periaate on siis täsmälleen sama, mutta yksittäisen arvon sijasta annetaan erikseen avain ja arvo. Yleisesti merkittynä siis:

{<avainlauseke> : <arvolauseke> for <alkio> in <sarja>}

Tarkastellaan vielä toisena esimerkkinä ohjelmaa, joka laskee kaikkien listalla olevien positiivisten lukujen kertomat, mutta tällä kertaa sanakirjaan. Luku toimii avaimena ja kertoma arvona:

\ndef kertoma(n: int):\n    \"\"\" Funktio laskee positiivisen luvun n kertoman n! \"\"\"\n    k = 1\n    while n >= 2:\n        k *= n\n        n -= 1\n    return k\n\nif __name__ == \"__main__\":\n    lista = [-2, 3, 2, 1, 4, -10, 5, 1, 6]\n    kertomat = {luku : kertoma(luku) for luku in lista if luku > 0}\n    print(kertomat)\n

{3: 6, 2: 2, 1: 1, 4: 24, 5: 120, 6: 720}

Tee funktio pituudet(merkkijonot: list), joka saa parametriksi listan merkkijonoja. Funktio palauttaa sanakirjan, jossa avaimina on listan merkkijonot ja arvoina merkkijonojen pituudet.

Funktio tulee toteuttaa sanakirjakoosteen avulla. Funktion maksimipituus def-määrittelyrivi mukaanlukien on kaksi riviä.

Funktio toimii seuraavasti

sanalista = [\"suo\", \"kuokka\" , \"python\", \"ja\", \"koodari\"]\n\nsanojen_pituudet = pituudet(sanalista)\nprint(sanojen_pituudet)

{'suo': 3, 'kuokka': 6, 'python': 6, 'ja': 2, 'koodari': 7}

Tee funktio yleisimmat_sanat(tiedoston_nimi: str, raja: int), joka saa parametrikseen tiedoston nimen. Funktio palauttaa sanakirjan, joka sisältää tiedostossa olevien sanojen esiintymislukumäärän niiden sanojen osalta, joilla on vähintään toisen parametrin raja verran esiintymiä.

Esim. jos funktiolla tarkasteltaisiin tiedostoa comprehensions.txt jonka sisältö on seuraava

List comprehension is an elegant way to define and create lists based on existing lists.\nList comprehension is generally more compact and faster than normal functions and loops for creating list.\nHowever, we should avoid writing very long list comprehensions in one line to ensure that code is user-friendly.\nRemember, every list comprehension can be rewritten in for loop, but every for loop can’t be rewritten in the form of list comprehension.

Kutsuttaessa yleisimmat_sanat(\"comprehensions.txt\", 3) funktion palauttama sanakirja näyttäisi seuraavalta:

{'comprehension': 4, 'is': 3, 'and': 3, 'for': 3, 'list': 4, 'in': 3}

Huomaa, että kirjainkoko vaikuttaa ja vain kokonaiset sanat lasketaan - sanat 'List' ja 'lists' eivät siis saa kasvattaa sanan 'list' lukumäärää. Lisäksi kaikki sanoissa olevat välimerkit tulee poistaa.

Funktion toteutustapa on vapaa, helpoimmalla pääset hyödyntämällä lista- ja sanakirjakoosteita.

","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-11/2-lisaa-koosteesta.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten koosteita voidaan hyödyntää merkkijonojen kanssa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää omia olioita koosteissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat muodostaa myös sanakirjakoosteita"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska koosteen lähteenä voi olla mikä tahansa sarja, voidaan sitä soveltaa myös merkkijonojen käsittelyyn. Merkkijonon läpikäynnissä poimitaan merkit yksitellen jonosta, suoritetaan nille annettu lauseke ja tallennetaan lopputulos uuden listan alkioksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\nnimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"text","value":"\n\nisot_kirjaimet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"merkki"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"upper"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"isot_kirjaimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['P', 'E', 'K', 'K', 'A', ' ', 'P', 'Y', 'T', 'H', 'O', 'N']"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että lopputuloksena on lista. Jos halutaan muodostaa merkkijonon perusteella uusi merkkijono, voidaan hyödyntää aikaisemmin esiteltyä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"join"}]},{"type":"text","value":"-metodia. Metodin avulla voidaan yhdistää listan alkiot merkkijonoksi. Metodi kohdistuu välimerkkiin, jolla alkiot yhdistetään."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi toimii siis esimerkiksi näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\nnimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"text","value":"\nlista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\",\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" ja \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['P', 'e', 'k', 'k', 'a']\nPekka\nP e k k a\nP,e,k,k,a\nP ja e ja k ja k ja a"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun yhdistetään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"join"}]},{"type":"text","value":"-metodin koosteeseen, voidaan muodostaa merkkijonosta uusi merkkijono helposti. Tarkastellaan esimerkkiä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"join"}]},{"type":"text","value":"-metodin ja koosteen yhdistelmästä, joka muodostaa alkuperäisen merkkijonon pohjalta uuden merkkijonon, jossa on ainoastaan vokaalit:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\ntestijono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Heippa vaan kaikki, tämä on testi\""}]},{"type":"text","value":"\n\nvokaalit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" testijono "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"aeiouyåäö\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nuusijono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vokaalit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"uusijono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"eiaaaaiiääoei"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkissä on selkeyden vuoksi jaettu kooste ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"join"}]},{"type":"text","value":"-metodin kutsu omille riveilleen, mutta toki ne voi kirjoittaa myös yhdeksi lausekkeeksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\ntestijono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Heippa vaan kaikki, tämä on testi\""}]},{"type":"text","value":"\n\nvokaalijono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" testijono "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"aeiouyåäö\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vokaalijono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hyödyntämällä samassa yhteydessä vielä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"split"}]},{"type":"text","value":"-metodia, voidaan käsitellä esimerkiksi kokonaisia lauseita tehokkaasti yhdellä lausekkeella. Esimerkissä poistetaan lauseen jokaisesta sanasta ensimmäinen kirjain:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\nlause "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vesihiisi se kuulkaa vaan sihisi hississä\""}]},{"type":"text","value":"\n\nlause_ilman_alkuja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause_ilman_alkuja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"esihiisi e uulkaa aan ihisi ississä"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käydään läpi tarkemmin mitä koko lausekkeessa tapahtuu:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sana[1:]"}]},{"type":"text","value":" ottaa osajonon sanasta alkaen toisesta merkistä (eli indeksistä 1)\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lause.split()"}]},{"type":"text","value":" purkaa merkkijonon listaksi annetun välimerkin kohdalta. Kun välimerkkiä ei ole määritelty, käytetään oletuksena tyhjiä välejä\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\" \".join()"}]},{"type":"text","value":" yhdistää listan palaset uudeksi jonoksi käyttäen välilyöntiä palojen välissä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sama esimerkki perinteisemmällä tavalla näyttäisi esimerkiksi tältä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\nlause "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vesihiisi se kuulkaa vaan sihisi hississä\""}]},{"type":"text","value":"\n\nsanalista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nsanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n sana_ilman_alkua "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n sanalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana_ilman_alkua"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nlause_ilman_alkuja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause_ilman_alkuja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Suodata kielletyt","tmcname":"osa11-08_suodata_kielletyt"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suodata_kielletyt(merkkijono: str, kielletyt: str)"}]},{"type":"text","value":" joka palauttaa sen parametrina olevasta merkkijonosta version, joka ei sisällä yhtään merkkiä sen toisena parametrina olevasta \"kiellettyjen merkkien\" merkkijonosta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion tulee käyttää listakoostetta. Funktio saa sisältää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":"-rivi mukaanlukien maksimissaan 3 riviä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion käytöstä"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lause "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suo! kuokka, ja python: hieno yhdistelmä!??!?!\""}]},{"type":"text","value":"\nsuodatettu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" suodata_kielletyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"!?:,.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suodatettu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Suo kuokka ja python hieno yhdistelmä"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"omat-oliot-koosteissa","style":"position:relative;"},"children":[{"type":"text","value":"Omat oliot koosteissa"},{"type":"element","tagName":"a","properties":{"href":"#omat-oliot-koosteissa","ariaLabel":"omat oliot koosteissa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joskus omia olioita on näppärä käsitellä tai muodostaa koosteiden avulla. Tarkastellaan seuraavaksi muutamaa esimerkkiä tähän liittyen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ensimmäisessä esimerkissä luokka Maa mallintaa yhtä maata asukaslukuineen. Koosteessa poimitaan listalta kaikkien sellaisten maiden nimet, joiden asukasluku on suurempi kuin 5 miljoonaa."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Maa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Luokka mallintaa yhtä maata asukaslukuineen \"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" asukasluku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"asukasluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" asukasluku\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n suomi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suomi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6000000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n malta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Malta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"500000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n ruotsi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ruotsi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10000000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n islanti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Islanti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"350000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n maat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"suomi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" malta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" ruotsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" islanti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n isommat_maat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" maa "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" maat "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"asukasluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5000000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" maa "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" isommat_maat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Suomi\nRuotsi"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen vaihtoehto olisi luoda lista maa-olioista ja tulostaa sen jälkeen nimet. Tämä vaihtoehto olisi järkevämpi, jos maita tarvittaisiin vielä myöhemminkin (tai mikäli haluttaisiin esimerkiksi tarkemmin tarkastella maiden asukaslukuja silmukassa):"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n suomi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suomi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6000000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n malta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Malta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"500000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n ruotsi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ruotsi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10000000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n islanti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Islanti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"350000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n maat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"suomi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" malta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" ruotsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" islanti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n isommat_maat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"maa "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" maa "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" maat "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"asukasluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5000000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" maa "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" isommat_maat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toisessa esimerkissä luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Juoksumatka"}]},{"type":"text","value":" mallintaa yhtä juoksumatkaa nimineen ja pituuksineen. Nyt koosteen avulla luodaan lista "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Juoksumatka"}]},{"type":"text","value":"-olioita annettujen pituuksien mukaaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Juoksumatka"}]},{"type":"text","value":"-luokan konstruktorissa parametrilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":" on oletusarvo, eikä sitä olioita luodessa esimerkissä erikseen annetakaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Juoksumatka"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Luokka mallintaa yhtä n metrin pituista juoksumatkaa \"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" matka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ei nimeä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"matka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" matka\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__repr__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"matka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" m. ("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n pituudet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"200"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"42195"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n matkat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"Juoksumatka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" pituus "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pituudet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tulostetaan kaikki"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matkat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Poimitaan yksi listasta ja nimetään se"}]},{"type":"text","value":"\n maraton "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" matkat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# viimeisenä listassa"}]},{"type":"text","value":"\n maraton"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maraton\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan vielä uudella nimellä"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matkat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[100 m. (ei nimeä), 200 m. (ei nimeä), 1500 m. (ei nimeä), 3000 m. (ei nimeä), 42195 m. (ei nimeä)]\n[100 m. (ei nimeä), 200 m. (ei nimeä), 1500 m. (ei nimeä), 3000 m. (ei nimeä), 42195 m. (Maraton)]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos oma luokka on viime kerran esimerkin mukaisesti iteroitava, voidaan sitä käyttää lähteenä listakoosteessa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kirja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirjailija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sivuja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjailija "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kirjailija\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sivuja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sivuja\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kirjahylly"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_kirjat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_kirja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Iteraattorin alustusmetodi"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tässä tulee alustaa iteroinnissa käytettävä(t) muuttuja(t)"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__iter__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodi palauttaa viittauksen olioon itseensä, koska"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# iteraattori on toteutettu samassa luokassa"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodi palauttaa seuraavan alkion"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Jos ei ole enempää alkioita, heitetään tapahtuma"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# StopIteration"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__next__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Poimitaan listasta nykyinen"}]},{"type":"text","value":"\n kirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kasvatetaan laskuria yhdellä"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ...ja palautetaan"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" kirja\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Ei enempää kirjoja"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" StopIteration\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Testataan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n k1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Elämäni Pythoniassa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"123"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n k2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vanhus ja Java\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ernest Hemingjava\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"204"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n k3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"C-itsemän veljestä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Keijo Koodari\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"997"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n hylly "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirjahylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n hylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n hylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n hylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luodaan lista, jossa kaikkien kirjojen nimet"}]},{"type":"text","value":"\n kirjojen_nimet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" kirja "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" hylly"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirjojen_nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kauppalistan tuotteet","tmcname":"osa11-09_kauppalistan_tuotteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Osan 10 tehtävässä teimme "},{"type":"element","tagName":"a","properties":{"href":"/osa-10/3-olio-ohjelmoinnin-tekniikoita#programming-exercise-iteroitava-kauppalista"},"children":[{"type":"text","value":"Kauppalista-luokasta iteroitavan"}]},{"type":"text","value":". Iteroitavan luokan oliota voidaan käyttää listakoosteiden yhteydessä. Tehtäväpohjassa on mukana luokasta typistetty versio, jonka toiminnallisuus riittää tähän tehtävään."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee nyt funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kauppalistan_tuotteet(kauppalista, maara: int)"}]},{"type":"text","value":" joka saa parametriksi kauppalista-olion. Funktio palauttaa kauppalistan ostoksista niiden tuotteiden nimet, joita on listalla vähintään parametrin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"maara"}]},{"type":"text","value":" verran."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio tulee toteuttaa listakoosteen avulla, ja sen pituus saa olla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":"-määrittelyriveineen yhteensä korkeintaan kaksi riviä. Luokan Kauppalista koodia ei saa muuttaa!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaanit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"omenat\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"alkoholiton olut\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ananas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kauppalistalla vähintään 8 seuraavia tuotteita:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tuote "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" kauppalistan_tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"kauppalistalla vähintään 8 seuraavia tuotteita:\nbanaanit\nalkoholiton olut"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Halvempien hintaero","tmcname":"osa11-10_halvempien_hintaero"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Osan 9 tehtävässä teimme luokan "},{"type":"element","tagName":"a","properties":{"href":"/osa-9/1-oliot-ja-viittaukset#programming-exercise-asuntovertailu"},"children":[{"type":"text","value":"Asunto"}]},{"type":"text","value":". Tässä tehtävässä on käytössä hieman laajennettu versio luokasta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"halvemmat(asunnot: list, verrattava: Asunto)"}]},{"type":"text","value":", joka saa parametriksi listan asuntoja sekä yksittäisen vertailtavan asunnon. Funktio palauttaa listan, jolla on asunnoista ne, jotka ovat hinnaltaan halvempia kuin vertailtava asunto, sekä näiden hintaeron. Palautettavan listan alkiot ovat tupleja, joiden ensimmäinen jäsen on asunto ja toisena sen hintaero vertailtavaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio tulee toteuttaa listakoosteen avulla. Funktion maksimipituus "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":"-määrittelyrivi mukaanluettuna on 2 riviä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Asunto"}]},{"type":"text","value":" koodia ei saa muuttaa!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"a1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"16"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Eira yksiö\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\na2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"38"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4200"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kallio kaksio\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\na3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"78"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jakomäki kolmio\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\na4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"215"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suomussalmi omakotitalo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\na5 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"105"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1700"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kerava 4h ja keittiö\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\na6 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"25"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1200"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Haikon kartano\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nasunnot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"a1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" a2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" a3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" a4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" a5"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" a6"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"asuntoa "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"a3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kuvaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" halvemmat vaihtoehdot:\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" halvemmat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"asunnot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" a3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kuvaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","format-spec"]},"children":[{"type":"text","value":"30"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" hintaero "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" euroa\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"asuntoa Jakomäki kolmio halvemmat vaihtoehdot:\nEira yksiö hintaero 107000 euroa\nKallio kaksio hintaero 35400 euroa\nSuomussalmi omakotitalo hintaero 87500 euroa\nKerava 4h ja keittiö hintaero 16500 euroa"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"koosteet-sanakirjan-kanssa","style":"position:relative;"},"children":[{"type":"text","value":"Koosteet sanakirjan kanssa"},{"type":"element","tagName":"a","properties":{"href":"#koosteet-sanakirjan-kanssa","ariaLabel":"koosteet sanakirjan kanssa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koosteet toimivat samalla tavalla myös sanakirjan kanssa: jos vaihdetaan hakasulkeet aaltosulkeiksi, syntyy koosteen seurauksena listan sijasta sanakirja. Koska sanakirjan alkio muodostuu kahdesta komponentista - arvosta ja avaimesta, tulee molemmat komponentit antaa myös koostetta luodessa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lähteenä voidaan edelleen käyttää mitä tahansa sarjaa, eli esimerkiksi listaa, merkkijonoa, tuplea, sanakirjaa tai omaa iteroinnin toteuttavaa luokkaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki, joka luo merkkijonon pohjalta sanakirjan, joka sisältää kaikki merkkijonon kirjaimet ja niiden esiintymämäärät:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\nlause "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hei kaikki\""}]},{"type":"text","value":"\n\nmerkkimäärät "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"kirjain "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"count"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirjain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" kirjain "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"merkkimäärät"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"{'H': 1, 'e': 1, 'i': 3, ' ': 1, 'k': 3, 'a': 1}"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Periaate on siis täsmälleen sama, mutta yksittäisen arvon sijasta annetaan erikseen avain ja arvo. Yleisesti merkittynä siis:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"{ : for in }"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan vielä toisena esimerkkinä ohjelmaa, joka laskee kaikkien listalla olevien positiivisten lukujen kertomat, mutta tällä kertaa sanakirjaan. Luku toimii avaimena ja kertoma arvona:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kertoma"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Funktio laskee positiivisen luvun n kertoman n! \"\"\""}]},{"type":"text","value":"\n k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*="}]},{"type":"text","value":" n\n n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" k\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n kertomat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" kertoma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kertomat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"{3: 6, 2: 2, 1: 1, 4: 24, 5: 120, 6: 720}"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Merkkijonojen pituudet","tmcname":"osa11-11_merkkijonojen_pituudet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pituudet(merkkijonot: list)"}]},{"type":"text","value":", joka saa parametriksi listan merkkijonoja. Funktio palauttaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"sanakirjan"}]},{"type":"text","value":", jossa avaimina on listan merkkijonot ja arvoina merkkijonojen pituudet."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio tulee toteuttaa sanakirjakoosteen avulla. Funktion maksimipituus def-määrittelyrivi mukaanlukien on kaksi riviä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sanalista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"suo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kuokka\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ja\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodari\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nsanojen_pituudet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pituudet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanojen_pituudet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"{'suo': 3, 'kuokka': 6, 'python': 6, 'ja': 2, 'koodari': 7}"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Yleisimmät sanat","tmcname":"osa11-12_yleisimmat_sanat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"yleisimmat_sanat(tiedoston_nimi: str, raja: int)"}]},{"type":"text","value":", joka saa parametrikseen tiedoston nimen. Funktio palauttaa sanakirjan, joka sisältää tiedostossa olevien sanojen esiintymislukumäärän niiden sanojen osalta, joilla on vähintään toisen parametrin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"raja"}]},{"type":"text","value":" verran esiintymiä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esim. jos funktiolla tarkasteltaisiin tiedostoa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"comprehensions.txt"}]},{"type":"text","value":" jonka sisältö on seuraava"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"txt"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-txt"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-txt"]},"children":[{"type":"text","value":"List comprehension is an elegant way to define and create lists based on existing lists.\nList comprehension is generally more compact and faster than normal functions and loops for creating list.\nHowever, we should avoid writing very long list comprehensions in one line to ensure that code is user-friendly.\nRemember, every list comprehension can be rewritten in for loop, but every for loop can’t be rewritten in the form of list comprehension."}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kutsuttaessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"yleisimmat_sanat(\"comprehensions.txt\", 3)"}]},{"type":"text","value":" funktion palauttama sanakirja näyttäisi seuraavalta:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"{'comprehension': 4, 'is': 3, 'and': 3, 'for': 3, 'list': 4, 'in': 3}"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että kirjainkoko vaikuttaa ja vain kokonaiset sanat lasketaan - sanat 'List' ja 'lists' eivät siis saa kasvattaa sanan 'list' lukumäärää. Lisäksi kaikki sanoissa olevat välimerkit tulee poistaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion toteutustapa on vapaa, helpoimmalla pääset hyödyntämällä lista- ja sanakirjakoosteita."}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, miten koosteita voidaan hyödyntää merkkijonojen kanssa
  • \n
  • Osaat käyttää omia olioita koosteissa
  • \n
  • Osaat muodostaa myös sanakirjakoosteita
  • \n

Koska koosteen lähteenä voi olla mikä tahansa sarja, voidaan sitä soveltaa myös merkkijonojen käsittelyyn. Merkkijonon läpikäynnissä poimitaan merkit yksitellen jonosta, suoritetaan nille annettu lauseke ja tallennetaan lopputulos uuden listan alkioksi.

Esimerkiksi

\nnimi = \"Pekka Python\"\n\nisot_kirjaimet = [merkki.upper() for merkki in nimi]\nprint(isot_kirjaimet)\n

['P', 'E', 'K', 'K', 'A', ' ', 'P', 'Y', 'T', 'H', 'O', 'N']

Huomaa, että lopputuloksena on lista. Jos halutaan muodostaa merkkijonon perusteella uusi merkkijono, voidaan hyödyntää aikaisemmin esiteltyä join-metodia. Metodin avulla voidaan yhdistää listan alkiot merkkijonoksi. Metodi kohdistuu välimerkkiin, jolla alkiot yhdistetään.

Metodi toimii siis esimerkiksi näin:

\nnimi = \"Pekka\"\nlista = list(nimi)\nprint(lista)\n\nprint(\"\".join(lista))\nprint(\" \".join(lista))\nprint(\",\".join(lista))\nprint(\" ja \".join(lista))\n

['P', 'e', 'k', 'k', 'a']\nPekka\nP e k k a\nP,e,k,k,a\nP ja e ja k ja k ja a

Kun yhdistetään join-metodin koosteeseen, voidaan muodostaa merkkijonosta uusi merkkijono helposti. Tarkastellaan esimerkkiä join-metodin ja koosteen yhdistelmästä, joka muodostaa alkuperäisen merkkijonon pohjalta uuden merkkijonon, jossa on ainoastaan vokaalit:

\ntestijono = \"Heippa vaan kaikki, tämä on testi\"\n\nvokaalit = [merkki for merkki in testijono if merkki in \"aeiouyåäö\"]\nuusijono = \"\".join(vokaalit)\n\nprint(uusijono)\n

eiaaaaiiääoei

Esimerkissä on selkeyden vuoksi jaettu kooste ja join-metodin kutsu omille riveilleen, mutta toki ne voi kirjoittaa myös yhdeksi lausekkeeksi:

\ntestijono = \"Heippa vaan kaikki, tämä on testi\"\n\nvokaalijono = \"\".join([merkki for merkki in testijono if merkki in \"aeiouyåäö\"])\n\nprint(vokaalijono)\n

Hyödyntämällä samassa yhteydessä vielä split-metodia, voidaan käsitellä esimerkiksi kokonaisia lauseita tehokkaasti yhdellä lausekkeella. Esimerkissä poistetaan lauseen jokaisesta sanasta ensimmäinen kirjain:

\nlause = \"Vesihiisi se kuulkaa vaan sihisi hississä\"\n\nlause_ilman_alkuja = \" \".join([sana[1:] for sana in lause.split()])\nprint(lause_ilman_alkuja)\n

esihiisi e uulkaa aan ihisi ississä

Käydään läpi tarkemmin mitä koko lausekkeessa tapahtuu:

sana[1:] ottaa osajonon sanasta alkaen toisesta merkistä (eli indeksistä 1)\nlause.split() purkaa merkkijonon listaksi annetun välimerkin kohdalta. Kun välimerkkiä ei ole määritelty, käytetään oletuksena tyhjiä välejä\n\" \".join() yhdistää listan palaset uudeksi jonoksi käyttäen välilyöntiä palojen välissä.

Sama esimerkki perinteisemmällä tavalla näyttäisi esimerkiksi tältä:

\nlause = \"Vesihiisi se kuulkaa vaan sihisi hississä\"\n\nsanalista = []\nsanat = lause.split()\nfor sana in sanat:\n    sana_ilman_alkua = sana[1:]\n    sanalista.append(sana_ilman_alkua)\n\nlause_ilman_alkuja = \" \".join(sanalista)\n\n\nprint(lause_ilman_alkuja)\n

Tee funktio suodata_kielletyt(merkkijono: str, kielletyt: str) joka palauttaa sen parametrina olevasta merkkijonosta version, joka ei sisällä yhtään merkkiä sen toisena parametrina olevasta \"kiellettyjen merkkien\" merkkijonosta.

Funktion tulee käyttää listakoostetta. Funktio saa sisältää def-rivi mukaanlukien maksimissaan 3 riviä.

Esimerkki funktion käytöstä

lause = \"Suo! kuokka, ja python: hieno yhdistelmä!??!?!\"\nsuodatettu = suodata_kielletyt(lause, \"!?:,.\")\nprint(suodatettu)

Suo kuokka ja python hieno yhdistelmä

Omat oliot koosteissa

Joskus omia olioita on näppärä käsitellä tai muodostaa koosteiden avulla. Tarkastellaan seuraavaksi muutamaa esimerkkiä tähän liittyen.

Ensimmäisessä esimerkissä luokka Maa mallintaa yhtä maata asukaslukuineen. Koosteessa poimitaan listalta kaikkien sellaisten maiden nimet, joiden asukasluku on suurempi kuin 5 miljoonaa.

\nclass Maa:\n    \"\"\" Luokka mallintaa yhtä maata asukaslukuineen \"\"\"\n    def __init__(self, nimi: str, asukasluku: int):\n        self.nimi = nimi\n        self.asukasluku = asukasluku\n\nif __name__ == \"__main__\":\n    suomi = Maa(\"Suomi\", 6000000)\n    malta = Maa(\"Malta\", 500000)\n    ruotsi = Maa(\"Ruotsi\", 10000000)\n    islanti = Maa(\"Islanti\", 350000)\n\n    maat = [suomi, malta, ruotsi, islanti]\n\n    isommat_maat = [maa.nimi for maa in maat if maa.asukasluku > 5000000]\n    for maa in isommat_maat:\n        print(maa)\n\n

Suomi\nRuotsi

Toinen vaihtoehto olisi luoda lista maa-olioista ja tulostaa sen jälkeen nimet. Tämä vaihtoehto olisi järkevämpi, jos maita tarvittaisiin vielä myöhemminkin (tai mikäli haluttaisiin esimerkiksi tarkemmin tarkastella maiden asukaslukuja silmukassa):

\nif __name__ == \"__main__\":\n    suomi = Maa(\"Suomi\", 6000000)\n    malta = Maa(\"Malta\", 500000)\n    ruotsi = Maa(\"Ruotsi\", 10000000)\n    islanti = Maa(\"Islanti\", 350000)\n\n    maat = [suomi, malta, ruotsi, islanti]\n\n    isommat_maat = [maa for maa in maat if maa.asukasluku > 5000000]\n    for maa in isommat_maat:\n        print(maa.nimi)

Toisessa esimerkissä luokka Juoksumatka mallintaa yhtä juoksumatkaa nimineen ja pituuksineen. Nyt koosteen avulla luodaan lista Juoksumatka-olioita annettujen pituuksien mukaaan.

Huomaa, että Juoksumatka-luokan konstruktorissa parametrilla nimi on oletusarvo, eikä sitä olioita luodessa esimerkissä erikseen annetakaan:

\nclass Juoksumatka:\n    \"\"\" Luokka mallintaa yhtä n metrin pituista juoksumatkaa \"\"\"\n    def __init__(self, matka:int, nimi:str = \"ei nimeä\"):\n        self.matka = matka\n        self.nimi = nimi\n\n    def __repr__(self):\n        return f\"{self.matka} m. ({self.nimi})\"\n\nif __name__ == \"__main__\":\n    pituudet = [100, 200, 1500, 3000, 42195]\n    matkat = [Juoksumatka(pituus) for pituus in pituudet]\n\n    # tulostetaan kaikki\n    print(matkat)\n\n    # Poimitaan yksi listasta ja nimetään se\n    maraton = matkat[-1] # viimeisenä listassa\n    maraton.nimi = \"Maraton\"\n\n    # Tulostetaan vielä uudella nimellä\n    print(matkat)\n

[100 m. (ei nimeä), 200 m. (ei nimeä), 1500 m. (ei nimeä), 3000 m. (ei nimeä), 42195 m. (ei nimeä)]\n[100 m. (ei nimeä), 200 m. (ei nimeä), 1500 m. (ei nimeä), 3000 m. (ei nimeä), 42195 m. (Maraton)]

Jos oma luokka on viime kerran esimerkin mukaisesti iteroitava, voidaan sitä käyttää lähteenä listakoosteessa:

\nclass Kirja:\n    def __init__(self, nimi: str, kirjailija: str, sivuja: int):\n        self.nimi = nimi\n        self.kirjailija = kirjailija\n        self.sivuja = sivuja\n\nclass Kirjahylly:\n    def __init__(self):\n        self._kirjat = []\n\n    def lisaa_kirja(self, kirja: Kirja):\n        self._kirjat.append(kirja)\n\n    # Iteraattorin alustusmetodi\n    # Tässä tulee alustaa iteroinnissa käytettävä(t) muuttuja(t)\n    def __iter__(self):\n        self.n = 0\n        # Metodi palauttaa viittauksen olioon itseensä, koska\n        # iteraattori on toteutettu samassa luokassa\n        return self\n\n    # Metodi palauttaa seuraavan alkion\n    # Jos ei ole enempää alkioita, heitetään tapahtuma\n    # StopIteration\n    def __next__(self):\n        if self.n < len(self._kirjat):\n            # Poimitaan listasta nykyinen\n            kirja = self._kirjat[self.n]\n            # Kasvatetaan laskuria yhdellä\n            self.n += 1\n            # ...ja palautetaan\n            return kirja\n        else:\n            # Ei enempää kirjoja\n            raise StopIteration\n\n# Testataan\nif __name__ == \"__main__\":\n    k1 = Kirja(\"Elämäni Pythoniassa\", \"Pekka Python\", 123)\n    k2 = Kirja(\"Vanhus ja Java\", \"Ernest Hemingjava\", 204)\n    k3 = Kirja(\"C-itsemän veljestä\", \"Keijo Koodari\", 997)\n\n    hylly = Kirjahylly()\n    hylly.lisaa_kirja(k1)\n    hylly.lisaa_kirja(k2)\n    hylly.lisaa_kirja(k3)\n\n    # Luodaan lista, jossa kaikkien kirjojen nimet\n    kirjojen_nimet = [kirja.nimi for kirja in hylly]\n    print(kirjojen_nimet)\n

Osan 10 tehtävässä teimme Kauppalista-luokasta iteroitavan. Iteroitavan luokan oliota voidaan käyttää listakoosteiden yhteydessä. Tehtäväpohjassa on mukana luokasta typistetty versio, jonka toiminnallisuus riittää tähän tehtävään.

Tee nyt funktio kauppalistan_tuotteet(kauppalista, maara: int) joka saa parametriksi kauppalista-olion. Funktio palauttaa kauppalistan ostoksista niiden tuotteiden nimet, joita on listalla vähintään parametrin maara verran.

Funktio tulee toteuttaa listakoosteen avulla, ja sen pituus saa olla def-määrittelyriveineen yhteensä korkeintaan kaksi riviä. Luokan Kauppalista koodia ei saa muuttaa!

Funktio toimii seuraavasti

lista = Kauppalista()\nlista.lisaa(\"banaanit\", 10)\nlista.lisaa(\"omenat\", 5)\nlista.lisaa(\"alkoholiton olut\", 24)\nlista.lisaa(\"ananas\", 1)\n\nprint(\"kauppalistalla vähintään 8 seuraavia tuotteita:\")\nfor tuote in kauppalistan_tuotteet(lista, 8):\n    print(tuote)

kauppalistalla vähintään 8 seuraavia tuotteita:\nbanaanit\nalkoholiton olut

Osan 9 tehtävässä teimme luokan Asunto. Tässä tehtävässä on käytössä hieman laajennettu versio luokasta.

Tee funktio halvemmat(asunnot: list, verrattava: Asunto), joka saa parametriksi listan asuntoja sekä yksittäisen vertailtavan asunnon. Funktio palauttaa listan, jolla on asunnoista ne, jotka ovat hinnaltaan halvempia kuin vertailtava asunto, sekä näiden hintaeron. Palautettavan listan alkiot ovat tupleja, joiden ensimmäinen jäsen on asunto ja toisena sen hintaero vertailtavaan.

Funktio tulee toteuttaa listakoosteen avulla. Funktion maksimipituus def-määrittelyrivi mukaanluettuna on 2 riviä.

Luokan Asunto koodia ei saa muuttaa!

Funktio toimii seuraavasti

a1 = Asunto(1, 16, 5500, \"Eira yksiö\")\na2 = Asunto(2, 38, 4200, \"Kallio kaksio\")\na3 = Asunto(3, 78, 2500, \"Jakomäki kolmio\")\na4 = Asunto(6, 215, 500, \"Suomussalmi omakotitalo\")\na5 = Asunto(4, 105, 1700, \"Kerava 4h ja keittiö\")\na6 = Asunto(25, 1200, 2500, \"Haikon kartano\")\n\nasunnot = [a1, a2, a3, a4, a5, a6]\n\nprint(f\"asuntoa {a3.kuvaus} halvemmat vaihtoehdot:\")\nfor alkio in halvemmat(asunnot, a3):\n    print(f\"{alkio[0].kuvaus:30} hintaero {alkio[1]} euroa\")

asuntoa Jakomäki kolmio halvemmat vaihtoehdot:\nEira yksiö hintaero 107000 euroa\nKallio kaksio hintaero 35400 euroa\nSuomussalmi omakotitalo hintaero 87500 euroa\nKerava 4h ja keittiö hintaero 16500 euroa

Koosteet sanakirjan kanssa

Koosteet toimivat samalla tavalla myös sanakirjan kanssa: jos vaihdetaan hakasulkeet aaltosulkeiksi, syntyy koosteen seurauksena listan sijasta sanakirja. Koska sanakirjan alkio muodostuu kahdesta komponentista - arvosta ja avaimesta, tulee molemmat komponentit antaa myös koostetta luodessa.

Lähteenä voidaan edelleen käyttää mitä tahansa sarjaa, eli esimerkiksi listaa, merkkijonoa, tuplea, sanakirjaa tai omaa iteroinnin toteuttavaa luokkaa.

Esimerkki, joka luo merkkijonon pohjalta sanakirjan, joka sisältää kaikki merkkijonon kirjaimet ja niiden esiintymämäärät:

\nlause = \"Hei kaikki\"\n\nmerkkimäärät = {kirjain : lause.count(kirjain) for kirjain in lause}\nprint(merkkimäärät)\n

{'H': 1, 'e': 1, 'i': 3, ' ': 1, 'k': 3, 'a': 1}

Periaate on siis täsmälleen sama, mutta yksittäisen arvon sijasta annetaan erikseen avain ja arvo. Yleisesti merkittynä siis:

{<avainlauseke> : <arvolauseke> for <alkio> in <sarja>}

Tarkastellaan vielä toisena esimerkkinä ohjelmaa, joka laskee kaikkien listalla olevien positiivisten lukujen kertomat, mutta tällä kertaa sanakirjaan. Luku toimii avaimena ja kertoma arvona:

\ndef kertoma(n: int):\n    \"\"\" Funktio laskee positiivisen luvun n kertoman n! \"\"\"\n    k = 1\n    while n >= 2:\n        k *= n\n        n -= 1\n    return k\n\nif __name__ == \"__main__\":\n    lista = [-2, 3, 2, 1, 4, -10, 5, 1, 6]\n    kertomat = {luku : kertoma(luku) for luku in lista if luku > 0}\n    print(kertomat)\n

{3: 6, 2: 2, 1: 1, 4: 24, 5: 120, 6: 720}

Tee funktio pituudet(merkkijonot: list), joka saa parametriksi listan merkkijonoja. Funktio palauttaa sanakirjan, jossa avaimina on listan merkkijonot ja arvoina merkkijonojen pituudet.

Funktio tulee toteuttaa sanakirjakoosteen avulla. Funktion maksimipituus def-määrittelyrivi mukaanlukien on kaksi riviä.

Funktio toimii seuraavasti

sanalista = [\"suo\", \"kuokka\" , \"python\", \"ja\", \"koodari\"]\n\nsanojen_pituudet = pituudet(sanalista)\nprint(sanojen_pituudet)

{'suo': 3, 'kuokka': 6, 'python': 6, 'ja': 2, 'koodari': 7}

Tee funktio yleisimmat_sanat(tiedoston_nimi: str, raja: int), joka saa parametrikseen tiedoston nimen. Funktio palauttaa sanakirjan, joka sisältää tiedostossa olevien sanojen esiintymislukumäärän niiden sanojen osalta, joilla on vähintään toisen parametrin raja verran esiintymiä.

Esim. jos funktiolla tarkasteltaisiin tiedostoa comprehensions.txt jonka sisältö on seuraava

List comprehension is an elegant way to define and create lists based on existing lists.\nList comprehension is generally more compact and faster than normal functions and loops for creating list.\nHowever, we should avoid writing very long list comprehensions in one line to ensure that code is user-friendly.\nRemember, every list comprehension can be rewritten in for loop, but every for loop can’t be rewritten in the form of list comprehension.

Kutsuttaessa yleisimmat_sanat(\"comprehensions.txt\", 3) funktion palauttama sanakirja näyttäisi seuraavalta:

{'comprehension': 4, 'is': 3, 'and': 3, 'for': 3, 'list': 4, 'in': 3}

Huomaa, että kirjainkoko vaikuttaa ja vain kokonaiset sanat lasketaan - sanat 'List' ja 'lists' eivät siis saa kasvattaa sanan 'list' lukumäärää. Lisäksi kaikki sanoissa olevat välimerkit tulee poistaa.

Funktion toteutustapa on vapaa, helpoimmalla pääset hyödyntämällä lista- ja sanakirjakoosteita.

","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-11/2-lisaa-koosteesta.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-11/3-rekursio/page-data.json b/page-data/osa-11/3-rekursio/page-data.json index 0ad69a03a..575e3df60 100644 --- a/page-data/osa-11/3-rekursio/page-data.json +++ b/page-data/osa-11/3-rekursio/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-11/3-rekursio", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät mitä tarkoitetaan rekursiolla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat kirjoittaa itse yksinkertaisen rekursiivisen funktion"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten aiemmin on huomattu, funktiot voivat kutsua toisia funktioita. Esimerkiksi näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tervehdi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moikka,\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tervehdi_monesti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kerrat "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kerrat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tervehdi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Samaan tapaan funktio voi kutsua myös itseään. Jos kuitenkaan funktion parametrit eivät muutu kutsukertojen välissä, tästä syntyy \"ikuinen silmukka\":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tervehdi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moikka,\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tervehdi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tällöin funktion kutsuminen millä tahansa merkkijonolla antaa virheilmoituksen:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"RecursionError: maximum recursion depth exceeded"}]}]},{"type":"element","tagName":"h2","properties":{"id":"mita-rekursio-tarkoittaa","style":"position:relative;"},"children":[{"type":"text","value":"Mitä rekursio tarkoittaa?"},{"type":"element","tagName":"a","properties":{"href":"#mita-rekursio-tarkoittaa","ariaLabel":"mita rekursio tarkoittaa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Virheilmoituksessakin mainitulla "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"rekursiolla"}]},{"type":"text","value":" tarkoitetaan sitä, että funktio kutsuu itseään. Rekursiossa funktion parametrien pitää kuitenkin muuttua niin, että jossain vaiheessa kutsuminen lopetetaan. Perusperiaate on sama kuin silmukoissa: jotta silmukka ei jatkuisi ikuisesti, siinä tulee olla päättymisehto, joka toteutuu jossain vaiheessa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan aluksi yksinkertaista funktiota, joka lisää listan loppuun 0-alkioita niin kauan kuin listan pituus on alle 10. Silmukan sijasta funktio kutsuukin itseään uudestaan, jos ehto ei täyty:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tayta_lista"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Lisää listaan alkoita jos sen pituus on alle 10 \"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kutsutaan uudestaaan"}]},{"type":"text","value":"\n tayta_lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n testi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n tayta_lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"testi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"testi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 2, 3, 4, 0, 0, 0, 0, 0, 0]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Perinteisellä silmukalla ohjelma näyttäisi esimerkiksi tältä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tayta_lista"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Lisää listaan alkoita jos sen pituus on alle 10 \"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n testi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n tayta_lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"testi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"testi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkeistä huomataan, että perinteinen (eli "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"iteratiivinen"}]},{"type":"text","value":") lähestymistapa tuottaa lyhyemmän ja selkeämmän ohjelman. Rekursiivinen ohjelma kuitenkin toimii ja tuottaa oikean lopputuloksen, koska funktio käsittelee jokaisella kutsukerralla samaa listaa viittauksen kautta."}]},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Iteratiivinen vai rekursiivinen?"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tietojenkäsittelytieteteessä erotetaan usein "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"iteratiiviset"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"rekursiiviset"}]},{"type":"text","value":" algoritmit. Iteratiivinen tarkoittaa kurssilla tähän asti yleensä käyttämäämme tapaa, jossa ratkaisu perustuu peräkkäisyyteen – yleensä siihen, että käsitellään rakenne silmukassa. Rekursiivinen tarkoittaa vaihtoehtoista tapaa, jossa funktio silmukan sijasta (tai lisäksi) kutsuu itseään muuttuvilla parametrien arvoilla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mikä tahansa algoritmi on periaatteessa mahdollista toteuttaa sekä iteratiivisesti että rekursiivisesti, mutta monessa tapauksessa jompikumpi tapa soveltuu selkeästi paremmin ongelman ratkaisemiseen."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Suurempia lukuja","tmcname":"osa11-13_listaan_lukuja"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"rekursiivinen funktio"}]},{"type":"text","value":" "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"listaan_lukuja(luvut: list)"}]},{"type":"text","value":", joka lisää listaan lukuja niin kauan, kunnes listan pituus on viidellä jaollinen. Jokainen listaan lisättävä luku on aina yhden suurempi kuin listan viimeinen luku."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion pitää kutsua itseään rekursiivisesti."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsusta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nlistaan_lukuja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 3, 4, 5, 10, 11, 12, 13, 14, 15]"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"rekursio-ja-paluuarvot","style":"position:relative;"},"children":[{"type":"text","value":"Rekursio ja paluuarvot"},{"type":"element","tagName":"a","properties":{"href":"#rekursio-ja-paluuarvot","ariaLabel":"rekursio ja paluuarvot permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rekursiivisella funktiolla voi olla myös palautusarvo. Tarkastellaan tätä tarkoitusta varten esimerkkiä, joka laskee kertoman rekursiivisesti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kertoma"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Funktio laskee positiivisen luvun n kertoman n!, eli n * (n-1) ... * 2 * 1 \"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Lukujen 0 ja 1 kertoma on 1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kutsuu funktiota uudestaan"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" kertoma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Testataan"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Luvun "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" kertoma on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"kertoma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luvun 1 kertoma on 1\nLuvun 2 kertoma on 2\nLuvun 3 kertoma on 6\nLuvun 4 kertoma on 24\nLuvun 5 kertoma on 120\nLuvun 6 kertoma on 720"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos funktion parametrin arvo on 0 tai 1, funktio palauttaa 1 (koska kertoman määritelmän mukaan lukujen 0 ja 1 kertoma on 1). Muuten funktio palauttaa lausekkeen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"n * kertoma(n - 1)"}]},{"type":"text","value":". Tämä tarkoittaa, että parametri "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"n"}]},{"type":"text","value":" kerrotaan funktion itsensä kutsun palauttamalla arvolla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olennaista funktion toimivuuden kannalta on, että funktiossa on määritelty ehto, jolla se ei kutsu itseään enää uudestaan. Tässä tapauksessa ehto on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"n < 2"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"http://www.pythontutor.com/visualize.html#mode=edit","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Visualisaattori"}]},{"type":"text","value":" on oivallinen väline rekursiota käyttävien ohjelmien tutkimiseksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajennetaan kertoman laskevaa funktiota niin, että se käyttää apumuuttujia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kertoma"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n edellisen_luvun_kertoma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kertoma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luvun_n_kertoma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" edellisen_luvun_kertoma\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" luvun_n_kertoma\n \nkertoma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kokeile, miten "},{"type":"element","tagName":"a","properties":{"href":"http://www.pythontutor.com/visualize.html#code=def%20kertoma%28n%3A%20int%29%3A%0A%20%20%20%20if%20n%20%3C%202%3A%0A%20%20%20%20%20%20%20%20return%201%0A%0A%20%20%20%20edellisen_luvun_kertoma%20%3D%20kertoma%28n%20-%201%29%0A%20%20%20%20luvun_n_kertoma%20%3D%20n%20*%20edellisen_luvun_kertoma%0A%20%20%20%20return%20luvun_n_kertoma%0A%20%20%20%20%0Akertoma%285%29&cumulative=false&curInstr=5&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"visualisaattori"}]},{"type":"text","value":" demonstroi rekursion etenemisen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hieman normaalista poiketen visualisaattorissa kutsupino \"kasvaa\" alaspäin. Suorituksessa oleva funktiokutsu on kutsupinon alimpana oleva sinisellä merkitty \"lohko\", jolla on omat muuttujansa. Hetken kuluttua palautettava tulos on laskettu muuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luvun_n_kertoma"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/9d75a2d6b42864178f98c237765dbc86/6976b/11_1_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 43.913043478260875%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAABYlAAAWJQFJUiTwAAABKklEQVQoz42Ry04DMQxF+/+fxgapGwQSQtBKhcx08rJnbMeOUWcKpTuOoiwSnST3ZpcrlYq1lgJLKpeRCwCA/4Odu/cVNQtjHM7ZrG+L26ym3b2tiMg8zze5946I0zSllBaSpv1Xc3dZaKmwAJaYlEVEzuezqt5kMyuljOOIAIhYV4jIepcQecqOJBksVudm3brZVTZhJgor4zDEONUfmLmlyk3c3bzrTE5yl9lUAaCU0loDJJj57zaPaangaiZN6+zcfI10lWvOKaWtBhZjtt59y+LuMaSP18/xVE6HqXxGX+5v1tbMDAFCCMPl7V8hBADo6xkh4ePzcf9yfHh6D4fB9292HPtUvF062wFKRSFAYUorIqKq2/+xaEGKGWIGknYpayZjMTUz+wbqwQrKy5mcywAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/9d75a2d6b42864178f98c237765dbc86/a0b58/11_1_1.webp 230w","/static/9d75a2d6b42864178f98c237765dbc86/bc10c/11_1_1.webp 460w","/static/9d75a2d6b42864178f98c237765dbc86/966d8/11_1_1.webp 920w","/static/9d75a2d6b42864178f98c237765dbc86/445df/11_1_1.webp 1380w","/static/9d75a2d6b42864178f98c237765dbc86/78de1/11_1_1.webp 1840w","/static/9d75a2d6b42864178f98c237765dbc86/129b4/11_1_1.webp 2172w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/9d75a2d6b42864178f98c237765dbc86/81c8e/11_1_1.png 230w","/static/9d75a2d6b42864178f98c237765dbc86/08a84/11_1_1.png 460w","/static/9d75a2d6b42864178f98c237765dbc86/c0255/11_1_1.png 920w","/static/9d75a2d6b42864178f98c237765dbc86/b1001/11_1_1.png 1380w","/static/9d75a2d6b42864178f98c237765dbc86/161ec/11_1_1.png 1840w","/static/9d75a2d6b42864178f98c237765dbc86/6976b/11_1_1.png 2172w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/9d75a2d6b42864178f98c237765dbc86/c0255/11_1_1.png","alt":"11 1 1","title":"11 1 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan vielä toista funktiota, joka laskee halutun Fibonaccin luvun rekursiivisesti. Fibonaccin lukujonossa luku on aina kahden edellisen luvun summa. Niinpä jonon alku näyttää tältä: 1, 1, 2, 3, 5, 8, 13, 21, 34."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"fibonacci"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Funktio palauttaa n:nen luvun Fibonaccin sarjasta (1, 1, 2, 3, 5, 8 jne.); n > 0\"\"\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kaksi ekaa lukua ovat ykkösiä"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Muuten luku saadaan laskemalla kaksi edellistä yhteen"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" fibonacci"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" fibonacci"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Testataan, että toimii"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Fibonaccin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":". luku on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"fibonacci"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Fibonaccin 1. luku on 1\nFibonaccin 2. luku on 1\nFibonaccin 3. luku on 2\nFibonaccin 4. luku on 3\nFibonaccin 5. luku on 5\nFibonaccin 6. luku on 8\nFibonaccin 7. luku on 13\nFibonaccin 8. luku on 21\nFibonaccin 9. luku on 34\nFibonaccin 10. luku on 55"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tällä kertaa lopetusehtona on, että luku on pienempi tai yhtä suuri kuin 2, koska Fibonaccin kaksi ensimmäistä lukua ovat molemmat ykkösiä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Miten algoritmi käytännössä oikein toimii?"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luvuille 1 ja 2 algoritmi palauttaa arvon 1 ehdon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"n <= 2"}]},{"type":"text","value":" mukaisesti."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luvulle 3 algoritmi palauttaa arvon lausekkeesta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"fibonacci(n - 1) + fibonacci(n - 2)"}]},{"type":"text","value":", eli käytännössä lausekkeen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"fibonacci(2) + fibonacci(1)"}]},{"type":"text","value":". Koska edellisessä kohdassa huomattiin, että näiden molempien arvo on 1, palauttaa funktio siis arvon 2 (joka onkin kolmas Fibonaccin luku)"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luvulle 4 algoritmi palauttaa arvon lausekkeesta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"fibonacci(3) + fibonacci(2)"}]},{"type":"text","value":", mikä edellisten kohtien perusteella on siis "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"2 + 1"}]},{"type":"text","value":" eli 3."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luvulle 5 algoritmi palauttaa arvon lausekkeesta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"fibonacci(4) + fibonacci(3)"}]},{"type":"text","value":", mikä edellisten kohtien perusteella on siis "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"3 + 2"}]},{"type":"text","value":" eli 5."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"jne."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rekursiivinen algoritmimme siis toimii, koska voimme todistaa jokaisen luvun kohdalla ohjelman toimivuuden aikaisempien lukujen perusteella."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Rekursiivinen summa","tmcname":"osa11-14_rekursiivinen_summa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee rekursiivinen funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa(luku: int)"}]},{"type":"text","value":" summan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"1 + 2 + ... + luku"}]},{"type":"text","value":" laskemiseen. Funktion runko on seuraava:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"summa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kun luku on 1, ei ole muita summattavia..."}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" luku\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# täydennä koodi..."}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muutama käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"6\n15\n55"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sulut tasapainossa","tmcname":"osa11-15_sulut_tasapainossa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on valmiina funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sulut_tasapainossa"}]},{"type":"text","value":", joka tarkastaa, onko sen parametrina olevassa merkkijonossa sulut tasapainossa, eli onko jokaista \"aukeavaa\" sulkumerkkiä ( kohti on oma \"sulkeutuva\" sulkumerkki ), ja että sulut eivät mene ristiin."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"sulut_tasapainossa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"merkkijono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"merkkijono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"merkkijono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'('"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" merkkijono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"')'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# poistetaan ensimmäinen ja viimeinen merkki"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" sulut_tasapainossa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"merkkijono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nok "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sulut_tasapainossa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"(((())))\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ok"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ei kelpaa sillä yksi loppusulku liikaa"}]},{"type":"text","value":"\nok "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sulut_tasapainossa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"()())\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ok"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ei kelpaa sillä alussa virheellinen loppusulku"}]},{"type":"text","value":"\nok "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sulut_tasapainossa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\")()\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ok"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ei kelpaa, sillä funktio ei osaa käsitellä kuin sisäkkäisiä sulkuja"}]},{"type":"text","value":"\nok "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sulut_tasapainossa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"()(())\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ok"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\nFalse\nFalse\nFalse"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajenna funktiota siten, että se jättää huomiotta kaikki muut kuin sulkumerkit, ja että se osaa kaarisulkujen lisäksi myös hakasulut. Haka- ja kaarisulut eivät saa mennä ristiin!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa muutama käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ok "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sulut_tasapainossa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"([([])])\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ok"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nok "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sulut_tasapainossa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"(python versio [3.7]) käytä tätä!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ok"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ei kelpaa sillä virheellinen loppusulku"}]},{"type":"text","value":"\nok "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sulut_tasapainossa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"(()]\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ok"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ei kelpaa sillä erityyppiset sulut menevät ristiin"}]},{"type":"text","value":"\nok "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sulut_tasapainossa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"([huono)]\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ok"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että funktion ei tarvitse osata kuin yksi sisäkkäinen sulutus - sen ei siis tarvitse ymmärtää esimerkiksi jonoa (x + 1)(y + 1)."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\nTrue\nFalse\nFalse"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"binaarihaku","style":"position:relative;"},"children":[{"type":"text","value":"Binäärihaku"},{"type":"element","tagName":"a","properties":{"href":"#binaarihaku","ariaLabel":"binaarihaku permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Binäärihaussa yritetään löytää järjestyksessä olevasta listasta annettu alkio. Järjestys tarkoittaa tässä yhteydessä esimerkiksi lukujen järjestystä pienimmästä suurimpaan tai merkkijonoja aakkosjärjestyksessä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Binäärihaun ideana on, että tarkastellaan aina listan keskimmäistä alkiota. Jos"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"keskimmäinen alkio on etsitty alkio, palautetaan tieto siitä, että alkio löytyi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"keskimmäinen alkio on pienempi kuin etsittävä alkio, rajataan haku listan jälkimmäiselle puolikkaalle"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"keskimmäinen alkio on suurempi kuin etsittävä alkio, rajataan haku listan ensimmäiselle puolikkaalle"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos lista on tyhjä, palautetaan tieto siitä, että alkiota ei löytynyt."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava kuva havainnollistaa binäärihaun etenemistä, kun etsitään listasta lukua 24:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 777px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/ca600c1fe96166b67e6fe37b5f5dcc89/108f8/11_3_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 43.47826086956522%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABXklEQVQoz5WQ3UvCUBiH989FdN9dRBAUEhFd1G13EXQREQTdCAYl5AojMQrLKfRBNmSVusCczjn3gbYv5xlzO2/pBgVB4I/Dj/fmOec5LwHjRFGURqMhiiLP86ZpEhgAYwh7FB/7fjj8HDyCHcexLMu2bU3TEELEdCy1dHq7mMgskNeRk+xsKjHxuDGfPlsm86vn1EqSWrvIR8ib/IcAAJ1uV9d1wzACEYIR1bLcYSWNbeuV9iejtp8MlpZaBV6hBZkWlGJLfW7KimUDQK/Xs20bIRTCOzn64K60+ZRZf4/uFu6jD5U96pXrmADgh7LDBOLaKKZphnC8yCaZeqxE79fTx28vJFM9pMu8NhQb+P7vbwOAYRi6rluWFcKu5/Wh72DXcwHwWLsHYubocjK3NZXdnotfUdUmALie//eSQFsQBI7jarVaYE7Ipi0hTUK6avWRO/j/Kc/zMMZBf8Nfq6LsorLTvyMAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/ca600c1fe96166b67e6fe37b5f5dcc89/a0b58/11_3_1.webp 230w","/static/ca600c1fe96166b67e6fe37b5f5dcc89/bc10c/11_3_1.webp 460w","/static/ca600c1fe96166b67e6fe37b5f5dcc89/2e4ba/11_3_1.webp 777w"],"sizes":"(max-width: 777px) 100vw, 777px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/ca600c1fe96166b67e6fe37b5f5dcc89/81c8e/11_3_1.png 230w","/static/ca600c1fe96166b67e6fe37b5f5dcc89/08a84/11_3_1.png 460w","/static/ca600c1fe96166b67e6fe37b5f5dcc89/108f8/11_3_1.png 777w"],"sizes":"(max-width: 777px) 100vw, 777px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/ca600c1fe96166b67e6fe37b5f5dcc89/108f8/11_3_1.png","alt":"11 3 1","title":"11 3 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rekursiivinen algoritmi binäärihaulle:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"binaarihaku"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vasen "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" oikea "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Funktio palauttaa True tai False sen mukaan, onko listalla alkiota \"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Jos hakualue on tyhjä, ei löydy"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" vasen "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" oikea"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Lasketaan hakualueen keskikohta"}]},{"type":"text","value":"\n keski "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vasen"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"oikea"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"//"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Jos keskellä on etsittävä alkio"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"keski"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Jos pienempi, etsi jälkipuoliskolta"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"keski"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" binaarihaku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" keski"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" oikea"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Muuten täytyy olla suurempi, etsitään alkupuoliskolta"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" binaarihaku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vasen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" keski"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Testataan"}]},{"type":"text","value":"\n lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"13"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"14"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"18"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"binaarihaku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"binaarihaku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"13"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"binaarihaku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"binaarihaku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\nTrue\nFalse\nFalse"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä funktiolle "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"binaarihaku"}]},{"type":"text","value":" annetaan neljä parametria: viite listaan, etsittävä alkio sekä hakualueen vasen ja oikea kohta. Alussa hakualue on koko lista, jolloin vasen kohta on 0 ja oikea kohta on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"len(lista)-1"}]},{"type":"text","value":". Funktio tarkastaa hakualueen keskellä olevan alkion ja joko ilmoittaa, että haluttu alkio löytyi, tai jatkaa hakua vasemmasta tai oikeasta puoliskosta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos verrataan binäärihakua "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"peräkkäishakuun"}]},{"type":"text","value":", algoritmien tehokkuus erottuu selvästi. Peräkkäishaussa alkiota lähdetään etsimään listan alusta ja listaa käydään läpi yksi alkio kerrallaan, kunnes alkio on löytynyt tai on päästy listan loppuun. Jos listan pituus on miljoona alkiota, tarvitaan perättäishaussa koko listan läpikäyntiin miljoona askelta, mutta binäärihaussa askelia tarvitaan vain 20."}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät mitä tarkoitetaan rekursiolla
  • \n
  • Osaat kirjoittaa itse yksinkertaisen rekursiivisen funktion
  • \n

Kuten aiemmin on huomattu, funktiot voivat kutsua toisia funktioita. Esimerkiksi näin:

def tervehdi(nimi : str):\n    print(\"Moikka,\", nimi)\n\ndef tervehdi_monesti(nimi : str, kerrat : int):\n    for i in range(kerrat):\n        tervehdi(nimi)

Samaan tapaan funktio voi kutsua myös itseään. Jos kuitenkaan funktion parametrit eivät muutu kutsukertojen välissä, tästä syntyy \"ikuinen silmukka\":

def tervehdi(nimi : str):\n    print(\"Moikka,\", nimi)\n    tervehdi(nimi)

Tällöin funktion kutsuminen millä tahansa merkkijonolla antaa virheilmoituksen:

RecursionError: maximum recursion depth exceeded

Mitä rekursio tarkoittaa?

Virheilmoituksessakin mainitulla rekursiolla tarkoitetaan sitä, että funktio kutsuu itseään. Rekursiossa funktion parametrien pitää kuitenkin muuttua niin, että jossain vaiheessa kutsuminen lopetetaan. Perusperiaate on sama kuin silmukoissa: jotta silmukka ei jatkuisi ikuisesti, siinä tulee olla päättymisehto, joka toteutuu jossain vaiheessa.

Tarkastellaan aluksi yksinkertaista funktiota, joka lisää listan loppuun 0-alkioita niin kauan kuin listan pituus on alle 10. Silmukan sijasta funktio kutsuukin itseään uudestaan, jos ehto ei täyty:

def tayta_lista(luvut: list):\n    \"\"\" Lisää listaan alkoita jos sen pituus on alle 10 \"\"\"\n    if len(luvut) < 10:\n        luvut.append(0)\n        # Kutsutaan uudestaaan\n        tayta_lista(luvut)\n\n\nif __name__ == \"__main__\":\n    testi = [1,2,3,4]\n    tayta_lista(testi)\n    print(testi)

[1, 2, 3, 4, 0, 0, 0, 0, 0, 0]

Perinteisellä silmukalla ohjelma näyttäisi esimerkiksi tältä:

\ndef tayta_lista(luvut: list):\n    \"\"\" Lisää listaan alkoita jos sen pituus on alle 10 \"\"\"\n    while len(luvut) < 10:\n        luvut.append(0)\n\nif __name__ == \"__main__\":\n    testi = [1,2,3,4]\n    tayta_lista(testi)\n    print(testi)\n

Esimerkeistä huomataan, että perinteinen (eli iteratiivinen) lähestymistapa tuottaa lyhyemmän ja selkeämmän ohjelman. Rekursiivinen ohjelma kuitenkin toimii ja tuottaa oikean lopputuloksen, koska funktio käsittelee jokaisella kutsukerralla samaa listaa viittauksen kautta.

Tietojenkäsittelytieteteessä erotetaan usein iteratiiviset ja rekursiiviset algoritmit. Iteratiivinen tarkoittaa kurssilla tähän asti yleensä käyttämäämme tapaa, jossa ratkaisu perustuu peräkkäisyyteen – yleensä siihen, että käsitellään rakenne silmukassa. Rekursiivinen tarkoittaa vaihtoehtoista tapaa, jossa funktio silmukan sijasta (tai lisäksi) kutsuu itseään muuttuvilla parametrien arvoilla.

Mikä tahansa algoritmi on periaatteessa mahdollista toteuttaa sekä iteratiivisesti että rekursiivisesti, mutta monessa tapauksessa jompikumpi tapa soveltuu selkeästi paremmin ongelman ratkaisemiseen.

Kirjoita rekursiivinen funktio listaan_lukuja(luvut: list), joka lisää listaan lukuja niin kauan, kunnes listan pituus on viidellä jaollinen. Jokainen listaan lisättävä luku on aina yhden suurempi kuin listan viimeinen luku.

Funktion pitää kutsua itseään rekursiivisesti.

Esimerkki funktion kutsusta:

luvut = [1,3,4,5,10,11]\nlistaan_lukuja(luvut)\nprint(luvut)

[1, 3, 4, 5, 10, 11, 12, 13, 14, 15]

Rekursio ja paluuarvot

Rekursiivisella funktiolla voi olla myös palautusarvo. Tarkastellaan tätä tarkoitusta varten esimerkkiä, joka laskee kertoman rekursiivisesti:

\ndef kertoma(n: int):\n    \"\"\" Funktio laskee positiivisen luvun n kertoman n!, eli n * (n-1) ... * 2 * 1 \"\"\"\n    if n < 2:\n        # Lukujen 0 ja 1 kertoma on 1\n        return 1\n\n    # Kutsuu funktiota uudestaan\n    return n * kertoma(n - 1)\n\nif __name__ == \"__main__\":\n    # Testataan\n    for i in range(1, 7):\n        print(f\"Luvun {i} kertoma on {kertoma(i)}\")\n

Luvun 1 kertoma on 1\nLuvun 2 kertoma on 2\nLuvun 3 kertoma on 6\nLuvun 4 kertoma on 24\nLuvun 5 kertoma on 120\nLuvun 6 kertoma on 720

Jos funktion parametrin arvo on 0 tai 1, funktio palauttaa 1 (koska kertoman määritelmän mukaan lukujen 0 ja 1 kertoma on 1). Muuten funktio palauttaa lausekkeen n * kertoma(n - 1). Tämä tarkoittaa, että parametri n kerrotaan funktion itsensä kutsun palauttamalla arvolla.

Olennaista funktion toimivuuden kannalta on, että funktiossa on määritelty ehto, jolla se ei kutsu itseään enää uudestaan. Tässä tapauksessa ehto on n < 2.

Visualisaattori on oivallinen väline rekursiota käyttävien ohjelmien tutkimiseksi.

Laajennetaan kertoman laskevaa funktiota niin, että se käyttää apumuuttujia:

def kertoma(n: int):\n    if n < 2:\n        return 1\n\n    edellisen_luvun_kertoma = kertoma(n - 1)\n    luvun_n_kertoma = n * edellisen_luvun_kertoma\n    return luvun_n_kertoma\n    \nkertoma(5)

Kokeile, miten visualisaattori demonstroi rekursion etenemisen.

Hieman normaalista poiketen visualisaattorissa kutsupino \"kasvaa\" alaspäin. Suorituksessa oleva funktiokutsu on kutsupinon alimpana oleva sinisellä merkitty \"lohko\", jolla on omat muuttujansa. Hetken kuluttua palautettava tulos on laskettu muuttujaan luvun_n_kertoma.

\n \n \n \n \n \n \"11\n \n \n

Tarkastellaan vielä toista funktiota, joka laskee halutun Fibonaccin luvun rekursiivisesti. Fibonaccin lukujonossa luku on aina kahden edellisen luvun summa. Niinpä jonon alku näyttää tältä: 1, 1, 2, 3, 5, 8, 13, 21, 34.

def fibonacci(n: int):\n    \"\"\" Funktio palauttaa n:nen luvun Fibonaccin sarjasta (1, 1, 2, 3, 5, 8 jne.); n > 0\"\"\"\n\n    if n <= 2:\n        # Kaksi ekaa lukua ovat ykkösiä\n        return 1\n\n    # Muuten luku saadaan laskemalla kaksi edellistä yhteen\n    return fibonacci(n - 1) + fibonacci(n - 2)\n\n# Testataan, että toimii\nif __name__ == \"__main__\":\n    for i in range(1, 11):\n        print(f\"Fibonaccin {i}. luku on {fibonacci(i)}\")

Fibonaccin 1. luku on 1\nFibonaccin 2. luku on 1\nFibonaccin 3. luku on 2\nFibonaccin 4. luku on 3\nFibonaccin 5. luku on 5\nFibonaccin 6. luku on 8\nFibonaccin 7. luku on 13\nFibonaccin 8. luku on 21\nFibonaccin 9. luku on 34\nFibonaccin 10. luku on 55

Tällä kertaa lopetusehtona on, että luku on pienempi tai yhtä suuri kuin 2, koska Fibonaccin kaksi ensimmäistä lukua ovat molemmat ykkösiä.

Miten algoritmi käytännössä oikein toimii?

Luvuille 1 ja 2 algoritmi palauttaa arvon 1 ehdon n <= 2 mukaisesti.

Luvulle 3 algoritmi palauttaa arvon lausekkeesta fibonacci(n - 1) + fibonacci(n - 2), eli käytännössä lausekkeen fibonacci(2) + fibonacci(1). Koska edellisessä kohdassa huomattiin, että näiden molempien arvo on 1, palauttaa funktio siis arvon 2 (joka onkin kolmas Fibonaccin luku)

Luvulle 4 algoritmi palauttaa arvon lausekkeesta fibonacci(3) + fibonacci(2), mikä edellisten kohtien perusteella on siis 2 + 1 eli 3.

Luvulle 5 algoritmi palauttaa arvon lausekkeesta fibonacci(4) + fibonacci(3), mikä edellisten kohtien perusteella on siis 3 + 2 eli 5.

jne.

Rekursiivinen algoritmimme siis toimii, koska voimme todistaa jokaisen luvun kohdalla ohjelman toimivuuden aikaisempien lukujen perusteella.

Tee rekursiivinen funktio summa(luku: int) summan 1 + 2 + ... + luku laskemiseen. Funktion runko on seuraava:

def summa(luku: int):\n    # kun luku on 1, ei ole muita summattavia...\n    if luku <= 1:\n        return luku\n\n    # täydennä koodi...

Muutama käyttöesimerkki:

tulos = summa(3)\nprint(tulos)\n\nprint(summa(5))\nprint(summa(10))

6\n15\n55

Tehtäväpohjassa on valmiina funktio sulut_tasapainossa, joka tarkastaa, onko sen parametrina olevassa merkkijonossa sulut tasapainossa, eli onko jokaista \"aukeavaa\" sulkumerkkiä ( kohti on oma \"sulkeutuva\" sulkumerkki ), ja että sulut eivät mene ristiin.

def sulut_tasapainossa(merkkijono: str):\n    if len(merkkijono) == 0:\n        return True\n    if not (merkkijono[0] == '(' and merkkijono[-1] == ')'):\n        return False\n\n    # poistetaan ensimmäinen ja viimeinen merkki\n    return sulut_tasapainossa(merkkijono[1:-1])\n\nok = sulut_tasapainossa(\"(((())))\")\nprint(ok)\n\n# ei kelpaa sillä yksi loppusulku liikaa\nok = sulut_tasapainossa(\"()())\")\nprint(ok)\n\n# ei kelpaa sillä alussa virheellinen loppusulku\nok = sulut_tasapainossa(\")()\")\nprint(ok)\n\n# ei kelpaa, sillä funktio ei osaa käsitellä kuin sisäkkäisiä sulkuja\nok = sulut_tasapainossa(\"()(())\")\nprint(ok)

True\nFalse\nFalse\nFalse

Laajenna funktiota siten, että se jättää huomiotta kaikki muut kuin sulkumerkit, ja että se osaa kaarisulkujen lisäksi myös hakasulut. Haka- ja kaarisulut eivät saa mennä ristiin!

Seuraavassa muutama käyttöesimerkki:

ok = sulut_tasapainossa(\"([([])])\")\nprint(ok)\n\nok = sulut_tasapainossa(\"(python versio [3.7]) käytä tätä!\")\nprint(ok)\n\n# ei kelpaa sillä virheellinen loppusulku\nok = sulut_tasapainossa(\"(()]\")\nprint(ok)\n\n\n# ei kelpaa sillä erityyppiset sulut menevät ristiin\nok = sulut_tasapainossa(\"([huono)]\")\nprint(ok)

Huomaa, että funktion ei tarvitse osata kuin yksi sisäkkäinen sulutus - sen ei siis tarvitse ymmärtää esimerkiksi jonoa (x + 1)(y + 1).

True\nTrue\nFalse\nFalse

Binäärihaku

Binäärihaussa yritetään löytää järjestyksessä olevasta listasta annettu alkio. Järjestys tarkoittaa tässä yhteydessä esimerkiksi lukujen järjestystä pienimmästä suurimpaan tai merkkijonoja aakkosjärjestyksessä.

Binäärihaun ideana on, että tarkastellaan aina listan keskimmäistä alkiota. Jos

    \n
  • keskimmäinen alkio on etsitty alkio, palautetaan tieto siitä, että alkio löytyi
  • \n
  • keskimmäinen alkio on pienempi kuin etsittävä alkio, rajataan haku listan jälkimmäiselle puolikkaalle
  • \n
  • keskimmäinen alkio on suurempi kuin etsittävä alkio, rajataan haku listan ensimmäiselle puolikkaalle
  • \n

Jos lista on tyhjä, palautetaan tieto siitä, että alkiota ei löytynyt.

Seuraava kuva havainnollistaa binäärihaun etenemistä, kun etsitään listasta lukua 24:

\n \n 0\"\"\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kaksi ekaa lukua ovat ykkösiä"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Muuten luku saadaan laskemalla kaksi edellistä yhteen"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" fibonacci"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" fibonacci"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Testataan, että toimii"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Fibonaccin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":". luku on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"fibonacci"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Fibonaccin 1. luku on 1\nFibonaccin 2. luku on 1\nFibonaccin 3. luku on 2\nFibonaccin 4. luku on 3\nFibonaccin 5. luku on 5\nFibonaccin 6. luku on 8\nFibonaccin 7. luku on 13\nFibonaccin 8. luku on 21\nFibonaccin 9. luku on 34\nFibonaccin 10. luku on 55"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tällä kertaa lopetusehtona on, että luku on pienempi tai yhtä suuri kuin 2, koska Fibonaccin kaksi ensimmäistä lukua ovat molemmat ykkösiä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Miten algoritmi käytännössä oikein toimii?"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luvuille 1 ja 2 algoritmi palauttaa arvon 1 ehdon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"n <= 2"}]},{"type":"text","value":" mukaisesti."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luvulle 3 algoritmi palauttaa arvon lausekkeesta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"fibonacci(n - 1) + fibonacci(n - 2)"}]},{"type":"text","value":", eli käytännössä lausekkeen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"fibonacci(2) + fibonacci(1)"}]},{"type":"text","value":". Koska edellisessä kohdassa huomattiin, että näiden molempien arvo on 1, palauttaa funktio siis arvon 2 (joka onkin kolmas Fibonaccin luku)"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luvulle 4 algoritmi palauttaa arvon lausekkeesta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"fibonacci(3) + fibonacci(2)"}]},{"type":"text","value":", mikä edellisten kohtien perusteella on siis "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"2 + 1"}]},{"type":"text","value":" eli 3."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luvulle 5 algoritmi palauttaa arvon lausekkeesta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"fibonacci(4) + fibonacci(3)"}]},{"type":"text","value":", mikä edellisten kohtien perusteella on siis "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"3 + 2"}]},{"type":"text","value":" eli 5."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"jne."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rekursiivinen algoritmimme siis toimii, koska voimme todistaa jokaisen luvun kohdalla ohjelman toimivuuden aikaisempien lukujen perusteella."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Rekursiivinen summa","tmcname":"osa11-14_rekursiivinen_summa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee rekursiivinen funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa(luku: int)"}]},{"type":"text","value":" summan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"1 + 2 + ... + luku"}]},{"type":"text","value":" laskemiseen. Funktion runko on seuraava:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"summa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kun luku on 1, ei ole muita summattavia..."}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" luku\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# täydennä koodi..."}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muutama käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"6\n15\n55"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sulut tasapainossa","tmcname":"osa11-15_sulut_tasapainossa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on valmiina funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sulut_tasapainossa"}]},{"type":"text","value":", joka tarkastaa, onko sen parametrina olevassa merkkijonossa sulut tasapainossa, eli onko jokaista \"aukeavaa\" sulkumerkkiä ( kohti on oma \"sulkeutuva\" sulkumerkki ), ja että sulut eivät mene ristiin."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"sulut_tasapainossa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"merkkijono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"merkkijono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"merkkijono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'('"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" merkkijono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"')'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# poistetaan ensimmäinen ja viimeinen merkki"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" sulut_tasapainossa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"merkkijono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nok "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sulut_tasapainossa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"(((())))\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ok"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ei kelpaa sillä yksi loppusulku liikaa"}]},{"type":"text","value":"\nok "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sulut_tasapainossa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"()())\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ok"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ei kelpaa sillä alussa virheellinen loppusulku"}]},{"type":"text","value":"\nok "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sulut_tasapainossa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\")()\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ok"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ei kelpaa, sillä funktio ei osaa käsitellä kuin sisäkkäisiä sulkuja"}]},{"type":"text","value":"\nok "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sulut_tasapainossa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"()(())\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ok"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\nFalse\nFalse\nFalse"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajenna funktiota siten, että se jättää huomiotta kaikki muut kuin sulkumerkit, ja että se osaa kaarisulkujen lisäksi myös hakasulut. Haka- ja kaarisulut eivät saa mennä ristiin!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa muutama käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ok "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sulut_tasapainossa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"([([])])\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ok"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nok "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sulut_tasapainossa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"(python versio [3.7]) käytä tätä!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ok"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ei kelpaa sillä virheellinen loppusulku"}]},{"type":"text","value":"\nok "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sulut_tasapainossa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"(()]\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ok"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ei kelpaa sillä erityyppiset sulut menevät ristiin"}]},{"type":"text","value":"\nok "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sulut_tasapainossa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"([huono)]\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ok"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että funktion ei tarvitse osata kuin yksi sisäkkäinen sulutus - sen ei siis tarvitse ymmärtää esimerkiksi jonoa (x + 1)(y + 1)."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\nTrue\nFalse\nFalse"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"binaarihaku","style":"position:relative;"},"children":[{"type":"text","value":"Binäärihaku"},{"type":"element","tagName":"a","properties":{"href":"#binaarihaku","ariaLabel":"binaarihaku permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Binäärihaussa yritetään löytää järjestyksessä olevasta listasta annettu alkio. Järjestys tarkoittaa tässä yhteydessä esimerkiksi lukujen järjestystä pienimmästä suurimpaan tai merkkijonoja aakkosjärjestyksessä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Binäärihaun ideana on, että tarkastellaan aina listan keskimmäistä alkiota. Jos"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"keskimmäinen alkio on etsitty alkio, palautetaan tieto siitä, että alkio löytyi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"keskimmäinen alkio on pienempi kuin etsittävä alkio, rajataan haku listan jälkimmäiselle puolikkaalle"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"keskimmäinen alkio on suurempi kuin etsittävä alkio, rajataan haku listan ensimmäiselle puolikkaalle"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos lista on tyhjä, palautetaan tieto siitä, että alkiota ei löytynyt."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava kuva havainnollistaa binäärihaun etenemistä, kun etsitään listasta lukua 24:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 777px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/ca600c1fe96166b67e6fe37b5f5dcc89/108f8/11_3_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 43.47826086956522%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABXklEQVQoz5WQ3UvCUBiH989FdN9dRBAUEhFd1G13EXQREQTdCAYl5AojMQrLKfRBNmSVusCczjn3gbYv5xlzO2/pBgVB4I/Dj/fmOec5LwHjRFGURqMhiiLP86ZpEhgAYwh7FB/7fjj8HDyCHcexLMu2bU3TEELEdCy1dHq7mMgskNeRk+xsKjHxuDGfPlsm86vn1EqSWrvIR8ib/IcAAJ1uV9d1wzACEYIR1bLcYSWNbeuV9iejtp8MlpZaBV6hBZkWlGJLfW7KimUDQK/Xs20bIRTCOzn64K60+ZRZf4/uFu6jD5U96pXrmADgh7LDBOLaKKZphnC8yCaZeqxE79fTx28vJFM9pMu8NhQb+P7vbwOAYRi6rluWFcKu5/Wh72DXcwHwWLsHYubocjK3NZXdnotfUdUmALie//eSQFsQBI7jarVaYE7Ipi0hTUK6avWRO/j/Kc/zMMZBf8Nfq6LsorLTvyMAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/ca600c1fe96166b67e6fe37b5f5dcc89/a0b58/11_3_1.webp 230w","/static/ca600c1fe96166b67e6fe37b5f5dcc89/bc10c/11_3_1.webp 460w","/static/ca600c1fe96166b67e6fe37b5f5dcc89/2e4ba/11_3_1.webp 777w"],"sizes":"(max-width: 777px) 100vw, 777px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/ca600c1fe96166b67e6fe37b5f5dcc89/81c8e/11_3_1.png 230w","/static/ca600c1fe96166b67e6fe37b5f5dcc89/08a84/11_3_1.png 460w","/static/ca600c1fe96166b67e6fe37b5f5dcc89/108f8/11_3_1.png 777w"],"sizes":"(max-width: 777px) 100vw, 777px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/ca600c1fe96166b67e6fe37b5f5dcc89/108f8/11_3_1.png","alt":"11 3 1","title":"11 3 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rekursiivinen algoritmi binäärihaulle:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"binaarihaku"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vasen "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" oikea "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Funktio palauttaa True tai False sen mukaan, onko listalla alkiota \"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Jos hakualue on tyhjä, ei löydy"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" vasen "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" oikea"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Lasketaan hakualueen keskikohta"}]},{"type":"text","value":"\n keski "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vasen"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"oikea"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"//"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Jos keskellä on etsittävä alkio"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"keski"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Jos pienempi, etsi jälkipuoliskolta"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"keski"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" binaarihaku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" keski"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" oikea"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Muuten täytyy olla suurempi, etsitään alkupuoliskolta"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" binaarihaku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vasen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" keski"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Testataan"}]},{"type":"text","value":"\n lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"13"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"14"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"18"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"binaarihaku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"binaarihaku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"13"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"binaarihaku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"binaarihaku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\nTrue\nFalse\nFalse"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä funktiolle "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"binaarihaku"}]},{"type":"text","value":" annetaan neljä parametria: viite listaan, etsittävä alkio sekä hakualueen vasen ja oikea kohta. Alussa hakualue on koko lista, jolloin vasen kohta on 0 ja oikea kohta on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"len(lista)-1"}]},{"type":"text","value":". Funktio tarkastaa hakualueen keskellä olevan alkion ja joko ilmoittaa, että haluttu alkio löytyi, tai jatkaa hakua vasemmasta tai oikeasta puoliskosta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos verrataan binäärihakua "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"peräkkäishakuun"}]},{"type":"text","value":", algoritmien tehokkuus erottuu selvästi. Peräkkäishaussa alkiota lähdetään etsimään listan alusta ja listaa käydään läpi yksi alkio kerrallaan, kunnes alkio on löytynyt tai on päästy listan loppuun. Jos listan pituus on miljoona alkiota, tarvitaan perättäishaussa koko listan läpikäyntiin miljoona askelta, mutta binäärihaussa askelia tarvitaan vain 20."}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät mitä tarkoitetaan rekursiolla
  • \n
  • Osaat kirjoittaa itse yksinkertaisen rekursiivisen funktion
  • \n

Kuten aiemmin on huomattu, funktiot voivat kutsua toisia funktioita. Esimerkiksi näin:

def tervehdi(nimi : str):\n    print(\"Moikka,\", nimi)\n\ndef tervehdi_monesti(nimi : str, kerrat : int):\n    for i in range(kerrat):\n        tervehdi(nimi)

Samaan tapaan funktio voi kutsua myös itseään. Jos kuitenkaan funktion parametrit eivät muutu kutsukertojen välissä, tästä syntyy \"ikuinen silmukka\":

def tervehdi(nimi : str):\n    print(\"Moikka,\", nimi)\n    tervehdi(nimi)

Tällöin funktion kutsuminen millä tahansa merkkijonolla antaa virheilmoituksen:

RecursionError: maximum recursion depth exceeded

Mitä rekursio tarkoittaa?

Virheilmoituksessakin mainitulla rekursiolla tarkoitetaan sitä, että funktio kutsuu itseään. Rekursiossa funktion parametrien pitää kuitenkin muuttua niin, että jossain vaiheessa kutsuminen lopetetaan. Perusperiaate on sama kuin silmukoissa: jotta silmukka ei jatkuisi ikuisesti, siinä tulee olla päättymisehto, joka toteutuu jossain vaiheessa.

Tarkastellaan aluksi yksinkertaista funktiota, joka lisää listan loppuun 0-alkioita niin kauan kuin listan pituus on alle 10. Silmukan sijasta funktio kutsuukin itseään uudestaan, jos ehto ei täyty:

def tayta_lista(luvut: list):\n    \"\"\" Lisää listaan alkoita jos sen pituus on alle 10 \"\"\"\n    if len(luvut) < 10:\n        luvut.append(0)\n        # Kutsutaan uudestaaan\n        tayta_lista(luvut)\n\n\nif __name__ == \"__main__\":\n    testi = [1,2,3,4]\n    tayta_lista(testi)\n    print(testi)

[1, 2, 3, 4, 0, 0, 0, 0, 0, 0]

Perinteisellä silmukalla ohjelma näyttäisi esimerkiksi tältä:

\ndef tayta_lista(luvut: list):\n    \"\"\" Lisää listaan alkoita jos sen pituus on alle 10 \"\"\"\n    while len(luvut) < 10:\n        luvut.append(0)\n\nif __name__ == \"__main__\":\n    testi = [1,2,3,4]\n    tayta_lista(testi)\n    print(testi)\n

Esimerkeistä huomataan, että perinteinen (eli iteratiivinen) lähestymistapa tuottaa lyhyemmän ja selkeämmän ohjelman. Rekursiivinen ohjelma kuitenkin toimii ja tuottaa oikean lopputuloksen, koska funktio käsittelee jokaisella kutsukerralla samaa listaa viittauksen kautta.

Tietojenkäsittelytieteteessä erotetaan usein iteratiiviset ja rekursiiviset algoritmit. Iteratiivinen tarkoittaa kurssilla tähän asti yleensä käyttämäämme tapaa, jossa ratkaisu perustuu peräkkäisyyteen – yleensä siihen, että käsitellään rakenne silmukassa. Rekursiivinen tarkoittaa vaihtoehtoista tapaa, jossa funktio silmukan sijasta (tai lisäksi) kutsuu itseään muuttuvilla parametrien arvoilla.

Mikä tahansa algoritmi on periaatteessa mahdollista toteuttaa sekä iteratiivisesti että rekursiivisesti, mutta monessa tapauksessa jompikumpi tapa soveltuu selkeästi paremmin ongelman ratkaisemiseen.

Kirjoita rekursiivinen funktio listaan_lukuja(luvut: list), joka lisää listaan lukuja niin kauan, kunnes listan pituus on viidellä jaollinen. Jokainen listaan lisättävä luku on aina yhden suurempi kuin listan viimeinen luku.

Funktion pitää kutsua itseään rekursiivisesti.

Esimerkki funktion kutsusta:

luvut = [1,3,4,5,10,11]\nlistaan_lukuja(luvut)\nprint(luvut)

[1, 3, 4, 5, 10, 11, 12, 13, 14, 15]

Rekursio ja paluuarvot

Rekursiivisella funktiolla voi olla myös palautusarvo. Tarkastellaan tätä tarkoitusta varten esimerkkiä, joka laskee kertoman rekursiivisesti:

\ndef kertoma(n: int):\n    \"\"\" Funktio laskee positiivisen luvun n kertoman n!, eli n * (n-1) ... * 2 * 1 \"\"\"\n    if n < 2:\n        # Lukujen 0 ja 1 kertoma on 1\n        return 1\n\n    # Kutsuu funktiota uudestaan\n    return n * kertoma(n - 1)\n\nif __name__ == \"__main__\":\n    # Testataan\n    for i in range(1, 7):\n        print(f\"Luvun {i} kertoma on {kertoma(i)}\")\n

Luvun 1 kertoma on 1\nLuvun 2 kertoma on 2\nLuvun 3 kertoma on 6\nLuvun 4 kertoma on 24\nLuvun 5 kertoma on 120\nLuvun 6 kertoma on 720

Jos funktion parametrin arvo on 0 tai 1, funktio palauttaa 1 (koska kertoman määritelmän mukaan lukujen 0 ja 1 kertoma on 1). Muuten funktio palauttaa lausekkeen n * kertoma(n - 1). Tämä tarkoittaa, että parametri n kerrotaan funktion itsensä kutsun palauttamalla arvolla.

Olennaista funktion toimivuuden kannalta on, että funktiossa on määritelty ehto, jolla se ei kutsu itseään enää uudestaan. Tässä tapauksessa ehto on n < 2.

Visualisaattori on oivallinen väline rekursiota käyttävien ohjelmien tutkimiseksi.

Laajennetaan kertoman laskevaa funktiota niin, että se käyttää apumuuttujia:

def kertoma(n: int):\n    if n < 2:\n        return 1\n\n    edellisen_luvun_kertoma = kertoma(n - 1)\n    luvun_n_kertoma = n * edellisen_luvun_kertoma\n    return luvun_n_kertoma\n    \nkertoma(5)

Kokeile, miten visualisaattori demonstroi rekursion etenemisen.

Hieman normaalista poiketen visualisaattorissa kutsupino \"kasvaa\" alaspäin. Suorituksessa oleva funktiokutsu on kutsupinon alimpana oleva sinisellä merkitty \"lohko\", jolla on omat muuttujansa. Hetken kuluttua palautettava tulos on laskettu muuttujaan luvun_n_kertoma.

\n \n \n \n \n \n \"11\n \n \n

Tarkastellaan vielä toista funktiota, joka laskee halutun Fibonaccin luvun rekursiivisesti. Fibonaccin lukujonossa luku on aina kahden edellisen luvun summa. Niinpä jonon alku näyttää tältä: 1, 1, 2, 3, 5, 8, 13, 21, 34.

def fibonacci(n: int):\n    \"\"\" Funktio palauttaa n:nen luvun Fibonaccin sarjasta (1, 1, 2, 3, 5, 8 jne.); n > 0\"\"\"\n\n    if n <= 2:\n        # Kaksi ekaa lukua ovat ykkösiä\n        return 1\n\n    # Muuten luku saadaan laskemalla kaksi edellistä yhteen\n    return fibonacci(n - 1) + fibonacci(n - 2)\n\n# Testataan, että toimii\nif __name__ == \"__main__\":\n    for i in range(1, 11):\n        print(f\"Fibonaccin {i}. luku on {fibonacci(i)}\")

Fibonaccin 1. luku on 1\nFibonaccin 2. luku on 1\nFibonaccin 3. luku on 2\nFibonaccin 4. luku on 3\nFibonaccin 5. luku on 5\nFibonaccin 6. luku on 8\nFibonaccin 7. luku on 13\nFibonaccin 8. luku on 21\nFibonaccin 9. luku on 34\nFibonaccin 10. luku on 55

Tällä kertaa lopetusehtona on, että luku on pienempi tai yhtä suuri kuin 2, koska Fibonaccin kaksi ensimmäistä lukua ovat molemmat ykkösiä.

Miten algoritmi käytännössä oikein toimii?

Luvuille 1 ja 2 algoritmi palauttaa arvon 1 ehdon n <= 2 mukaisesti.

Luvulle 3 algoritmi palauttaa arvon lausekkeesta fibonacci(n - 1) + fibonacci(n - 2), eli käytännössä lausekkeen fibonacci(2) + fibonacci(1). Koska edellisessä kohdassa huomattiin, että näiden molempien arvo on 1, palauttaa funktio siis arvon 2 (joka onkin kolmas Fibonaccin luku)

Luvulle 4 algoritmi palauttaa arvon lausekkeesta fibonacci(3) + fibonacci(2), mikä edellisten kohtien perusteella on siis 2 + 1 eli 3.

Luvulle 5 algoritmi palauttaa arvon lausekkeesta fibonacci(4) + fibonacci(3), mikä edellisten kohtien perusteella on siis 3 + 2 eli 5.

jne.

Rekursiivinen algoritmimme siis toimii, koska voimme todistaa jokaisen luvun kohdalla ohjelman toimivuuden aikaisempien lukujen perusteella.

Tee rekursiivinen funktio summa(luku: int) summan 1 + 2 + ... + luku laskemiseen. Funktion runko on seuraava:

def summa(luku: int):\n    # kun luku on 1, ei ole muita summattavia...\n    if luku <= 1:\n        return luku\n\n    # täydennä koodi...

Muutama käyttöesimerkki:

tulos = summa(3)\nprint(tulos)\n\nprint(summa(5))\nprint(summa(10))

6\n15\n55

Tehtäväpohjassa on valmiina funktio sulut_tasapainossa, joka tarkastaa, onko sen parametrina olevassa merkkijonossa sulut tasapainossa, eli onko jokaista \"aukeavaa\" sulkumerkkiä ( kohti on oma \"sulkeutuva\" sulkumerkki ), ja että sulut eivät mene ristiin.

def sulut_tasapainossa(merkkijono: str):\n    if len(merkkijono) == 0:\n        return True\n    if not (merkkijono[0] == '(' and merkkijono[-1] == ')'):\n        return False\n\n    # poistetaan ensimmäinen ja viimeinen merkki\n    return sulut_tasapainossa(merkkijono[1:-1])\n\nok = sulut_tasapainossa(\"(((())))\")\nprint(ok)\n\n# ei kelpaa sillä yksi loppusulku liikaa\nok = sulut_tasapainossa(\"()())\")\nprint(ok)\n\n# ei kelpaa sillä alussa virheellinen loppusulku\nok = sulut_tasapainossa(\")()\")\nprint(ok)\n\n# ei kelpaa, sillä funktio ei osaa käsitellä kuin sisäkkäisiä sulkuja\nok = sulut_tasapainossa(\"()(())\")\nprint(ok)

True\nFalse\nFalse\nFalse

Laajenna funktiota siten, että se jättää huomiotta kaikki muut kuin sulkumerkit, ja että se osaa kaarisulkujen lisäksi myös hakasulut. Haka- ja kaarisulut eivät saa mennä ristiin!

Seuraavassa muutama käyttöesimerkki:

ok = sulut_tasapainossa(\"([([])])\")\nprint(ok)\n\nok = sulut_tasapainossa(\"(python versio [3.7]) käytä tätä!\")\nprint(ok)\n\n# ei kelpaa sillä virheellinen loppusulku\nok = sulut_tasapainossa(\"(()]\")\nprint(ok)\n\n\n# ei kelpaa sillä erityyppiset sulut menevät ristiin\nok = sulut_tasapainossa(\"([huono)]\")\nprint(ok)

Huomaa, että funktion ei tarvitse osata kuin yksi sisäkkäinen sulutus - sen ei siis tarvitse ymmärtää esimerkiksi jonoa (x + 1)(y + 1).

True\nTrue\nFalse\nFalse

Binäärihaku

Binäärihaussa yritetään löytää järjestyksessä olevasta listasta annettu alkio. Järjestys tarkoittaa tässä yhteydessä esimerkiksi lukujen järjestystä pienimmästä suurimpaan tai merkkijonoja aakkosjärjestyksessä.

Binäärihaun ideana on, että tarkastellaan aina listan keskimmäistä alkiota. Jos

    \n
  • keskimmäinen alkio on etsitty alkio, palautetaan tieto siitä, että alkio löytyi
  • \n
  • keskimmäinen alkio on pienempi kuin etsittävä alkio, rajataan haku listan jälkimmäiselle puolikkaalle
  • \n
  • keskimmäinen alkio on suurempi kuin etsittävä alkio, rajataan haku listan ensimmäiselle puolikkaalle
  • \n

Jos lista on tyhjä, palautetaan tieto siitä, että alkiota ei löytynyt.

Seuraava kuva havainnollistaa binäärihaun etenemistä, kun etsitään listasta lukua 24:

\n \n "}]},{"type":"text","value":" juuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" etsi_alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"juuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_lapsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" etsi_alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"juuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_lapsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Pomot ja alaiset","tmcname":"osa11-17_pomot_ja_alaiset"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tyontekija"}]},{"type":"text","value":" mallintaa yrityksen työntekijää:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Tyontekija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"alaiset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_alainen"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tyontekija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Tyontekija'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"alaiset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tyontekija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"laske_alaiset(tyontekija: Tyontekija)"}]},{"type":"text","value":", joka laskee rekursiivisesti annetun työntekijän alaisten määrän."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion käyttämisestä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n t1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tyontekija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sasu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n t2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tyontekija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n t3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tyontekija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Matti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n t4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tyontekija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n t5 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tyontekija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n t6 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tyontekija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kjell\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_alainen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_alainen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t6"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n t4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_alainen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n t4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_alainen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n t4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_alainen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t5"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"laske_alaiset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"laske_alaiset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"laske_alaiset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t5"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"5\n3\n0"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"paluu-aikaan-ennen-rekursiota","style":"position:relative;"},"children":[{"type":"text","value":"Paluu aikaan ennen rekursiota"},{"type":"element","tagName":"a","properties":{"href":"#paluu-aikaan-ennen-rekursiota","ariaLabel":"paluu aikaan ennen rekursiota permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Harjoitellaan vielä osan lopussa hieman laajemman ohjelman tekemistä olioita hyödyntäen. Tässä tehtäväsarjassa ei rekursiota tarvitse eikä edes kannata käyttää. Listakoosteita sen sijaan pääsee hyödyntämään!"}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Tilauskirja","tmcname":"osa11-18_tilauskirja"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Teemme tässä tehtävässä kaksi luokkaa, joitka toimivat rakennuspalikoina seuraavassa tehtävässä aiheena olevassa sovelluksessa."}]},{"type":"element","tagName":"h2","properties":{"id":"tehtava","style":"position:relative;"},"children":[{"type":"text","value":"Tehtava"},{"type":"element","tagName":"a","properties":{"href":"#tehtava","ariaLabel":"tehtava permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tehtava"}]},{"type":"text","value":", joka mallintaa ohjelmistoyritykselle annettavia työtehtäviä. Tehtävillä on"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"kuvaus"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"arvio sen viemästä työmäärästä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"tieto koodarista, joka toteuttaa tehtävän"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"tieto siitä, onko tehtävä valmis vai ei"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"yksikäsitteinen tunniste eli id"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokka toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"t1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tehtava"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodaa hello world\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"id"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kuvaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"koodari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tyomaara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"on_valmis"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nt1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkkaa_valmiiksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"on_valmis"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nt2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tehtava"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodaa webbikauppa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nt3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tehtava"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tee mobiilisovellus työaikakirjanpitoon\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"25"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1 koodaa hello world Erkki 3\n1: koodaa hello world (3 tuntia), koodari Erkki EI VALMIS\nFalse\n1: koodaa hello world (3 tuntia), koodari Erkki VALMIS\nTrue\n2: koodaa webbikauppa (10 tuntia), koodari Antti EI VALMIS\n3: tee mobiilisovellus työaikakirjanpitoon (25 tuntia), koodari Erkki EI VALMIS"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Täsmennyksiä:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"tehtävän tilan (valmis vai ei vielä valmis) voi tarkistaa metodilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"on_valmis(self)"}]},{"type":"text","value":" joka palauttaa totuusarvon"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"tehtävä ei ole siinä vaiheessa valmis kun se luodaan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"tehtävä merkataan valmiiksi kutsumalla metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"merkkaa_valmiiksi(self)"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"tehtävien id on juokseva numero, joka alkaa arvosta 1 (ensimmäisenä luotava tehtävä saa id:n 1, seuraava id:n 2 jne.)"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vihje"}]},{"type":"text","value":": id kannattaa toteuttaa "},{"type":"element","tagName":"a","properties":{"href":"/osa-9/5-staattiset-piirteet#luokkamuuttujat"},"children":[{"type":"text","value":"luokkamuuttujana"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"h2","properties":{"id":"tilauskirja","style":"position:relative;"},"children":[{"type":"text","value":"Tilauskirja"},{"type":"element","tagName":"a","properties":{"href":"#tilauskirja","ariaLabel":"tilauskirja permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehdään nyt luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tilauskirja"}]},{"type":"text","value":", joka kokoaa kaikki ohjelmistoyritykseltä tilatut työtehtävät, joita siis mallinnetaan luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tehtava"}]},{"type":"text","value":" olioilla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tilauskirjan perusversiota käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tilaukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tilauskirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tilaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodaa webbikauppa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tilaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tee mobiilisovellus työaikakirjanpitoon\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"25"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tilaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tee ohjelma matematiikan harjoitteluun\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tilaus "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kaikki_tilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tilaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" koodari "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"koodarit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"koodari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1: koodaa webbikauppa (10 tuntia), koodari Antti EI VALMIS\n2: tee mobiilisovellus työaikakirjanpitoon (25 tuntia), koodari Erkki EI VALMIS\n3: tee ohjelma matematiikan harjoitteluun (100 tuntia), koodari Antti EI VALMIS"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Antti\nErkki"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä vaiheessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tilauskirja"}]},{"type":"text","value":" tarjoaa kolme metodia:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_tilaus(self, kuvaus, koodari, tyomaara)"}]},{"type":"text","value":" lisää uuden tilauksen tilauskirjaan. Tilauskirja tallettaa tilaukset sisäisesti "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tehtava"}]},{"type":"text","value":"-olioina. Huomaa, että metodilla täytyy olla juuri nämä parametrit, muuten testit eivät hyväksy metodia!"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kaikki_tilaukset(self)"}]},{"type":"text","value":" palauttaa listana kaikki tilauskirjalla olevat tehtävät"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"koodarit(self)"}]},{"type":"text","value":" palauttaa listana kaikki koodarit, joille on tehtävä tilauskirjassa, metodin palauttama lista ei saa sisältää yhtä koodia useampaan kertaan"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vihje"}]},{"type":"text","value":" Listalta on helppo poistaa duplikaatit siten että muutetaan ensin lista "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3.8/library/stdtypes.html#set","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"set"}]},{"type":"text","value":"-tyyppiseksi. Set siis tarkoittaa joukkoa, ja joukossa kutakin alkiota voi olla vain yksi kappale. Tämän jälkeen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"set"}]},{"type":"text","value":" voidaan muuttaa takaisin listaksi, ja duplikaatit ovat kadonneet:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nlista2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"set"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 1, 3, 6, 4, 1, 3]\n[1, 3, 4, 6]"}]}]},{"type":"element","tagName":"h2","properties":{"id":"tilauskirjan-viimeistely","style":"position:relative;"},"children":[{"type":"text","value":"Tilauskirjan viimeistely"},{"type":"element","tagName":"a","properties":{"href":"#tilauskirjan-viimeistely","ariaLabel":"tilauskirjan viimeistely permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehdään luokalle "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tilauskirja"}]},{"type":"text","value":" vielä kolme uutta metodia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"merkkaa_valmiiksi(self, id: int)"}]},{"type":"text","value":" saa parametriksi tehtävän id:n ja merkkaa kyseisen tehtävän valmiiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tilaukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tilauskirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tilaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodaa webbikauppa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tilaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tee mobiilisovellus työaikakirjanpitoon\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"25"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tilaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tee ohjelma matematiikan harjoitteluun\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkkaa_valmiiksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkkaa_valmiiksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tilaus "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kaikki_tilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tilaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1: koodaa webbikauppa (10 tuntia), koodari Antti VALMIS\n2: tee mobiilisovellus työaikakirjanpitoon (25 tuntia), koodari Erkki VALMIS\n3: tee ohjelma matematiikan harjoitteluun (100 tuntia), koodari Antti EI VALMIS"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos parametria vastaavaa tilausta ei löydy, tuottaa metodi poikkeuksen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ValueError"}]},{"type":"text","value":". Kertaa tarvittaessa "},{"type":"element","tagName":"a","properties":{"href":"/osa-6/3-virheet#poikkeusten-tuottaminen"},"children":[{"type":"text","value":"täältä"}]},{"type":"text","value":", miten poikkeus tuotetaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"valmiit_tilaukset(self)"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ei_valmiit_tilaukset(self)"}]},{"type":"text","value":" toimivat kuten olettaa saattaa, ne palauttavat nimensä mukaisen osajoukon tilauskirjan tehtävistä listana."}]},{"type":"element","tagName":"h2","properties":{"id":"tilauskirjan-loppusilaus","style":"position:relative;"},"children":[{"type":"text","value":"Tilauskirjan loppusilaus"},{"type":"element","tagName":"a","properties":{"href":"#tilauskirjan-loppusilaus","ariaLabel":"tilauskirjan loppusilaus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehdään luokalle "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tilauskirja"}]},{"type":"text","value":" vielä metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"koodarin_status(self, koodari: str)"}]},{"type":"text","value":", joka palauttaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tuplen"}]},{"type":"text","value":", joka kertoo koodarin valmistuneiden ja vielä valmistumattomien töiden määrän sekä näihin kuluneiden työtuntien summan."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tilaukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tilauskirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tilaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodaa webbikauppa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tilaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tee mobiilisovellus työaikakirjanpitoon\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"25"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tilaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tee ohjelma matematiikan harjoitteluun\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tilaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tee uusi facebook\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkkaa_valmiiksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkkaa_valmiiksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nstatus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"koodarin_status"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"status"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"(2, 1, 35, 100)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tuplen ensimmäinen alkio siis kertoo valmiiden töiden määrän ja toinen valmistumattomien töiden määrän. Kolmas alkio on valmiiden töiden työaika-arvioiden summa ja neljäs alkio vielä valmistumattomien töiden työmääräarvioiden summan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos parametria vastaavaa koodaria ei löydy, tuottaa metodi poikkeuksen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ValueError"}]},{"type":"text","value":"."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Tilauskirjasovellus","tmcname":"osa11-19_tilauskirjasovellus"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä tehdään interaktiivinen sovellus softafirmalta tilattujen tehtävien hallintaan. Tyyli on täysin vapaa, mutta voit hyödyntää sovelluksessa edellisen tehtävän aikana koodattuja rakennuspalikoita. Myös "},{"type":"element","tagName":"a","properties":{"href":"/osa-10/4-lisaa-esimerkkeja"},"children":[{"type":"text","value":"edellisen osan viimeisen luvun"}]},{"type":"text","value":" materiaalin kertaaminen saattaa olla hyödyksi."}]},{"type":"element","tagName":"h2","properties":{"id":"ei-virheiden-kasittelya","style":"position:relative;"},"children":[{"type":"text","value":"Ei virheiden käsittelyä"},{"type":"element","tagName":"a","properties":{"href":"#ei-virheiden-kasittelya","ariaLabel":"ei virheiden kasittelya permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sovelluksen tulee toimia "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"täsmälleen"}]},{"type":"text","value":" seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komennot:\n0 lopetus\n1 lisää tilaus\n2 listaa valmiit\n3 listaa ei valmiit\n4 merkitse tehtävä valmiiksi\n5 koodarit\n6 koodarin status"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkuvaus: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"koodaa uusi facebook"}]},{"type":"text","value":"\nkoodari ja työmääräarvio: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"joona 1000"}]},{"type":"text","value":"\nlisätty!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkuvaus: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tee sovellus ajanhallintaan"}]},{"type":"text","value":"\nkoodari ja työmääräarvio: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"erkki 25"}]},{"type":"text","value":"\nlisätty!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkuvaus: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ohjelma musiikin teorian harjoitteluun"}]},{"type":"text","value":"\nkoodari ja työmääräarvio: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"niina 12"}]},{"type":"text","value":"\nlisätty!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkuvaus: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"koodaa uusi twitter"}]},{"type":"text","value":"\nkoodari ja työmääräarvio: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"joona 55"}]},{"type":"text","value":"\nlisätty!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nei valmiita"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n1: koodaa uusi facebook (1000 tuntia), koodari joona EI VALMIS\n2: tee sovellus ajanhallintaan (25 tuntia), koodari erkki EI VALMIS\n3: ohjelma musiikin teorian harjoitteluun (12 tuntia), koodari niina EI VALMIS\n4: koodaa uusi twitter (55 tuntia), koodari joona EI VALMIS"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\ntunniste: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nmerkitty valmiiksi"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\ntunniste: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nmerkitty valmiiksi"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n2: tee sovellus ajanhallintaan (25 tuntia), koodari erkki VALMIS\n4: koodaa uusi twitter (55 tuntia), koodari joona VALMIS"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n1: koodaa uusi facebook (1000 tuntia), koodari joona EI VALMIS\n3: ohjelma musiikin teorian harjoitteluun (12 tuntia), koodari niina EI VALMIS"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\njoona\nerkki\nniina"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"6"}]},{"type":"text","value":"\nkoodari: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"joona"}]},{"type":"text","value":"\ntyöt: valmiina 2 ei valmiina 1, tunteja: tehty 55 tekemättä 1000"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ensimmäiseen tehtäväpisteeseen riittää, että sovellus toimii jos kaikki syötteet ovat virheettömiä."}]},{"type":"element","tagName":"h2","properties":{"id":"virheiden-kasittely","style":"position:relative;"},"children":[{"type":"text","value":"Virheiden käsittely"},{"type":"element","tagName":"a","properties":{"href":"#virheiden-kasittely","ariaLabel":"virheiden kasittely permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toiseen tehtäväpisteeseen edellytetään, että sovellus toipuu käyttäjän syötteessä olevista virheistä. Virheiden käsittelyn tulee toimia siten, että missä tahansa syötteessa annettu virheellinen syöte aiheuttaa virheilmoituksen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"virheellinen syöte"}]},{"type":"text","value":", ja johtaa siihen, että komentoa pyydetään uudelleen:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkuvaus: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tee sovellus ajanhallintaan"}]},{"type":"text","value":"\nkoodari ja työmääräarvio: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"erkki xxx"}]},{"type":"text","value":"\nvirheellinen syöte"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkuvaus: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tee sovellus ajanhallintaan"}]},{"type":"text","value":"\nkoodari ja työmääräarvio: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"erkki"}]},{"type":"text","value":"\nvirheellinen syöte"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\ntunniste: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1000000"}]},{"type":"text","value":"\nvirheellinen syöte"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\ntunniste: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"XXXX"}]},{"type":"text","value":"\nvirheellinen syöte"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"6"}]},{"type":"text","value":"\nkoodari: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tuntematonkoodari"}]},{"type":"text","value":"\nvirheellinen syöte"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa lopuksi osion loppukyselyyn:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542"},"children":[]}]}]},"html":"

Tässä osiossa

    \n
  • Käydään läpi muutamia binääripuuhun liittyviä rekursiivisia esimerkkialgoritmeja
  • \n

Rekursion todellinen hyöty tulee esiin tilanteissa, joissa iteratiivinen ratkaisu on hankala kirjoittaa. Tarkastellaan esimerkkinä binääripuuta. Binääripuulla tarkoitetaan puurakennetta, jossa jokaisella alkiolla on korkeintaan kaksi \"lasta\". Binääripuu voisi siis näyttää esim. tältä (huomaa, että vaikka tietojenkäsittelijöitä pidetään joissain yhteyksissä luonnontieteilijöinä, käsityksemme puiden kasvusuunnasta on nurinkurinen):

\n
\n \n \n \n \n \"11\n \n \n

Binääripuiden (ja puiden yleensäkin) käsittely rekursiivisesti on ainakin teoriassa helppoa: jos halutaan tehdä jokin operaatio binääripuun kaikille alkioille - esim. etsiä jokin tietty alkio puusta, voidaan kirjoittaa rekursiivinen algoritmi, joka

    \n
  1. Käsittelee nykyisen alkion
  2. \n
  3. Kutsuu itseään vasemmasta lapsesta alkavalle \"alipuulle\"
  4. \n
  5. Kutsuu itseään oikeasta lapsesta alkavalle \"alipuulle\"
  6. \n
\n \n \n \n \n \n \"11\n \n \n

Kun koko rekursiivinen algoritmi on käsitelty, on vierailtu kerran puun jokaisessa solussa. Iteratiivinen versio algoritmista on yleensä hankalampi kirjoittaa, koska kirjanpito vieralluista alkioista menee äkkiä monimutkaiseksi.

Binääripuuta voidaan mallintaa helposti kirjoittamalla luokka, joka mallintaa yhtä alkiota puussa. Alkiolla on arvon lisäksi tieto vasemmasta ja oikeasta lapsestaan:

\nclass Alkio:\n    \"\"\" Luokka mallintaa yhtä alkiota binääripuussa \"\"\"\n    def __init__(self, arvo, vasen_lapsi:'Alkio' = None, oikea_lapsi:'Alkio' = None):\n        self.arvo = arvo\n        self.vasen_lapsi = vasen_lapsi\n        self.oikea_lapsi = oikea_lapsi

Nyt jos halutaan mallintaa esimerkiksi oheisen kaltainen puu:

\n \n \n \n \n \n \"11\n \n \n

...se voidaan muodostaa seuraavalla ohjelmalla:

if __name__ == \"__main__\":\n    puu = Alkio(2)\n\n    puu.vasen_lapsi = Alkio(3)\n    puu.vasen_lapsi.vasen_lapsi = Alkio(5)\n    puu.vasen_lapsi.oikea_lapsi = Alkio(8)\n\n    puu.oikea_lapsi = Alkio(4)\n    puu.oikea_lapsi.oikea_lapsi = Alkio(11)\n

Rekursiiviset binääripuualgoritmit

Tarkastellaan ensin algoritmia, joka tulostaa kaikki binääripuun alkiot allekkain. Käytetään esimerkkinä tässä ja tulevissa tehtävissä yllä muodostettua puuta.

Funktio saa parametrikseen juurialkion (eli kaikkein ylimmäisenä olevan alkion, jonka jälkeläisiä kaikki muut alkiot ovat):

\ndef tulosta_alkiot(juuri: Alkio):\n    print(juuri.arvo)\n\n    if juuri.vasen_lapsi is not None:\n        tulosta_alkiot(juuri.vasen_lapsi)\n\n    if juuri.oikea_lapsi is not None:\n        tulosta_alkiot(juuri.oikea_lapsi)\n

Funktio tulostaa annetun alkion arvon, ja sen jälkeen kutsuu itseään uudestaan vasemmalle ja oikealla alipuulle (edellyttäen, että vasen ja/tai oikea alkio on määritelty). Algoritmi on melko yksinkertainen, mutta käy tehokkaasti läpi kaikki puun alkiot riippumatta puun koosta. Algoritmi ei myöskään vieraile missään puun alkiossa kahta kertaa.

Kun funktiolle annetaan parametriksi aikaisemmin luodun binääripuun juurialkio puu, se tulostaa

2\n3\n5\n8\n4\n11

Vastaavalla tavalla voidaan kirjoittaa algoritmi, joka laskee kaikkien puun alkioiden summan:

\ndef alkioiden_summa(juuri: Alkio):\n    summa = juuri.arvo\n\n    if juuri.vasen_lapsi is not None:\n        summa += alkioiden_summa(juuri.vasen_lapsi)\n\n    if juuri.oikea_lapsi is not None:\n        summa += alkioiden_summa(juuri.oikea_lapsi)\n\n    return summa\n

Muuttuja summa alustetaan nykyisen alkion arvolla. Tämän jälkeen siihen lisätään rekursiivisesti vasemman ja oikean alipuun summat (tarkastaen taas ensin, että ne ovat olemassa). Lopuksi summa palautetaan.

Kirjoita funktio suurin_alkio(juuri: Alkio), joka saa parametrikseen binääripuun juurialkion.

Funktion palauttaa puun suurimman alkion. Puun arvot tulee käydä läpi rekursiivisesti.

Vinkki: voit hyödyntää ratkaisussasi ylempänä esitettyä alkoiden_summa -funktiota.

Esimerkki funktion kutsumisesta:

\nif __name__ == \"__main__\":\n    puu = Alkio(2)\n\n    puu.vasen_lapsi = Alkio(3)\n    puu.vasen_lapsi.vasen_lapsi = Alkio(5)\n    puu.vasen_lapsi.oikea_lapsi = Alkio(8)\n\n    puu.oikea_lapsi = Alkio(4)\n    puu.oikea_lapsi.oikea_lapsi = Alkio(11)\n\n    print(suurin_alkio(puu))\n

11

Järjestetty binääripuu

Binääripuusta on erityisesti hyötyä silloin, kun alkiot on järjestetty tietyllä tavalla. Alkion löytäminen järjestetystä puusta on nopeaa.

Tarkastellaan esimerkkinä puuta, jossa alkiot on järjestetty seuraavasti: jokaisen alkion vasen lapsi on pienempi kuin alkio itse, ja vastaavasti oikea alkio on suurempi kuin alkio itse.

\n \n \n \n \n \n \"11\n \n \n

Nyt alkion etsimiseen voidaan kirjoittaa rekursiivinen algoritmi, joka toimii hyvin samankaltaisesti kuin aiemmin tarkastelemamme binäärihaku: jos juurialkio on tarkasteltava alkio, palautetaan arvo True. Muuten jatketaan rekursiivisesti hakua joko vasemmasta tai oikeasta alipuusta. Jos alkio on tyhjä, palautetaan False.

\ndef etsi_alkio(juuri: Alkio, arvo):\n    if juuri is None:\n        return False\n\n    if arvo == juuri.arvo:\n        return True\n\n    if arvo > juuri.arvo:\n        return etsi_alkio(juuri.oikea_lapsi, arvo)\n\n    return etsi_alkio(juuri.vasen_lapsi, arvo)\n

Luokka Tyontekija mallintaa yrityksen työntekijää:

class Tyontekija:\n    def __init__(self, nimi: str):\n        self.nimi = nimi\n        self.alaiset = []\n\n    def lisaa_alainen(self, tyontekija: 'Tyontekija'):\n        self.alaiset.append(tyontekija)

Tee funktio laske_alaiset(tyontekija: Tyontekija), joka laskee rekursiivisesti annetun työntekijän alaisten määrän.

Esimerkki funktion käyttämisestä:

if __name__ == \"__main__\":\n    t1 = Tyontekija(\"Sasu\")\n    t2 = Tyontekija(\"Erkki\")\n    t3 = Tyontekija(\"Matti\")\n    t4 = Tyontekija(\"Emilia\")\n    t5 = Tyontekija(\"Antti\")\n    t6 = Tyontekija(\"Kjell\")\n    t1.lisaa_alainen(t4)\n    t1.lisaa_alainen(t6)\n    t4.lisaa_alainen(t2)\n    t4.lisaa_alainen(t3)\n    t4.lisaa_alainen(t5)\n    print(laske_alaiset(t1))\n    print(laske_alaiset(t4))\n    print(laske_alaiset(t5))

5\n3\n0

Paluu aikaan ennen rekursiota

Harjoitellaan vielä osan lopussa hieman laajemman ohjelman tekemistä olioita hyödyntäen. Tässä tehtäväsarjassa ei rekursiota tarvitse eikä edes kannata käyttää. Listakoosteita sen sijaan pääsee hyödyntämään!

Teemme tässä tehtävässä kaksi luokkaa, joitka toimivat rakennuspalikoina seuraavassa tehtävässä aiheena olevassa sovelluksessa.

Tehtava

Toteuta luokka Tehtava, joka mallintaa ohjelmistoyritykselle annettavia työtehtäviä. Tehtävillä on

    \n
  • kuvaus
  • \n
  • arvio sen viemästä työmäärästä
  • \n
  • tieto koodarista, joka toteuttaa tehtävän
  • \n
  • tieto siitä, onko tehtävä valmis vai ei
  • \n
  • yksikäsitteinen tunniste eli id
  • \n

Luokka toimii seuraavasti:

t1 = Tehtava(\"koodaa hello world\", \"Erkki\", 3)\nprint(t1.id, t1.kuvaus, t1.koodari, t1.tyomaara)\nprint(t1)\nprint(t1.on_valmis())\nt1.merkkaa_valmiiksi()\nprint(t1)\nprint(t1.on_valmis())\nt2 = Tehtava(\"koodaa webbikauppa\", \"Antti\", 10)\nt3 = Tehtava(\"tee mobiilisovellus työaikakirjanpitoon\", \"Erkki\", 25)\nprint(t2)\nprint(t3)

1 koodaa hello world Erkki 3\n1: koodaa hello world (3 tuntia), koodari Erkki EI VALMIS\nFalse\n1: koodaa hello world (3 tuntia), koodari Erkki VALMIS\nTrue\n2: koodaa webbikauppa (10 tuntia), koodari Antti EI VALMIS\n3: tee mobiilisovellus työaikakirjanpitoon (25 tuntia), koodari Erkki EI VALMIS

Täsmennyksiä:

    \n
  • tehtävän tilan (valmis vai ei vielä valmis) voi tarkistaa metodilla on_valmis(self) joka palauttaa totuusarvon
  • \n
  • tehtävä ei ole siinä vaiheessa valmis kun se luodaan
  • \n
  • tehtävä merkataan valmiiksi kutsumalla metodia merkkaa_valmiiksi(self)
  • \n
  • tehtävien id on juokseva numero, joka alkaa arvosta 1 (ensimmäisenä luotava tehtävä saa id:n 1, seuraava id:n 2 jne.)
  • \n

Vihje: id kannattaa toteuttaa luokkamuuttujana.

Tilauskirja

Tehdään nyt luokka Tilauskirja, joka kokoaa kaikki ohjelmistoyritykseltä tilatut työtehtävät, joita siis mallinnetaan luokan Tehtava olioilla.

Tilauskirjan perusversiota käytetään seuraavasti:

tilaukset = Tilauskirja()\ntilaukset.lisaa_tilaus(\"koodaa webbikauppa\", \"Antti\", 10)\ntilaukset.lisaa_tilaus(\"tee mobiilisovellus työaikakirjanpitoon\", \"Erkki\", 25)\ntilaukset.lisaa_tilaus(\"tee ohjelma matematiikan harjoitteluun\", \"Antti\", 100)\n\nfor tilaus in tilaukset.kaikki_tilaukset():\n    print(tilaus)\n\nprint()\n\nfor koodari in tilaukset.koodarit():\n    print(koodari)

1: koodaa webbikauppa (10 tuntia), koodari Antti EI VALMIS\n2: tee mobiilisovellus työaikakirjanpitoon (25 tuntia), koodari Erkki EI VALMIS\n3: tee ohjelma matematiikan harjoitteluun (100 tuntia), koodari Antti EI VALMIS

Antti\nErkki

Tässä vaiheessa Tilauskirja tarjoaa kolme metodia:

    \n
  • lisaa_tilaus(self, kuvaus, koodari, tyomaara) lisää uuden tilauksen tilauskirjaan. Tilauskirja tallettaa tilaukset sisäisesti Tehtava-olioina. Huomaa, että metodilla täytyy olla juuri nämä parametrit, muuten testit eivät hyväksy metodia!
  • \n
  • kaikki_tilaukset(self) palauttaa listana kaikki tilauskirjalla olevat tehtävät
  • \n
  • koodarit(self) palauttaa listana kaikki koodarit, joille on tehtävä tilauskirjassa, metodin palauttama lista ei saa sisältää yhtä koodia useampaan kertaan
  • \n

Vihje Listalta on helppo poistaa duplikaatit siten että muutetaan ensin lista set-tyyppiseksi. Set siis tarkoittaa joukkoa, ja joukossa kutakin alkiota voi olla vain yksi kappale. Tämän jälkeen set voidaan muuttaa takaisin listaksi, ja duplikaatit ovat kadonneet:

lista = [1,1,3,6,4,1,3]\nlista2 = list(set(lista))\nprint(lista)\nprint(lista2)

[1, 1, 3, 6, 4, 1, 3]\n[1, 3, 4, 6]

Tilauskirjan viimeistely

Tehdään luokalle Tilauskirja vielä kolme uutta metodia.

Metodi merkkaa_valmiiksi(self, id: int) saa parametriksi tehtävän id:n ja merkkaa kyseisen tehtävän valmiiksi:

tilaukset = Tilauskirja()\ntilaukset.lisaa_tilaus(\"koodaa webbikauppa\", \"Antti\", 10)\ntilaukset.lisaa_tilaus(\"tee mobiilisovellus työaikakirjanpitoon\", \"Erkki\", 25)\ntilaukset.lisaa_tilaus(\"tee ohjelma matematiikan harjoitteluun\", \"Antti\", 100)\n\ntilaukset.merkkaa_valmiiksi(1)\ntilaukset.merkkaa_valmiiksi(2)\n\nfor tilaus in tilaukset.kaikki_tilaukset():\n    print(tilaus)

1: koodaa webbikauppa (10 tuntia), koodari Antti VALMIS\n2: tee mobiilisovellus työaikakirjanpitoon (25 tuntia), koodari Erkki VALMIS\n3: tee ohjelma matematiikan harjoitteluun (100 tuntia), koodari Antti EI VALMIS

Jos parametria vastaavaa tilausta ei löydy, tuottaa metodi poikkeuksen ValueError. Kertaa tarvittaessa täältä, miten poikkeus tuotetaan.

Metodit valmiit_tilaukset(self) ja ei_valmiit_tilaukset(self) toimivat kuten olettaa saattaa, ne palauttavat nimensä mukaisen osajoukon tilauskirjan tehtävistä listana.

Tilauskirjan loppusilaus

Tehdään luokalle Tilauskirja vielä metodi koodarin_status(self, koodari: str), joka palauttaa tuplen, joka kertoo koodarin valmistuneiden ja vielä valmistumattomien töiden määrän sekä näihin kuluneiden työtuntien summan.

tilaukset = Tilauskirja()\ntilaukset.lisaa_tilaus(\"koodaa webbikauppa\", \"Antti\", 10)\ntilaukset.lisaa_tilaus(\"tee mobiilisovellus työaikakirjanpitoon\", \"Antti\", 25)\ntilaukset.lisaa_tilaus(\"tee ohjelma matematiikan harjoitteluun\", \"Antti\", 100)\ntilaukset.lisaa_tilaus(\"tee uusi facebook\", \"Erkki\", 1000)\n\ntilaukset.merkkaa_valmiiksi(1)\ntilaukset.merkkaa_valmiiksi(2)\n\nstatus = tilaukset.koodarin_status(\"Antti\")\nprint(status)

(2, 1, 35, 100)

Tuplen ensimmäinen alkio siis kertoo valmiiden töiden määrän ja toinen valmistumattomien töiden määrän. Kolmas alkio on valmiiden töiden työaika-arvioiden summa ja neljäs alkio vielä valmistumattomien töiden työmääräarvioiden summan.

Jos parametria vastaavaa koodaria ei löydy, tuottaa metodi poikkeuksen ValueError.

Tässä tehtävässä tehdään interaktiivinen sovellus softafirmalta tilattujen tehtävien hallintaan. Tyyli on täysin vapaa, mutta voit hyödyntää sovelluksessa edellisen tehtävän aikana koodattuja rakennuspalikoita. Myös edellisen osan viimeisen luvun materiaalin kertaaminen saattaa olla hyödyksi.

Ei virheiden käsittelyä

Sovelluksen tulee toimia täsmälleen seuraavasti:

komennot:\n0 lopetus\n1 lisää tilaus\n2 listaa valmiit\n3 listaa ei valmiit\n4 merkitse tehtävä valmiiksi\n5 koodarit\n6 koodarin status

komento: 1\nkuvaus: koodaa uusi facebook\nkoodari ja työmääräarvio: joona 1000\nlisätty!

komento: 1\nkuvaus: tee sovellus ajanhallintaan\nkoodari ja työmääräarvio: erkki 25\nlisätty!

komento: 1\nkuvaus: ohjelma musiikin teorian harjoitteluun\nkoodari ja työmääräarvio: niina 12\nlisätty!

komento: 1\nkuvaus: koodaa uusi twitter\nkoodari ja työmääräarvio: joona 55\nlisätty!

komento: 2\nei valmiita

komento: 3\n1: koodaa uusi facebook (1000 tuntia), koodari joona EI VALMIS\n2: tee sovellus ajanhallintaan (25 tuntia), koodari erkki EI VALMIS\n3: ohjelma musiikin teorian harjoitteluun (12 tuntia), koodari niina EI VALMIS\n4: koodaa uusi twitter (55 tuntia), koodari joona EI VALMIS

komento: 4\ntunniste: 2\nmerkitty valmiiksi

komento: 4\ntunniste: 4\nmerkitty valmiiksi

komento: 2\n2: tee sovellus ajanhallintaan (25 tuntia), koodari erkki VALMIS\n4: koodaa uusi twitter (55 tuntia), koodari joona VALMIS

komento: 3\n1: koodaa uusi facebook (1000 tuntia), koodari joona EI VALMIS\n3: ohjelma musiikin teorian harjoitteluun (12 tuntia), koodari niina EI VALMIS

komento: 5\njoona\nerkki\nniina

komento: 6\nkoodari: joona\ntyöt: valmiina 2 ei valmiina 1, tunteja: tehty 55 tekemättä 1000

Ensimmäiseen tehtäväpisteeseen riittää, että sovellus toimii jos kaikki syötteet ovat virheettömiä.

Virheiden käsittely

Toiseen tehtäväpisteeseen edellytetään, että sovellus toipuu käyttäjän syötteessä olevista virheistä. Virheiden käsittelyn tulee toimia siten, että missä tahansa syötteessa annettu virheellinen syöte aiheuttaa virheilmoituksen virheellinen syöte, ja johtaa siihen, että komentoa pyydetään uudelleen:

komento: 1\nkuvaus: tee sovellus ajanhallintaan\nkoodari ja työmääräarvio: erkki xxx\nvirheellinen syöte

komento: 1\nkuvaus: tee sovellus ajanhallintaan\nkoodari ja työmääräarvio: erkki\nvirheellinen syöte

komento: 4\ntunniste: 1000000\nvirheellinen syöte

komento: 4\ntunniste: XXXX\nvirheellinen syöte

komento: 6\nkoodari: tuntematonkoodari\nvirheellinen syöte

Vastaa lopuksi osion loppukyselyyn:

","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-11/4-lisaa-esimerkkeja.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä osiossa"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Käydään läpi muutamia binääripuuhun liittyviä rekursiivisia esimerkkialgoritmeja"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rekursion todellinen hyöty tulee esiin tilanteissa, joissa iteratiivinen ratkaisu on hankala kirjoittaa. Tarkastellaan esimerkkinä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"binääripuuta"}]},{"type":"text","value":". Binääripuulla tarkoitetaan puurakennetta, jossa jokaisella alkiolla on korkeintaan kaksi \"lasta\". Binääripuu voisi siis näyttää esim. tältä (huomaa, että vaikka tietojenkäsittelijöitä pidetään joissain yhteyksissä luonnontieteilijöinä, käsityksemme puiden kasvusuunnasta on nurinkurinen):"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 307px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/42ada93f7fad74a8205a13a46dc4de57/4651d/11_4_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 78.69565217391303%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAABsElEQVQ4y3WU54rDQAyE/f5PlUD+JIT03ntvpHcdn0C+9Z5PYFxWO5rRaB2IF9/vV++fz0fa7bZ0u13pdDryer3CdcuJi8AHs+Tr9apgAHHn3c35DzRwF7nDjHg8HpJOp6XX60k2m5XNZhMy53L3uOCBL9WiXq/L7XYL35E9n89j2xMBdCvsdjsZDodSLBb12RhZjEYjLTQYDMJ1n0hgH5CICSQ2m82QnVvwcrlIo9GQ9XqtuX5fI4DP51Oq1arKqlQqcr/f/ySfz2ft6Ww2k1KppCR8o0JAAABarVZSq9UiJrjSDoeDFiWHZz8nMMfoC5IskH08Hv9tvhnnylbJzBjMuKyaycec7XYbC0qP2VMul2W/3/8yHI/HcjqddCwslsulOkrPYOqfIGI6ncpkMtFcJiMEZAPOsWiBjFwup98xIO6EULBQKChL1IRjgzy3d7BCZr/fD110Gb7fbzUFtynMflhikjJ0mwx1zMlkMhHn/PPNyCDZgsngG2uBm9xqtfQZdq7DlgMI7DDEcm0iMAaWkaNHhUQioQlxhx8gfhSpVEpPi8VisZBkMin5fF5+ALPgzivet7o7AAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/42ada93f7fad74a8205a13a46dc4de57/a0b58/11_4_1.webp 230w","/static/42ada93f7fad74a8205a13a46dc4de57/b1a97/11_4_1.webp 307w"],"sizes":"(max-width: 307px) 100vw, 307px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/42ada93f7fad74a8205a13a46dc4de57/81c8e/11_4_1.png 230w","/static/42ada93f7fad74a8205a13a46dc4de57/4651d/11_4_1.png 307w"],"sizes":"(max-width: 307px) 100vw, 307px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/42ada93f7fad74a8205a13a46dc4de57/4651d/11_4_1.png","alt":"11 4 1","title":"11 4 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Binääripuiden (ja puiden yleensäkin) käsittely rekursiivisesti on ainakin teoriassa helppoa: jos halutaan tehdä jokin operaatio binääripuun kaikille alkioille - esim. etsiä jokin tietty alkio puusta, voidaan kirjoittaa rekursiivinen algoritmi, joka"}]},{"type":"element","tagName":"ol","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Käsittelee nykyisen alkion"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Kutsuu itseään vasemmasta lapsesta alkavalle \"alipuulle\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Kutsuu itseään oikeasta lapsesta alkavalle \"alipuulle\""}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 362px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/876ad26e1b0c7b303582f9e0f2cb0148/10600/11_4_2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 77.82608695652173%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAABtklEQVQ4y4WU147CUAxE8/9/xQMvCCFEh9B7C703r45XvrrJAmvJCjjxeGauk+D1ekkyCa7dbleq1apMJhNX+y8DSYQB3m43CcNQTqeTXn3AbxG8Y0fs93upVCrS7/el0Wjof3/oR4ar1Uq2261sNhvZ7XYyn89lPB5LPp+X9XqtNRLpWDCdTsXvSWZwPp9jrGBULpcliiLHxoZR73Q6MhgMPkqPAS6XS2XRbDaVgQ9Icm84HEq9XpfH4/FeMqZbzGYzBWu1Wio7yfBwOGgd+dbnb4UyvF6vQiIRuRZIM1Bj6Afyk6AKiMHIYDVGo5EWGdDr9ZQtg/AWQGTaAFNiljnJsACIqzFCGoCYzz3++4A8h594iRXE8/n8ZXi5XGSxWGizNZgkaiy4rYhvB4B2SP5+xk75fr/rA6VSya2NSQSUwcViMQZSq9U0senP2thSM9lnBBgDaGS17PBYfJ6FsfkfHI9Hd0p4hdEkJ0gdG2i0PeQegwnsarfb+mryjDtlY4DByCLtZEl+o4QmXj17HalTY4A97742uVxO0um0ykqlUpLJZNxUP2jMZrP64aCnUCg4/2D4Ax3myJowab4fAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/876ad26e1b0c7b303582f9e0f2cb0148/a0b58/11_4_2.webp 230w","/static/876ad26e1b0c7b303582f9e0f2cb0148/c2de8/11_4_2.webp 362w"],"sizes":"(max-width: 362px) 100vw, 362px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/876ad26e1b0c7b303582f9e0f2cb0148/81c8e/11_4_2.png 230w","/static/876ad26e1b0c7b303582f9e0f2cb0148/10600/11_4_2.png 362w"],"sizes":"(max-width: 362px) 100vw, 362px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/876ad26e1b0c7b303582f9e0f2cb0148/10600/11_4_2.png","alt":"11 4 2","title":"11 4 2","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun koko rekursiivinen algoritmi on käsitelty, on vierailtu kerran puun jokaisessa solussa. Iteratiivinen versio algoritmista on yleensä hankalampi kirjoittaa, koska kirjanpito vieralluista alkioista menee äkkiä monimutkaiseksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Binääripuuta voidaan mallintaa helposti kirjoittamalla luokka, joka mallintaa yhtä alkiota puussa. Alkiolla on arvon lisäksi tieto vasemmasta ja oikeasta lapsestaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Alkio"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Luokka mallintaa yhtä alkiota binääripuussa \"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vasen_lapsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Alkio'"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"None"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" oikea_lapsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Alkio'"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"None"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" arvo\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_lapsi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" vasen_lapsi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_lapsi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" oikea_lapsi"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt jos halutaan mallintaa esimerkiksi oheisen kaltainen puu:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 267px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/2d27ece550ee70e685bb54be04c9ea65/19e8f/11_4_3.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 68.26086956521739%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsTAAALEwEAmpwYAAABfUlEQVQ4y4VTWcuDQAzc///sDyr0wRdrRVuqvbx6aA96gtArHxPIsm4t34LEI5lMZqKijvP5fDjebjfyPI+v+Xyuv8n3rqO6wKQgjmO63+/0er0oyzI6nU7/giqTkcT3+80xz3MKw5CKomCWAO7KN8GV2U3u5Xk0GvGo6/WakiTRY0tTu1YD2l1wAFBVVevdZrPhJr80/xoZAIvFgobDIaVpyu8wJtiIDMfjkXzf57zZbEZN03QzPJ/PbILE7Xb7ZYBoGEURy1DXNU0mk1aeBtzv9+wkOoIpDLF1lVzIAaZwHc1bDGWU5/NJ/X6fx0CEXqbjJiDAwAxMB4NByyS9h8vlkhOlcDwe0+PxaIGaTEAApyxLWq1WOk/hAXpMp9NWwfV6pV6vx3+L7aS9Ea7rskk8MoSFq9BPktEJI2FsMDX/EHt8EIJM0BwSKDDY7XZ6TYQdlvhwOLDb0szUU1yHQaiHBI7jkEIx2NhrEgQBXS4XXmQA/2IIIriwJTDoD1qJNDsmtBRAAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/2d27ece550ee70e685bb54be04c9ea65/a0b58/11_4_3.webp 230w","/static/2d27ece550ee70e685bb54be04c9ea65/9156e/11_4_3.webp 267w"],"sizes":"(max-width: 267px) 100vw, 267px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/2d27ece550ee70e685bb54be04c9ea65/81c8e/11_4_3.png 230w","/static/2d27ece550ee70e685bb54be04c9ea65/19e8f/11_4_3.png 267w"],"sizes":"(max-width: 267px) 100vw, 267px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/2d27ece550ee70e685bb54be04c9ea65/19e8f/11_4_3.png","alt":"11 4 3","title":"11 4 3","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"...se voidaan muodostaa seuraavalla ohjelmalla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n puu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n puu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_lapsi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n puu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_lapsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_lapsi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n puu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_lapsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_lapsi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n puu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_lapsi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n puu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_lapsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_lapsi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"rekursiiviset-binaaripuualgoritmit","style":"position:relative;"},"children":[{"type":"text","value":"Rekursiiviset binääripuualgoritmit"},{"type":"element","tagName":"a","properties":{"href":"#rekursiiviset-binaaripuualgoritmit","ariaLabel":"rekursiiviset binaaripuualgoritmit permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan ensin algoritmia, joka tulostaa kaikki binääripuun alkiot allekkain. Käytetään esimerkkinä tässä ja tulevissa tehtävissä yllä muodostettua puuta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio saa parametrikseen juurialkion (eli kaikkein ylimmäisenä olevan alkion, jonka "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"jälkeläisiä"}]},{"type":"text","value":" kaikki muut alkiot ovat):"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta_alkiot"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"juuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"juuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" juuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_lapsi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"is"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"None"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tulosta_alkiot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"juuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_lapsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" juuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_lapsi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"is"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"None"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tulosta_alkiot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"juuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_lapsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio tulostaa annetun alkion arvon, ja sen jälkeen kutsuu itseään uudestaan vasemmalle ja oikealla alipuulle (edellyttäen, että vasen ja/tai oikea alkio on määritelty). Algoritmi on melko yksinkertainen, mutta käy tehokkaasti läpi kaikki puun alkiot riippumatta puun koosta. Algoritmi ei myöskään vieraile missään puun alkiossa kahta kertaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun funktiolle annetaan parametriksi aikaisemmin luodun binääripuun juurialkio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"puu"}]},{"type":"text","value":", se tulostaa"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2\n3\n5\n8\n4\n11"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaavalla tavalla voidaan kirjoittaa algoritmi, joka laskee kaikkien puun alkioiden summan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"alkioiden_summa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"juuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" juuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvo\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" juuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_lapsi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"is"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"None"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" alkioiden_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"juuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_lapsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" juuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_lapsi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"is"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"None"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" alkioiden_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"juuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_lapsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" summa\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa"}]},{"type":"text","value":" alustetaan nykyisen alkion arvolla. Tämän jälkeen siihen lisätään rekursiivisesti vasemman ja oikean alipuun summat (tarkastaen taas ensin, että ne ovat olemassa). Lopuksi summa palautetaan."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Suurin alkio","tmcname":"osa11-16_suurin_alkio"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suurin_alkio(juuri: Alkio)"}]},{"type":"text","value":", joka saa parametrikseen binääripuun juurialkion."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion palauttaa puun suurimman alkion. Puun arvot tulee käydä läpi rekursiivisesti."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vinkki: voit hyödyntää ratkaisussasi ylempänä esitettyä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"alkoiden_summa"}]},{"type":"text","value":" -funktiota."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n puu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n puu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_lapsi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n puu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_lapsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_lapsi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n puu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_lapsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_lapsi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n puu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_lapsi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n puu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_lapsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_lapsi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suurin_alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"puu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"11"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"jarjestetty-binaaripuu","style":"position:relative;"},"children":[{"type":"text","value":"Järjestetty binääripuu"},{"type":"element","tagName":"a","properties":{"href":"#jarjestetty-binaaripuu","ariaLabel":"jarjestetty binaaripuu permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Binääripuusta on erityisesti hyötyä silloin, kun alkiot on järjestetty tietyllä tavalla. Alkion löytäminen järjestetystä puusta on nopeaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkinä puuta, jossa alkiot on järjestetty seuraavasti: jokaisen alkion vasen lapsi on pienempi kuin alkio itse, ja vastaavasti oikea alkio on suurempi kuin alkio itse."}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 307px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/42ada93f7fad74a8205a13a46dc4de57/4651d/11_4_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 78.69565217391303%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAABsElEQVQ4y3WU54rDQAyE/f5PlUD+JIT03ntvpHcdn0C+9Z5PYFxWO5rRaB2IF9/vV++fz0fa7bZ0u13pdDryer3CdcuJi8AHs+Tr9apgAHHn3c35DzRwF7nDjHg8HpJOp6XX60k2m5XNZhMy53L3uOCBL9WiXq/L7XYL35E9n89j2xMBdCvsdjsZDodSLBb12RhZjEYjLTQYDMJ1n0hgH5CICSQ2m82QnVvwcrlIo9GQ9XqtuX5fI4DP51Oq1arKqlQqcr/f/ySfz2ft6Ww2k1KppCR8o0JAAABarVZSq9UiJrjSDoeDFiWHZz8nMMfoC5IskH08Hv9tvhnnylbJzBjMuKyaycec7XYbC0qP2VMul2W/3/8yHI/HcjqddCwslsulOkrPYOqfIGI6ncpkMtFcJiMEZAPOsWiBjFwup98xIO6EULBQKChL1IRjgzy3d7BCZr/fD110Gb7fbzUFtynMflhikjJ0mwx1zMlkMhHn/PPNyCDZgsngG2uBm9xqtfQZdq7DlgMI7DDEcm0iMAaWkaNHhUQioQlxhx8gfhSpVEpPi8VisZBkMin5fF5+ALPgzivet7o7AAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/42ada93f7fad74a8205a13a46dc4de57/a0b58/11_4_1.webp 230w","/static/42ada93f7fad74a8205a13a46dc4de57/b1a97/11_4_1.webp 307w"],"sizes":"(max-width: 307px) 100vw, 307px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/42ada93f7fad74a8205a13a46dc4de57/81c8e/11_4_1.png 230w","/static/42ada93f7fad74a8205a13a46dc4de57/4651d/11_4_1.png 307w"],"sizes":"(max-width: 307px) 100vw, 307px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/42ada93f7fad74a8205a13a46dc4de57/4651d/11_4_1.png","alt":"11 4 1","title":"11 4 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt alkion etsimiseen voidaan kirjoittaa rekursiivinen algoritmi, joka toimii hyvin samankaltaisesti kuin aiemmin tarkastelemamme binäärihaku: jos juurialkio on tarkasteltava alkio, palautetaan arvo "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":". Muuten jatketaan rekursiivisesti hakua joko vasemmasta tai oikeasta alipuusta. Jos alkio on tyhjä, palautetaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"etsi_alkio"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"juuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" juuri "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"is"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"None"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" arvo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" juuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" arvo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" juuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" etsi_alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"juuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_lapsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" etsi_alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"juuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_lapsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Pomot ja alaiset","tmcname":"osa11-17_pomot_ja_alaiset"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tyontekija"}]},{"type":"text","value":" mallintaa yrityksen työntekijää:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Tyontekija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"alaiset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_alainen"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tyontekija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Tyontekija'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"alaiset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tyontekija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"laske_alaiset(tyontekija: Tyontekija)"}]},{"type":"text","value":", joka laskee rekursiivisesti annetun työntekijän alaisten määrän."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion käyttämisestä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n t1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tyontekija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sasu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n t2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tyontekija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n t3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tyontekija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Matti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n t4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tyontekija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n t5 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tyontekija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n t6 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tyontekija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kjell\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_alainen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_alainen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t6"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n t4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_alainen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n t4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_alainen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n t4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_alainen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t5"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"laske_alaiset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"laske_alaiset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"laske_alaiset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t5"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"5\n3\n0"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"paluu-aikaan-ennen-rekursiota","style":"position:relative;"},"children":[{"type":"text","value":"Paluu aikaan ennen rekursiota"},{"type":"element","tagName":"a","properties":{"href":"#paluu-aikaan-ennen-rekursiota","ariaLabel":"paluu aikaan ennen rekursiota permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Harjoitellaan vielä osan lopussa hieman laajemman ohjelman tekemistä olioita hyödyntäen. Tässä tehtäväsarjassa ei rekursiota tarvitse eikä edes kannata käyttää. Listakoosteita sen sijaan pääsee hyödyntämään!"}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Tilauskirja","tmcname":"osa11-18_tilauskirja"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Teemme tässä tehtävässä kaksi luokkaa, joitka toimivat rakennuspalikoina seuraavassa tehtävässä aiheena olevassa sovelluksessa."}]},{"type":"element","tagName":"h2","properties":{"id":"tehtava","style":"position:relative;"},"children":[{"type":"text","value":"Tehtava"},{"type":"element","tagName":"a","properties":{"href":"#tehtava","ariaLabel":"tehtava permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tehtava"}]},{"type":"text","value":", joka mallintaa ohjelmistoyritykselle annettavia työtehtäviä. Tehtävillä on"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"kuvaus"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"arvio sen viemästä työmäärästä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"tieto koodarista, joka toteuttaa tehtävän"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"tieto siitä, onko tehtävä valmis vai ei"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"yksikäsitteinen tunniste eli id"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokka toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"t1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tehtava"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodaa hello world\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"id"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kuvaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"koodari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tyomaara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"on_valmis"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nt1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkkaa_valmiiksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"on_valmis"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nt2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tehtava"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodaa webbikauppa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nt3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tehtava"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tee mobiilisovellus työaikakirjanpitoon\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"25"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"t3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1 koodaa hello world Erkki 3\n1: koodaa hello world (3 tuntia), koodari Erkki EI VALMIS\nFalse\n1: koodaa hello world (3 tuntia), koodari Erkki VALMIS\nTrue\n2: koodaa webbikauppa (10 tuntia), koodari Antti EI VALMIS\n3: tee mobiilisovellus työaikakirjanpitoon (25 tuntia), koodari Erkki EI VALMIS"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Täsmennyksiä:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"tehtävän tilan (valmis vai ei vielä valmis) voi tarkistaa metodilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"on_valmis(self)"}]},{"type":"text","value":" joka palauttaa totuusarvon"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"tehtävä ei ole siinä vaiheessa valmis kun se luodaan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"tehtävä merkataan valmiiksi kutsumalla metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"merkkaa_valmiiksi(self)"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"tehtävien id on juokseva numero, joka alkaa arvosta 1 (ensimmäisenä luotava tehtävä saa id:n 1, seuraava id:n 2 jne.)"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vihje"}]},{"type":"text","value":": id kannattaa toteuttaa "},{"type":"element","tagName":"a","properties":{"href":"/osa-9/5-staattiset-piirteet#luokkamuuttujat"},"children":[{"type":"text","value":"luokkamuuttujana"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"h2","properties":{"id":"tilauskirja","style":"position:relative;"},"children":[{"type":"text","value":"Tilauskirja"},{"type":"element","tagName":"a","properties":{"href":"#tilauskirja","ariaLabel":"tilauskirja permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehdään nyt luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tilauskirja"}]},{"type":"text","value":", joka kokoaa kaikki ohjelmistoyritykseltä tilatut työtehtävät, joita siis mallinnetaan luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tehtava"}]},{"type":"text","value":" olioilla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tilauskirjan perusversiota käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tilaukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tilauskirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tilaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodaa webbikauppa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tilaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tee mobiilisovellus työaikakirjanpitoon\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"25"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tilaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tee ohjelma matematiikan harjoitteluun\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tilaus "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kaikki_tilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tilaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" koodari "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"koodarit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"koodari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1: koodaa webbikauppa (10 tuntia), koodari Antti EI VALMIS\n2: tee mobiilisovellus työaikakirjanpitoon (25 tuntia), koodari Erkki EI VALMIS\n3: tee ohjelma matematiikan harjoitteluun (100 tuntia), koodari Antti EI VALMIS"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Antti\nErkki"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä vaiheessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tilauskirja"}]},{"type":"text","value":" tarjoaa kolme metodia:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_tilaus(self, kuvaus, koodari, tyomaara)"}]},{"type":"text","value":" lisää uuden tilauksen tilauskirjaan. Tilauskirja tallettaa tilaukset sisäisesti "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tehtava"}]},{"type":"text","value":"-olioina. Huomaa, että metodilla täytyy olla juuri nämä parametrit, muuten testit eivät hyväksy metodia!"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kaikki_tilaukset(self)"}]},{"type":"text","value":" palauttaa listana kaikki tilauskirjalla olevat tehtävät"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"koodarit(self)"}]},{"type":"text","value":" palauttaa listana kaikki koodarit, joille on tehtävä tilauskirjassa, metodin palauttama lista ei saa sisältää yhtä koodia useampaan kertaan"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vihje"}]},{"type":"text","value":" Listalta on helppo poistaa duplikaatit siten että muutetaan ensin lista "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3.8/library/stdtypes.html#set","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"set"}]},{"type":"text","value":"-tyyppiseksi. Set siis tarkoittaa joukkoa, ja joukossa kutakin alkiota voi olla vain yksi kappale. Tämän jälkeen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"set"}]},{"type":"text","value":" voidaan muuttaa takaisin listaksi, ja duplikaatit ovat kadonneet:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nlista2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"set"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 1, 3, 6, 4, 1, 3]\n[1, 3, 4, 6]"}]}]},{"type":"element","tagName":"h2","properties":{"id":"tilauskirjan-viimeistely","style":"position:relative;"},"children":[{"type":"text","value":"Tilauskirjan viimeistely"},{"type":"element","tagName":"a","properties":{"href":"#tilauskirjan-viimeistely","ariaLabel":"tilauskirjan viimeistely permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehdään luokalle "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tilauskirja"}]},{"type":"text","value":" vielä kolme uutta metodia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"merkkaa_valmiiksi(self, id: int)"}]},{"type":"text","value":" saa parametriksi tehtävän id:n ja merkkaa kyseisen tehtävän valmiiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tilaukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tilauskirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tilaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodaa webbikauppa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tilaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tee mobiilisovellus työaikakirjanpitoon\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"25"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tilaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tee ohjelma matematiikan harjoitteluun\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkkaa_valmiiksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkkaa_valmiiksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tilaus "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kaikki_tilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tilaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1: koodaa webbikauppa (10 tuntia), koodari Antti VALMIS\n2: tee mobiilisovellus työaikakirjanpitoon (25 tuntia), koodari Erkki VALMIS\n3: tee ohjelma matematiikan harjoitteluun (100 tuntia), koodari Antti EI VALMIS"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos parametria vastaavaa tilausta ei löydy, tuottaa metodi poikkeuksen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ValueError"}]},{"type":"text","value":". Kertaa tarvittaessa "},{"type":"element","tagName":"a","properties":{"href":"/osa-6/3-virheet#poikkeusten-tuottaminen"},"children":[{"type":"text","value":"täältä"}]},{"type":"text","value":", miten poikkeus tuotetaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"valmiit_tilaukset(self)"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ei_valmiit_tilaukset(self)"}]},{"type":"text","value":" toimivat kuten olettaa saattaa, ne palauttavat nimensä mukaisen osajoukon tilauskirjan tehtävistä listana."}]},{"type":"element","tagName":"h2","properties":{"id":"tilauskirjan-loppusilaus","style":"position:relative;"},"children":[{"type":"text","value":"Tilauskirjan loppusilaus"},{"type":"element","tagName":"a","properties":{"href":"#tilauskirjan-loppusilaus","ariaLabel":"tilauskirjan loppusilaus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehdään luokalle "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tilauskirja"}]},{"type":"text","value":" vielä metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"koodarin_status(self, koodari: str)"}]},{"type":"text","value":", joka palauttaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tuplen"}]},{"type":"text","value":", joka kertoo koodarin valmistuneiden ja vielä valmistumattomien töiden määrän sekä näihin kuluneiden työtuntien summan."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tilaukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tilauskirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tilaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodaa webbikauppa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tilaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tee mobiilisovellus työaikakirjanpitoon\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"25"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tilaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tee ohjelma matematiikan harjoitteluun\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tilaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tee uusi facebook\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkkaa_valmiiksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"merkkaa_valmiiksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nstatus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tilaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"koodarin_status"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"status"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"(2, 1, 35, 100)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tuplen ensimmäinen alkio siis kertoo valmiiden töiden määrän ja toinen valmistumattomien töiden määrän. Kolmas alkio on valmiiden töiden työaika-arvioiden summa ja neljäs alkio vielä valmistumattomien töiden työmääräarvioiden summan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos parametria vastaavaa koodaria ei löydy, tuottaa metodi poikkeuksen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ValueError"}]},{"type":"text","value":"."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Tilauskirjasovellus","tmcname":"osa11-19_tilauskirjasovellus"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä tehdään interaktiivinen sovellus softafirmalta tilattujen tehtävien hallintaan. Tyyli on täysin vapaa, mutta voit hyödyntää sovelluksessa edellisen tehtävän aikana koodattuja rakennuspalikoita. Myös "},{"type":"element","tagName":"a","properties":{"href":"/osa-10/4-lisaa-esimerkkeja"},"children":[{"type":"text","value":"edellisen osan viimeisen luvun"}]},{"type":"text","value":" materiaalin kertaaminen saattaa olla hyödyksi."}]},{"type":"element","tagName":"h2","properties":{"id":"ei-virheiden-kasittelya","style":"position:relative;"},"children":[{"type":"text","value":"Ei virheiden käsittelyä"},{"type":"element","tagName":"a","properties":{"href":"#ei-virheiden-kasittelya","ariaLabel":"ei virheiden kasittelya permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sovelluksen tulee toimia "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"täsmälleen"}]},{"type":"text","value":" seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komennot:\n0 lopetus\n1 lisää tilaus\n2 listaa valmiit\n3 listaa ei valmiit\n4 merkitse tehtävä valmiiksi\n5 koodarit\n6 koodarin status"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkuvaus: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"koodaa uusi facebook"}]},{"type":"text","value":"\nkoodari ja työmääräarvio: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"joona 1000"}]},{"type":"text","value":"\nlisätty!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkuvaus: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tee sovellus ajanhallintaan"}]},{"type":"text","value":"\nkoodari ja työmääräarvio: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"erkki 25"}]},{"type":"text","value":"\nlisätty!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkuvaus: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ohjelma musiikin teorian harjoitteluun"}]},{"type":"text","value":"\nkoodari ja työmääräarvio: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"niina 12"}]},{"type":"text","value":"\nlisätty!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkuvaus: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"koodaa uusi twitter"}]},{"type":"text","value":"\nkoodari ja työmääräarvio: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"joona 55"}]},{"type":"text","value":"\nlisätty!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nei valmiita"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n1: koodaa uusi facebook (1000 tuntia), koodari joona EI VALMIS\n2: tee sovellus ajanhallintaan (25 tuntia), koodari erkki EI VALMIS\n3: ohjelma musiikin teorian harjoitteluun (12 tuntia), koodari niina EI VALMIS\n4: koodaa uusi twitter (55 tuntia), koodari joona EI VALMIS"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\ntunniste: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nmerkitty valmiiksi"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\ntunniste: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nmerkitty valmiiksi"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n2: tee sovellus ajanhallintaan (25 tuntia), koodari erkki VALMIS\n4: koodaa uusi twitter (55 tuntia), koodari joona VALMIS"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n1: koodaa uusi facebook (1000 tuntia), koodari joona EI VALMIS\n3: ohjelma musiikin teorian harjoitteluun (12 tuntia), koodari niina EI VALMIS"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\njoona\nerkki\nniina"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"6"}]},{"type":"text","value":"\nkoodari: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"joona"}]},{"type":"text","value":"\ntyöt: valmiina 2 ei valmiina 1, tunteja: tehty 55 tekemättä 1000"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ensimmäiseen tehtäväpisteeseen riittää, että sovellus toimii jos kaikki syötteet ovat virheettömiä."}]},{"type":"element","tagName":"h2","properties":{"id":"virheiden-kasittely","style":"position:relative;"},"children":[{"type":"text","value":"Virheiden käsittely"},{"type":"element","tagName":"a","properties":{"href":"#virheiden-kasittely","ariaLabel":"virheiden kasittely permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toiseen tehtäväpisteeseen edellytetään, että sovellus toipuu käyttäjän syötteessä olevista virheistä. Virheiden käsittelyn tulee toimia siten, että missä tahansa syötteessa annettu virheellinen syöte aiheuttaa virheilmoituksen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"virheellinen syöte"}]},{"type":"text","value":", ja johtaa siihen, että komentoa pyydetään uudelleen:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkuvaus: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tee sovellus ajanhallintaan"}]},{"type":"text","value":"\nkoodari ja työmääräarvio: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"erkki xxx"}]},{"type":"text","value":"\nvirheellinen syöte"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkuvaus: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tee sovellus ajanhallintaan"}]},{"type":"text","value":"\nkoodari ja työmääräarvio: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"erkki"}]},{"type":"text","value":"\nvirheellinen syöte"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\ntunniste: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1000000"}]},{"type":"text","value":"\nvirheellinen syöte"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\ntunniste: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"XXXX"}]},{"type":"text","value":"\nvirheellinen syöte"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"6"}]},{"type":"text","value":"\nkoodari: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tuntematonkoodari"}]},{"type":"text","value":"\nvirheellinen syöte"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa lopuksi osion loppukyselyyn:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542"},"children":[]}]}]},"html":"

Tässä osiossa

    \n
  • Käydään läpi muutamia binääripuuhun liittyviä rekursiivisia esimerkkialgoritmeja
  • \n

Rekursion todellinen hyöty tulee esiin tilanteissa, joissa iteratiivinen ratkaisu on hankala kirjoittaa. Tarkastellaan esimerkkinä binääripuuta. Binääripuulla tarkoitetaan puurakennetta, jossa jokaisella alkiolla on korkeintaan kaksi \"lasta\". Binääripuu voisi siis näyttää esim. tältä (huomaa, että vaikka tietojenkäsittelijöitä pidetään joissain yhteyksissä luonnontieteilijöinä, käsityksemme puiden kasvusuunnasta on nurinkurinen):

\n \n \n \n \n \n \"11\n \n \n

Binääripuiden (ja puiden yleensäkin) käsittely rekursiivisesti on ainakin teoriassa helppoa: jos halutaan tehdä jokin operaatio binääripuun kaikille alkioille - esim. etsiä jokin tietty alkio puusta, voidaan kirjoittaa rekursiivinen algoritmi, joka

    \n
  1. Käsittelee nykyisen alkion
  2. \n
  3. Kutsuu itseään vasemmasta lapsesta alkavalle \"alipuulle\"
  4. \n
  5. Kutsuu itseään oikeasta lapsesta alkavalle \"alipuulle\"
  6. \n
\n \n \n \n \n \n \"11\n \n \n

Kun koko rekursiivinen algoritmi on käsitelty, on vierailtu kerran puun jokaisessa solussa. Iteratiivinen versio algoritmista on yleensä hankalampi kirjoittaa, koska kirjanpito vieralluista alkioista menee äkkiä monimutkaiseksi.

Binääripuuta voidaan mallintaa helposti kirjoittamalla luokka, joka mallintaa yhtä alkiota puussa. Alkiolla on arvon lisäksi tieto vasemmasta ja oikeasta lapsestaan:

\nclass Alkio:\n    \"\"\" Luokka mallintaa yhtä alkiota binääripuussa \"\"\"\n    def __init__(self, arvo, vasen_lapsi:'Alkio' = None, oikea_lapsi:'Alkio' = None):\n        self.arvo = arvo\n        self.vasen_lapsi = vasen_lapsi\n        self.oikea_lapsi = oikea_lapsi

Nyt jos halutaan mallintaa esimerkiksi oheisen kaltainen puu:

\n \n \n \n \n \n \"11\n \n \n

...se voidaan muodostaa seuraavalla ohjelmalla:

if __name__ == \"__main__\":\n    puu = Alkio(2)\n\n    puu.vasen_lapsi = Alkio(3)\n    puu.vasen_lapsi.vasen_lapsi = Alkio(5)\n    puu.vasen_lapsi.oikea_lapsi = Alkio(8)\n\n    puu.oikea_lapsi = Alkio(4)\n    puu.oikea_lapsi.oikea_lapsi = Alkio(11)\n

Rekursiiviset binääripuualgoritmit

Tarkastellaan ensin algoritmia, joka tulostaa kaikki binääripuun alkiot allekkain. Käytetään esimerkkinä tässä ja tulevissa tehtävissä yllä muodostettua puuta.

Funktio saa parametrikseen juurialkion (eli kaikkein ylimmäisenä olevan alkion, jonka jälkeläisiä kaikki muut alkiot ovat):

\ndef tulosta_alkiot(juuri: Alkio):\n    print(juuri.arvo)\n\n    if juuri.vasen_lapsi is not None:\n        tulosta_alkiot(juuri.vasen_lapsi)\n\n    if juuri.oikea_lapsi is not None:\n        tulosta_alkiot(juuri.oikea_lapsi)\n

Funktio tulostaa annetun alkion arvon, ja sen jälkeen kutsuu itseään uudestaan vasemmalle ja oikealla alipuulle (edellyttäen, että vasen ja/tai oikea alkio on määritelty). Algoritmi on melko yksinkertainen, mutta käy tehokkaasti läpi kaikki puun alkiot riippumatta puun koosta. Algoritmi ei myöskään vieraile missään puun alkiossa kahta kertaa.

Kun funktiolle annetaan parametriksi aikaisemmin luodun binääripuun juurialkio puu, se tulostaa

2\n3\n5\n8\n4\n11

Vastaavalla tavalla voidaan kirjoittaa algoritmi, joka laskee kaikkien puun alkioiden summan:

\ndef alkioiden_summa(juuri: Alkio):\n    summa = juuri.arvo\n\n    if juuri.vasen_lapsi is not None:\n        summa += alkioiden_summa(juuri.vasen_lapsi)\n\n    if juuri.oikea_lapsi is not None:\n        summa += alkioiden_summa(juuri.oikea_lapsi)\n\n    return summa\n

Muuttuja summa alustetaan nykyisen alkion arvolla. Tämän jälkeen siihen lisätään rekursiivisesti vasemman ja oikean alipuun summat (tarkastaen taas ensin, että ne ovat olemassa). Lopuksi summa palautetaan.

Kirjoita funktio suurin_alkio(juuri: Alkio), joka saa parametrikseen binääripuun juurialkion.

Funktion palauttaa puun suurimman alkion. Puun arvot tulee käydä läpi rekursiivisesti.

Vinkki: voit hyödyntää ratkaisussasi ylempänä esitettyä alkoiden_summa -funktiota.

Esimerkki funktion kutsumisesta:

\nif __name__ == \"__main__\":\n    puu = Alkio(2)\n\n    puu.vasen_lapsi = Alkio(3)\n    puu.vasen_lapsi.vasen_lapsi = Alkio(5)\n    puu.vasen_lapsi.oikea_lapsi = Alkio(8)\n\n    puu.oikea_lapsi = Alkio(4)\n    puu.oikea_lapsi.oikea_lapsi = Alkio(11)\n\n    print(suurin_alkio(puu))\n

11

Järjestetty binääripuu

Binääripuusta on erityisesti hyötyä silloin, kun alkiot on järjestetty tietyllä tavalla. Alkion löytäminen järjestetystä puusta on nopeaa.

Tarkastellaan esimerkkinä puuta, jossa alkiot on järjestetty seuraavasti: jokaisen alkion vasen lapsi on pienempi kuin alkio itse, ja vastaavasti oikea alkio on suurempi kuin alkio itse.

\n \n \n \n \n \n \"11\n \n \n

Nyt alkion etsimiseen voidaan kirjoittaa rekursiivinen algoritmi, joka toimii hyvin samankaltaisesti kuin aiemmin tarkastelemamme binäärihaku: jos juurialkio on tarkasteltava alkio, palautetaan arvo True. Muuten jatketaan rekursiivisesti hakua joko vasemmasta tai oikeasta alipuusta. Jos alkio on tyhjä, palautetaan False.

\ndef etsi_alkio(juuri: Alkio, arvo):\n    if juuri is None:\n        return False\n\n    if arvo == juuri.arvo:\n        return True\n\n    if arvo > juuri.arvo:\n        return etsi_alkio(juuri.oikea_lapsi, arvo)\n\n    return etsi_alkio(juuri.vasen_lapsi, arvo)\n

Luokka Tyontekija mallintaa yrityksen työntekijää:

class Tyontekija:\n    def __init__(self, nimi: str):\n        self.nimi = nimi\n        self.alaiset = []\n\n    def lisaa_alainen(self, tyontekija: 'Tyontekija'):\n        self.alaiset.append(tyontekija)

Tee funktio laske_alaiset(tyontekija: Tyontekija), joka laskee rekursiivisesti annetun työntekijän alaisten määrän.

Esimerkki funktion käyttämisestä:

if __name__ == \"__main__\":\n    t1 = Tyontekija(\"Sasu\")\n    t2 = Tyontekija(\"Erkki\")\n    t3 = Tyontekija(\"Matti\")\n    t4 = Tyontekija(\"Emilia\")\n    t5 = Tyontekija(\"Antti\")\n    t6 = Tyontekija(\"Kjell\")\n    t1.lisaa_alainen(t4)\n    t1.lisaa_alainen(t6)\n    t4.lisaa_alainen(t2)\n    t4.lisaa_alainen(t3)\n    t4.lisaa_alainen(t5)\n    print(laske_alaiset(t1))\n    print(laske_alaiset(t4))\n    print(laske_alaiset(t5))

5\n3\n0

Paluu aikaan ennen rekursiota

Harjoitellaan vielä osan lopussa hieman laajemman ohjelman tekemistä olioita hyödyntäen. Tässä tehtäväsarjassa ei rekursiota tarvitse eikä edes kannata käyttää. Listakoosteita sen sijaan pääsee hyödyntämään!

Teemme tässä tehtävässä kaksi luokkaa, joitka toimivat rakennuspalikoina seuraavassa tehtävässä aiheena olevassa sovelluksessa.

Tehtava

Toteuta luokka Tehtava, joka mallintaa ohjelmistoyritykselle annettavia työtehtäviä. Tehtävillä on

    \n
  • kuvaus
  • \n
  • arvio sen viemästä työmäärästä
  • \n
  • tieto koodarista, joka toteuttaa tehtävän
  • \n
  • tieto siitä, onko tehtävä valmis vai ei
  • \n
  • yksikäsitteinen tunniste eli id
  • \n

Luokka toimii seuraavasti:

t1 = Tehtava(\"koodaa hello world\", \"Erkki\", 3)\nprint(t1.id, t1.kuvaus, t1.koodari, t1.tyomaara)\nprint(t1)\nprint(t1.on_valmis())\nt1.merkkaa_valmiiksi()\nprint(t1)\nprint(t1.on_valmis())\nt2 = Tehtava(\"koodaa webbikauppa\", \"Antti\", 10)\nt3 = Tehtava(\"tee mobiilisovellus työaikakirjanpitoon\", \"Erkki\", 25)\nprint(t2)\nprint(t3)

1 koodaa hello world Erkki 3\n1: koodaa hello world (3 tuntia), koodari Erkki EI VALMIS\nFalse\n1: koodaa hello world (3 tuntia), koodari Erkki VALMIS\nTrue\n2: koodaa webbikauppa (10 tuntia), koodari Antti EI VALMIS\n3: tee mobiilisovellus työaikakirjanpitoon (25 tuntia), koodari Erkki EI VALMIS

Täsmennyksiä:

    \n
  • tehtävän tilan (valmis vai ei vielä valmis) voi tarkistaa metodilla on_valmis(self) joka palauttaa totuusarvon
  • \n
  • tehtävä ei ole siinä vaiheessa valmis kun se luodaan
  • \n
  • tehtävä merkataan valmiiksi kutsumalla metodia merkkaa_valmiiksi(self)
  • \n
  • tehtävien id on juokseva numero, joka alkaa arvosta 1 (ensimmäisenä luotava tehtävä saa id:n 1, seuraava id:n 2 jne.)
  • \n

Vihje: id kannattaa toteuttaa luokkamuuttujana.

Tilauskirja

Tehdään nyt luokka Tilauskirja, joka kokoaa kaikki ohjelmistoyritykseltä tilatut työtehtävät, joita siis mallinnetaan luokan Tehtava olioilla.

Tilauskirjan perusversiota käytetään seuraavasti:

tilaukset = Tilauskirja()\ntilaukset.lisaa_tilaus(\"koodaa webbikauppa\", \"Antti\", 10)\ntilaukset.lisaa_tilaus(\"tee mobiilisovellus työaikakirjanpitoon\", \"Erkki\", 25)\ntilaukset.lisaa_tilaus(\"tee ohjelma matematiikan harjoitteluun\", \"Antti\", 100)\n\nfor tilaus in tilaukset.kaikki_tilaukset():\n    print(tilaus)\n\nprint()\n\nfor koodari in tilaukset.koodarit():\n    print(koodari)

1: koodaa webbikauppa (10 tuntia), koodari Antti EI VALMIS\n2: tee mobiilisovellus työaikakirjanpitoon (25 tuntia), koodari Erkki EI VALMIS\n3: tee ohjelma matematiikan harjoitteluun (100 tuntia), koodari Antti EI VALMIS

Antti\nErkki

Tässä vaiheessa Tilauskirja tarjoaa kolme metodia:

    \n
  • lisaa_tilaus(self, kuvaus, koodari, tyomaara) lisää uuden tilauksen tilauskirjaan. Tilauskirja tallettaa tilaukset sisäisesti Tehtava-olioina. Huomaa, että metodilla täytyy olla juuri nämä parametrit, muuten testit eivät hyväksy metodia!
  • \n
  • kaikki_tilaukset(self) palauttaa listana kaikki tilauskirjalla olevat tehtävät
  • \n
  • koodarit(self) palauttaa listana kaikki koodarit, joille on tehtävä tilauskirjassa, metodin palauttama lista ei saa sisältää yhtä koodia useampaan kertaan
  • \n

Vihje Listalta on helppo poistaa duplikaatit siten että muutetaan ensin lista set-tyyppiseksi. Set siis tarkoittaa joukkoa, ja joukossa kutakin alkiota voi olla vain yksi kappale. Tämän jälkeen set voidaan muuttaa takaisin listaksi, ja duplikaatit ovat kadonneet:

lista = [1,1,3,6,4,1,3]\nlista2 = list(set(lista))\nprint(lista)\nprint(lista2)

[1, 1, 3, 6, 4, 1, 3]\n[1, 3, 4, 6]

Tilauskirjan viimeistely

Tehdään luokalle Tilauskirja vielä kolme uutta metodia.

Metodi merkkaa_valmiiksi(self, id: int) saa parametriksi tehtävän id:n ja merkkaa kyseisen tehtävän valmiiksi:

tilaukset = Tilauskirja()\ntilaukset.lisaa_tilaus(\"koodaa webbikauppa\", \"Antti\", 10)\ntilaukset.lisaa_tilaus(\"tee mobiilisovellus työaikakirjanpitoon\", \"Erkki\", 25)\ntilaukset.lisaa_tilaus(\"tee ohjelma matematiikan harjoitteluun\", \"Antti\", 100)\n\ntilaukset.merkkaa_valmiiksi(1)\ntilaukset.merkkaa_valmiiksi(2)\n\nfor tilaus in tilaukset.kaikki_tilaukset():\n    print(tilaus)

1: koodaa webbikauppa (10 tuntia), koodari Antti VALMIS\n2: tee mobiilisovellus työaikakirjanpitoon (25 tuntia), koodari Erkki VALMIS\n3: tee ohjelma matematiikan harjoitteluun (100 tuntia), koodari Antti EI VALMIS

Jos parametria vastaavaa tilausta ei löydy, tuottaa metodi poikkeuksen ValueError. Kertaa tarvittaessa täältä, miten poikkeus tuotetaan.

Metodit valmiit_tilaukset(self) ja ei_valmiit_tilaukset(self) toimivat kuten olettaa saattaa, ne palauttavat nimensä mukaisen osajoukon tilauskirjan tehtävistä listana.

Tilauskirjan loppusilaus

Tehdään luokalle Tilauskirja vielä metodi koodarin_status(self, koodari: str), joka palauttaa tuplen, joka kertoo koodarin valmistuneiden ja vielä valmistumattomien töiden määrän sekä näihin kuluneiden työtuntien summan.

tilaukset = Tilauskirja()\ntilaukset.lisaa_tilaus(\"koodaa webbikauppa\", \"Antti\", 10)\ntilaukset.lisaa_tilaus(\"tee mobiilisovellus työaikakirjanpitoon\", \"Antti\", 25)\ntilaukset.lisaa_tilaus(\"tee ohjelma matematiikan harjoitteluun\", \"Antti\", 100)\ntilaukset.lisaa_tilaus(\"tee uusi facebook\", \"Erkki\", 1000)\n\ntilaukset.merkkaa_valmiiksi(1)\ntilaukset.merkkaa_valmiiksi(2)\n\nstatus = tilaukset.koodarin_status(\"Antti\")\nprint(status)

(2, 1, 35, 100)

Tuplen ensimmäinen alkio siis kertoo valmiiden töiden määrän ja toinen valmistumattomien töiden määrän. Kolmas alkio on valmiiden töiden työaika-arvioiden summa ja neljäs alkio vielä valmistumattomien töiden työmääräarvioiden summan.

Jos parametria vastaavaa koodaria ei löydy, tuottaa metodi poikkeuksen ValueError.

Tässä tehtävässä tehdään interaktiivinen sovellus softafirmalta tilattujen tehtävien hallintaan. Tyyli on täysin vapaa, mutta voit hyödyntää sovelluksessa edellisen tehtävän aikana koodattuja rakennuspalikoita. Myös edellisen osan viimeisen luvun materiaalin kertaaminen saattaa olla hyödyksi.

Ei virheiden käsittelyä

Sovelluksen tulee toimia täsmälleen seuraavasti:

komennot:\n0 lopetus\n1 lisää tilaus\n2 listaa valmiit\n3 listaa ei valmiit\n4 merkitse tehtävä valmiiksi\n5 koodarit\n6 koodarin status

komento: 1\nkuvaus: koodaa uusi facebook\nkoodari ja työmääräarvio: joona 1000\nlisätty!

komento: 1\nkuvaus: tee sovellus ajanhallintaan\nkoodari ja työmääräarvio: erkki 25\nlisätty!

komento: 1\nkuvaus: ohjelma musiikin teorian harjoitteluun\nkoodari ja työmääräarvio: niina 12\nlisätty!

komento: 1\nkuvaus: koodaa uusi twitter\nkoodari ja työmääräarvio: joona 55\nlisätty!

komento: 2\nei valmiita

komento: 3\n1: koodaa uusi facebook (1000 tuntia), koodari joona EI VALMIS\n2: tee sovellus ajanhallintaan (25 tuntia), koodari erkki EI VALMIS\n3: ohjelma musiikin teorian harjoitteluun (12 tuntia), koodari niina EI VALMIS\n4: koodaa uusi twitter (55 tuntia), koodari joona EI VALMIS

komento: 4\ntunniste: 2\nmerkitty valmiiksi

komento: 4\ntunniste: 4\nmerkitty valmiiksi

komento: 2\n2: tee sovellus ajanhallintaan (25 tuntia), koodari erkki VALMIS\n4: koodaa uusi twitter (55 tuntia), koodari joona VALMIS

komento: 3\n1: koodaa uusi facebook (1000 tuntia), koodari joona EI VALMIS\n3: ohjelma musiikin teorian harjoitteluun (12 tuntia), koodari niina EI VALMIS

komento: 5\njoona\nerkki\nniina

komento: 6\nkoodari: joona\ntyöt: valmiina 2 ei valmiina 1, tunteja: tehty 55 tekemättä 1000

Ensimmäiseen tehtäväpisteeseen riittää, että sovellus toimii jos kaikki syötteet ovat virheettömiä.

Virheiden käsittely

Toiseen tehtäväpisteeseen edellytetään, että sovellus toipuu käyttäjän syötteessä olevista virheistä. Virheiden käsittelyn tulee toimia siten, että missä tahansa syötteessa annettu virheellinen syöte aiheuttaa virheilmoituksen virheellinen syöte, ja johtaa siihen, että komentoa pyydetään uudelleen:

komento: 1\nkuvaus: tee sovellus ajanhallintaan\nkoodari ja työmääräarvio: erkki xxx\nvirheellinen syöte

komento: 1\nkuvaus: tee sovellus ajanhallintaan\nkoodari ja työmääräarvio: erkki\nvirheellinen syöte

komento: 4\ntunniste: 1000000\nvirheellinen syöte

komento: 4\ntunniste: XXXX\nvirheellinen syöte

komento: 6\nkoodari: tuntematonkoodari\nvirheellinen syöte

Vastaa lopuksi osion loppukyselyyn:

","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-11/4-lisaa-esimerkkeja.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-11/page-data.json b/page-data/osa-11/page-data.json index 22eda4c67..d43b781e8 100644 --- a/page-data/osa-11/page-data.json +++ b/page-data/osa-11/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-part-overview-template-js", "path": "/osa-11", - "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-11","title":"Osa 11"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-11/index.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-11","title":"Osa 11"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-11/index.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-12/1-funktio-parametrina/page-data.json b/page-data/osa-12/1-funktio-parametrina/page-data.json index 47916785f..443673aeb 100644 --- a/page-data/osa-12/1-funktio-parametrina/page-data.json +++ b/page-data/osa-12/1-funktio-parametrina/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-12/1-funktio-parametrina", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat järjestää listoja eri kriteerien mukaan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät mitä tarkoitetaan lambda-lausekkeella"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat hyödyntää lambda-lauseketta myös muiden Pythonin funktioiden kanssa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat välittää funktion parametrina funktiolle"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olemme jo aikaisemmin käyttäneet metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sort"}]},{"type":"text","value":" ja funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sorted"}]},{"type":"text","value":" järjestämään listoja luonnolliseen järjestykseen. Metodit toimivat sellaisenaan hyvin luvuista ja merkkijonoista koostuvien listojen kanssa, mutta jos lista sisältää monimutkaisempia alkioita, Python ei välttämättä järjestä listaa niin kuin ohjelmoija toivoisi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi lista tupleja järjestetään oletuksena jokaisen tuplen ensimmäisen alkion perusteella:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tuotteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"omena\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"appelsiini\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vesimeloni\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\ntuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sort"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tuote "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"('appelsiini', 4.5)\n('banaani', 5.95)\n('omena', 3.95)\n('vesimeloni', 4.95)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mitä jos haluaisimme järjestää tuotelistan hinnan perusteella?"}]},{"type":"element","tagName":"h2","properties":{"id":"funktiot-parametrina","style":"position:relative;"},"children":[{"type":"text","value":"Funktiot parametrina"},{"type":"element","tagName":"a","properties":{"href":"#funktiot-parametrina","ariaLabel":"funktiot parametrina permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Järjestysmetodille tai -funktiolle voidaan antaa toisena parametrina järjestyksen määräävä avain. Avaimeksi annetaan funktio, joka kertoo, miten yksittäisen alkion arvo määritetään. Python kutsuu tätä funktiota järjestämisen aikana alkioiden vertailemiseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hintajarjestys"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"tuple"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Palautetaan tuplen toinen alkio eli hinta"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tuotteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"omena\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"appelsiini\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vesimeloni\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Hyödynnetään funktiota hintajarjestys"}]},{"type":"text","value":"\n tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sort"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":"hintajarjestys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tuote "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"('omena', 3.95)\n('appelsiini', 4.5)\n('vesimeloni', 4.95)\n('banaani', 5.95)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt ohjelma järjestää listan hinnan mukaiseen järjestykseen. Mutta mitä ohjelmassa oikeastaan tapahtuu?"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hintajarjestys"}]},{"type":"text","value":" määrittely on melko yksinkertainen: se saa parametrikseen yhden alkion ja palauttaa alkiolle arvon - tässä tapauksessa tuplen toisen alkion (joka esimerkissämme esittää tuotteen hintaa). Tarkastellaan kuitenkin lähemmin järjestysmetodia kutsuvaa riviä:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tuotteet.sort(key=hintajarjestys)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rivillä annetaan metodille "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sort"}]},{"type":"text","value":" parametriksi funktio. Ei siis funktion paluuarvoa, vaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"viittaus funktioon"}]},{"type":"text","value":". Järjestysmetodi kutsuu tätä funktiota jokaiselle alkiolle."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kutsut nähdään selkeästi lisäämällä vertailufunktioomme ylimääräinen tulostuslause:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hintajarjestys"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"tuple"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan alkio"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Kutsuttiin hintajarjestys("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Palautetaan tuplen toinen alkio eli hinta"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n\ntuotteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"omena\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"appelsiini\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vesimeloni\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Hyödynnetään funktiota hintajarjestys"}]},{"type":"text","value":"\ntuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sort"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":"hintajarjestys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tuote "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kutsuttiin hintajarjestys(('banaani', 5.95))\nKutsuttiin hintajarjestys(('omena', 3.95))\nKutsuttiin hintajarjestys(('appelsiini', 4.5))\nKutsuttiin hintajarjestys(('vesimeloni', 4.95))\n('omena', 3.95)\n('appelsiini', 4.5)\n('vesimeloni', 4.95)\n('banaani', 5.95)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Järjestys saadaan käännettyä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"päinvastaiseksi"}]},{"type":"text","value":" hyödyntämällä sekä metodista "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sort"}]},{"type":"text","value":" että funktiosta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sorted"}]},{"type":"text","value":" löytyvää toista parametria "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reverse"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sort"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":"hintajarjestys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" reverse"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nt2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":"hintajarjestys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" reverse"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"funktion-sisalla-maaritelty-funktio","style":"position:relative;"},"children":[{"type":"text","value":"Funktion sisällä määritelty funktio"},{"type":"element","tagName":"a","properties":{"href":"#funktion-sisalla-maaritelty-funktio","ariaLabel":"funktion sisalla maaritelty funktio permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos haluaisimme siirtää edellisessä esimerkissä tehdyn järjestämisen omaan funktioonsa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"jarjesta_hinnan_mukaan"}]},{"type":"text","value":", voisimme toteuttaa sen seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hintajarjestys"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"tuple"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"jarjesta_hinnan_mukaan"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkiot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# käytetään täällä funktiota hintajarjestys"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkiot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":"hintajarjestys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntuotteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"omena\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"appelsiini\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vesimeloni\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tuote "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" jarjesta_hinnan_mukaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos järjestämisen käyttämää apufunktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hintajarjestys"}]},{"type":"text","value":" ei käytetä missään muussa kohtaa ohjelmaa kuin funktiossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"jarjesta_hinnan_mukaan"}]},{"type":"text","value":", sen määrittely voitaisiin siirtää funktion sisälle:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"jarjesta_hinnan_mukaan"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkiot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# määritellään apufunktio tällä kertaa funktion sisällä"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hintajarjestys"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"tuple"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkiot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":"hintajarjestys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Järjestys varastosaldon mukaan","tmcname":"osa12-01_varastosaldo"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"jarjesta_varastosaldon_mukaan(alkiot: list)"}]},{"type":"text","value":". Funktio saa parametrina listan tupleja, joissa kolmantena alkiona on tuotteiden varastosaldo. Funktio järjestää parametrinaan saamat tuotteet varastosaldojen mukaiseen kasvavaan järjestykseen. Funktio ei muuta parametrina olevaa listaa, vaan palauttaa uuden listan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tuotteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"omena\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"appelsiini\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vesimeloni\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"22"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tuote "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" jarjesta_varastosaldon_mukaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" kpl\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"text","value":"\nappelsiini 2 kpl\nomena 3 kpl\nbanaani 12 kpl\nvesimeloni 22 kpl\n"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Järjestys tuotantokausien mukaan","tmcname":"osa12-02_tuotantokaudet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"jarjesta_tuotantokausien_mukaan(alkiot: list)"}]},{"type":"text","value":". Funktio saa parametrina listan sanakirjoja, jotka edustavat yksittäisiä TV-sarjoja, ja järjestää ne tuotantokausien lukumäärän mukaiseen kasvavaan järjestykseen. Funktio ei muuta parametrina olevaa listaa, vaan palauttaa uuden listan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sarjat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Dexter\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pisteet\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8.6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kausia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Friends\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pisteet\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8.9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kausia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Simpsons\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pisteet\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8.7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kausia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"32"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sarja "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" jarjesta_tuotantokausien_mukaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sarjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"sarja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'nimi'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"sarja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'kausia'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" tuotantokautta\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"text","value":"\nDexter 9 tuotantokautta\nFriends 10 tuotantokautta\nSimpsons 32 tuotantokautta\n"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Järjestys pisteiden mukaan","tmcname":"osa12-03_pisteiden_mukaan"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"jarjesta_pisteiden_mukaan(alkiot: list)"}]},{"type":"text","value":". Funktio saa parametrina listan sanakirjoja, jotka edustavat yksittäisiä TV-sarjoja, ja järjestää ne "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"pisteiden mukaiseen laskevaan järjestykseen"}]},{"type":"text","value":". Funktio ei muuta parametrina olevaa listaa, vaan palauttaa uuden listan."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sarjat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Dexter\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pisteet\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8.6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kausia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Friends\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pisteet\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8.9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kausia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Simpsons\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pisteet\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8.7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kausia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"32"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"IMDB:n mukainen pistemäärä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sarja "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" jarjesta_pisteiden_mukaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sarjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"sarja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'nimi'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"sarja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'pisteet'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"text","value":"\nIMDB:n mukainen pistemäärä\nFriends 8.9\nSimpsons 8.7\nDexter 8.6\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"omien-olioiden-alkioiden-jarjestaminen","style":"position:relative;"},"children":[{"type":"text","value":"Omien olioiden alkioiden järjestäminen"},{"type":"element","tagName":"a","properties":{"href":"#omien-olioiden-alkioiden-jarjestaminen","ariaLabel":"omien olioiden alkioiden jarjestaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoitetaan samaa periaatetta hyödyntäen ohjelma, joka järjestää listan omasta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"text","value":"-luokasta luotuja olioita kahden eri kriteerin avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Luokka mallintaa yhtä opiskelijaa \"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tunnus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tunnus\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pisteet\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tunnus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"), "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" op.\""}]}]},{"type":"text","value":"\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tunnuksen_mukaan"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tunnus\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pisteiden_mukaan"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisteet\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n o1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aapeli\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"a123\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"220"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n o2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"m321\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"210"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n o3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"a999\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"131"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n opiskelijat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"o1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" o2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" o3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tunnuksen mukaan:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" opiskelija "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":"tunnuksen_mukaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pisteiden mukaan:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" opiskelija "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":"pisteiden_mukaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aapeli (a123), 220 op.\nAnna (a999), 131 op.\nMaija (m321), 210 op."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pisteiden mukaan:\nAnna (a999), 131 op.\nMaija (m321), 210 op.\nAapeli (a123), 220 op."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Järjestäminen toimii niinkuin pitää. Jos olioille arvon antavia funktioita "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tunnuksen_mukaan"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pisteiden_mukaan"}]},{"type":"text","value":" ei tarvita muuten, voimme kuitenkin vielä yksinkertaistaa ohjelmaa."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kiipeilyreitti","tmcname":"osa12-04_kiipeilyreitti"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjan mukana tulee valmis luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kiipeilyreitti"}]},{"type":"text","value":", jota käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"reitti1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kantti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"38"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"6A+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nreitti2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Smooth operator\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"7A\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nreitti3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Syncro\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"14"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"8C+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"reitti1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"reitti2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"reitti3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" reitti3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" reitti3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"grade"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kantti, pituus 38 metriä, grade 6A+\nSmooth operator, pituus 11 metriä, grade 7A\nSyncro 14 8C+"}]}]},{"type":"element","tagName":"h2","properties":{"id":"pituuden-mukainen-jarjestys","style":"position:relative;"},"children":[{"type":"text","value":"Pituuden mukainen järjestys"},{"type":"element","tagName":"a","properties":{"href":"#pituuden-mukainen-jarjestys","ariaLabel":"pituuden mukainen jarjestys permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pituuden_mukaan(reitit: list)"}]},{"type":"text","value":" joka palauttaa kiipeilyreitit pituuden mukaan käänteisessä järjestyksessä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"r1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kantti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"38"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"6A+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nr2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Smooth operator\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"7A\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nr3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Syncro\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"14"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"8C+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nr4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pieniä askelia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"6A+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nreitit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"r1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" r2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" r3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" r4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" reitti "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pituuden_mukaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"reitit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"reitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kantti, pituus 38 metriä, grade 6A+\nSyncro, pituus 14 metriä, grade 8C+\nPieniä askelia, pituus 12 metriä, grade 6A+\nSmooth operator, pituus 11 metriä, grade 7A"}]}]},{"type":"element","tagName":"h2","properties":{"id":"vaikeuden-mukainen-jarjestys","style":"position:relative;"},"children":[{"type":"text","value":"Vaikeuden mukainen järjestys"},{"type":"element","tagName":"a","properties":{"href":"#vaikeuden-mukainen-jarjestys","ariaLabel":"vaikeuden mukainen jarjestys permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vaikeuden_mukaan(reitit: list)"}]},{"type":"text","value":" joka palauttaa kiipeilyreitit vaikeuden (eli graden) mukaan laskevassa järjestyksessä. Jos reittien vaikeus on sama, ratkaisee pituus vaikeuden. Pidempi on vaikeampi. Kiipeilyreittien vaikeusasteikko on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"4, 4+, 5, 5+, 6A, 6A+, ..."}]},{"type":"text","value":" eli käytännössä se seuraa aakkosjärjestystä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"r1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kantti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"38"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"6A+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nr2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Smooth operator\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"7A\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nr3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Syncro\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"14"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"8C+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nr4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pieniä askelia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"6A+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nreitit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"r1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" r2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" r3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" r4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" reitti "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" vaikeuden_mukaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"reitit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"reitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Syncro, pituus 14 metriä, grade 8C+\nSmooth operator, pituus 11 metriä, grade 7A\nKantti, pituus 38 metriä, grade 6A+\nPieniä askelia, pituus 12 metriä, grade 6A+"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Vihje"}]},{"type":"text","value":" jos järjestysperusteena on lista tai tuple, järjestetään ensisijaiseti ensimmäisen alkion mukaan, toissijaisesti toisen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"a\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"a\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"b\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"30"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"b\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[('a', 2), ('a', 4), ('b', 0), ('b', 30)]"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kiipeilykalliot","tmcname":"osa12-05_kiipeilykalliot/"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjasta löytyy luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kiipeilyreitti"}]},{"type":"text","value":" lisäksi luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kiipeilykallio"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"k1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilykallio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olhava\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nk1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_reitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kantti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"38"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"6A+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nk1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_reitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suuri leikkaus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"36"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"6B\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nk1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_reitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ruotsalaisten reitti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"42"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"5+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nk2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilykallio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nummi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nk2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_reitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Syncro\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"14"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"8C+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nk3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilykallio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nalkkilan släbi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nk3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_reitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pieniä askelia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"6A+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nk3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_reitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Smooth operator\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"7A\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nk3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_reitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Possu ei pidä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"6B+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nk3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_reitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hedelmätarha\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"6A\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"reitteja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vaikein_reitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olhava, 3 reittiä, vaikein 6B\nNalkkilan slabi 4\nSmooth operator, pituus 9 metriä, grade 7A"}]}]},{"type":"element","tagName":"h2","properties":{"id":"reittien-maaran-mukaan","style":"position:relative;"},"children":[{"type":"text","value":"Reittien määrän mukaan"},{"type":"element","tagName":"a","properties":{"href":"#reittien-maaran-mukaan","ariaLabel":"reittien maaran mukaan permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reittien_maaran_mukaan"}]},{"type":"text","value":", joka järjestää kiipeilykalliot reittien määrän mukaiseen kasvavaan suuruusjärjestykseen."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# k1, k2 ja k3 määritelty kuten edellä"}]},{"type":"text","value":"\nkalliot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"k1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" kallio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" reittien_maaran_mukaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kalliot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kallio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nummi, 1 reittiä, vaikein 8C+\nOlhava, 3 reittiä, vaikein 6B\nNalkkilan slabi, 4 reittiä, vaikein 7A"}]}]},{"type":"element","tagName":"h2","properties":{"id":"vaikeimman-reitin-mukaan","style":"position:relative;"},"children":[{"type":"text","value":"Vaikeimman reitin mukaan"},{"type":"element","tagName":"a","properties":{"href":"#vaikeimman-reitin-mukaan","ariaLabel":"vaikeimman reitin mukaan permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vaikeimman_reitin_mukaan"}]},{"type":"text","value":", joka järjestää kiipeilykalliot kalliolta löytyvän vaikeimman reitin mukaiseen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"laskevaan"}]},{"type":"text","value":" suuruusjärjestykseen."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# k1, k2 ja k3 määritelty kuten edellä"}]},{"type":"text","value":"\nkalliot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"k1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" kallio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" vaikeimman_reitin_mukaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kalliot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kallio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nummi, 1 reittiä, vaikein 8C+\nNalkkilan slabi, 4 reittiä, vaikein 7A\nOlhava, 3 reittiä, vaikein 6B"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"lambda-lauseke","style":"position:relative;"},"children":[{"type":"text","value":"Lambda-lauseke"},{"type":"element","tagName":"a","properties":{"href":"#lambda-lauseke","ariaLabel":"lambda lauseke permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lambda-lausekkeen avulla voidaan luoda anonyymi funktio eli funktio, joka muodostetaan sillä hetkellä, kun sitä tarvitaan. Lausekkeen yleinen syntaksi on seuraava:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lambda : "}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi tuplelistan järjestys onnistuisi näin käyttämällä lambda-lauseketta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tuotteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"omena\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"appelsiini\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vesimeloni\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Funktio luodaan \"lennosta\" lambda-lausekkeella:"}]},{"type":"text","value":"\ntuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sort"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tuote "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"('omena', 3.95)\n('appelsiini', 4.5)\n('vesimeloni', 4.95)\n('banaani', 5.95)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lauseke"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lambda alkio: alkio[1]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"vastaa funktiomäärittelyä"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hinta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"paitsi että lambda-lauseketta käytettäessä funktiolle ei anneta nimeä. Tämän takia muodostettavaa funktiota kutsutaan anonyymiksi funktioksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuten lambdan avulla muodostettava funktio on kuin mikä tahansa muukin funktio. Esimerkiksi seuraava esimerkki järjestää merkkijonot niiden viimeisten merkkien mukaiseen aakkosjärjestykseen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjonot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Makke\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Markku\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" jono "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjonot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" jono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" jono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Maija\nMakke\nMikki\nMikko\nMarkku"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mennään vielä pidemmälle: yhdistämällä listakooste ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"join"}]},{"type":"text","value":"-metodi lambda-lausekkeeseen voidaan esimerkiksi järjestää merkkijonot niistä löytyvien vokaalien mukaiseen järjestykseen välittämättä muista merkeistä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjonot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Makke\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Markku\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" jono "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjonot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" jono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"m "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" m "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" jono "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" m "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"aeiouyäö\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Makke\nMaija\nMarkku\nMikki\nMikko"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anonyymejä funktioita voi hyödyntää Pythonissa monien muidenkin valmiiden funktioiden yhteydessä. Esimerkiksi funktioille "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"min"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"max"}]},{"type":"text","value":" voidaan määritellä samalla tavalla parametri "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"key"}]},{"type":"text","value":", jonka perusteella minimi- tai maksimiarvo valitaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkissä poimitaan levyistä aluksi vanhin ja sitten pisin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Levy"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\"Luokka mallintaa yhtä äänilevyä\"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" esittaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kesto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"esittaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" esittaja\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vuosi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" vuosi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kesto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kesto\n\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"esittaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"), "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":". "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kesto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" min.\""}]}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n l1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Levy"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nevermind\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nirvana\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1991"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"43"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n l2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Levy"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Let It Be\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Beatles\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1969"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"35"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n l3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Levy"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Joshua Tree\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"U2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1986"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n levyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"l1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" l2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" l3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vanhin levy:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"min"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"levyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" levy"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" levy"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pisin levy: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"max"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"levyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" levy"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" levy"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kesto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vanhin levy:\nLet It Be (Beatles), 1969. 35 min.\nPisin levy:\nU2 (Joshua Tree), 1986. 50 min."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Palloilijat","tmcname":"osa12-06_palloilijat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjasta löytyy luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Palloilija"}]},{"type":"text","value":", jolla on seuraavat julkiset piirteet:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"pelinumero"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"tehtyjen maalien määrä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"maalit"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"annettujen syöttöjen määrä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"syotot"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"peliminuuttien määrä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"minuutit"}]}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita seuraavien tehtävänantojen mukaiset funktiot. Huomaa, että jokaisessa funktiossa palautetaan erityyppiset tiedot."}]},{"type":"element","tagName":"h2","properties":{"id":"eniten-maaleja","style":"position:relative;"},"children":[{"type":"text","value":"Eniten maaleja"},{"type":"element","tagName":"a","properties":{"href":"#eniten-maaleja","ariaLabel":"eniten maaleja permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"eniten_maaleja"}]},{"type":"text","value":", joka saa parametrikseen listan palloilijoita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa merkkijonona sen pelaajan nimen, joka on tehnyt eniten maaleja."}]},{"type":"element","tagName":"h2","properties":{"id":"eniten-pisteita","style":"position:relative;"},"children":[{"type":"text","value":"Eniten pisteitä"},{"type":"element","tagName":"a","properties":{"href":"#eniten-pisteita","ariaLabel":"eniten pisteita permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"eniten_pisteita"}]},{"type":"text","value":", joka saa parametrikseen listan palloilijoita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa tuplena sen pelaajan nimen ja pelinumeron, joka on tehnyt yhteensä eniten pisteitä. Pisteisiin lasketaan siis sekä maalit että syötöt."}]},{"type":"element","tagName":"h2","properties":{"id":"vahiten-peliminuutteja","style":"position:relative;"},"children":[{"type":"text","value":"Vähiten peliminuutteja"},{"type":"element","tagName":"a","properties":{"href":"#vahiten-peliminuutteja","ariaLabel":"vahiten peliminuutteja permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vahiten_minuutteja"}]},{"type":"text","value":", joka saa parametrikseen listan palloilijoita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa sen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Palloilija"}]},{"type":"text","value":"-olion, jolla on vähiten peliminuutteja kaikista pelaajista."}]},{"type":"element","tagName":"h2","properties":{"id":"testiohjelma","style":"position:relative;"},"children":[{"type":"text","value":"Testiohjelma"},{"type":"element","tagName":"a","properties":{"href":"#testiohjelma","ariaLabel":"testiohjelma permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit testata koodisi toimintaa seuraavalla ohjelmalla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n pelaaja1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Palloilija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kelju Kojootti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"13"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"46"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pelaaja2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Palloilija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maantiekiitäjä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"26"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"55"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pelaaja3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Palloilija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Uka Naakka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"32"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"26"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pelaaja4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Palloilija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pelle Peloton\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"41"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pelaaja5 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Palloilija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hessu Hopo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n joukkue "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"pelaaja1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelaaja2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelaaja3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelaaja4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelaaja5"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eniten_maaleja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"joukkue"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eniten_pisteita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"joukkue"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vahiten_minuutteja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"joukkue"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostuksen tulisi olla:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kelju Kojootti\n('Uka Naakka', 9)\nPalloilija(nimi=Hessu Hopo, pelinumero=4, maalit=3, syotot=9, minuutit=12)"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"funktiot-parametreina-omissa-funktioissa","style":"position:relative;"},"children":[{"type":"text","value":"Funktiot parametreina omissa funktioissa"},{"type":"element","tagName":"a","properties":{"href":"#funktiot-parametreina-omissa-funktioissa","ariaLabel":"funktiot parametreina omissa funktioissa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa on siis mahdollista välittää viittaus johonkin funktioon toiselle funktiolle. Tarkastellaan vielä esimerkkinä omaa funktiota, joka saa parametrikseen toisen funktion:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tyyppivihje callable viittaa funktioon"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"suorita_operaatio"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"operaatio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"callable"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kutsutaan välitettyä funktiota"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" operaatio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"summa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" b\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" b\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorita_operaatio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorita_operaatio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorita_operaatio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"15\n50\n5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suorita_operaatio"}]},{"type":"text","value":" lopputulos siis riippuu siitä, mikä funktio sille on välitetty parametrina. Funktioksi kelpaa mikä tahansa funktio (niin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":"-lauseella määritelty kuin anonyymikin) jolla on kaksi parametria."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaikkei funktioiden välittäminen parametrina olekaan kaikkein yleisimmin tarvittava operaatio, on se joka tapauksessa hyödyllinen mekanismi. Esimerkiksi seuraava ohjelma kirjoittaa tiedostosta 1 halutut rivit tiedostoon 2. Rivien valintakriteeri annetaan funktiona, joka palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", jos rivi tulee kirjoittaa toiseen tiedostoon:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kopioi_rivit"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lahde_nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kohde_nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kriteeri"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lahde_nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" lahde"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kohde_nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"w\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" kohde"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lahde"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Poistetaan ensin tyhjät merkit alusta ja lopusta"}]},{"type":"text","value":"\n rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"strip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" kriteeri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n kohde"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Esimerkkejä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Jos kolmatta parametria ei ole määritelty, kopioidaan kaikki"}]},{"type":"text","value":"\n kopioi_rivit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eka.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toka.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kopioidaan kaikki ei-tyhjät rivit"}]},{"type":"text","value":"\n kopioi_rivit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eka.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toka.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kopioidaan kaikki rivit, joilla on sana \"Python\""}]},{"type":"text","value":"\n kopioi_rivit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eka.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toka.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Python\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kopioidaan kaikki rivit, jotka eivät pääty pisteeseen"}]},{"type":"text","value":"\n kopioi_rivit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eka.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toka.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"!="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\".\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiossa parametrille "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kriteeri"}]},{"type":"text","value":" on määritelty oletusarvoksi lambda-lauseke "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lambda x: True"}]},{"type":"text","value":", jonka tuottama anonyymi funktio palauttaa arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":" kaikille syötteille. Niinpä oletuksena kopioidaan kaikki rivit tiedostosta toiseen. Jos käyttäjä antaa kolmannelle parametrille arvon, tämä korvaa oletusarvon."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Tuotteiden haku","tmcname":"osa12-07_tuotteiden_haku"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä käsitellään tupleina esitettäviä tuotteita, jotka on esimerkeissä alustettu muuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tuotteet"}]},{"type":"text","value":" seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tuotteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"omena\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"appelsiini\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vesimeloni\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"22"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kaali\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.99"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jokaisessa tuplessa ensimmäinen alkio siis edustaa nimeä, seuraava hintaa ja kolmas määrää."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae(tuotteet: list, kriteeri: callable)"}]},{"type":"text","value":", missä toisena parametrina on funktio, joka saa parametriksi yhden tuotetta edustavan tuplen ja palauttaa totuusarvon. Funktio palauttaa listassa parametrina annetuista tuotteista ne, jotka toteuttavat kriteerin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sopiva kriteeri voisi olla esimerkiksi seuraavanlainen"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hinta_alle_4_euroa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio siis palauttaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"True"}]},{"type":"text","value":" jos tuotteen hinta on alle 4 euroa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"haku"}]},{"type":"text","value":" toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tuote "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" hae"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" hinta_alle_4_euroa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"('omena', 3.95, 3)\n('kaali', 0.99, 1)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kriteerifunktion voi myös määritellä lambda-funktiona. Seuraava käyttää funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"haku"}]},{"type":"text","value":" etsimään tuotteet, joita on vähintään 11 kappaletta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tuote "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" hae"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" t"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" t"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"('banaani', 5.95, 12)\n('vesimeloni', 4.95, 22)"}]}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat järjestää listoja eri kriteerien mukaan
  • \n
  • Tiedät mitä tarkoitetaan lambda-lausekkeella
  • \n
  • Osaat hyödyntää lambda-lauseketta myös muiden Pythonin funktioiden kanssa
  • \n
  • Osaat välittää funktion parametrina funktiolle
  • \n

Olemme jo aikaisemmin käyttäneet metodia sort ja funktiota sorted järjestämään listoja luonnolliseen järjestykseen. Metodit toimivat sellaisenaan hyvin luvuista ja merkkijonoista koostuvien listojen kanssa, mutta jos lista sisältää monimutkaisempia alkioita, Python ei välttämättä järjestä listaa niin kuin ohjelmoija toivoisi.

Esimerkiksi lista tupleja järjestetään oletuksena jokaisen tuplen ensimmäisen alkion perusteella:

tuotteet = [(\"banaani\", 5.95), (\"omena\", 3.95), (\"appelsiini\", 4.50), (\"vesimeloni\", 4.95)]\n\ntuotteet.sort()\n\nfor tuote in tuotteet:\n    print(tuote)

('appelsiini', 4.5)\n('banaani', 5.95)\n('omena', 3.95)\n('vesimeloni', 4.95)

Mitä jos haluaisimme järjestää tuotelistan hinnan perusteella?

Funktiot parametrina

Järjestysmetodille tai -funktiolle voidaan antaa toisena parametrina järjestyksen määräävä avain. Avaimeksi annetaan funktio, joka kertoo, miten yksittäisen alkion arvo määritetään. Python kutsuu tätä funktiota järjestämisen aikana alkioiden vertailemiseen.

Esimerkiksi:

def hintajarjestys(alkio: tuple):\n    # Palautetaan tuplen toinen alkio eli hinta\n    return alkio[1]\n\nif __name__ == \"__main__\":\n    tuotteet = [(\"banaani\", 5.95), (\"omena\", 3.95), (\"appelsiini\", 4.50), (\"vesimeloni\", 4.95)]\n\n    # Hyödynnetään funktiota hintajarjestys\n    tuotteet.sort(key=hintajarjestys)\n\n    for tuote in tuotteet:\n        print(tuote)

('omena', 3.95)\n('appelsiini', 4.5)\n('vesimeloni', 4.95)\n('banaani', 5.95)

Nyt ohjelma järjestää listan hinnan mukaiseen järjestykseen. Mutta mitä ohjelmassa oikeastaan tapahtuu?

Funktion hintajarjestys määrittely on melko yksinkertainen: se saa parametrikseen yhden alkion ja palauttaa alkiolle arvon - tässä tapauksessa tuplen toisen alkion (joka esimerkissämme esittää tuotteen hintaa). Tarkastellaan kuitenkin lähemmin järjestysmetodia kutsuvaa riviä:

tuotteet.sort(key=hintajarjestys)

Rivillä annetaan metodille sort parametriksi funktio. Ei siis funktion paluuarvoa, vaan viittaus funktioon. Järjestysmetodi kutsuu tätä funktiota jokaiselle alkiolle.

Kutsut nähdään selkeästi lisäämällä vertailufunktioomme ylimääräinen tulostuslause:

def hintajarjestys(alkio: tuple):\n    # Tulostetaan alkio\n    print(f\"Kutsuttiin hintajarjestys({alkio})\")\n\n    # Palautetaan tuplen toinen alkio eli hinta\n    return alkio[1]\n\n\ntuotteet = [(\"banaani\", 5.95), (\"omena\", 3.95), (\"appelsiini\", 4.50), (\"vesimeloni\", 4.95)]\n\n# Hyödynnetään funktiota hintajarjestys\ntuotteet.sort(key=hintajarjestys)\n\nfor tuote in tuotteet:\n    print(tuote)

Kutsuttiin hintajarjestys(('banaani', 5.95))\nKutsuttiin hintajarjestys(('omena', 3.95))\nKutsuttiin hintajarjestys(('appelsiini', 4.5))\nKutsuttiin hintajarjestys(('vesimeloni', 4.95))\n('omena', 3.95)\n('appelsiini', 4.5)\n('vesimeloni', 4.95)\n('banaani', 5.95)

Järjestys saadaan käännettyä päinvastaiseksi hyödyntämällä sekä metodista sort että funktiosta sorted löytyvää toista parametria reverse:

tuotteet.sort(key=hintajarjestys, reverse=True)\n\nt2 = sorted(tuotteet, key=hintajarjestys, reverse=True)

Funktion sisällä määritelty funktio

Jos haluaisimme siirtää edellisessä esimerkissä tehdyn järjestämisen omaan funktioonsa jarjesta_hinnan_mukaan, voisimme toteuttaa sen seuraavasti:

def hintajarjestys(alkio: tuple):\n    return alkio[1]\n\ndef jarjesta_hinnan_mukaan(alkiot: list):\n    # käytetään täällä funktiota hintajarjestys\n    return sorted(alkiot, key=hintajarjestys)\n\ntuotteet = [(\"banaani\", 5.95), (\"omena\", 3.95), (\"appelsiini\", 4.50), (\"vesimeloni\", 4.95)]\n\nfor tuote in jarjesta_hinnan_mukaan(tuotteet):\n    print(tuote)

Jos järjestämisen käyttämää apufunktiota hintajarjestys ei käytetä missään muussa kohtaa ohjelmaa kuin funktiossa jarjesta_hinnan_mukaan, sen määrittely voitaisiin siirtää funktion sisälle:

def jarjesta_hinnan_mukaan(alkiot: list):\n    # määritellään apufunktio tällä kertaa funktion sisällä\n    def hintajarjestys(alkio: tuple):\n        return alkio[1]\n\n    return sorted(alkiot, key=hintajarjestys)

Tee funktio jarjesta_varastosaldon_mukaan(alkiot: list). Funktio saa parametrina listan tupleja, joissa kolmantena alkiona on tuotteiden varastosaldo. Funktio järjestää parametrinaan saamat tuotteet varastosaldojen mukaiseen kasvavaan järjestykseen. Funktio ei muuta parametrina olevaa listaa, vaan palauttaa uuden listan.

Funktio toimii seuraavasti:

tuotteet = [(\"banaani\", 5.95, 12), (\"omena\", 3.95, 3), (\"appelsiini\", 4.50, 2), (\"vesimeloni\", 4.95, 22)]\n\nfor tuote in jarjesta_varastosaldon_mukaan(tuotteet):\n    print(f\"{tuote[0]} {tuote[2]} kpl\")
\nappelsiini 2 kpl\nomena 3 kpl\nbanaani 12 kpl\nvesimeloni 22 kpl\n

Tee funktio jarjesta_tuotantokausien_mukaan(alkiot: list). Funktio saa parametrina listan sanakirjoja, jotka edustavat yksittäisiä TV-sarjoja, ja järjestää ne tuotantokausien lukumäärän mukaiseen kasvavaan järjestykseen. Funktio ei muuta parametrina olevaa listaa, vaan palauttaa uuden listan.

Funktio toimii seuraavasti:

sarjat = [{ \"nimi\": \"Dexter\", \"pisteet\" : 8.6, \"kausia\":9 }, { \"nimi\": \"Friends\", \"pisteet\" : 8.9, \"kausia\":10 },  { \"nimi\": \"Simpsons\", \"pisteet\" : 8.7, \"kausia\":32 }  ]\n\nfor sarja in jarjesta_tuotantokausien_mukaan(sarjat):\n    print(f\"{sarja['nimi']}  {sarja['kausia']} tuotantokautta\")
\nDexter 9 tuotantokautta\nFriends 10 tuotantokautta\nSimpsons 32 tuotantokautta\n

Tee funktio jarjesta_pisteiden_mukaan(alkiot: list). Funktio saa parametrina listan sanakirjoja, jotka edustavat yksittäisiä TV-sarjoja, ja järjestää ne pisteiden mukaiseen laskevaan järjestykseen. Funktio ei muuta parametrina olevaa listaa, vaan palauttaa uuden listan.

sarjat = [{ \"nimi\": \"Dexter\", \"pisteet\" : 8.6, \"kausia\":9 }, { \"nimi\": \"Friends\", \"pisteet\" : 8.9, \"kausia\":10 },  { \"nimi\": \"Simpsons\", \"pisteet\" : 8.7, \"kausia\":32 }  ]\n\nprint(\"IMDB:n mukainen pistemäärä\")\nfor sarja in jarjesta_pisteiden_mukaan(sarjat):\n    print(f\"{sarja['nimi']}  {sarja['pisteet']}\")
\nIMDB:n mukainen pistemäärä\nFriends 8.9\nSimpsons 8.7\nDexter 8.6\n

Omien olioiden alkioiden järjestäminen

Kirjoitetaan samaa periaatetta hyödyntäen ohjelma, joka järjestää listan omasta Opiskelija-luokasta luotuja olioita kahden eri kriteerin avulla:

class Opiskelija:\n    \"\"\" Luokka mallintaa yhtä opiskelijaa \"\"\"\n    def __init__(self, nimi: str, tunnus: str, pisteet: int):\n        self.nimi = nimi\n        self.tunnus = tunnus\n        self.pisteet = pisteet\n\n    def __str__(self):\n        return f\"{self.nimi} ({self.tunnus}), {self.pisteet} op.\"\n\n\ndef tunnuksen_mukaan(alkio: Opiskelija):\n    return alkio.tunnus\n\ndef pisteiden_mukaan(alkio: Opiskelija):\n    return alkio.pisteet\n\n\nif __name__ == \"__main__\":\n    o1 = Opiskelija(\"Aapeli\", \"a123\", 220)\n    o2 = Opiskelija(\"Maija\", \"m321\", 210)\n    o3 = Opiskelija(\"Anna\", \"a999\", 131)\n\n    opiskelijat = [o1, o2, o3]\n\n    print(\"Tunnuksen mukaan:\")\n    for opiskelija in sorted(opiskelijat, key=tunnuksen_mukaan):\n        print(opiskelija)\n\n    print()\n\n    print(\"Pisteiden mukaan:\")\n    for opiskelija in sorted(opiskelijat, key=pisteiden_mukaan):\n        print(opiskelija)

Aapeli (a123), 220 op.\nAnna (a999), 131 op.\nMaija (m321), 210 op.

Pisteiden mukaan:\nAnna (a999), 131 op.\nMaija (m321), 210 op.\nAapeli (a123), 220 op.

Järjestäminen toimii niinkuin pitää. Jos olioille arvon antavia funktioita tunnuksen_mukaan ja pisteiden_mukaan ei tarvita muuten, voimme kuitenkin vielä yksinkertaistaa ohjelmaa.

Tehtäväpohjan mukana tulee valmis luokka Kiipeilyreitti, jota käytetään seuraavasti:

reitti1 = Kiipeilyreitti(\"Kantti\", 38, \"6A+\")\nreitti2 = Kiipeilyreitti(\"Smooth operator\", 11, \"7A\")\nreitti3 = Kiipeilyreitti(\"Syncro\", 14, \"8C+\")\n\n\nprint(reitti1)\nprint(reitti2)\nprint(reitti3.nimi, reitti3.pituus, reitti3.grade)

Kantti, pituus 38 metriä, grade 6A+\nSmooth operator, pituus 11 metriä, grade 7A\nSyncro 14 8C+

Pituuden mukainen järjestys

Tee funktio pituuden_mukaan(reitit: list) joka palauttaa kiipeilyreitit pituuden mukaan käänteisessä järjestyksessä.

Funktio toimii seuraavasti:

r1 = Kiipeilyreitti(\"Kantti\", 38, \"6A+\")\nr2 = Kiipeilyreitti(\"Smooth operator\", 11, \"7A\")\nr3 = Kiipeilyreitti(\"Syncro\", 14, \"8C+\")\nr4 = Kiipeilyreitti(\"Pieniä askelia\", 12, \"6A+\")\n\nreitit = [r1, r2, r3, r4]\n\nfor reitti in pituuden_mukaan(reitit):\n    print(reitti)

Kantti, pituus 38 metriä, grade 6A+\nSyncro, pituus 14 metriä, grade 8C+\nPieniä askelia, pituus 12 metriä, grade 6A+\nSmooth operator, pituus 11 metriä, grade 7A

Vaikeuden mukainen järjestys

Tee funktio vaikeuden_mukaan(reitit: list) joka palauttaa kiipeilyreitit vaikeuden (eli graden) mukaan laskevassa järjestyksessä. Jos reittien vaikeus on sama, ratkaisee pituus vaikeuden. Pidempi on vaikeampi. Kiipeilyreittien vaikeusasteikko on 4, 4+, 5, 5+, 6A, 6A+, ... eli käytännössä se seuraa aakkosjärjestystä.

Funktio toimii seuraavasti:

r1 = Kiipeilyreitti(\"Kantti\", 38, \"6A+\")\nr2 = Kiipeilyreitti(\"Smooth operator\", 11, \"7A\")\nr3 = Kiipeilyreitti(\"Syncro\", 14, \"8C+\")\nr4 = Kiipeilyreitti(\"Pieniä askelia\", 12, \"6A+\")\n\nreitit = [r1, r2, r3, r4]\nfor reitti in vaikeuden_mukaan(reitit):\n    print(reitti)

Syncro, pituus 14 metriä, grade 8C+\nSmooth operator, pituus 11 metriä, grade 7A\nKantti, pituus 38 metriä, grade 6A+\nPieniä askelia, pituus 12 metriä, grade 6A+

Vihje jos järjestysperusteena on lista tai tuple, järjestetään ensisijaiseti ensimmäisen alkion mukaan, toissijaisesti toisen:

lista = [(\"a\", 4),(\"a\", 2),(\"b\", 30), (\"b\", 0) ]\nprint(sorted(lista))

[('a', 2), ('a', 4), ('b', 0), ('b', 30)]

Tehtäväpohjasta löytyy luokan Kiipeilyreitti lisäksi luokka Kiipeilykallio.

k1 = Kiipeilykallio(\"Olhava\")\nk1.lisaa_reitti(Kiipeilyreitti(\"Kantti\", 38, \"6A+\"))\nk1.lisaa_reitti(Kiipeilyreitti(\"Suuri leikkaus\", 36, \"6B\"))\nk1.lisaa_reitti(Kiipeilyreitti(\"Ruotsalaisten reitti\", 42, \"5+\"))\n\nk2 = Kiipeilykallio(\"Nummi\")\nk2.lisaa_reitti(Kiipeilyreitti(\"Syncro\", 14, \"8C+\"))\n\nk3 = Kiipeilykallio(\"Nalkkilan släbi\")\nk3.lisaa_reitti(Kiipeilyreitti(\"Pieniä askelia\", 12, \"6A+\"))\nk3.lisaa_reitti(Kiipeilyreitti(\"Smooth operator\", 11, \"7A\"))\nk3.lisaa_reitti(Kiipeilyreitti(\"Possu ei pidä\", 12 , \"6B+\"))\nk3.lisaa_reitti(Kiipeilyreitti(\"Hedelmätarha\", 8, \"6A\"))\n\nprint(k1)\nprint(k3.nimi, k3.reitteja())\nprint(k3.vaikein_reitti())

Olhava, 3 reittiä, vaikein 6B\nNalkkilan slabi 4\nSmooth operator, pituus 9 metriä, grade 7A

Reittien määrän mukaan

Tee funktio reittien_maaran_mukaan, joka järjestää kiipeilykalliot reittien määrän mukaiseen kasvavaan suuruusjärjestykseen.

# k1, k2 ja k3 määritelty kuten edellä\nkalliot = [k1, k2, k3]\nfor kallio in reittien_maaran_mukaan(kalliot):\n    print(kallio)\n

Nummi, 1 reittiä, vaikein 8C+\nOlhava, 3 reittiä, vaikein 6B\nNalkkilan slabi, 4 reittiä, vaikein 7A

Vaikeimman reitin mukaan

Tee funktio vaikeimman_reitin_mukaan, joka järjestää kiipeilykalliot kalliolta löytyvän vaikeimman reitin mukaiseen laskevaan suuruusjärjestykseen.

# k1, k2 ja k3 määritelty kuten edellä\nkalliot = [k1, k2, k3]\nfor kallio in vaikeimman_reitin_mukaan(kalliot):\n    print(kallio)\n

Nummi, 1 reittiä, vaikein 8C+\nNalkkilan slabi, 4 reittiä, vaikein 7A\nOlhava, 3 reittiä, vaikein 6B

Lambda-lauseke

Lambda-lausekkeen avulla voidaan luoda anonyymi funktio eli funktio, joka muodostetaan sillä hetkellä, kun sitä tarvitaan. Lausekkeen yleinen syntaksi on seuraava:

lambda <parametrit> : <lauseke>

Esimerkiksi tuplelistan järjestys onnistuisi näin käyttämällä lambda-lauseketta:

tuotteet = [(\"banaani\", 5.95), (\"omena\", 3.95), (\"appelsiini\", 4.50), (\"vesimeloni\", 4.95)]\n\n# Funktio luodaan \"lennosta\" lambda-lausekkeella:\ntuotteet.sort(key=lambda alkio: alkio[1])\n\nfor tuote in tuotteet:\n    print(tuote)

('omena', 3.95)\n('appelsiini', 4.5)\n('vesimeloni', 4.95)\n('banaani', 5.95)

Lauseke

lambda alkio: alkio[1]

vastaa funktiomäärittelyä

\ndef hinta(alkio):\n    return alkio[1]

paitsi että lambda-lauseketta käytettäessä funktiolle ei anneta nimeä. Tämän takia muodostettavaa funktiota kutsutaan anonyymiksi funktioksi.

Muuten lambdan avulla muodostettava funktio on kuin mikä tahansa muukin funktio. Esimerkiksi seuraava esimerkki järjestää merkkijonot niiden viimeisten merkkien mukaiseen aakkosjärjestykseen:

mjonot = [\"Mikko\", \"Makke\", \"Maija\", \"Markku\", \"Mikki\"]\n\nfor jono in sorted(mjonot, key=lambda jono: jono[-1]):\n    print(jono)

Maija\nMakke\nMikki\nMikko\nMarkku

Mennään vielä pidemmälle: yhdistämällä listakooste ja join-metodi lambda-lausekkeeseen voidaan esimerkiksi järjestää merkkijonot niistä löytyvien vokaalien mukaiseen järjestykseen välittämättä muista merkeistä:

mjonot = [\"Mikko\", \"Makke\", \"Maija\", \"Markku\", \"Mikki\"]\n\nfor jono in sorted(mjonot, key=lambda jono: \"\".join([m for m in jono if m in \"aeiouyäö\"])):\n    print(jono)

Makke\nMaija\nMarkku\nMikki\nMikko

Anonyymejä funktioita voi hyödyntää Pythonissa monien muidenkin valmiiden funktioiden yhteydessä. Esimerkiksi funktioille min ja max voidaan määritellä samalla tavalla parametri key, jonka perusteella minimi- tai maksimiarvo valitaan.

Esimerkissä poimitaan levyistä aluksi vanhin ja sitten pisin:

\nclass Levy:\n    \"\"\"Luokka mallintaa yhtä äänilevyä\"\"\"\n    def __init__(self, nimi: str, esittaja: str, vuosi: int, kesto: int):\n        self.nimi = nimi\n        self.esittaja = esittaja\n        self.vuosi = vuosi\n        self.kesto = kesto\n\n\n    def __str__(self):\n        return f\"{self.nimi} ({self.esittaja}), {self.vuosi}. {self.kesto} min.\"\n\nif __name__ == \"__main__\":\n    l1 = Levy(\"Nevermind\", \"Nirvana\", 1991, 43)\n    l2 = Levy(\"Let It Be\", \"Beatles\", 1969, 35)\n    l3 = Levy(\"Joshua Tree\", \"U2\", 1986, 50)\n\n    levyt = [l1, l2, l3]\n\n\n    print(\"Vanhin levy:\")\n    print(min(levyt, key=lambda levy: levy.vuosi))\n\n    print(\"Pisin levy: \")\n    print(max(levyt, key=lambda levy: levy.kesto))

Vanhin levy:\nLet It Be (Beatles), 1969. 35 min.\nPisin levy:\nU2 (Joshua Tree), 1986. 50 min.

Tehtäväpohjasta löytyy luokka Palloilija, jolla on seuraavat julkiset piirteet:

    \n
  • nimi
  • \n
  • pelinumero
  • \n
  • tehtyjen maalien määrä maalit
  • \n
  • annettujen syöttöjen määrä syotot
  • \n
  • peliminuuttien määrä minuutit
  • \n

Kirjoita seuraavien tehtävänantojen mukaiset funktiot. Huomaa, että jokaisessa funktiossa palautetaan erityyppiset tiedot.

Eniten maaleja

Kirjoita funktio eniten_maaleja, joka saa parametrikseen listan palloilijoita.

Funktio palauttaa merkkijonona sen pelaajan nimen, joka on tehnyt eniten maaleja.

Eniten pisteitä

Kirjoita funktio eniten_pisteita, joka saa parametrikseen listan palloilijoita.

Funktio palauttaa tuplena sen pelaajan nimen ja pelinumeron, joka on tehnyt yhteensä eniten pisteitä. Pisteisiin lasketaan siis sekä maalit että syötöt.

Vähiten peliminuutteja

Kirjoita funktio vahiten_minuutteja, joka saa parametrikseen listan palloilijoita.

Funktio palauttaa sen Palloilija-olion, jolla on vähiten peliminuutteja kaikista pelaajista.

Testiohjelma

Voit testata koodisi toimintaa seuraavalla ohjelmalla:

if __name__ == \"__main__\":\n    pelaaja1 = Palloilija(\"Kelju Kojootti\", 13, 5, 12, 46)\n    pelaaja2 = Palloilija(\"Maantiekiitäjä\", 7, 2, 26, 55)\n    pelaaja3 = Palloilija(\"Uka Naakka\", 9, 1, 32, 26)\n    pelaaja4 = Palloilija(\"Pelle Peloton\", 12, 1, 11, 41)\n    pelaaja5 = Palloilija(\"Hessu Hopo\", 4, 3, 9, 12)\n\n    joukkue = [pelaaja1, pelaaja2, pelaaja3, pelaaja4, pelaaja5]\n    print(eniten_maaleja(joukkue))\n    print(eniten_pisteita(joukkue))\n    print(vahiten_minuutteja(joukkue))

Tulostuksen tulisi olla:

Kelju Kojootti\n('Uka Naakka', 9)\nPalloilija(nimi=Hessu Hopo, pelinumero=4, maalit=3, syotot=9, minuutit=12)

Funktiot parametreina omissa funktioissa

Pythonissa on siis mahdollista välittää viittaus johonkin funktioon toiselle funktiolle. Tarkastellaan vielä esimerkkinä omaa funktiota, joka saa parametrikseen toisen funktion:

# tyyppivihje callable viittaa funktioon\ndef suorita_operaatio(operaatio: callable):\n    # Kutsutaan välitettyä funktiota\n    return operaatio(10, 5)\n\ndef summa(a: int, b: int):\n    return a + b\n\ndef tulo(a: int, b: int):\n    return a * b\n\n\nif __name__ == \"__main__\":\n    print(suorita_operaatio(summa))\n    print(suorita_operaatio(tulo))\n    print(suorita_operaatio(lambda x,y: x - y))\n

15\n50\n5

Funktion suorita_operaatio lopputulos siis riippuu siitä, mikä funktio sille on välitetty parametrina. Funktioksi kelpaa mikä tahansa funktio (niin def-lauseella määritelty kuin anonyymikin) jolla on kaksi parametria.

Vaikkei funktioiden välittäminen parametrina olekaan kaikkein yleisimmin tarvittava operaatio, on se joka tapauksessa hyödyllinen mekanismi. Esimerkiksi seuraava ohjelma kirjoittaa tiedostosta 1 halutut rivit tiedostoon 2. Rivien valintakriteeri annetaan funktiona, joka palauttaa True, jos rivi tulee kirjoittaa toiseen tiedostoon:

def kopioi_rivit(lahde_nimi: str, kohde_nimi: str, kriteeri= lambda x: True):\n    with open(lahde_nimi) as lahde, open(kohde_nimi, \"w\") as kohde:\n        for rivi in lahde:\n            # Poistetaan ensin tyhjät merkit alusta ja lopusta\n            rivi = rivi.strip()\n\n            if kriteeri(rivi):\n                kohde.write(rivi + \"\\n\")\n\n# Esimerkkejä\nif __name__ == \"__main__\":\n    # Jos kolmatta parametria ei ole määritelty, kopioidaan kaikki\n    kopioi_rivit(\"eka.txt\", \"toka.txt\")\n\n    # Kopioidaan kaikki ei-tyhjät rivit\n    kopioi_rivit(\"eka.txt\", \"toka.txt\", lambda rivi: len(rivi) > 0)\n\n    # Kopioidaan kaikki rivit, joilla on sana \"Python\"\n    kopioi_rivit(\"eka.txt\", \"toka.txt\", lambda rivi: \"Python\" in rivi)\n\n    # Kopioidaan kaikki rivit, jotka eivät pääty pisteeseen\n    kopioi_rivit(\"eka.txt\", \"toka.txt\", lambda rivi: rivi[-1] != \".\")

Funktiossa parametrille kriteeri on määritelty oletusarvoksi lambda-lauseke lambda x: True, jonka tuottama anonyymi funktio palauttaa arvon True kaikille syötteille. Niinpä oletuksena kopioidaan kaikki rivit tiedostosta toiseen. Jos käyttäjä antaa kolmannelle parametrille arvon, tämä korvaa oletusarvon.

Tässä tehtävässä käsitellään tupleina esitettäviä tuotteita, jotka on esimerkeissä alustettu muuttujaan tuotteet seuraavasti:

tuotteet = [(\"banaani\", 5.95, 12), (\"omena\", 3.95, 3), (\"appelsiini\", 4.50, 2), (\"vesimeloni\", 4.95, 22), (\"Kaali\", 0.99, 1)]

Jokaisessa tuplessa ensimmäinen alkio siis edustaa nimeä, seuraava hintaa ja kolmas määrää.

Toteuta funktio hae(tuotteet: list, kriteeri: callable), missä toisena parametrina on funktio, joka saa parametriksi yhden tuotetta edustavan tuplen ja palauttaa totuusarvon. Funktio palauttaa listassa parametrina annetuista tuotteista ne, jotka toteuttavat kriteerin.

Sopiva kriteeri voisi olla esimerkiksi seuraavanlainen

def hinta_alle_4_euroa(tuote):\n    return tuote[1] < 4

Funktio siis palauttaa True jos tuotteen hinta on alle 4 euroa.

Funktio haku toimii seuraavasti:

for tuote in hae(tuotteet, hinta_alle_4_euroa):\n    print(tuote)

('omena', 3.95, 3)\n('kaali', 0.99, 1)

Kriteerifunktion voi myös määritellä lambda-funktiona. Seuraava käyttää funktiota haku etsimään tuotteet, joita on vähintään 11 kappaletta:

for tuote in hae(tuotteet, lambda t: t[2]>10):\n    print(tuote)

('banaani', 5.95, 12)\n('vesimeloni', 4.95, 22)

","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-12/1-funktio-parametrina.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat järjestää listoja eri kriteerien mukaan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät mitä tarkoitetaan lambda-lausekkeella"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat hyödyntää lambda-lauseketta myös muiden Pythonin funktioiden kanssa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat välittää funktion parametrina funktiolle"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olemme jo aikaisemmin käyttäneet metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sort"}]},{"type":"text","value":" ja funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sorted"}]},{"type":"text","value":" järjestämään listoja luonnolliseen järjestykseen. Metodit toimivat sellaisenaan hyvin luvuista ja merkkijonoista koostuvien listojen kanssa, mutta jos lista sisältää monimutkaisempia alkioita, Python ei välttämättä järjestä listaa niin kuin ohjelmoija toivoisi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi lista tupleja järjestetään oletuksena jokaisen tuplen ensimmäisen alkion perusteella:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tuotteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"omena\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"appelsiini\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vesimeloni\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\ntuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sort"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tuote "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"('appelsiini', 4.5)\n('banaani', 5.95)\n('omena', 3.95)\n('vesimeloni', 4.95)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mitä jos haluaisimme järjestää tuotelistan hinnan perusteella?"}]},{"type":"element","tagName":"h2","properties":{"id":"funktiot-parametrina","style":"position:relative;"},"children":[{"type":"text","value":"Funktiot parametrina"},{"type":"element","tagName":"a","properties":{"href":"#funktiot-parametrina","ariaLabel":"funktiot parametrina permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Järjestysmetodille tai -funktiolle voidaan antaa toisena parametrina järjestyksen määräävä avain. Avaimeksi annetaan funktio, joka kertoo, miten yksittäisen alkion arvo määritetään. Python kutsuu tätä funktiota järjestämisen aikana alkioiden vertailemiseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hintajarjestys"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"tuple"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Palautetaan tuplen toinen alkio eli hinta"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tuotteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"omena\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"appelsiini\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vesimeloni\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Hyödynnetään funktiota hintajarjestys"}]},{"type":"text","value":"\n tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sort"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":"hintajarjestys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tuote "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"('omena', 3.95)\n('appelsiini', 4.5)\n('vesimeloni', 4.95)\n('banaani', 5.95)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt ohjelma järjestää listan hinnan mukaiseen järjestykseen. Mutta mitä ohjelmassa oikeastaan tapahtuu?"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hintajarjestys"}]},{"type":"text","value":" määrittely on melko yksinkertainen: se saa parametrikseen yhden alkion ja palauttaa alkiolle arvon - tässä tapauksessa tuplen toisen alkion (joka esimerkissämme esittää tuotteen hintaa). Tarkastellaan kuitenkin lähemmin järjestysmetodia kutsuvaa riviä:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tuotteet.sort(key=hintajarjestys)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rivillä annetaan metodille "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sort"}]},{"type":"text","value":" parametriksi funktio. Ei siis funktion paluuarvoa, vaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"viittaus funktioon"}]},{"type":"text","value":". Järjestysmetodi kutsuu tätä funktiota jokaiselle alkiolle."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kutsut nähdään selkeästi lisäämällä vertailufunktioomme ylimääräinen tulostuslause:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hintajarjestys"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"tuple"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan alkio"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Kutsuttiin hintajarjestys("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Palautetaan tuplen toinen alkio eli hinta"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n\ntuotteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"omena\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"appelsiini\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vesimeloni\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Hyödynnetään funktiota hintajarjestys"}]},{"type":"text","value":"\ntuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sort"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":"hintajarjestys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tuote "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kutsuttiin hintajarjestys(('banaani', 5.95))\nKutsuttiin hintajarjestys(('omena', 3.95))\nKutsuttiin hintajarjestys(('appelsiini', 4.5))\nKutsuttiin hintajarjestys(('vesimeloni', 4.95))\n('omena', 3.95)\n('appelsiini', 4.5)\n('vesimeloni', 4.95)\n('banaani', 5.95)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Järjestys saadaan käännettyä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"päinvastaiseksi"}]},{"type":"text","value":" hyödyntämällä sekä metodista "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sort"}]},{"type":"text","value":" että funktiosta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sorted"}]},{"type":"text","value":" löytyvää toista parametria "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reverse"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sort"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":"hintajarjestys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" reverse"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nt2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":"hintajarjestys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" reverse"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"funktion-sisalla-maaritelty-funktio","style":"position:relative;"},"children":[{"type":"text","value":"Funktion sisällä määritelty funktio"},{"type":"element","tagName":"a","properties":{"href":"#funktion-sisalla-maaritelty-funktio","ariaLabel":"funktion sisalla maaritelty funktio permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos haluaisimme siirtää edellisessä esimerkissä tehdyn järjestämisen omaan funktioonsa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"jarjesta_hinnan_mukaan"}]},{"type":"text","value":", voisimme toteuttaa sen seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hintajarjestys"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"tuple"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"jarjesta_hinnan_mukaan"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkiot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# käytetään täällä funktiota hintajarjestys"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkiot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":"hintajarjestys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntuotteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"omena\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"appelsiini\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vesimeloni\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tuote "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" jarjesta_hinnan_mukaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos järjestämisen käyttämää apufunktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hintajarjestys"}]},{"type":"text","value":" ei käytetä missään muussa kohtaa ohjelmaa kuin funktiossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"jarjesta_hinnan_mukaan"}]},{"type":"text","value":", sen määrittely voitaisiin siirtää funktion sisälle:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"jarjesta_hinnan_mukaan"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkiot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# määritellään apufunktio tällä kertaa funktion sisällä"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hintajarjestys"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"tuple"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkiot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":"hintajarjestys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Järjestys varastosaldon mukaan","tmcname":"osa12-01_varastosaldo"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"jarjesta_varastosaldon_mukaan(alkiot: list)"}]},{"type":"text","value":". Funktio saa parametrina listan tupleja, joissa kolmantena alkiona on tuotteiden varastosaldo. Funktio järjestää parametrinaan saamat tuotteet varastosaldojen mukaiseen kasvavaan järjestykseen. Funktio ei muuta parametrina olevaa listaa, vaan palauttaa uuden listan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tuotteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"omena\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"appelsiini\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vesimeloni\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"22"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tuote "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" jarjesta_varastosaldon_mukaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" kpl\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"text","value":"\nappelsiini 2 kpl\nomena 3 kpl\nbanaani 12 kpl\nvesimeloni 22 kpl\n"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Järjestys tuotantokausien mukaan","tmcname":"osa12-02_tuotantokaudet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"jarjesta_tuotantokausien_mukaan(alkiot: list)"}]},{"type":"text","value":". Funktio saa parametrina listan sanakirjoja, jotka edustavat yksittäisiä TV-sarjoja, ja järjestää ne tuotantokausien lukumäärän mukaiseen kasvavaan järjestykseen. Funktio ei muuta parametrina olevaa listaa, vaan palauttaa uuden listan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sarjat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Dexter\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pisteet\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8.6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kausia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Friends\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pisteet\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8.9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kausia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Simpsons\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pisteet\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8.7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kausia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"32"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sarja "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" jarjesta_tuotantokausien_mukaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sarjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"sarja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'nimi'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"sarja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'kausia'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" tuotantokautta\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"text","value":"\nDexter 9 tuotantokautta\nFriends 10 tuotantokautta\nSimpsons 32 tuotantokautta\n"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Järjestys pisteiden mukaan","tmcname":"osa12-03_pisteiden_mukaan"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"jarjesta_pisteiden_mukaan(alkiot: list)"}]},{"type":"text","value":". Funktio saa parametrina listan sanakirjoja, jotka edustavat yksittäisiä TV-sarjoja, ja järjestää ne "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"pisteiden mukaiseen laskevaan järjestykseen"}]},{"type":"text","value":". Funktio ei muuta parametrina olevaa listaa, vaan palauttaa uuden listan."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sarjat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Dexter\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pisteet\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8.6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kausia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Friends\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pisteet\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8.9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kausia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Simpsons\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pisteet\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8.7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kausia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"32"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"IMDB:n mukainen pistemäärä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sarja "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" jarjesta_pisteiden_mukaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sarjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"sarja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'nimi'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"sarja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'pisteet'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"text","value":"\nIMDB:n mukainen pistemäärä\nFriends 8.9\nSimpsons 8.7\nDexter 8.6\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"omien-olioiden-alkioiden-jarjestaminen","style":"position:relative;"},"children":[{"type":"text","value":"Omien olioiden alkioiden järjestäminen"},{"type":"element","tagName":"a","properties":{"href":"#omien-olioiden-alkioiden-jarjestaminen","ariaLabel":"omien olioiden alkioiden jarjestaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoitetaan samaa periaatetta hyödyntäen ohjelma, joka järjestää listan omasta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"text","value":"-luokasta luotuja olioita kahden eri kriteerin avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Luokka mallintaa yhtä opiskelijaa \"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tunnus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tunnus\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pisteet\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tunnus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"), "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" op.\""}]}]},{"type":"text","value":"\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tunnuksen_mukaan"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tunnus\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pisteiden_mukaan"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisteet\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n o1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aapeli\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"a123\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"220"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n o2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"m321\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"210"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n o3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"a999\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"131"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n opiskelijat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"o1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" o2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" o3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tunnuksen mukaan:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" opiskelija "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":"tunnuksen_mukaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pisteiden mukaan:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" opiskelija "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":"pisteiden_mukaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aapeli (a123), 220 op.\nAnna (a999), 131 op.\nMaija (m321), 210 op."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pisteiden mukaan:\nAnna (a999), 131 op.\nMaija (m321), 210 op.\nAapeli (a123), 220 op."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Järjestäminen toimii niinkuin pitää. Jos olioille arvon antavia funktioita "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tunnuksen_mukaan"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pisteiden_mukaan"}]},{"type":"text","value":" ei tarvita muuten, voimme kuitenkin vielä yksinkertaistaa ohjelmaa."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kiipeilyreitti","tmcname":"osa12-04_kiipeilyreitti"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjan mukana tulee valmis luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kiipeilyreitti"}]},{"type":"text","value":", jota käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"reitti1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kantti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"38"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"6A+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nreitti2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Smooth operator\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"7A\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nreitti3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Syncro\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"14"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"8C+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"reitti1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"reitti2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"reitti3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" reitti3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" reitti3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"grade"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kantti, pituus 38 metriä, grade 6A+\nSmooth operator, pituus 11 metriä, grade 7A\nSyncro 14 8C+"}]}]},{"type":"element","tagName":"h2","properties":{"id":"pituuden-mukainen-jarjestys","style":"position:relative;"},"children":[{"type":"text","value":"Pituuden mukainen järjestys"},{"type":"element","tagName":"a","properties":{"href":"#pituuden-mukainen-jarjestys","ariaLabel":"pituuden mukainen jarjestys permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pituuden_mukaan(reitit: list)"}]},{"type":"text","value":" joka palauttaa kiipeilyreitit pituuden mukaan käänteisessä järjestyksessä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"r1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kantti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"38"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"6A+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nr2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Smooth operator\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"7A\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nr3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Syncro\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"14"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"8C+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nr4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pieniä askelia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"6A+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nreitit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"r1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" r2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" r3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" r4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" reitti "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pituuden_mukaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"reitit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"reitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kantti, pituus 38 metriä, grade 6A+\nSyncro, pituus 14 metriä, grade 8C+\nPieniä askelia, pituus 12 metriä, grade 6A+\nSmooth operator, pituus 11 metriä, grade 7A"}]}]},{"type":"element","tagName":"h2","properties":{"id":"vaikeuden-mukainen-jarjestys","style":"position:relative;"},"children":[{"type":"text","value":"Vaikeuden mukainen järjestys"},{"type":"element","tagName":"a","properties":{"href":"#vaikeuden-mukainen-jarjestys","ariaLabel":"vaikeuden mukainen jarjestys permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vaikeuden_mukaan(reitit: list)"}]},{"type":"text","value":" joka palauttaa kiipeilyreitit vaikeuden (eli graden) mukaan laskevassa järjestyksessä. Jos reittien vaikeus on sama, ratkaisee pituus vaikeuden. Pidempi on vaikeampi. Kiipeilyreittien vaikeusasteikko on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"4, 4+, 5, 5+, 6A, 6A+, ..."}]},{"type":"text","value":" eli käytännössä se seuraa aakkosjärjestystä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"r1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kantti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"38"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"6A+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nr2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Smooth operator\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"7A\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nr3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Syncro\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"14"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"8C+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nr4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pieniä askelia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"6A+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nreitit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"r1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" r2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" r3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" r4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" reitti "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" vaikeuden_mukaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"reitit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"reitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Syncro, pituus 14 metriä, grade 8C+\nSmooth operator, pituus 11 metriä, grade 7A\nKantti, pituus 38 metriä, grade 6A+\nPieniä askelia, pituus 12 metriä, grade 6A+"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Vihje"}]},{"type":"text","value":" jos järjestysperusteena on lista tai tuple, järjestetään ensisijaiseti ensimmäisen alkion mukaan, toissijaisesti toisen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"a\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"a\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"b\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"30"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"b\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[('a', 2), ('a', 4), ('b', 0), ('b', 30)]"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kiipeilykalliot","tmcname":"osa12-05_kiipeilykalliot/"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjasta löytyy luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kiipeilyreitti"}]},{"type":"text","value":" lisäksi luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kiipeilykallio"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"k1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilykallio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olhava\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nk1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_reitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kantti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"38"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"6A+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nk1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_reitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suuri leikkaus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"36"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"6B\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nk1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_reitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ruotsalaisten reitti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"42"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"5+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nk2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilykallio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nummi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nk2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_reitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Syncro\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"14"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"8C+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nk3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kiipeilykallio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nalkkilan släbi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nk3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_reitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pieniä askelia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"6A+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nk3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_reitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Smooth operator\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"7A\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nk3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_reitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Possu ei pidä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"6B+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nk3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_reitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kiipeilyreitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hedelmätarha\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"6A\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"reitteja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vaikein_reitti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olhava, 3 reittiä, vaikein 6B\nNalkkilan slabi 4\nSmooth operator, pituus 9 metriä, grade 7A"}]}]},{"type":"element","tagName":"h2","properties":{"id":"reittien-maaran-mukaan","style":"position:relative;"},"children":[{"type":"text","value":"Reittien määrän mukaan"},{"type":"element","tagName":"a","properties":{"href":"#reittien-maaran-mukaan","ariaLabel":"reittien maaran mukaan permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reittien_maaran_mukaan"}]},{"type":"text","value":", joka järjestää kiipeilykalliot reittien määrän mukaiseen kasvavaan suuruusjärjestykseen."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# k1, k2 ja k3 määritelty kuten edellä"}]},{"type":"text","value":"\nkalliot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"k1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" kallio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" reittien_maaran_mukaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kalliot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kallio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nummi, 1 reittiä, vaikein 8C+\nOlhava, 3 reittiä, vaikein 6B\nNalkkilan slabi, 4 reittiä, vaikein 7A"}]}]},{"type":"element","tagName":"h2","properties":{"id":"vaikeimman-reitin-mukaan","style":"position:relative;"},"children":[{"type":"text","value":"Vaikeimman reitin mukaan"},{"type":"element","tagName":"a","properties":{"href":"#vaikeimman-reitin-mukaan","ariaLabel":"vaikeimman reitin mukaan permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vaikeimman_reitin_mukaan"}]},{"type":"text","value":", joka järjestää kiipeilykalliot kalliolta löytyvän vaikeimman reitin mukaiseen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"laskevaan"}]},{"type":"text","value":" suuruusjärjestykseen."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# k1, k2 ja k3 määritelty kuten edellä"}]},{"type":"text","value":"\nkalliot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"k1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" kallio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" vaikeimman_reitin_mukaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kalliot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kallio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nummi, 1 reittiä, vaikein 8C+\nNalkkilan slabi, 4 reittiä, vaikein 7A\nOlhava, 3 reittiä, vaikein 6B"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"lambda-lauseke","style":"position:relative;"},"children":[{"type":"text","value":"Lambda-lauseke"},{"type":"element","tagName":"a","properties":{"href":"#lambda-lauseke","ariaLabel":"lambda lauseke permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lambda-lausekkeen avulla voidaan luoda anonyymi funktio eli funktio, joka muodostetaan sillä hetkellä, kun sitä tarvitaan. Lausekkeen yleinen syntaksi on seuraava:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lambda : "}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi tuplelistan järjestys onnistuisi näin käyttämällä lambda-lauseketta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tuotteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"omena\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"appelsiini\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vesimeloni\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Funktio luodaan \"lennosta\" lambda-lausekkeella:"}]},{"type":"text","value":"\ntuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sort"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tuote "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"('omena', 3.95)\n('appelsiini', 4.5)\n('vesimeloni', 4.95)\n('banaani', 5.95)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lauseke"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lambda alkio: alkio[1]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"vastaa funktiomäärittelyä"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hinta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"paitsi että lambda-lauseketta käytettäessä funktiolle ei anneta nimeä. Tämän takia muodostettavaa funktiota kutsutaan anonyymiksi funktioksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuten lambdan avulla muodostettava funktio on kuin mikä tahansa muukin funktio. Esimerkiksi seuraava esimerkki järjestää merkkijonot niiden viimeisten merkkien mukaiseen aakkosjärjestykseen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjonot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Makke\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Markku\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" jono "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjonot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" jono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" jono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Maija\nMakke\nMikki\nMikko\nMarkku"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mennään vielä pidemmälle: yhdistämällä listakooste ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"join"}]},{"type":"text","value":"-metodi lambda-lausekkeeseen voidaan esimerkiksi järjestää merkkijonot niistä löytyvien vokaalien mukaiseen järjestykseen välittämättä muista merkeistä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjonot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Makke\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Markku\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" jono "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjonot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" jono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"m "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" m "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" jono "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" m "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"aeiouyäö\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Makke\nMaija\nMarkku\nMikki\nMikko"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anonyymejä funktioita voi hyödyntää Pythonissa monien muidenkin valmiiden funktioiden yhteydessä. Esimerkiksi funktioille "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"min"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"max"}]},{"type":"text","value":" voidaan määritellä samalla tavalla parametri "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"key"}]},{"type":"text","value":", jonka perusteella minimi- tai maksimiarvo valitaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkissä poimitaan levyistä aluksi vanhin ja sitten pisin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Levy"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\"Luokka mallintaa yhtä äänilevyä\"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" esittaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kesto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"esittaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" esittaja\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vuosi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" vuosi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kesto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kesto\n\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"esittaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"), "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":". "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kesto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" min.\""}]}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n l1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Levy"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nevermind\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nirvana\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1991"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"43"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n l2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Levy"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Let It Be\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Beatles\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1969"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"35"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n l3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Levy"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Joshua Tree\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"U2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1986"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n levyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"l1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" l2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" l3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vanhin levy:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"min"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"levyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" levy"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" levy"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pisin levy: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"max"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"levyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" key"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" levy"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" levy"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kesto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vanhin levy:\nLet It Be (Beatles), 1969. 35 min.\nPisin levy:\nU2 (Joshua Tree), 1986. 50 min."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Palloilijat","tmcname":"osa12-06_palloilijat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjasta löytyy luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Palloilija"}]},{"type":"text","value":", jolla on seuraavat julkiset piirteet:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"pelinumero"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"tehtyjen maalien määrä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"maalit"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"annettujen syöttöjen määrä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"syotot"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"peliminuuttien määrä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"minuutit"}]}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita seuraavien tehtävänantojen mukaiset funktiot. Huomaa, että jokaisessa funktiossa palautetaan erityyppiset tiedot."}]},{"type":"element","tagName":"h2","properties":{"id":"eniten-maaleja","style":"position:relative;"},"children":[{"type":"text","value":"Eniten maaleja"},{"type":"element","tagName":"a","properties":{"href":"#eniten-maaleja","ariaLabel":"eniten maaleja permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"eniten_maaleja"}]},{"type":"text","value":", joka saa parametrikseen listan palloilijoita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa merkkijonona sen pelaajan nimen, joka on tehnyt eniten maaleja."}]},{"type":"element","tagName":"h2","properties":{"id":"eniten-pisteita","style":"position:relative;"},"children":[{"type":"text","value":"Eniten pisteitä"},{"type":"element","tagName":"a","properties":{"href":"#eniten-pisteita","ariaLabel":"eniten pisteita permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"eniten_pisteita"}]},{"type":"text","value":", joka saa parametrikseen listan palloilijoita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa tuplena sen pelaajan nimen ja pelinumeron, joka on tehnyt yhteensä eniten pisteitä. Pisteisiin lasketaan siis sekä maalit että syötöt."}]},{"type":"element","tagName":"h2","properties":{"id":"vahiten-peliminuutteja","style":"position:relative;"},"children":[{"type":"text","value":"Vähiten peliminuutteja"},{"type":"element","tagName":"a","properties":{"href":"#vahiten-peliminuutteja","ariaLabel":"vahiten peliminuutteja permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vahiten_minuutteja"}]},{"type":"text","value":", joka saa parametrikseen listan palloilijoita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa sen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Palloilija"}]},{"type":"text","value":"-olion, jolla on vähiten peliminuutteja kaikista pelaajista."}]},{"type":"element","tagName":"h2","properties":{"id":"testiohjelma","style":"position:relative;"},"children":[{"type":"text","value":"Testiohjelma"},{"type":"element","tagName":"a","properties":{"href":"#testiohjelma","ariaLabel":"testiohjelma permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit testata koodisi toimintaa seuraavalla ohjelmalla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n pelaaja1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Palloilija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kelju Kojootti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"13"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"46"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pelaaja2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Palloilija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maantiekiitäjä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"26"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"55"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pelaaja3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Palloilija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Uka Naakka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"32"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"26"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pelaaja4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Palloilija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pelle Peloton\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"41"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pelaaja5 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Palloilija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hessu Hopo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n joukkue "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"pelaaja1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelaaja2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelaaja3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelaaja4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelaaja5"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eniten_maaleja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"joukkue"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eniten_pisteita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"joukkue"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vahiten_minuutteja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"joukkue"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostuksen tulisi olla:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kelju Kojootti\n('Uka Naakka', 9)\nPalloilija(nimi=Hessu Hopo, pelinumero=4, maalit=3, syotot=9, minuutit=12)"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"funktiot-parametreina-omissa-funktioissa","style":"position:relative;"},"children":[{"type":"text","value":"Funktiot parametreina omissa funktioissa"},{"type":"element","tagName":"a","properties":{"href":"#funktiot-parametreina-omissa-funktioissa","ariaLabel":"funktiot parametreina omissa funktioissa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa on siis mahdollista välittää viittaus johonkin funktioon toiselle funktiolle. Tarkastellaan vielä esimerkkinä omaa funktiota, joka saa parametrikseen toisen funktion:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tyyppivihje callable viittaa funktioon"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"suorita_operaatio"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"operaatio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"callable"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kutsutaan välitettyä funktiota"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" operaatio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"summa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" b\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" b\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorita_operaatio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorita_operaatio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorita_operaatio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"15\n50\n5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suorita_operaatio"}]},{"type":"text","value":" lopputulos siis riippuu siitä, mikä funktio sille on välitetty parametrina. Funktioksi kelpaa mikä tahansa funktio (niin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":"-lauseella määritelty kuin anonyymikin) jolla on kaksi parametria."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaikkei funktioiden välittäminen parametrina olekaan kaikkein yleisimmin tarvittava operaatio, on se joka tapauksessa hyödyllinen mekanismi. Esimerkiksi seuraava ohjelma kirjoittaa tiedostosta 1 halutut rivit tiedostoon 2. Rivien valintakriteeri annetaan funktiona, joka palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", jos rivi tulee kirjoittaa toiseen tiedostoon:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kopioi_rivit"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lahde_nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kohde_nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kriteeri"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lahde_nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" lahde"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kohde_nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"w\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" kohde"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lahde"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Poistetaan ensin tyhjät merkit alusta ja lopusta"}]},{"type":"text","value":"\n rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"strip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" kriteeri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n kohde"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Esimerkkejä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Jos kolmatta parametria ei ole määritelty, kopioidaan kaikki"}]},{"type":"text","value":"\n kopioi_rivit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eka.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toka.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kopioidaan kaikki ei-tyhjät rivit"}]},{"type":"text","value":"\n kopioi_rivit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eka.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toka.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kopioidaan kaikki rivit, joilla on sana \"Python\""}]},{"type":"text","value":"\n kopioi_rivit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eka.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toka.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Python\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kopioidaan kaikki rivit, jotka eivät pääty pisteeseen"}]},{"type":"text","value":"\n kopioi_rivit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eka.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toka.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"!="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\".\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiossa parametrille "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kriteeri"}]},{"type":"text","value":" on määritelty oletusarvoksi lambda-lauseke "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lambda x: True"}]},{"type":"text","value":", jonka tuottama anonyymi funktio palauttaa arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":" kaikille syötteille. Niinpä oletuksena kopioidaan kaikki rivit tiedostosta toiseen. Jos käyttäjä antaa kolmannelle parametrille arvon, tämä korvaa oletusarvon."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Tuotteiden haku","tmcname":"osa12-07_tuotteiden_haku"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä käsitellään tupleina esitettäviä tuotteita, jotka on esimerkeissä alustettu muuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tuotteet"}]},{"type":"text","value":" seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tuotteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"omena\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"appelsiini\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vesimeloni\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.95"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"22"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kaali\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.99"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jokaisessa tuplessa ensimmäinen alkio siis edustaa nimeä, seuraava hintaa ja kolmas määrää."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae(tuotteet: list, kriteeri: callable)"}]},{"type":"text","value":", missä toisena parametrina on funktio, joka saa parametriksi yhden tuotetta edustavan tuplen ja palauttaa totuusarvon. Funktio palauttaa listassa parametrina annetuista tuotteista ne, jotka toteuttavat kriteerin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sopiva kriteeri voisi olla esimerkiksi seuraavanlainen"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hinta_alle_4_euroa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio siis palauttaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"True"}]},{"type":"text","value":" jos tuotteen hinta on alle 4 euroa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"haku"}]},{"type":"text","value":" toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tuote "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" hae"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" hinta_alle_4_euroa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"('omena', 3.95, 3)\n('kaali', 0.99, 1)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kriteerifunktion voi myös määritellä lambda-funktiona. Seuraava käyttää funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"haku"}]},{"type":"text","value":" etsimään tuotteet, joita on vähintään 11 kappaletta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tuote "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" hae"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" t"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" t"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"('banaani', 5.95, 12)\n('vesimeloni', 4.95, 22)"}]}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat järjestää listoja eri kriteerien mukaan
  • \n
  • Tiedät mitä tarkoitetaan lambda-lausekkeella
  • \n
  • Osaat hyödyntää lambda-lauseketta myös muiden Pythonin funktioiden kanssa
  • \n
  • Osaat välittää funktion parametrina funktiolle
  • \n

Olemme jo aikaisemmin käyttäneet metodia sort ja funktiota sorted järjestämään listoja luonnolliseen järjestykseen. Metodit toimivat sellaisenaan hyvin luvuista ja merkkijonoista koostuvien listojen kanssa, mutta jos lista sisältää monimutkaisempia alkioita, Python ei välttämättä järjestä listaa niin kuin ohjelmoija toivoisi.

Esimerkiksi lista tupleja järjestetään oletuksena jokaisen tuplen ensimmäisen alkion perusteella:

tuotteet = [(\"banaani\", 5.95), (\"omena\", 3.95), (\"appelsiini\", 4.50), (\"vesimeloni\", 4.95)]\n\ntuotteet.sort()\n\nfor tuote in tuotteet:\n    print(tuote)

('appelsiini', 4.5)\n('banaani', 5.95)\n('omena', 3.95)\n('vesimeloni', 4.95)

Mitä jos haluaisimme järjestää tuotelistan hinnan perusteella?

Funktiot parametrina

Järjestysmetodille tai -funktiolle voidaan antaa toisena parametrina järjestyksen määräävä avain. Avaimeksi annetaan funktio, joka kertoo, miten yksittäisen alkion arvo määritetään. Python kutsuu tätä funktiota järjestämisen aikana alkioiden vertailemiseen.

Esimerkiksi:

def hintajarjestys(alkio: tuple):\n    # Palautetaan tuplen toinen alkio eli hinta\n    return alkio[1]\n\nif __name__ == \"__main__\":\n    tuotteet = [(\"banaani\", 5.95), (\"omena\", 3.95), (\"appelsiini\", 4.50), (\"vesimeloni\", 4.95)]\n\n    # Hyödynnetään funktiota hintajarjestys\n    tuotteet.sort(key=hintajarjestys)\n\n    for tuote in tuotteet:\n        print(tuote)

('omena', 3.95)\n('appelsiini', 4.5)\n('vesimeloni', 4.95)\n('banaani', 5.95)

Nyt ohjelma järjestää listan hinnan mukaiseen järjestykseen. Mutta mitä ohjelmassa oikeastaan tapahtuu?

Funktion hintajarjestys määrittely on melko yksinkertainen: se saa parametrikseen yhden alkion ja palauttaa alkiolle arvon - tässä tapauksessa tuplen toisen alkion (joka esimerkissämme esittää tuotteen hintaa). Tarkastellaan kuitenkin lähemmin järjestysmetodia kutsuvaa riviä:

tuotteet.sort(key=hintajarjestys)

Rivillä annetaan metodille sort parametriksi funktio. Ei siis funktion paluuarvoa, vaan viittaus funktioon. Järjestysmetodi kutsuu tätä funktiota jokaiselle alkiolle.

Kutsut nähdään selkeästi lisäämällä vertailufunktioomme ylimääräinen tulostuslause:

def hintajarjestys(alkio: tuple):\n    # Tulostetaan alkio\n    print(f\"Kutsuttiin hintajarjestys({alkio})\")\n\n    # Palautetaan tuplen toinen alkio eli hinta\n    return alkio[1]\n\n\ntuotteet = [(\"banaani\", 5.95), (\"omena\", 3.95), (\"appelsiini\", 4.50), (\"vesimeloni\", 4.95)]\n\n# Hyödynnetään funktiota hintajarjestys\ntuotteet.sort(key=hintajarjestys)\n\nfor tuote in tuotteet:\n    print(tuote)

Kutsuttiin hintajarjestys(('banaani', 5.95))\nKutsuttiin hintajarjestys(('omena', 3.95))\nKutsuttiin hintajarjestys(('appelsiini', 4.5))\nKutsuttiin hintajarjestys(('vesimeloni', 4.95))\n('omena', 3.95)\n('appelsiini', 4.5)\n('vesimeloni', 4.95)\n('banaani', 5.95)

Järjestys saadaan käännettyä päinvastaiseksi hyödyntämällä sekä metodista sort että funktiosta sorted löytyvää toista parametria reverse:

tuotteet.sort(key=hintajarjestys, reverse=True)\n\nt2 = sorted(tuotteet, key=hintajarjestys, reverse=True)

Funktion sisällä määritelty funktio

Jos haluaisimme siirtää edellisessä esimerkissä tehdyn järjestämisen omaan funktioonsa jarjesta_hinnan_mukaan, voisimme toteuttaa sen seuraavasti:

def hintajarjestys(alkio: tuple):\n    return alkio[1]\n\ndef jarjesta_hinnan_mukaan(alkiot: list):\n    # käytetään täällä funktiota hintajarjestys\n    return sorted(alkiot, key=hintajarjestys)\n\ntuotteet = [(\"banaani\", 5.95), (\"omena\", 3.95), (\"appelsiini\", 4.50), (\"vesimeloni\", 4.95)]\n\nfor tuote in jarjesta_hinnan_mukaan(tuotteet):\n    print(tuote)

Jos järjestämisen käyttämää apufunktiota hintajarjestys ei käytetä missään muussa kohtaa ohjelmaa kuin funktiossa jarjesta_hinnan_mukaan, sen määrittely voitaisiin siirtää funktion sisälle:

def jarjesta_hinnan_mukaan(alkiot: list):\n    # määritellään apufunktio tällä kertaa funktion sisällä\n    def hintajarjestys(alkio: tuple):\n        return alkio[1]\n\n    return sorted(alkiot, key=hintajarjestys)

Tee funktio jarjesta_varastosaldon_mukaan(alkiot: list). Funktio saa parametrina listan tupleja, joissa kolmantena alkiona on tuotteiden varastosaldo. Funktio järjestää parametrinaan saamat tuotteet varastosaldojen mukaiseen kasvavaan järjestykseen. Funktio ei muuta parametrina olevaa listaa, vaan palauttaa uuden listan.

Funktio toimii seuraavasti:

tuotteet = [(\"banaani\", 5.95, 12), (\"omena\", 3.95, 3), (\"appelsiini\", 4.50, 2), (\"vesimeloni\", 4.95, 22)]\n\nfor tuote in jarjesta_varastosaldon_mukaan(tuotteet):\n    print(f\"{tuote[0]} {tuote[2]} kpl\")
\nappelsiini 2 kpl\nomena 3 kpl\nbanaani 12 kpl\nvesimeloni 22 kpl\n

Tee funktio jarjesta_tuotantokausien_mukaan(alkiot: list). Funktio saa parametrina listan sanakirjoja, jotka edustavat yksittäisiä TV-sarjoja, ja järjestää ne tuotantokausien lukumäärän mukaiseen kasvavaan järjestykseen. Funktio ei muuta parametrina olevaa listaa, vaan palauttaa uuden listan.

Funktio toimii seuraavasti:

sarjat = [{ \"nimi\": \"Dexter\", \"pisteet\" : 8.6, \"kausia\":9 }, { \"nimi\": \"Friends\", \"pisteet\" : 8.9, \"kausia\":10 },  { \"nimi\": \"Simpsons\", \"pisteet\" : 8.7, \"kausia\":32 }  ]\n\nfor sarja in jarjesta_tuotantokausien_mukaan(sarjat):\n    print(f\"{sarja['nimi']}  {sarja['kausia']} tuotantokautta\")
\nDexter 9 tuotantokautta\nFriends 10 tuotantokautta\nSimpsons 32 tuotantokautta\n

Tee funktio jarjesta_pisteiden_mukaan(alkiot: list). Funktio saa parametrina listan sanakirjoja, jotka edustavat yksittäisiä TV-sarjoja, ja järjestää ne pisteiden mukaiseen laskevaan järjestykseen. Funktio ei muuta parametrina olevaa listaa, vaan palauttaa uuden listan.

sarjat = [{ \"nimi\": \"Dexter\", \"pisteet\" : 8.6, \"kausia\":9 }, { \"nimi\": \"Friends\", \"pisteet\" : 8.9, \"kausia\":10 },  { \"nimi\": \"Simpsons\", \"pisteet\" : 8.7, \"kausia\":32 }  ]\n\nprint(\"IMDB:n mukainen pistemäärä\")\nfor sarja in jarjesta_pisteiden_mukaan(sarjat):\n    print(f\"{sarja['nimi']}  {sarja['pisteet']}\")
\nIMDB:n mukainen pistemäärä\nFriends 8.9\nSimpsons 8.7\nDexter 8.6\n

Omien olioiden alkioiden järjestäminen

Kirjoitetaan samaa periaatetta hyödyntäen ohjelma, joka järjestää listan omasta Opiskelija-luokasta luotuja olioita kahden eri kriteerin avulla:

class Opiskelija:\n    \"\"\" Luokka mallintaa yhtä opiskelijaa \"\"\"\n    def __init__(self, nimi: str, tunnus: str, pisteet: int):\n        self.nimi = nimi\n        self.tunnus = tunnus\n        self.pisteet = pisteet\n\n    def __str__(self):\n        return f\"{self.nimi} ({self.tunnus}), {self.pisteet} op.\"\n\n\ndef tunnuksen_mukaan(alkio: Opiskelija):\n    return alkio.tunnus\n\ndef pisteiden_mukaan(alkio: Opiskelija):\n    return alkio.pisteet\n\n\nif __name__ == \"__main__\":\n    o1 = Opiskelija(\"Aapeli\", \"a123\", 220)\n    o2 = Opiskelija(\"Maija\", \"m321\", 210)\n    o3 = Opiskelija(\"Anna\", \"a999\", 131)\n\n    opiskelijat = [o1, o2, o3]\n\n    print(\"Tunnuksen mukaan:\")\n    for opiskelija in sorted(opiskelijat, key=tunnuksen_mukaan):\n        print(opiskelija)\n\n    print()\n\n    print(\"Pisteiden mukaan:\")\n    for opiskelija in sorted(opiskelijat, key=pisteiden_mukaan):\n        print(opiskelija)

Aapeli (a123), 220 op.\nAnna (a999), 131 op.\nMaija (m321), 210 op.

Pisteiden mukaan:\nAnna (a999), 131 op.\nMaija (m321), 210 op.\nAapeli (a123), 220 op.

Järjestäminen toimii niinkuin pitää. Jos olioille arvon antavia funktioita tunnuksen_mukaan ja pisteiden_mukaan ei tarvita muuten, voimme kuitenkin vielä yksinkertaistaa ohjelmaa.

Tehtäväpohjan mukana tulee valmis luokka Kiipeilyreitti, jota käytetään seuraavasti:

reitti1 = Kiipeilyreitti(\"Kantti\", 38, \"6A+\")\nreitti2 = Kiipeilyreitti(\"Smooth operator\", 11, \"7A\")\nreitti3 = Kiipeilyreitti(\"Syncro\", 14, \"8C+\")\n\n\nprint(reitti1)\nprint(reitti2)\nprint(reitti3.nimi, reitti3.pituus, reitti3.grade)

Kantti, pituus 38 metriä, grade 6A+\nSmooth operator, pituus 11 metriä, grade 7A\nSyncro 14 8C+

Pituuden mukainen järjestys

Tee funktio pituuden_mukaan(reitit: list) joka palauttaa kiipeilyreitit pituuden mukaan käänteisessä järjestyksessä.

Funktio toimii seuraavasti:

r1 = Kiipeilyreitti(\"Kantti\", 38, \"6A+\")\nr2 = Kiipeilyreitti(\"Smooth operator\", 11, \"7A\")\nr3 = Kiipeilyreitti(\"Syncro\", 14, \"8C+\")\nr4 = Kiipeilyreitti(\"Pieniä askelia\", 12, \"6A+\")\n\nreitit = [r1, r2, r3, r4]\n\nfor reitti in pituuden_mukaan(reitit):\n    print(reitti)

Kantti, pituus 38 metriä, grade 6A+\nSyncro, pituus 14 metriä, grade 8C+\nPieniä askelia, pituus 12 metriä, grade 6A+\nSmooth operator, pituus 11 metriä, grade 7A

Vaikeuden mukainen järjestys

Tee funktio vaikeuden_mukaan(reitit: list) joka palauttaa kiipeilyreitit vaikeuden (eli graden) mukaan laskevassa järjestyksessä. Jos reittien vaikeus on sama, ratkaisee pituus vaikeuden. Pidempi on vaikeampi. Kiipeilyreittien vaikeusasteikko on 4, 4+, 5, 5+, 6A, 6A+, ... eli käytännössä se seuraa aakkosjärjestystä.

Funktio toimii seuraavasti:

r1 = Kiipeilyreitti(\"Kantti\", 38, \"6A+\")\nr2 = Kiipeilyreitti(\"Smooth operator\", 11, \"7A\")\nr3 = Kiipeilyreitti(\"Syncro\", 14, \"8C+\")\nr4 = Kiipeilyreitti(\"Pieniä askelia\", 12, \"6A+\")\n\nreitit = [r1, r2, r3, r4]\nfor reitti in vaikeuden_mukaan(reitit):\n    print(reitti)

Syncro, pituus 14 metriä, grade 8C+\nSmooth operator, pituus 11 metriä, grade 7A\nKantti, pituus 38 metriä, grade 6A+\nPieniä askelia, pituus 12 metriä, grade 6A+

Vihje jos järjestysperusteena on lista tai tuple, järjestetään ensisijaiseti ensimmäisen alkion mukaan, toissijaisesti toisen:

lista = [(\"a\", 4),(\"a\", 2),(\"b\", 30), (\"b\", 0) ]\nprint(sorted(lista))

[('a', 2), ('a', 4), ('b', 0), ('b', 30)]

Tehtäväpohjasta löytyy luokan Kiipeilyreitti lisäksi luokka Kiipeilykallio.

k1 = Kiipeilykallio(\"Olhava\")\nk1.lisaa_reitti(Kiipeilyreitti(\"Kantti\", 38, \"6A+\"))\nk1.lisaa_reitti(Kiipeilyreitti(\"Suuri leikkaus\", 36, \"6B\"))\nk1.lisaa_reitti(Kiipeilyreitti(\"Ruotsalaisten reitti\", 42, \"5+\"))\n\nk2 = Kiipeilykallio(\"Nummi\")\nk2.lisaa_reitti(Kiipeilyreitti(\"Syncro\", 14, \"8C+\"))\n\nk3 = Kiipeilykallio(\"Nalkkilan släbi\")\nk3.lisaa_reitti(Kiipeilyreitti(\"Pieniä askelia\", 12, \"6A+\"))\nk3.lisaa_reitti(Kiipeilyreitti(\"Smooth operator\", 11, \"7A\"))\nk3.lisaa_reitti(Kiipeilyreitti(\"Possu ei pidä\", 12 , \"6B+\"))\nk3.lisaa_reitti(Kiipeilyreitti(\"Hedelmätarha\", 8, \"6A\"))\n\nprint(k1)\nprint(k3.nimi, k3.reitteja())\nprint(k3.vaikein_reitti())

Olhava, 3 reittiä, vaikein 6B\nNalkkilan slabi 4\nSmooth operator, pituus 9 metriä, grade 7A

Reittien määrän mukaan

Tee funktio reittien_maaran_mukaan, joka järjestää kiipeilykalliot reittien määrän mukaiseen kasvavaan suuruusjärjestykseen.

# k1, k2 ja k3 määritelty kuten edellä\nkalliot = [k1, k2, k3]\nfor kallio in reittien_maaran_mukaan(kalliot):\n    print(kallio)\n

Nummi, 1 reittiä, vaikein 8C+\nOlhava, 3 reittiä, vaikein 6B\nNalkkilan slabi, 4 reittiä, vaikein 7A

Vaikeimman reitin mukaan

Tee funktio vaikeimman_reitin_mukaan, joka järjestää kiipeilykalliot kalliolta löytyvän vaikeimman reitin mukaiseen laskevaan suuruusjärjestykseen.

# k1, k2 ja k3 määritelty kuten edellä\nkalliot = [k1, k2, k3]\nfor kallio in vaikeimman_reitin_mukaan(kalliot):\n    print(kallio)\n

Nummi, 1 reittiä, vaikein 8C+\nNalkkilan slabi, 4 reittiä, vaikein 7A\nOlhava, 3 reittiä, vaikein 6B

Lambda-lauseke

Lambda-lausekkeen avulla voidaan luoda anonyymi funktio eli funktio, joka muodostetaan sillä hetkellä, kun sitä tarvitaan. Lausekkeen yleinen syntaksi on seuraava:

lambda <parametrit> : <lauseke>

Esimerkiksi tuplelistan järjestys onnistuisi näin käyttämällä lambda-lauseketta:

tuotteet = [(\"banaani\", 5.95), (\"omena\", 3.95), (\"appelsiini\", 4.50), (\"vesimeloni\", 4.95)]\n\n# Funktio luodaan \"lennosta\" lambda-lausekkeella:\ntuotteet.sort(key=lambda alkio: alkio[1])\n\nfor tuote in tuotteet:\n    print(tuote)

('omena', 3.95)\n('appelsiini', 4.5)\n('vesimeloni', 4.95)\n('banaani', 5.95)

Lauseke

lambda alkio: alkio[1]

vastaa funktiomäärittelyä

\ndef hinta(alkio):\n    return alkio[1]

paitsi että lambda-lauseketta käytettäessä funktiolle ei anneta nimeä. Tämän takia muodostettavaa funktiota kutsutaan anonyymiksi funktioksi.

Muuten lambdan avulla muodostettava funktio on kuin mikä tahansa muukin funktio. Esimerkiksi seuraava esimerkki järjestää merkkijonot niiden viimeisten merkkien mukaiseen aakkosjärjestykseen:

mjonot = [\"Mikko\", \"Makke\", \"Maija\", \"Markku\", \"Mikki\"]\n\nfor jono in sorted(mjonot, key=lambda jono: jono[-1]):\n    print(jono)

Maija\nMakke\nMikki\nMikko\nMarkku

Mennään vielä pidemmälle: yhdistämällä listakooste ja join-metodi lambda-lausekkeeseen voidaan esimerkiksi järjestää merkkijonot niistä löytyvien vokaalien mukaiseen järjestykseen välittämättä muista merkeistä:

mjonot = [\"Mikko\", \"Makke\", \"Maija\", \"Markku\", \"Mikki\"]\n\nfor jono in sorted(mjonot, key=lambda jono: \"\".join([m for m in jono if m in \"aeiouyäö\"])):\n    print(jono)

Makke\nMaija\nMarkku\nMikki\nMikko

Anonyymejä funktioita voi hyödyntää Pythonissa monien muidenkin valmiiden funktioiden yhteydessä. Esimerkiksi funktioille min ja max voidaan määritellä samalla tavalla parametri key, jonka perusteella minimi- tai maksimiarvo valitaan.

Esimerkissä poimitaan levyistä aluksi vanhin ja sitten pisin:

\nclass Levy:\n    \"\"\"Luokka mallintaa yhtä äänilevyä\"\"\"\n    def __init__(self, nimi: str, esittaja: str, vuosi: int, kesto: int):\n        self.nimi = nimi\n        self.esittaja = esittaja\n        self.vuosi = vuosi\n        self.kesto = kesto\n\n\n    def __str__(self):\n        return f\"{self.nimi} ({self.esittaja}), {self.vuosi}. {self.kesto} min.\"\n\nif __name__ == \"__main__\":\n    l1 = Levy(\"Nevermind\", \"Nirvana\", 1991, 43)\n    l2 = Levy(\"Let It Be\", \"Beatles\", 1969, 35)\n    l3 = Levy(\"Joshua Tree\", \"U2\", 1986, 50)\n\n    levyt = [l1, l2, l3]\n\n\n    print(\"Vanhin levy:\")\n    print(min(levyt, key=lambda levy: levy.vuosi))\n\n    print(\"Pisin levy: \")\n    print(max(levyt, key=lambda levy: levy.kesto))

Vanhin levy:\nLet It Be (Beatles), 1969. 35 min.\nPisin levy:\nU2 (Joshua Tree), 1986. 50 min.

Tehtäväpohjasta löytyy luokka Palloilija, jolla on seuraavat julkiset piirteet:

    \n
  • nimi
  • \n
  • pelinumero
  • \n
  • tehtyjen maalien määrä maalit
  • \n
  • annettujen syöttöjen määrä syotot
  • \n
  • peliminuuttien määrä minuutit
  • \n

Kirjoita seuraavien tehtävänantojen mukaiset funktiot. Huomaa, että jokaisessa funktiossa palautetaan erityyppiset tiedot.

Eniten maaleja

Kirjoita funktio eniten_maaleja, joka saa parametrikseen listan palloilijoita.

Funktio palauttaa merkkijonona sen pelaajan nimen, joka on tehnyt eniten maaleja.

Eniten pisteitä

Kirjoita funktio eniten_pisteita, joka saa parametrikseen listan palloilijoita.

Funktio palauttaa tuplena sen pelaajan nimen ja pelinumeron, joka on tehnyt yhteensä eniten pisteitä. Pisteisiin lasketaan siis sekä maalit että syötöt.

Vähiten peliminuutteja

Kirjoita funktio vahiten_minuutteja, joka saa parametrikseen listan palloilijoita.

Funktio palauttaa sen Palloilija-olion, jolla on vähiten peliminuutteja kaikista pelaajista.

Testiohjelma

Voit testata koodisi toimintaa seuraavalla ohjelmalla:

if __name__ == \"__main__\":\n    pelaaja1 = Palloilija(\"Kelju Kojootti\", 13, 5, 12, 46)\n    pelaaja2 = Palloilija(\"Maantiekiitäjä\", 7, 2, 26, 55)\n    pelaaja3 = Palloilija(\"Uka Naakka\", 9, 1, 32, 26)\n    pelaaja4 = Palloilija(\"Pelle Peloton\", 12, 1, 11, 41)\n    pelaaja5 = Palloilija(\"Hessu Hopo\", 4, 3, 9, 12)\n\n    joukkue = [pelaaja1, pelaaja2, pelaaja3, pelaaja4, pelaaja5]\n    print(eniten_maaleja(joukkue))\n    print(eniten_pisteita(joukkue))\n    print(vahiten_minuutteja(joukkue))

Tulostuksen tulisi olla:

Kelju Kojootti\n('Uka Naakka', 9)\nPalloilija(nimi=Hessu Hopo, pelinumero=4, maalit=3, syotot=9, minuutit=12)

Funktiot parametreina omissa funktioissa

Pythonissa on siis mahdollista välittää viittaus johonkin funktioon toiselle funktiolle. Tarkastellaan vielä esimerkkinä omaa funktiota, joka saa parametrikseen toisen funktion:

# tyyppivihje callable viittaa funktioon\ndef suorita_operaatio(operaatio: callable):\n    # Kutsutaan välitettyä funktiota\n    return operaatio(10, 5)\n\ndef summa(a: int, b: int):\n    return a + b\n\ndef tulo(a: int, b: int):\n    return a * b\n\n\nif __name__ == \"__main__\":\n    print(suorita_operaatio(summa))\n    print(suorita_operaatio(tulo))\n    print(suorita_operaatio(lambda x,y: x - y))\n

15\n50\n5

Funktion suorita_operaatio lopputulos siis riippuu siitä, mikä funktio sille on välitetty parametrina. Funktioksi kelpaa mikä tahansa funktio (niin def-lauseella määritelty kuin anonyymikin) jolla on kaksi parametria.

Vaikkei funktioiden välittäminen parametrina olekaan kaikkein yleisimmin tarvittava operaatio, on se joka tapauksessa hyödyllinen mekanismi. Esimerkiksi seuraava ohjelma kirjoittaa tiedostosta 1 halutut rivit tiedostoon 2. Rivien valintakriteeri annetaan funktiona, joka palauttaa True, jos rivi tulee kirjoittaa toiseen tiedostoon:

def kopioi_rivit(lahde_nimi: str, kohde_nimi: str, kriteeri= lambda x: True):\n    with open(lahde_nimi) as lahde, open(kohde_nimi, \"w\") as kohde:\n        for rivi in lahde:\n            # Poistetaan ensin tyhjät merkit alusta ja lopusta\n            rivi = rivi.strip()\n\n            if kriteeri(rivi):\n                kohde.write(rivi + \"\\n\")\n\n# Esimerkkejä\nif __name__ == \"__main__\":\n    # Jos kolmatta parametria ei ole määritelty, kopioidaan kaikki\n    kopioi_rivit(\"eka.txt\", \"toka.txt\")\n\n    # Kopioidaan kaikki ei-tyhjät rivit\n    kopioi_rivit(\"eka.txt\", \"toka.txt\", lambda rivi: len(rivi) > 0)\n\n    # Kopioidaan kaikki rivit, joilla on sana \"Python\"\n    kopioi_rivit(\"eka.txt\", \"toka.txt\", lambda rivi: \"Python\" in rivi)\n\n    # Kopioidaan kaikki rivit, jotka eivät pääty pisteeseen\n    kopioi_rivit(\"eka.txt\", \"toka.txt\", lambda rivi: rivi[-1] != \".\")

Funktiossa parametrille kriteeri on määritelty oletusarvoksi lambda-lauseke lambda x: True, jonka tuottama anonyymi funktio palauttaa arvon True kaikille syötteille. Niinpä oletuksena kopioidaan kaikki rivit tiedostosta toiseen. Jos käyttäjä antaa kolmannelle parametrille arvon, tämä korvaa oletusarvon.

Tässä tehtävässä käsitellään tupleina esitettäviä tuotteita, jotka on esimerkeissä alustettu muuttujaan tuotteet seuraavasti:

tuotteet = [(\"banaani\", 5.95, 12), (\"omena\", 3.95, 3), (\"appelsiini\", 4.50, 2), (\"vesimeloni\", 4.95, 22), (\"Kaali\", 0.99, 1)]

Jokaisessa tuplessa ensimmäinen alkio siis edustaa nimeä, seuraava hintaa ja kolmas määrää.

Toteuta funktio hae(tuotteet: list, kriteeri: callable), missä toisena parametrina on funktio, joka saa parametriksi yhden tuotetta edustavan tuplen ja palauttaa totuusarvon. Funktio palauttaa listassa parametrina annetuista tuotteista ne, jotka toteuttavat kriteerin.

Sopiva kriteeri voisi olla esimerkiksi seuraavanlainen

def hinta_alle_4_euroa(tuote):\n    return tuote[1] < 4

Funktio siis palauttaa True jos tuotteen hinta on alle 4 euroa.

Funktio haku toimii seuraavasti:

for tuote in hae(tuotteet, hinta_alle_4_euroa):\n    print(tuote)

('omena', 3.95, 3)\n('kaali', 0.99, 1)

Kriteerifunktion voi myös määritellä lambda-funktiona. Seuraava käyttää funktiota haku etsimään tuotteet, joita on vähintään 11 kappaletta:

for tuote in hae(tuotteet, lambda t: t[2]>10):\n    print(tuote)

('banaani', 5.95, 12)\n('vesimeloni', 4.95, 22)

","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-12/1-funktio-parametrina.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-12/2-generaattorit/page-data.json b/page-data/osa-12/2-generaattorit/page-data.json index bf5c5eb2a..521f8516e 100644 --- a/page-data/osa-12/2-generaattorit/page-data.json +++ b/page-data/osa-12/2-generaattorit/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-12/2-generaattorit", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä tarkoitetaan generaattorilla Pythonissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä avainsana yield tekee"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat kirjoittaa itse generaattorifunktioita"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eräissä tilanteissa olisi kätevää saada ohjelmassa seuraava alkio (tai useampi alkio) tietystä sarjasta ilman että muodostetaan koko sarjaa kerralla. Pythonissa tämä onnistuu näppärästi "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"generaattoreiden"}]},{"type":"text","value":" avulla. Generaattorifunktio muistuttaa normaalia arvon palauttavaa funktiota, mutta kun normaalifunktio palauttaa (tai ainakin sen pitäisi palauttaa) samalla syötteellä saman arvon, generaattorifunktio palauttaa seuraavan luvun sarjasta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Generaattorien toiminta voidaan toteuttaa ohjelmissa myös muilla keinoilla (itse asiassa sama pätee useimpiin ohjelmointitekniikoihin), mutta niiden käyttö selkeyttää ja mahdollisesti säästää muistia tai muita resursseja tietyntyylisissä ohjelmissa."}]},{"type":"element","tagName":"h2","properties":{"id":"avainsana-yield","style":"position:relative;"},"children":[{"type":"text","value":"Avainsana yield"},{"type":"element","tagName":"a","properties":{"href":"#avainsana-yield","ariaLabel":"avainsana yield permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Generaattorifunktion toiminta perustuu avainsanaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"yield"}]},{"type":"text","value":". Tarkastellaan esimerkkinä funktiota, joka palauttaa yksi kerrallaan kokonaislukuja nollasta alkaen kunnes maksimiarvo on saavutettu:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"laskuri"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"maksimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":" maksimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"yield"}]},{"type":"text","value":" luku\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt laskurilta voi pyytää seuraavan arvon funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"next()"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" laskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Eka arvo:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"next"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Toka arvo:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"next"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eka arvo:\n0\nToka arvo:\n1"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Niinkuin esimerkistä huomataan, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"yield"}]},{"type":"text","value":" muistuttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":"-komentoa siinä, että se palauttaa arvon funktiosta. Eroavaisuus on kuitenkin siinä, että yield palauttaa yksittäisen arvon, ja funktio \"muistaa\" mihin tilaan se jäi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Arvoja voi pyytää vain niin kauan kun niitä on generaattorissa jäljellä - tämän jälkeen generaattorifunktio antaa poikkeuksen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"StopIteration"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" laskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"next"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"next"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"next"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"text","value":"0\n1\nTraceback (most recent call last):\nFile \"generaattoriesimerkki.py\", line 11, in "},{"type":"element","tagName":"module","properties":{},"children":[{"type":"text","value":"\nprint(next(luvut))\nStopIteration"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Poikkeuksen voi ottaa kiinni "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"try"}]},{"type":"text","value":"-"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":" lohkolla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" laskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"try"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"next"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"next"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"next"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":" StopIteration"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luvut loppuivat kesken\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"0\n1\nLuvut loppuivat kesken"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos halutaan palauttaa kaikki generaattorin tuottamat alkiot, helpointa on iteroida ne läpi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-lauseella:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" laskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"0\n1\n2\n3\n4\n5"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Parilliset luvut","tmcname":"osa12-08_parilliset"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita generaattorifunktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"parilliset(alku: int, maksimi: int)"}]},{"type":"text","value":", joka saa parametrikseen alkuarvon ja maksimin. Funktio tuottaa alkuarvosta lähtien parillisia lukuja. Kun saavutetaan maksimi, generaattori pysähtyy."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kaksi esimerkkiä funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" parilliset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2\n4\n6\n8\n10"}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" parilliset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"21"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"12\n14\n16\n18\n20"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Alkuluvut","tmcname":"osa12-09_alkuluvut"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Alkuluvuksi sanotaan kokonaislukua, joka on vähintään 2 ja jaollinen ainoastaan 1:llä ja itsellään. Ensimmäiset alkuluvut ovat 2, 3, 5, 7, 11 ja 13."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjota generaattorifunktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"alkuluvut()"}]},{"type":"text","value":", joka luo uuden generaattorin. Generaattori palauttaa yksi kerrallaan alkulukuja järjestyksessä 2:sta alkaen. Huomaa, että generaattori ei pysähdy koskaan, vaan palauttaa lisää lukuja niin kauan kuin niitä pyydetään."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" alkuluvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"next"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2\n3\n5\n7\n11\n13\n17\n19"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vinkki: Voit tarkastaa, onko luku "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"x"}]},{"type":"text","value":" alkuluku, silmukalla, joka käy läpi luvut 2:sta lukuun "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"x"}]},{"type":"text","value":"–1 asti. Jos jokin näistä luvuista jakaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"x"}]},{"type":"text","value":":n, niin se ei ole alkuluku."}]}]},{"type":"element","tagName":"h2","properties":{"id":"generaattorikoosteet","style":"position:relative;"},"children":[{"type":"text","value":"Generaattorikoosteet"},{"type":"element","tagName":"a","properties":{"href":"#generaattorikoosteet","ariaLabel":"generaattorikoosteet permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Generaattorin voi luoda myös listakoostetta (list comprehension) muistuttavalla syntaksilla. Erotuksena listakoosteeseen on, että lauseke ympäröidään kaarisulkeilla hakasulkeiden sijasta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Generaattori palauttaa 2:n potensseja"}]},{"type":"text","value":"\nneliot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"64"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"neliot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"next"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"neliot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":" at 0x000002B4224EBFC0>\n1\n4\n9\n16\n25"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen esimerkki, jossa generaattori tuottaa kolmimerkkisiä alijonoja englanninkielisistä aakkosista. Esimerkissä tulostetaan generaattorin 10 ensimmäistä alkiota:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"alijonot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"abcdefghijklmnopqrstuvwxyz\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"i "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tulostetaan ensimmäiset 10 alijonoa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"next"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alijonot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"abc\nbcd\ncde\ndef\nefg\nfgh\nghi\nhij\nijk\njkl"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Satunnaiset sanat","tmcname":"osa12-10_satunnaiset_sanat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sanageneraattori(kirjaimet: str, pituus: int, maara: int)"}]},{"type":"text","value":", joka muodostaa ja palauttaa annettujen parametrien avulla satunnaisia sanoja tuottavan generaattorin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Satunnainen sana muodostetaan valitsemalla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pituus"}]},{"type":"text","value":" kappaletta kirjaimia valikoimasta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kirjaimet"}]},{"type":"text","value":". Sama kirjain saa esiintyä sanassa monta kertaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Generaattori palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"maara"}]},{"type":"text","value":" kappaletta sanoja ennen kuin se pysähtyy."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sanagen "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sanageneraattori"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"abcdefg\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sanagen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"dbf\nbaf\nead\nfga\nccc"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huom! Voit ratkaista tehtävän itse valitsemallasi tavalla (eli käyttäen joko generaattorikoostetta tai \"perinteistä\" generaattoria)."}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, mitä tarkoitetaan generaattorilla Pythonissa
  • \n
  • Tiedät, mitä avainsana yield tekee
  • \n
  • Osaat kirjoittaa itse generaattorifunktioita
  • \n

Eräissä tilanteissa olisi kätevää saada ohjelmassa seuraava alkio (tai useampi alkio) tietystä sarjasta ilman että muodostetaan koko sarjaa kerralla. Pythonissa tämä onnistuu näppärästi generaattoreiden avulla. Generaattorifunktio muistuttaa normaalia arvon palauttavaa funktiota, mutta kun normaalifunktio palauttaa (tai ainakin sen pitäisi palauttaa) samalla syötteellä saman arvon, generaattorifunktio palauttaa seuraavan luvun sarjasta.

Generaattorien toiminta voidaan toteuttaa ohjelmissa myös muilla keinoilla (itse asiassa sama pätee useimpiin ohjelmointitekniikoihin), mutta niiden käyttö selkeyttää ja mahdollisesti säästää muistia tai muita resursseja tietyntyylisissä ohjelmissa.

Avainsana yield

Generaattorifunktion toiminta perustuu avainsanaan yield. Tarkastellaan esimerkkinä funktiota, joka palauttaa yksi kerrallaan kokonaislukuja nollasta alkaen kunnes maksimiarvo on saavutettu:

\ndef laskuri(maksimi: int):\n    luku = 0\n    while luku <= maksimi:\n        yield luku\n        luku += 1\n

Nyt laskurilta voi pyytää seuraavan arvon funktiolla next():

if __name__ == \"__main__\":\n    luvut = laskuri(10)\n    print(\"Eka arvo:\")\n    print(next(luvut))\n    print(\"Toka arvo:\")\n    print(next(luvut))

Eka arvo:\n0\nToka arvo:\n1

Niinkuin esimerkistä huomataan, yield muistuttaa return-komentoa siinä, että se palauttaa arvon funktiosta. Eroavaisuus on kuitenkin siinä, että yield palauttaa yksittäisen arvon, ja funktio \"muistaa\" mihin tilaan se jäi.

Arvoja voi pyytää vain niin kauan kun niitä on generaattorissa jäljellä - tämän jälkeen generaattorifunktio antaa poikkeuksen StopIteration:

if __name__ == \"__main__\":\n    luvut = laskuri(1)\n    print(next(luvut))\n    print(next(luvut))\n    print(next(luvut))
0\n1\nTraceback (most recent call last):\nFile \"generaattoriesimerkki.py\", line 11, in \nprint(next(luvut))\nStopIteration

Poikkeuksen voi ottaa kiinni try-except lohkolla:

if __name__ == \"__main__\":\n    luvut = laskuri(1)\n    try:\n        print(next(luvut))\n        print(next(luvut))\n        print(next(luvut))\n    except StopIteration:\n        print(\"Luvut loppuivat kesken\")

0\n1\nLuvut loppuivat kesken

Jos halutaan palauttaa kaikki generaattorin tuottamat alkiot, helpointa on iteroida ne läpi for-lauseella:

if __name__ == \"__main__\":\n    luvut = laskuri(5)\n    for luku in luvut:\n        print(luku)

0\n1\n2\n3\n4\n5

Kirjoita generaattorifunktio parilliset(alku: int, maksimi: int), joka saa parametrikseen alkuarvon ja maksimin. Funktio tuottaa alkuarvosta lähtien parillisia lukuja. Kun saavutetaan maksimi, generaattori pysähtyy.

Kaksi esimerkkiä funktion käytöstä:

luvut = parilliset(2, 10)\nfor luku in luvut:\n    print(luku)

2\n4\n6\n8\n10

luvut = parilliset(11, 21)\nfor luku in luvut:\n    print(luku)

12\n14\n16\n18\n20

Alkuluvuksi sanotaan kokonaislukua, joka on vähintään 2 ja jaollinen ainoastaan 1:llä ja itsellään. Ensimmäiset alkuluvut ovat 2, 3, 5, 7, 11 ja 13.

Kirjota generaattorifunktio alkuluvut(), joka luo uuden generaattorin. Generaattori palauttaa yksi kerrallaan alkulukuja järjestyksessä 2:sta alkaen. Huomaa, että generaattori ei pysähdy koskaan, vaan palauttaa lisää lukuja niin kauan kuin niitä pyydetään.

Esimerkiksi:

luvut = alkuluvut()\nfor i in range(8):\n    print(next(luvut))

2\n3\n5\n7\n11\n13\n17\n19

Vinkki: Voit tarkastaa, onko luku x alkuluku, silmukalla, joka käy läpi luvut 2:sta lukuun x–1 asti. Jos jokin näistä luvuista jakaa x:n, niin se ei ole alkuluku.

Generaattorikoosteet

Generaattorin voi luoda myös listakoostetta (list comprehension) muistuttavalla syntaksilla. Erotuksena listakoosteeseen on, että lauseke ympäröidään kaarisulkeilla hakasulkeiden sijasta.

Esimerkiksi

# Generaattori palauttaa 2:n potensseja\nneliot = (x ** 2 for x in range(1, 64))\n\nprint(neliot)\n\nfor i in range(5):\n    print(next(neliot))

<generator object <genexpr> at 0x000002B4224EBFC0>\n1\n4\n9\n16\n25

Toinen esimerkki, jossa generaattori tuottaa kolmimerkkisiä alijonoja englanninkielisistä aakkosista. Esimerkissä tulostetaan generaattorin 10 ensimmäistä alkiota:

alijonot = (\"abcdefghijklmnopqrstuvwxyz\"[i : i + 3] for i in range(24))\n\n# tulostetaan ensimmäiset 10 alijonoa\nfor i in range(10):\n    print(next(alijonot))

abc\nbcd\ncde\ndef\nefg\nfgh\nghi\nhij\nijk\njkl

Tee funktio sanageneraattori(kirjaimet: str, pituus: int, maara: int), joka muodostaa ja palauttaa annettujen parametrien avulla satunnaisia sanoja tuottavan generaattorin.

Satunnainen sana muodostetaan valitsemalla pituus kappaletta kirjaimia valikoimasta kirjaimet. Sama kirjain saa esiintyä sanassa monta kertaa.

Generaattori palauttaa maara kappaletta sanoja ennen kuin se pysähtyy.

Esimerkki funktion kutsumisesta:

sanagen = sanageneraattori(\"abcdefg\", 3, 5)\nfor sana in sanagen:\n    print(sana)

dbf\nbaf\nead\nfga\nccc

Huom! Voit ratkaista tehtävän itse valitsemallasi tavalla (eli käyttäen joko generaattorikoostetta tai \"perinteistä\" generaattoria).

","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-12/2-generaattorit.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä tarkoitetaan generaattorilla Pythonissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä avainsana yield tekee"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat kirjoittaa itse generaattorifunktioita"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eräissä tilanteissa olisi kätevää saada ohjelmassa seuraava alkio (tai useampi alkio) tietystä sarjasta ilman että muodostetaan koko sarjaa kerralla. Pythonissa tämä onnistuu näppärästi "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"generaattoreiden"}]},{"type":"text","value":" avulla. Generaattorifunktio muistuttaa normaalia arvon palauttavaa funktiota, mutta kun normaalifunktio palauttaa (tai ainakin sen pitäisi palauttaa) samalla syötteellä saman arvon, generaattorifunktio palauttaa seuraavan luvun sarjasta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Generaattorien toiminta voidaan toteuttaa ohjelmissa myös muilla keinoilla (itse asiassa sama pätee useimpiin ohjelmointitekniikoihin), mutta niiden käyttö selkeyttää ja mahdollisesti säästää muistia tai muita resursseja tietyntyylisissä ohjelmissa."}]},{"type":"element","tagName":"h2","properties":{"id":"avainsana-yield","style":"position:relative;"},"children":[{"type":"text","value":"Avainsana yield"},{"type":"element","tagName":"a","properties":{"href":"#avainsana-yield","ariaLabel":"avainsana yield permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Generaattorifunktion toiminta perustuu avainsanaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"yield"}]},{"type":"text","value":". Tarkastellaan esimerkkinä funktiota, joka palauttaa yksi kerrallaan kokonaislukuja nollasta alkaen kunnes maksimiarvo on saavutettu:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"laskuri"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"maksimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":" maksimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"yield"}]},{"type":"text","value":" luku\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt laskurilta voi pyytää seuraavan arvon funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"next()"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" laskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Eka arvo:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"next"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Toka arvo:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"next"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eka arvo:\n0\nToka arvo:\n1"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Niinkuin esimerkistä huomataan, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"yield"}]},{"type":"text","value":" muistuttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":"-komentoa siinä, että se palauttaa arvon funktiosta. Eroavaisuus on kuitenkin siinä, että yield palauttaa yksittäisen arvon, ja funktio \"muistaa\" mihin tilaan se jäi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Arvoja voi pyytää vain niin kauan kun niitä on generaattorissa jäljellä - tämän jälkeen generaattorifunktio antaa poikkeuksen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"StopIteration"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" laskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"next"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"next"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"next"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"text","value":"0\n1\nTraceback (most recent call last):\nFile \"generaattoriesimerkki.py\", line 11, in "},{"type":"element","tagName":"module","properties":{},"children":[{"type":"text","value":"\nprint(next(luvut))\nStopIteration"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Poikkeuksen voi ottaa kiinni "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"try"}]},{"type":"text","value":"-"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":" lohkolla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" laskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"try"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"next"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"next"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"next"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":" StopIteration"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luvut loppuivat kesken\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"0\n1\nLuvut loppuivat kesken"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos halutaan palauttaa kaikki generaattorin tuottamat alkiot, helpointa on iteroida ne läpi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-lauseella:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" laskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"0\n1\n2\n3\n4\n5"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Parilliset luvut","tmcname":"osa12-08_parilliset"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita generaattorifunktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"parilliset(alku: int, maksimi: int)"}]},{"type":"text","value":", joka saa parametrikseen alkuarvon ja maksimin. Funktio tuottaa alkuarvosta lähtien parillisia lukuja. Kun saavutetaan maksimi, generaattori pysähtyy."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kaksi esimerkkiä funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" parilliset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2\n4\n6\n8\n10"}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" parilliset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"21"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"12\n14\n16\n18\n20"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Alkuluvut","tmcname":"osa12-09_alkuluvut"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Alkuluvuksi sanotaan kokonaislukua, joka on vähintään 2 ja jaollinen ainoastaan 1:llä ja itsellään. Ensimmäiset alkuluvut ovat 2, 3, 5, 7, 11 ja 13."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjota generaattorifunktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"alkuluvut()"}]},{"type":"text","value":", joka luo uuden generaattorin. Generaattori palauttaa yksi kerrallaan alkulukuja järjestyksessä 2:sta alkaen. Huomaa, että generaattori ei pysähdy koskaan, vaan palauttaa lisää lukuja niin kauan kuin niitä pyydetään."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" alkuluvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"next"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2\n3\n5\n7\n11\n13\n17\n19"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vinkki: Voit tarkastaa, onko luku "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"x"}]},{"type":"text","value":" alkuluku, silmukalla, joka käy läpi luvut 2:sta lukuun "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"x"}]},{"type":"text","value":"–1 asti. Jos jokin näistä luvuista jakaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"x"}]},{"type":"text","value":":n, niin se ei ole alkuluku."}]}]},{"type":"element","tagName":"h2","properties":{"id":"generaattorikoosteet","style":"position:relative;"},"children":[{"type":"text","value":"Generaattorikoosteet"},{"type":"element","tagName":"a","properties":{"href":"#generaattorikoosteet","ariaLabel":"generaattorikoosteet permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Generaattorin voi luoda myös listakoostetta (list comprehension) muistuttavalla syntaksilla. Erotuksena listakoosteeseen on, että lauseke ympäröidään kaarisulkeilla hakasulkeiden sijasta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Generaattori palauttaa 2:n potensseja"}]},{"type":"text","value":"\nneliot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"64"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"neliot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"next"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"neliot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":" at 0x000002B4224EBFC0>\n1\n4\n9\n16\n25"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen esimerkki, jossa generaattori tuottaa kolmimerkkisiä alijonoja englanninkielisistä aakkosista. Esimerkissä tulostetaan generaattorin 10 ensimmäistä alkiota:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"alijonot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"abcdefghijklmnopqrstuvwxyz\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"i "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tulostetaan ensimmäiset 10 alijonoa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"next"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alijonot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"abc\nbcd\ncde\ndef\nefg\nfgh\nghi\nhij\nijk\njkl"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Satunnaiset sanat","tmcname":"osa12-10_satunnaiset_sanat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sanageneraattori(kirjaimet: str, pituus: int, maara: int)"}]},{"type":"text","value":", joka muodostaa ja palauttaa annettujen parametrien avulla satunnaisia sanoja tuottavan generaattorin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Satunnainen sana muodostetaan valitsemalla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pituus"}]},{"type":"text","value":" kappaletta kirjaimia valikoimasta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kirjaimet"}]},{"type":"text","value":". Sama kirjain saa esiintyä sanassa monta kertaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Generaattori palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"maara"}]},{"type":"text","value":" kappaletta sanoja ennen kuin se pysähtyy."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sanagen "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sanageneraattori"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"abcdefg\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sanagen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"dbf\nbaf\nead\nfga\nccc"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huom! Voit ratkaista tehtävän itse valitsemallasi tavalla (eli käyttäen joko generaattorikoostetta tai \"perinteistä\" generaattoria)."}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, mitä tarkoitetaan generaattorilla Pythonissa
  • \n
  • Tiedät, mitä avainsana yield tekee
  • \n
  • Osaat kirjoittaa itse generaattorifunktioita
  • \n

Eräissä tilanteissa olisi kätevää saada ohjelmassa seuraava alkio (tai useampi alkio) tietystä sarjasta ilman että muodostetaan koko sarjaa kerralla. Pythonissa tämä onnistuu näppärästi generaattoreiden avulla. Generaattorifunktio muistuttaa normaalia arvon palauttavaa funktiota, mutta kun normaalifunktio palauttaa (tai ainakin sen pitäisi palauttaa) samalla syötteellä saman arvon, generaattorifunktio palauttaa seuraavan luvun sarjasta.

Generaattorien toiminta voidaan toteuttaa ohjelmissa myös muilla keinoilla (itse asiassa sama pätee useimpiin ohjelmointitekniikoihin), mutta niiden käyttö selkeyttää ja mahdollisesti säästää muistia tai muita resursseja tietyntyylisissä ohjelmissa.

Avainsana yield

Generaattorifunktion toiminta perustuu avainsanaan yield. Tarkastellaan esimerkkinä funktiota, joka palauttaa yksi kerrallaan kokonaislukuja nollasta alkaen kunnes maksimiarvo on saavutettu:

\ndef laskuri(maksimi: int):\n    luku = 0\n    while luku <= maksimi:\n        yield luku\n        luku += 1\n

Nyt laskurilta voi pyytää seuraavan arvon funktiolla next():

if __name__ == \"__main__\":\n    luvut = laskuri(10)\n    print(\"Eka arvo:\")\n    print(next(luvut))\n    print(\"Toka arvo:\")\n    print(next(luvut))

Eka arvo:\n0\nToka arvo:\n1

Niinkuin esimerkistä huomataan, yield muistuttaa return-komentoa siinä, että se palauttaa arvon funktiosta. Eroavaisuus on kuitenkin siinä, että yield palauttaa yksittäisen arvon, ja funktio \"muistaa\" mihin tilaan se jäi.

Arvoja voi pyytää vain niin kauan kun niitä on generaattorissa jäljellä - tämän jälkeen generaattorifunktio antaa poikkeuksen StopIteration:

if __name__ == \"__main__\":\n    luvut = laskuri(1)\n    print(next(luvut))\n    print(next(luvut))\n    print(next(luvut))
0\n1\nTraceback (most recent call last):\nFile \"generaattoriesimerkki.py\", line 11, in \nprint(next(luvut))\nStopIteration

Poikkeuksen voi ottaa kiinni try-except lohkolla:

if __name__ == \"__main__\":\n    luvut = laskuri(1)\n    try:\n        print(next(luvut))\n        print(next(luvut))\n        print(next(luvut))\n    except StopIteration:\n        print(\"Luvut loppuivat kesken\")

0\n1\nLuvut loppuivat kesken

Jos halutaan palauttaa kaikki generaattorin tuottamat alkiot, helpointa on iteroida ne läpi for-lauseella:

if __name__ == \"__main__\":\n    luvut = laskuri(5)\n    for luku in luvut:\n        print(luku)

0\n1\n2\n3\n4\n5

Kirjoita generaattorifunktio parilliset(alku: int, maksimi: int), joka saa parametrikseen alkuarvon ja maksimin. Funktio tuottaa alkuarvosta lähtien parillisia lukuja. Kun saavutetaan maksimi, generaattori pysähtyy.

Kaksi esimerkkiä funktion käytöstä:

luvut = parilliset(2, 10)\nfor luku in luvut:\n    print(luku)

2\n4\n6\n8\n10

luvut = parilliset(11, 21)\nfor luku in luvut:\n    print(luku)

12\n14\n16\n18\n20

Alkuluvuksi sanotaan kokonaislukua, joka on vähintään 2 ja jaollinen ainoastaan 1:llä ja itsellään. Ensimmäiset alkuluvut ovat 2, 3, 5, 7, 11 ja 13.

Kirjota generaattorifunktio alkuluvut(), joka luo uuden generaattorin. Generaattori palauttaa yksi kerrallaan alkulukuja järjestyksessä 2:sta alkaen. Huomaa, että generaattori ei pysähdy koskaan, vaan palauttaa lisää lukuja niin kauan kuin niitä pyydetään.

Esimerkiksi:

luvut = alkuluvut()\nfor i in range(8):\n    print(next(luvut))

2\n3\n5\n7\n11\n13\n17\n19

Vinkki: Voit tarkastaa, onko luku x alkuluku, silmukalla, joka käy läpi luvut 2:sta lukuun x–1 asti. Jos jokin näistä luvuista jakaa x:n, niin se ei ole alkuluku.

Generaattorikoosteet

Generaattorin voi luoda myös listakoostetta (list comprehension) muistuttavalla syntaksilla. Erotuksena listakoosteeseen on, että lauseke ympäröidään kaarisulkeilla hakasulkeiden sijasta.

Esimerkiksi

# Generaattori palauttaa 2:n potensseja\nneliot = (x ** 2 for x in range(1, 64))\n\nprint(neliot)\n\nfor i in range(5):\n    print(next(neliot))

<generator object <genexpr> at 0x000002B4224EBFC0>\n1\n4\n9\n16\n25

Toinen esimerkki, jossa generaattori tuottaa kolmimerkkisiä alijonoja englanninkielisistä aakkosista. Esimerkissä tulostetaan generaattorin 10 ensimmäistä alkiota:

alijonot = (\"abcdefghijklmnopqrstuvwxyz\"[i : i + 3] for i in range(24))\n\n# tulostetaan ensimmäiset 10 alijonoa\nfor i in range(10):\n    print(next(alijonot))

abc\nbcd\ncde\ndef\nefg\nfgh\nghi\nhij\nijk\njkl

Tee funktio sanageneraattori(kirjaimet: str, pituus: int, maara: int), joka muodostaa ja palauttaa annettujen parametrien avulla satunnaisia sanoja tuottavan generaattorin.

Satunnainen sana muodostetaan valitsemalla pituus kappaletta kirjaimia valikoimasta kirjaimet. Sama kirjain saa esiintyä sanassa monta kertaa.

Generaattori palauttaa maara kappaletta sanoja ennen kuin se pysähtyy.

Esimerkki funktion kutsumisesta:

sanagen = sanageneraattori(\"abcdefg\", 3, 5)\nfor sana in sanagen:\n    print(sana)

dbf\nbaf\nead\nfga\nccc

Huom! Voit ratkaista tehtävän itse valitsemallasi tavalla (eli käyttäen joko generaattorikoostetta tai \"perinteistä\" generaattoria).

","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-12/2-generaattorit.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-12/3-funktionaalista-ohjelmointia/page-data.json b/page-data/osa-12/3-funktionaalista-ohjelmointia/page-data.json index b28bc77dd..617017786 100644 --- a/page-data/osa-12/3-funktionaalista-ohjelmointia/page-data.json +++ b/page-data/osa-12/3-funktionaalista-ohjelmointia/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-12/3-funktionaalista-ohjelmointia", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät mitä tarkoitetaan funktonaalisella ohjelmoinilla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat hyödyntää operaatioita map, reduce ja filter omissa ohjelmissasi"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktionaalisella ohjelmoinnilla tarkoitetaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ohjelmointiparadigmaa"}]},{"type":"text","value":", jossa vältetään tilan muutoksia mahdollisimman pitkälle. Muuttujien sijasta ohjelman suoritus perustuu funktionaalisessa ohjelmoinnissa mahdollisimman pitkälti funktioiden keskinäisiin kutsuihin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aikaisemmin esitetyt lambda-lausekkeet ja listakoosteet ovat esimerkkejä funktionaalisesta ohjelmointityylistä, koska niitä käyttämällä voidaan välttää ohjelman tilan muutokset - esimerkiksi lambda-lausekkeella voimme luoda funktion ilman että viittausta siihen tallennetaan mihinkään."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktionaalinen ohjelmointi on esimerkki ohjelmointiparadigmasta eli ohjelmointityylistä. Muita tyypillisiä ja kurssilla jo aiemmin käsiteltyjä paradigmoja ovat esimerkiksi"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"imperatiivinen paradigma, joka perustuu peräkkäisiin komentoihin ja niiden suorittamiseen järjestyksessä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"proseduraalinen paradigma, jossa ohjelma jaetaan pienempiin aliohjelmiin. Imperatiivinen ja proseduraalinen paradigma tarkoittavat joidenkin määrittelyjen mukaan samaa asiaa."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"olio-ohjelmointi, jossa ohjelma ja sen tila mallinnetaan luokista muodostettujen olioiden avulla."}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonin monipuolisuus tulee hyvin esille siinä, että voimme hyödyntää siinä useita eri paradigmoja - jopa samoissa ohjelmissa. Näin voimme hyödyntää tehokkainta ja selkeintä tapaa ongelmien ratkaisemiseksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan vielä muutamaa funktionaalisen ohjelmoinnin työkalua Pythonissa."}]},{"type":"element","tagName":"h2","properties":{"id":"map","style":"position:relative;"},"children":[{"type":"text","value":"map"},{"type":"element","tagName":"a","properties":{"href":"#map","ariaLabel":"map permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":" suorittaa annetun operaation kaikille annetun iteroitavan sarjan alkioille. Niinpä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":" muistuttaa koostetta monessa mielessä, syntaksi tosin näyttää erilaiselta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkinä funktiokutsua, joka muuttaa merkkijonot kokonaisluvuiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjonolista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"123\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"-10\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"23\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"98\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"0\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"-110\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nluvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"map"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" mjonolista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"\n123\n-10\n23\n98\n0\n-110"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":" yleinen syntaksi on siis"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map(, )"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa map-tyyppisen objektin, jonka voi joko iteroida läpi for-lauseella tai esimerkiksi muuttaa listaksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"list"}]},{"type":"text","value":"-funktiolla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"alkukirjain_isoksi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n alku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n alku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" alku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"upper"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" alku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\ntestilista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kolmas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"neljäs\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nvalmiit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"map"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkukirjain_isoksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" testilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nvalmiit_lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"valmiit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"valmiit_lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['Eka', 'Toka', 'Kolmas', 'Neljäs']"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten esimerkistä huomataan, map-funktiossa voi tietysti käyttää lambda-lausekkeella luodun funktion lisäksi myös "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":"-avainsanalla aiemmin määriteltyä nimettyä funktiota."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellinen esimerkki voitaisiin toteuttaa myös vaikkapa listakoosteen avulla, esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"alkukirjain_isoksi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n alku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n alku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" alku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"upper"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" alku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\ntestilista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kolmas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"neljäs\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n\nvalmiit_lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"alkukirjain_isoksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" testilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"valmiit_lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"...tai esimerkiksi iteroimalla lista läpi for-lauseella ja tallentamalla käsitellyt alkiot uuteen listaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"append"}]},{"type":"text","value":"-metodilla. Onkin tyypillistä, että saman asian voi toteuttaa usealla eri tavalla. Eri vaihtoehtojen tunteminen auttaa valitsemaan niistä ohjelmaan (ja omaan makuun) parhaiten sopivan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kannattaa huomata, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":"-funktion palauttama lopputulos ei ole lista, vaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"iteraattori"}]},{"type":"text","value":"-olio ja vaikka se käyttäytyykin listan tapaan monissa tilanteissa, niin näin ei ole aina."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan seuraavaa esimerkkiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"alkukirjain_isoksi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n alku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n alku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" alku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"upper"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" alku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\ntestilista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kolmas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"neljäs\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# talletetaan map-funktion tulos"}]},{"type":"text","value":"\nvalmiit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"map"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkukirjain_isoksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" testilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" valmiit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"sama uusiksi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" valmiit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eka\nToka\nKolmas\nNeljäs\nsama uusiksi:"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eli kun "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":"-funktion tuloksena olevat nimet yritetään tulostaa toiseen kertaan, ei tulostu mitään. Syynä tälle on se, läpikäynti "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-lauseella käy iteraattorin oliot jo läpi, ja kun samaa yritetään toistamiseen, ei ole enää mitään läpikäytävää!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos ohjelma haluaa tarkastella "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":"-funktion tulosta useampaan kertaan, tulee tulos esimerkiksi muuttaa listaksi antamalla se parametriksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"list"}]},{"type":"text","value":"-konstruktorille:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"testilista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kolmas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"neljäs\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muutetaan map-funktion palauttama iteraattori listaksi"}]},{"type":"text","value":"\nvalmiit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"map"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkukirjain_isoksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" testilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" valmiit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"sama uusiksi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" valmiit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eka\nToka\nKolmas\nNeljäs\nsama uusiksi:\nEka\nToka\nKolmas\nNeljäs"}]}]},{"type":"element","tagName":"h2","properties":{"id":"map-ja-oliot","style":"position:relative;"},"children":[{"type":"text","value":"map ja oliot"},{"type":"element","tagName":"a","properties":{"href":"#map-ja-oliot","ariaLabel":"map ja oliot permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":" voidaan toki käsitellä myös omien luokkien olioita. Asiaan ei liity mitään tavanomaisesta poikkeavaa. Tarkastellaan seuraavaa esimerkkiä"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__numero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" numero\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_rahaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" rahasumma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" rahasumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" rahasumma\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hae_saldo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo\n\nt1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"123456\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Reijo Rahakas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nt2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12321\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Keijo Köyhä \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nt3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"223344\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maija Miljonääri \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntilit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" t2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" t3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nasiakkaat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"map"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" t"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" t"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" asiakkaat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsaldot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"map"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" t"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" t"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" saldo "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" saldot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Reijo Rahakas\nKeijo Köyhä\nMaija Miljonääri\n5000\n1\n1000000"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodissa selvitetään ensin funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":" avulla tilien omistajat. Huomaa miten lambda-funktiolla haetaan attribuuttina oleva nimi pankkitiliolioista:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"asiakkaat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"map"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" t"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" t"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän jälkeen haetaan samalla tyylillä jokaisen pankkitilin saldo. Lambda-funktio on nyt hieman erilainen, sillä saldo saadaan selville kutsumalla pankkitiliolion metodia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"saldot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"map"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" t"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" t"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Suoritukset","tmcname":"osa12-11_suoritukset"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on mukana kurssisuoritusta kuvaava luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Suoritus"}]},{"type":"text","value":", joka toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"suoritus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opiskelijan_nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kurssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvosana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka Python\nOhjelmoinnin perusteet\n5\nPekka Python, arvosana kurssilta Ohjelmoinnin perusteet 5"}]}]},{"type":"element","tagName":"h2","properties":{"id":"suorittajat","style":"position:relative;"},"children":[{"type":"text","value":"Suorittajat"},{"type":"element","tagName":"a","properties":{"href":"#suorittajat","ariaLabel":"suorittajat permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suorittajien_nimet(suoritukset: list)"}]},{"type":"text","value":" joka saa parametriksi listan suoritus-olioita. Funktio palauttaa listan, jolta löytyy suorittajien nimet."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"s1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olivia Ohjelmoija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin jatkokurssi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" suorittajien_nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"s1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka Python\nOlivia Ohjelmoija\nPekka Python"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta funktio käyttäen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":"-funktiota!"}]},{"type":"element","tagName":"h2","properties":{"id":"kurssit","style":"position:relative;"},"children":[{"type":"text","value":"Kurssit"},{"type":"element","tagName":"a","properties":{"href":"#kurssit","ariaLabel":"kurssit permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kurssien_nimet(suoritukset: list)"}]},{"type":"text","value":" joka saa parametriksi listan suoritus-olioita. Funktio palauttaa listan, jolla on suorituksessa olevien kurssien nimet aakkosjärjestyksessä. Kukin kurssi esiintyy listalla vain kerran."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"s1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olivia Ohjelmoija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin jatkokurssi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" kurssien_nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"s1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmoinnin jatkokurssi\nOhjelmoinnin perusteet"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hyödynnä funktion toteutuksessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":"-funktiota. Se ei tosin yksistään riitä, joten tarvitset muutakin..."}]}]},{"type":"element","tagName":"h2","properties":{"id":"filter","style":"position:relative;"},"children":[{"type":"text","value":"filter"},{"type":"element","tagName":"a","properties":{"href":"#filter","ariaLabel":"filter permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"filter"}]},{"type":"text","value":" muistuttaa funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":", mutta nimensä mukaisesti se ei poimi kaikkia alkioita lähteestä, vaan ainoastaan ne, joille annettu funktio palauttaa arvon True."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan taas ensin esimerkkiä funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"14"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nparilliset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"filter"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" parilliset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2\n6\n4\n10\n14"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sama esimerkki voitaisiin kirjoittaa ilman lambda-lauseketta määrittelemällä funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":"-avainsanalla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"onko_parillinen"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n\nluvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"14"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nparilliset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"filter"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"onko_parillinen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" parilliset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toiminnallisuuden kannalta ohjelmat ovat täysin yhtäläiset. Onkin mielipidekysymys kumpaa pitää selkeämpänä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan vielä toista esimerkkiä suodattamisesta. Ohjelmassa poimitaan kalalistasta ainoastaan ne kalat, jotka ovat vähintään 1000 gramman painoisia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kala"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Luokka mallintaa tietynpainoista kalaa \"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" laji"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" paino"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"laji "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" laji\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paino "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" paino\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__repr__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"laji"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paino"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" g.)\""}]}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n k1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hauki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1870"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n k2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ahven\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"763"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n k3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hauki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3410"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n k4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Turska\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2449"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n k5 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Särki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"210"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n kalat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"k1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k5"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n ylikiloiset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"filter"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" kala "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paino "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kalat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" kala "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" ylikiloiset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hauki (1870 g.)\nHauki (3410 g.)\nTurska (2449 g.)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Taas kerran sama voitaisiin toteuttaa listakoosteena:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ylikiloiset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"kala "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" kala "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" kalat "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paino "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"filter-palauttaa-iteraattorin","style":"position:relative;"},"children":[{"type":"text","value":"filter palauttaa iteraattorin"},{"type":"element","tagName":"a","properties":{"href":"#filter-palauttaa-iteraattorin","ariaLabel":"filter palauttaa iteraattorin permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":" tapaan, myös funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"filter"}]},{"type":"text","value":" palauttaa listan sijaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"iteraattorin"}]},{"type":"text","value":" ja on tilanteita joissa on syytä olla varuillaan sillä iteraattorin voi käydä läpi vain kerran. Eli seuraava yritys tulostaa suuret kalat kahteen kertaan ei onnistu:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"k1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hauki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1870"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nk2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ahven\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"763"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nk3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hauki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3410"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nk4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Turska\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2449"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nk5 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Särki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"210"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkalat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"k1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k5"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nylikiloiset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"filter"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" kala "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paino "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kalat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" kala "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" ylikiloiset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"sama uudelleen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" kala "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" ylikiloiset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostuu"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hauki (1870 g.)\nHauki (3410 g.)\nTurska (2449 g.)\nsama uudelleen"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"filter"}]},{"type":"text","value":" tulosta on tarve käsitellä useaan kertaan, tulee se muuttaa esimerkiksi listaksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kalat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"k1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k5"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muutetaan tulos listaksi kutsumalla list-konstruktorioa"}]},{"type":"text","value":"\nylikiloiset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"filter"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" kala "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paino "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kalat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Rajatut suoritukset","tmcname":"osa12-12_rajatut_suoritukset"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä jatketaan luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Suoritus"}]},{"type":"text","value":" käyttämistä"}]},{"type":"element","tagName":"h2","properties":{"id":"hyvaksytyt-suoritukset","style":"position:relative;"},"children":[{"type":"text","value":"Hyväksytyt suoritukset"},{"type":"element","tagName":"a","properties":{"href":"#hyvaksytyt-suoritukset","ariaLabel":"hyvaksytyt suoritukset permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hyvaksytyt(suoritukset: list)"}]},{"type":"text","value":" joka saa parametriksi listan suoritus-olioita. Funktio palauttaa listan, jolta löytyy suorituksista ne, joiden arvosana on vähintään 1."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"s1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olivia Ohjelmoija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin jatkokurssi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" suoritus "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" hyvaksytyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"s1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka Python, arvosana kurssilta Ohjelmoinnin perusteet 3\nOlivia Ohjelmoija arvosana kurssilta Ohjelmoinnin perusteet 5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta funktio käyttäen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"filter"}]},{"type":"text","value":"-funktiota!"}]},{"type":"element","tagName":"h2","properties":{"id":"arvosanan-suoritukset","style":"position:relative;"},"children":[{"type":"text","value":"Arvosanan suoritukset"},{"type":"element","tagName":"a","properties":{"href":"#arvosanan-suoritukset","ariaLabel":"arvosanan suoritukset permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suoritus_arvosanalla(suoritukset: list, arvosana: int)"}]},{"type":"text","value":" joka saa parametriksi listan suoritus-olioita sekä kokonaisluvun. Funktio palauttaa listan, jolta löytyy suorituksista ne, joiden arvosana on sama kuin toisen parametrin arvo."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"s1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olivia Ohjelmoija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tietoliikenteen perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olivia Ohjelmoija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Johdatus yliopistomatematiikkaan\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" suoritus "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" suoritus_arvosanalla"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"s1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka Python, arvosana kurssilta Ohjelmoinnin perusteet 3\nPekka Python, arvosana kurssilta Tietoliikenteen perusteet 3\nOlivia Ohjelmoija, arvosana kurssilta Johdatus yliopistomatematiikkaan 3"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta funktio käyttäen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"filter"}]},{"type":"text","value":"-funktiota!"}]},{"type":"element","tagName":"h2","properties":{"id":"kurssin-suorittajat","style":"position:relative;"},"children":[{"type":"text","value":"Kurssin suorittajat"},{"type":"element","tagName":"a","properties":{"href":"#kurssin-suorittajat","ariaLabel":"kurssin suorittajat permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kurssin_suorittajat(suoritukset: list, kurssi: str)"}]},{"type":"text","value":" joka saa parametriksi listan suoritus-olioita sekä kurssin nimen. Funktio palauttaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"aakkosjärjestyksessä"}]},{"type":"text","value":" niiden opiskelijoiden nimet, jotka ovat suorittaneet parametrina olevan kurssin arvosanalla joka on suurempi kuin nolla."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"s1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olivia Ohjelmoija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tietoliikenteen perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tietoliikenteen perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Niilo Nörtti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tietoliikenteen perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" suoritus "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" kurssin_suorittajat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"s1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tietoliikenteen perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Niilo Nörtti\nOlivia Ohjelmoija"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta funktio käyttäen funktioita "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"filter"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":"."}]}]},{"type":"element","tagName":"h2","properties":{"id":"reduce","style":"position:relative;"},"children":[{"type":"text","value":"reduce"},{"type":"element","tagName":"a","properties":{"href":"#reduce","ariaLabel":"reduce permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Viimeinen tarkastelemamme funktio on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":". Kuten funktion nimi vihjaa, sen tarkoituksena on vähentää sarjan alkioiden määrä. Itse asiassa alkioiden sijasta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":" palauttaa yksittäisen arvon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Reduce toimii sitten, että se pitää mukanaan koko ajan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"arvoa"}]},{"type":"text","value":", jota se muuttaa yksi kerrallaan käydessään läpi listan alkioita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on esimerkki, joka summaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":"-funktion avulla listan luvut yhteen. Huomaa, että Pythonin versiosta 3 alkaen funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":" pitää erikseen ottaa käyttöön moduulista "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"functools"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" functools "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":"\n\nlista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nlukujen_summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"reduce"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lukujen_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"11"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkiä hieman tarkemmin. Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":" saa kolme parametria. Parametreista toisena on läpikäytävä lista, ja kolmantena on laskennan alkuarvo. Koska laskemme listan alkioiden summaa, on sopiva alkuarvo nolla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ensimmäisenä parametrina on funktio, joka suorittaa toimenpiteen yksi kerrallaan kullekin listan alkiolle. Tällä kertaa funktio on seuraava:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" alkio"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiolla on kaksi parametria. Näistä ensimmäinen on laskennan sen hetkinen tulos ja toinen parametri on käsittelyvuorossa oleva listan alkio. Funktio laskee uuden arvon parametriensa perusteella. Tässä tapauksessa uusi arvio on vanha summa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"plus"}]},{"type":"text","value":" kyseisen alkion arvo."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":" toiminta hahmottuu kenties selkeämmin, jos käytetään lambdan sijaan normaalia funktiota apuna ja tehdään funktiosta aputulostuksia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" functools "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":"\n\nlista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# reducen apufunktio joka huolehtii yhden alkion arvon lisäämisestä summaan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"summaaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"summa nyt "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", vuorossa alkio "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# uusi summa on vanha summa + alkion arvo"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" alkio\n\nlukujen_summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"reduce"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lukujen_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma tulostaa:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"summa nyt 0, vuorossa alkio 2\nsumma nyt 2, vuorossa alkio 3\nsumma nyt 5, vuorossa alkio 1\nsumma nyt 6, vuorossa alkio 5\n11"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ensimmäisenä siis käsitellään listan alkio, jonka arvo on 2. Tässä vaiheessa summa on 0, eli sillä on reducelle annettu alkuarvo. Funktio laskee ja palauttaa näiden summan eli 0 + 2."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä arvo on parametrin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa"}]},{"type":"text","value":" arvona kun funktiota kutsutaan seuraavalle listan alkiolle eli luvulle 3. Funktio laskee ja palauttaa 2 + 3, joka taas toimii parametrina seuraavalle funktiokutsulle."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen esimerkkimme laskee kaikkien listassa olevien kokonaislukujen tulon."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" functools "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":"\n\nlista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\ntulo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"reduce"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" tulo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" tulo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"480"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska on kyse tulosta, ei alkuarvo voi olla nyt 0 (miten käy jos se olisi nolla?), vaan sopiva arvo sille on 1."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aivan kuten "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"filter"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":", myös "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":" voi käsitellä minkä tahansa tyyppisiä olioita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkinä pankin tilien yhteenlasketun saldon selvittämistä reducella:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__numero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" numero\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_rahaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" rahasumma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" rahasumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" rahasumma\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hae_saldo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo\n\nt1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"123456\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Reijo Rahakas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nt2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12321\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Keijo Köyhä \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nt3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"223344\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maija Miljonääri \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntilit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" t2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" t3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" functools "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"saldojen_summaaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"yht_saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" yht_saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsaldot_yhteensa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"reduce"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"saldojen_summaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pankissa rahaa yhteensä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"saldot_yhteensa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma tulostaa:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"pankissa rahaa yhteensä\n1005001"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa miten funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"saldojen_summaaja"}]},{"type":"text","value":" \"kaivaa\" saldon jokaisen tiliolion sisältä kutsumalla tilille saldon palauttavaa metodia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"saldojen_summaaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"yht_saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" yht_saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Alkuarvoton reduce"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":" kolmas parametri eli alkuarvo ei itse asiassa ole kaikissa tilanteissa pakollinen. Esimerkiksi summan laskeminen onnistuisi "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ilman"}]},{"type":"text","value":" alkuarvoa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nlukujen_summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"reduce"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lukujen_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos alkuarvoa ei anneta, toimii listan ensimmäinen luku alkuarvona ja \"redusointi\" aloitetaan vasta listan toisesta alkiosta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että jos käsiteltävän listan alkiot ovat eri tyyppisiä kuin laskettava arvo, on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":"-funktion kolmas parametri välttämätön. Jos yrittäisimme olla tili-esimerkissä käyttämättä alkuarvoa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"saldot_yhteensa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"reduce"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"saldojen_summaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"olisi seurauksena virhe"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"TypeError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" unsupported operand "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"s"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Pankkitili'"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'int'"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"sillä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":"-funktion parametri "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"yht_saldo"}]},{"type":"text","value":" saisi ensimmäisellä kerralla arvokseen listan ensimmäisen pankkitilin ja sen summaaminen pankkitilin saldoon ei olisi mahdollista."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Opintopisteet","tmcname":"osa12-13_opintopisteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan tässä tehtävässä hieman erilaista versiota luokasta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Suoritus"}]},{"type":"text","value":". Tällä kertaa se kuvastaa ainoastaan yksittäisen opiskelijan kurssisuorituksia. Luokka toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"suoritus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tietorakenteet ja algoritmit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kurssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvosana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tietorakenteet ja algoritmit (10 op) arvosana 3\nTietorakenteet ja algoritmit\n10\n3"}]}]},{"type":"element","tagName":"h2","properties":{"id":"opintopistemaara","style":"position:relative;"},"children":[{"type":"text","value":"Opintopistemäärä"},{"type":"element","tagName":"a","properties":{"href":"#opintopistemaara","ariaLabel":"opintopistemaara permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kaikkien_opintopisteiden_summa"}]},{"type":"text","value":", joka saa parametriksi listan suorituksia ja laskee suoritusten yhteenlasketun opintopistemäärän. Funktio toimii seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"s1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin jatkokutssi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tietorakenteet ja algoritmit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kaikkien_opintopisteiden_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"s1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"20"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta funktio käyttäen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":"-funktiota!"}]},{"type":"element","tagName":"h2","properties":{"id":"hyvaksyttyjen-opintopistemaara","style":"position:relative;"},"children":[{"type":"text","value":"Hyväksyttyjen opintopistemäärä"},{"type":"element","tagName":"a","properties":{"href":"#hyvaksyttyjen-opintopistemaara","ariaLabel":"hyvaksyttyjen opintopistemaara permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hyvaksyttyjen_opintopisteiden_summa"}]},{"type":"text","value":", joka saa parametriksi listan suorituksia ja laskee arvosanan 1 tai parempien omaavien suoritusten yhteenlasketun opintopistemäärän. Funktio toimii seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"s1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin jatkokutssi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tietorakenteet ja algoritmit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" hyvaksyttyjen_opintopisteiden_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"s1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"15"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta funktio käyttäen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":"- ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"filter"}]},{"type":"text","value":"-funktiota!"}]},{"type":"element","tagName":"h2","properties":{"id":"hyvaksyttyjen-suoritusten-keskiarvo","style":"position:relative;"},"children":[{"type":"text","value":"Hyväksyttyjen suoritusten keskiarvo"},{"type":"element","tagName":"a","properties":{"href":"#hyvaksyttyjen-suoritusten-keskiarvo","ariaLabel":"hyvaksyttyjen suoritusten keskiarvo permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"keskiarvo"}]},{"type":"text","value":", joka saa parametriksi listan suorituksia ja laskee arvosanan 1 tai parempien omaavien suoritusten arvosanojen keskiarvon. Funktio toimii seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"s1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin jatkokutssi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tietorakenteet ja algoritmit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" keskiarvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"s1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4.0"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hyödynnä funktion toteutuksessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":"- ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"filter"}]},{"type":"text","value":"-funktiota!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"/osa-12/3-funktionaalista-ohjelmointia#filter-palauttaa-iteraattorin"},"children":[{"type":"text","value":"Tämä"}]},{"type":"text","value":" lienee syytä pitää mielessä tätä tehtävää tehdessä-"}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät mitä tarkoitetaan funktonaalisella ohjelmoinilla
  • \n
  • Osaat hyödyntää operaatioita map, reduce ja filter omissa ohjelmissasi
  • \n

Funktionaalisella ohjelmoinnilla tarkoitetaan ohjelmointiparadigmaa, jossa vältetään tilan muutoksia mahdollisimman pitkälle. Muuttujien sijasta ohjelman suoritus perustuu funktionaalisessa ohjelmoinnissa mahdollisimman pitkälti funktioiden keskinäisiin kutsuihin.

Aikaisemmin esitetyt lambda-lausekkeet ja listakoosteet ovat esimerkkejä funktionaalisesta ohjelmointityylistä, koska niitä käyttämällä voidaan välttää ohjelman tilan muutokset - esimerkiksi lambda-lausekkeella voimme luoda funktion ilman että viittausta siihen tallennetaan mihinkään.

Funktionaalinen ohjelmointi on esimerkki ohjelmointiparadigmasta eli ohjelmointityylistä. Muita tyypillisiä ja kurssilla jo aiemmin käsiteltyjä paradigmoja ovat esimerkiksi

    \n
  • imperatiivinen paradigma, joka perustuu peräkkäisiin komentoihin ja niiden suorittamiseen järjestyksessä
  • \n
  • proseduraalinen paradigma, jossa ohjelma jaetaan pienempiin aliohjelmiin. Imperatiivinen ja proseduraalinen paradigma tarkoittavat joidenkin määrittelyjen mukaan samaa asiaa.
  • \n
  • olio-ohjelmointi, jossa ohjelma ja sen tila mallinnetaan luokista muodostettujen olioiden avulla.
  • \n

Pythonin monipuolisuus tulee hyvin esille siinä, että voimme hyödyntää siinä useita eri paradigmoja - jopa samoissa ohjelmissa. Näin voimme hyödyntää tehokkainta ja selkeintä tapaa ongelmien ratkaisemiseksi.

Tarkastellaan vielä muutamaa funktionaalisen ohjelmoinnin työkalua Pythonissa.

map

Funktio map suorittaa annetun operaation kaikille annetun iteroitavan sarjan alkioille. Niinpä map muistuttaa koostetta monessa mielessä, syntaksi tosin näyttää erilaiselta.

Tarkastellaan esimerkkinä funktiokutsua, joka muuttaa merkkijonot kokonaisluvuiksi:

mjonolista = [\"123\",\"-10\", \"23\", \"98\", \"0\", \"-110\"]\n\nluvut = map(lambda x : int(x), mjonolista)\n\nprint(luvut)\n\nfor luku in luvut:\n    print(luku)

<map object at 0x0000021A4BFA9A90>\n123\n-10\n23\n98\n0\n-110

Funktion map yleinen syntaksi on siis

map(<funktio, jota alkioille kutsutaan>, <sarja, jonka alkioille funktiota kutsutaan>)

Funktio palauttaa map-tyyppisen objektin, jonka voi joko iteroida läpi for-lauseella tai esimerkiksi muuttaa listaksi list-funktiolla:

def alkukirjain_isoksi(mjono: str):\n    alku = mjono[0]\n    alku = alku.upper()\n    return alku + mjono[1:]\n\ntestilista = [\"eka\", \"toka\", \"kolmas\", \"neljäs\"]\n\nvalmiit = map(alkukirjain_isoksi, testilista)\n\nvalmiit_lista = list(valmiit)\nprint(valmiit_lista)

['Eka', 'Toka', 'Kolmas', 'Neljäs']

Kuten esimerkistä huomataan, map-funktiossa voi tietysti käyttää lambda-lausekkeella luodun funktion lisäksi myös def-avainsanalla aiemmin määriteltyä nimettyä funktiota.

Edellinen esimerkki voitaisiin toteuttaa myös vaikkapa listakoosteen avulla, esimerkiksi:

def alkukirjain_isoksi(mjono: str):\n    alku = mjono[0]\n    alku = alku.upper()\n    return alku + mjono[1:]\n\ntestilista = [\"eka\", \"toka\", \"kolmas\", \"neljäs\"]\n\n\nvalmiit_lista = [alkukirjain_isoksi(alkio) for alkio in testilista]\nprint(valmiit_lista)

...tai esimerkiksi iteroimalla lista läpi for-lauseella ja tallentamalla käsitellyt alkiot uuteen listaan append-metodilla. Onkin tyypillistä, että saman asian voi toteuttaa usealla eri tavalla. Eri vaihtoehtojen tunteminen auttaa valitsemaan niistä ohjelmaan (ja omaan makuun) parhaiten sopivan.

Kannattaa huomata, että map-funktion palauttama lopputulos ei ole lista, vaan iteraattori-olio ja vaikka se käyttäytyykin listan tapaan monissa tilanteissa, niin näin ei ole aina.

Tarkastellaan seuraavaa esimerkkiä:

def alkukirjain_isoksi(mjono: str):\n    alku = mjono[0]\n    alku = alku.upper()\n    return alku + mjono[1:]\n\ntestilista = [\"eka\", \"toka\", \"kolmas\", \"neljäs\"]\n\n# talletetaan map-funktion tulos\nvalmiit = map(alkukirjain_isoksi, testilista)\n\nfor sana in valmiit:\n  print(sana)\n\nprint(\"sama uusiksi:\")\nfor sana in valmiit:\n  print(sana)

Tulostus on seuraava:

Eka\nToka\nKolmas\nNeljäs\nsama uusiksi:

Eli kun map-funktion tuloksena olevat nimet yritetään tulostaa toiseen kertaan, ei tulostu mitään. Syynä tälle on se, läpikäynti for-lauseella käy iteraattorin oliot jo läpi, ja kun samaa yritetään toistamiseen, ei ole enää mitään läpikäytävää!

Jos ohjelma haluaa tarkastella map-funktion tulosta useampaan kertaan, tulee tulos esimerkiksi muuttaa listaksi antamalla se parametriksi list-konstruktorille:

testilista = [\"eka\", \"toka\", \"kolmas\", \"neljäs\"]\n\n# muutetaan map-funktion palauttama iteraattori listaksi\nvalmiit = list(map(alkukirjain_isoksi, testilista))\n\nfor sana in valmiit:\n  print(sana)\n\nprint(\"sama uusiksi:\")\nfor sana in valmiit:\n  print(sana)

Eka\nToka\nKolmas\nNeljäs\nsama uusiksi:\nEka\nToka\nKolmas\nNeljäs

map ja oliot

Funktiolla map voidaan toki käsitellä myös omien luokkien olioita. Asiaan ei liity mitään tavanomaisesta poikkeavaa. Tarkastellaan seuraavaa esimerkkiä

class Pankkitili:\n    def __init__(self, numero: str, nimi: str, saldo: float):\n        self.__numero = numero\n        self.nimi = nimi\n        self.__saldo = saldo\n\n    def lisaa_rahaa(self, rahasumma: float):\n        if rahasumma > 0:\n            self.__saldo += rahasumma\n\n    def hae_saldo(self):\n        return self.__saldo\n\nt1 = Pankkitili(\"123456\", \"Reijo Rahakas\", 5000)\nt2 = Pankkitili(\"12321\", \"Keijo Köyhä \", 1)\nt3 = Pankkitili(\"223344\", \"Maija Miljonääri \", 1000000)\n\ntilit = [t1, t2, t3]\n\nasiakkaat = map(lambda t: t.nimi, tilit)\nfor nimi in asiakkaat:\n  print(nimi)\n\nsaldot = map(lambda t: t.hae_saldo(), tilit)\nfor saldo in saldot:\n  print(saldo)

Reijo Rahakas\nKeijo Köyhä\nMaija Miljonääri\n5000\n1\n1000000

Koodissa selvitetään ensin funktion map avulla tilien omistajat. Huomaa miten lambda-funktiolla haetaan attribuuttina oleva nimi pankkitiliolioista:

asiakkaat = map(lambda t: t.nimi, tilit)

Tämän jälkeen haetaan samalla tyylillä jokaisen pankkitilin saldo. Lambda-funktio on nyt hieman erilainen, sillä saldo saadaan selville kutsumalla pankkitiliolion metodia:

saldot = map(lambda t: t.hae_saldo(), tilit)

Tehtäväpohjassa on mukana kurssisuoritusta kuvaava luokka Suoritus, joka toimii seuraavasti:

suoritus = Suoritus(\"Pekka Python\", \"Ohjelmoinnin perusteet\", 5)\nprint(suoritus.opiskelijan_nimi)\nprint(suoritus.kurssi)\nprint(suoritus.arvosana)\nprint(suoritus)

Pekka Python\nOhjelmoinnin perusteet\n5\nPekka Python, arvosana kurssilta Ohjelmoinnin perusteet 5

Suorittajat

Tee funktio suorittajien_nimet(suoritukset: list) joka saa parametriksi listan suoritus-olioita. Funktio palauttaa listan, jolta löytyy suorittajien nimet.

s1 = Suoritus(\"Pekka Python\", \"Ohjelmoinnin perusteet\", 3)\ns2 = Suoritus(\"Olivia Ohjelmoija\", \"Ohjelmoinnin perusteet\", 5)\ns3 = Suoritus(\"Pekka Python\", \"Ohjelmoinnin jatkokurssi\", 2)\n\nfor nimi in suorittajien_nimet([s1, s2, s3]):\n    print(nimi)

Pekka Python\nOlivia Ohjelmoija\nPekka Python

Toteuta funktio käyttäen map-funktiota!

Kurssit

Tee funktio kurssien_nimet(suoritukset: list) joka saa parametriksi listan suoritus-olioita. Funktio palauttaa listan, jolla on suorituksessa olevien kurssien nimet aakkosjärjestyksessä. Kukin kurssi esiintyy listalla vain kerran.

s1 = Suoritus(\"Pekka Python\", \"Ohjelmoinnin perusteet\", 3)\ns2 = Suoritus(\"Olivia Ohjelmoija\", \"Ohjelmoinnin perusteet\", 5)\ns3 = Suoritus(\"Pekka Python\", \"Ohjelmoinnin jatkokurssi\", 2)\n\nfor nimi in kurssien_nimet([s1, s2, s3]):\n    print(nimi)

Ohjelmoinnin jatkokurssi\nOhjelmoinnin perusteet

Hyödynnä funktion toteutuksessa map-funktiota. Se ei tosin yksistään riitä, joten tarvitset muutakin...

filter

Funktio filter muistuttaa funktiota map, mutta nimensä mukaisesti se ei poimi kaikkia alkioita lähteestä, vaan ainoastaan ne, joille annettu funktio palauttaa arvon True.

Tarkastellaan taas ensin esimerkkiä funktion käytöstä:

luvut = [1, 2, 3, 5, 6, 4, 9, 10, 14, 15]\n\nparilliset = filter(lambda luku: luku % 2 == 0, luvut)\n\nfor luku in parilliset:\n    print(luku)

2\n6\n4\n10\n14

Sama esimerkki voitaisiin kirjoittaa ilman lambda-lauseketta määrittelemällä funktio def-avainsanalla:

def onko_parillinen(luku: int):\n    if luku % 2 == 0:\n        return True\n    return False\n\nluvut = [1, 2, 3, 5, 6, 4, 9, 10, 14, 15]\n\nparilliset = filter(onko_parillinen, luvut)\n\nfor luku in parilliset:\n    print(luku)

Toiminnallisuuden kannalta ohjelmat ovat täysin yhtäläiset. Onkin mielipidekysymys kumpaa pitää selkeämpänä.

Tarkastellaan vielä toista esimerkkiä suodattamisesta. Ohjelmassa poimitaan kalalistasta ainoastaan ne kalat, jotka ovat vähintään 1000 gramman painoisia:

class Kala:\n    \"\"\" Luokka mallintaa tietynpainoista kalaa \"\"\"\n    def __init__(self, laji: str, paino: int):\n        self.laji = laji\n        self.paino = paino\n\n    def __repr__(self):\n        return f\"{self.laji} ({self.paino} g.)\"\n\nif __name__ == \"__main__\":\n    k1 = Kala(\"Hauki\", 1870)\n    k2 = Kala(\"Ahven\", 763)\n    k3 = Kala(\"Hauki\", 3410)\n    k4 = Kala(\"Turska\", 2449)\n    k5 = Kala(\"Särki\", 210)\n\n    kalat = [k1, k2, k3, k4, k5]\n\n    ylikiloiset = filter(lambda kala : kala.paino >= 1000, kalat)\n\n    for kala in ylikiloiset:\n        print(kala)

Hauki (1870 g.)\nHauki (3410 g.)\nTurska (2449 g.)

Taas kerran sama voitaisiin toteuttaa listakoosteena:

ylikiloiset = [kala for kala in kalat if kala.paino >= 1000]

filter palauttaa iteraattorin

Funktion map tapaan, myös funktio filter palauttaa listan sijaan iteraattorin ja on tilanteita joissa on syytä olla varuillaan sillä iteraattorin voi käydä läpi vain kerran. Eli seuraava yritys tulostaa suuret kalat kahteen kertaan ei onnistu:

k1 = Kala(\"Hauki\", 1870)\nk2 = Kala(\"Ahven\", 763)\nk3 = Kala(\"Hauki\", 3410)\nk4 = Kala(\"Turska\", 2449)\nk5 = Kala(\"Särki\", 210)\n\nkalat = [k1, k2, k3, k4, k5]\n\nylikiloiset = filter(lambda kala : kala.paino >= 1000, kalat)\n\nfor kala in ylikiloiset:\n    print(kala)\n\nprint(\"sama uudelleen\")\n\nfor kala in ylikiloiset:\n    print(kala)

Tulostuu

Hauki (1870 g.)\nHauki (3410 g.)\nTurska (2449 g.)\nsama uudelleen

Jos funktion filter tulosta on tarve käsitellä useaan kertaan, tulee se muuttaa esimerkiksi listaksi:

kalat = [k1, k2, k3, k4, k5]\n\n# muutetaan tulos listaksi kutsumalla list-konstruktorioa\nylikiloiset = list(filter(lambda kala : kala.paino >= 1000, kalat))

Tässä tehtävässä jatketaan luokan Suoritus käyttämistä

Hyväksytyt suoritukset

Tee funktio hyvaksytyt(suoritukset: list) joka saa parametriksi listan suoritus-olioita. Funktio palauttaa listan, jolta löytyy suorituksista ne, joiden arvosana on vähintään 1.

s1 = Suoritus(\"Pekka Python\", \"Ohjelmoinnin perusteet\", 3)\ns2 = Suoritus(\"Olivia Ohjelmoija\", \"Ohjelmoinnin perusteet\", 5)\ns3 = Suoritus(\"Pekka Python\", \"Ohjelmoinnin jatkokurssi\", 0)\n\nfor suoritus in hyvaksytyt([s1, s2, s3]):\n    print(suoritus)

Pekka Python, arvosana kurssilta Ohjelmoinnin perusteet 3\nOlivia Ohjelmoija arvosana kurssilta Ohjelmoinnin perusteet 5

Toteuta funktio käyttäen filter-funktiota!

Arvosanan suoritukset

Tee funktio suoritus_arvosanalla(suoritukset: list, arvosana: int) joka saa parametriksi listan suoritus-olioita sekä kokonaisluvun. Funktio palauttaa listan, jolta löytyy suorituksista ne, joiden arvosana on sama kuin toisen parametrin arvo.

s1 = Suoritus(\"Pekka Python\", \"Ohjelmoinnin perusteet\", 3)\ns2 = Suoritus(\"Olivia Ohjelmoija\", \"Ohjelmoinnin perusteet\", 5)\ns3 = Suoritus(\"Pekka Python\", \"Tietoliikenteen perusteet\", 3)\ns4 = Suoritus(\"Olivia Ohjelmoija\", \"Johdatus yliopistomatematiikkaan\", 3)\n\nfor suoritus in suoritus_arvosanalla([s1, s2, s3, s4], 3):\n    print(suoritus)

Pekka Python, arvosana kurssilta Ohjelmoinnin perusteet 3\nPekka Python, arvosana kurssilta Tietoliikenteen perusteet 3\nOlivia Ohjelmoija, arvosana kurssilta Johdatus yliopistomatematiikkaan 3

Toteuta funktio käyttäen filter-funktiota!

Kurssin suorittajat

Tee funktio kurssin_suorittajat(suoritukset: list, kurssi: str) joka saa parametriksi listan suoritus-olioita sekä kurssin nimen. Funktio palauttaa aakkosjärjestyksessä niiden opiskelijoiden nimet, jotka ovat suorittaneet parametrina olevan kurssin arvosanalla joka on suurempi kuin nolla.

s1 = Suoritus(\"Pekka Python\", \"Ohjelmoinnin perusteet\", 3)\ns2 = Suoritus(\"Olivia Ohjelmoija\", \"Tietoliikenteen perusteet\", 5)\ns3 = Suoritus(\"Pekka Python\", \"Tietoliikenteen perusteet\", 0)\ns4 = Suoritus(\"Niilo Nörtti\", \"Tietoliikenteen perusteet\", 3)\n\nfor suoritus in kurssin_suorittajat([s1, s2, s3, s4], \"Tietoliikenteen perusteet\"):\n    print(suoritus)

Niilo Nörtti\nOlivia Ohjelmoija

Toteuta funktio käyttäen funktioita filter ja map.

reduce

Viimeinen tarkastelemamme funktio on reduce. Kuten funktion nimi vihjaa, sen tarkoituksena on vähentää sarjan alkioiden määrä. Itse asiassa alkioiden sijasta reduce palauttaa yksittäisen arvon.

Reduce toimii sitten, että se pitää mukanaan koko ajan arvoa, jota se muuttaa yksi kerrallaan käydessään läpi listan alkioita.

Seuraavassa on esimerkki, joka summaa reduce-funktion avulla listan luvut yhteen. Huomaa, että Pythonin versiosta 3 alkaen funktio reduce pitää erikseen ottaa käyttöön moduulista functools.

from functools import reduce\n\nlista = [2, 3, 1, 5]\n\nlukujen_summa = reduce(lambda summa, alkio: summa + alkio, lista, 0)\n\nprint(lukujen_summa)

11

Tarkastellaan esimerkkiä hieman tarkemmin. Funktio reduce saa kolme parametria. Parametreista toisena on läpikäytävä lista, ja kolmantena on laskennan alkuarvo. Koska laskemme listan alkioiden summaa, on sopiva alkuarvo nolla.

Ensimmäisenä parametrina on funktio, joka suorittaa toimenpiteen yksi kerrallaan kullekin listan alkiolle. Tällä kertaa funktio on seuraava:

lambda summa, alkio: summa + alkio

Funktiolla on kaksi parametria. Näistä ensimmäinen on laskennan sen hetkinen tulos ja toinen parametri on käsittelyvuorossa oleva listan alkio. Funktio laskee uuden arvon parametriensa perusteella. Tässä tapauksessa uusi arvio on vanha summa plus kyseisen alkion arvo.

Funktion reduce toiminta hahmottuu kenties selkeämmin, jos käytetään lambdan sijaan normaalia funktiota apuna ja tehdään funktiosta aputulostuksia:

from functools import reduce\n\nlista = [2, 3, 1, 5]\n\n# reducen apufunktio joka huolehtii yhden alkion arvon lisäämisestä summaan\ndef summaaja(summa, alkio):\n  print(f\"summa nyt {summa}, vuorossa alkio {alkio}\")\n  # uusi summa on vanha summa + alkion arvo\n  return summa + alkio\n\nlukujen_summa = reduce(summaaja, lista, 0)\n\nprint(lukujen_summa)

Ohjelma tulostaa:

summa nyt 0, vuorossa alkio 2\nsumma nyt 2, vuorossa alkio 3\nsumma nyt 5, vuorossa alkio 1\nsumma nyt 6, vuorossa alkio 5\n11

Ensimmäisenä siis käsitellään listan alkio, jonka arvo on 2. Tässä vaiheessa summa on 0, eli sillä on reducelle annettu alkuarvo. Funktio laskee ja palauttaa näiden summan eli 0 + 2.

Tämä arvo on parametrin summa arvona kun funktiota kutsutaan seuraavalle listan alkiolle eli luvulle 3. Funktio laskee ja palauttaa 2 + 3, joka taas toimii parametrina seuraavalle funktiokutsulle.

Toinen esimerkkimme laskee kaikkien listassa olevien kokonaislukujen tulon.

from functools import reduce\n\nlista = [2, 2, 4, 3, 5, 2]\n\ntulo = reduce(lambda tulo, alkio: tulo * alkio, lista, 1)\n\nprint(tulo)

480

Koska on kyse tulosta, ei alkuarvo voi olla nyt 0 (miten käy jos se olisi nolla?), vaan sopiva arvo sille on 1.

Aivan kuten filter ja map, myös reduce voi käsitellä minkä tahansa tyyppisiä olioita.

Tarkastellaan esimerkkinä pankin tilien yhteenlasketun saldon selvittämistä reducella:

class Pankkitili:\n    def __init__(self, numero: str, nimi: str, saldo: float):\n        self.__numero = numero\n        self.nimi = nimi\n        self.__saldo = saldo\n\n    def lisaa_rahaa(self, rahasumma: float):\n        if rahasumma > 0:\n            self.__saldo += rahasumma\n\n    def hae_saldo(self):\n        return self.__saldo\n\nt1 = Pankkitili(\"123456\", \"Reijo Rahakas\", 5000)\nt2 = Pankkitili(\"12321\", \"Keijo Köyhä \", 1)\nt3 = Pankkitili(\"223344\", \"Maija Miljonääri \", 1000000)\n\ntilit = [t1, t2, t3]\n\nfrom functools import reduce\n\ndef saldojen_summaaja(yht_saldo, tili):\n  return yht_saldo + tili.hae_saldo()\n\nsaldot_yhteensa = reduce(saldojen_summaaja, tilit, 0)\n\nprint(\"pankissa rahaa yhteensä\")\nprint(saldot_yhteensa)

Ohjelma tulostaa:

pankissa rahaa yhteensä\n1005001

Huomaa miten funktio saldojen_summaaja \"kaivaa\" saldon jokaisen tiliolion sisältä kutsumalla tilille saldon palauttavaa metodia:

def saldojen_summaaja(yht_saldo, tili):\n  return yht_saldo + tili.hae_saldo()

Funktion reduce kolmas parametri eli alkuarvo ei itse asiassa ole kaikissa tilanteissa pakollinen. Esimerkiksi summan laskeminen onnistuisi ilman alkuarvoa:

lista = [2, 3, 1, 5]\n\nlukujen_summa = reduce(lambda summa, alkio: summa + alkio, lista)\n\nprint(lukujen_summa)

Jos alkuarvoa ei anneta, toimii listan ensimmäinen luku alkuarvona ja \"redusointi\" aloitetaan vasta listan toisesta alkiosta.

Huomaa, että jos käsiteltävän listan alkiot ovat eri tyyppisiä kuin laskettava arvo, on reduce-funktion kolmas parametri välttämätön. Jos yrittäisimme olla tili-esimerkissä käyttämättä alkuarvoa:

saldot_yhteensa = reduce(saldojen_summaaja, tilit)

olisi seurauksena virhe

TypeError: unsupported operand type(s) for +: 'Pankkitili' and 'int'

sillä reduce-funktion parametri yht_saldo saisi ensimmäisellä kerralla arvokseen listan ensimmäisen pankkitilin ja sen summaaminen pankkitilin saldoon ei olisi mahdollista.

Tarkastellaan tässä tehtävässä hieman erilaista versiota luokasta Suoritus. Tällä kertaa se kuvastaa ainoastaan yksittäisen opiskelijan kurssisuorituksia. Luokka toimii seuraavasti:

suoritus = Suoritus(\"Tietorakenteet ja algoritmit\", 3, 10)\nprint(suoritus)\nprint(suoritus.kurssi)\nprint(suoritus.opintopisteet)\nprint(suoritus.arvosana)

Tietorakenteet ja algoritmit (10 op) arvosana 3\nTietorakenteet ja algoritmit\n10\n3

Opintopistemäärä

Toteuta funktio kaikkien_opintopisteiden_summa, joka saa parametriksi listan suorituksia ja laskee suoritusten yhteenlasketun opintopistemäärän. Funktio toimii seuraavasti

s1 = Suoritus(\"Ohjelmoinnin perusteet\", 5, 5)\ns2 = Suoritus(\"Ohjelmoinnin jatkokutssi\", 4, 5)\ns3 = Suoritus(\"Tietorakenteet ja algoritmit\", 3, 10)\nsumma = kaikkien_opintopisteiden_summa([s1, s2, s3])\nprint(summa)

20

Toteuta funktio käyttäen reduce-funktiota!

Hyväksyttyjen opintopistemäärä

Toteuta funktio hyvaksyttyjen_opintopisteiden_summa, joka saa parametriksi listan suorituksia ja laskee arvosanan 1 tai parempien omaavien suoritusten yhteenlasketun opintopistemäärän. Funktio toimii seuraavasti

s1 = Suoritus(\"Ohjelmoinnin perusteet\", 5, 5)\ns2 = Suoritus(\"Ohjelmoinnin jatkokutssi\", 0, 4)\ns3 = Suoritus(\"Tietorakenteet ja algoritmit\", 3, 10)\nsumma = hyvaksyttyjen_opintopisteiden_summa([s1, s2, s3])\nprint(summa)

15

Toteuta funktio käyttäen reduce- ja filter-funktiota!

Hyväksyttyjen suoritusten keskiarvo

Toteuta funktio keskiarvo, joka saa parametriksi listan suorituksia ja laskee arvosanan 1 tai parempien omaavien suoritusten arvosanojen keskiarvon. Funktio toimii seuraavasti

s1 = Suoritus(\"Ohjelmoinnin perusteet\", 5, 5)\ns2 = Suoritus(\"Ohjelmoinnin jatkokutssi\", 0, 4)\ns3 = Suoritus(\"Tietorakenteet ja algoritmit\", 3, 10)\nsumma = keskiarvo([s1, s2, s3])\nprint(summa)

4.0

Hyödynnä funktion toteutuksessa reduce- ja filter-funktiota!

Tämä lienee syytä pitää mielessä tätä tehtävää tehdessä-

","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-12/3-funktionaalista-ohjelmointia.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät mitä tarkoitetaan funktonaalisella ohjelmoinilla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat hyödyntää operaatioita map, reduce ja filter omissa ohjelmissasi"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktionaalisella ohjelmoinnilla tarkoitetaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ohjelmointiparadigmaa"}]},{"type":"text","value":", jossa vältetään tilan muutoksia mahdollisimman pitkälle. Muuttujien sijasta ohjelman suoritus perustuu funktionaalisessa ohjelmoinnissa mahdollisimman pitkälti funktioiden keskinäisiin kutsuihin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aikaisemmin esitetyt lambda-lausekkeet ja listakoosteet ovat esimerkkejä funktionaalisesta ohjelmointityylistä, koska niitä käyttämällä voidaan välttää ohjelman tilan muutokset - esimerkiksi lambda-lausekkeella voimme luoda funktion ilman että viittausta siihen tallennetaan mihinkään."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktionaalinen ohjelmointi on esimerkki ohjelmointiparadigmasta eli ohjelmointityylistä. Muita tyypillisiä ja kurssilla jo aiemmin käsiteltyjä paradigmoja ovat esimerkiksi"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"imperatiivinen paradigma, joka perustuu peräkkäisiin komentoihin ja niiden suorittamiseen järjestyksessä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"proseduraalinen paradigma, jossa ohjelma jaetaan pienempiin aliohjelmiin. Imperatiivinen ja proseduraalinen paradigma tarkoittavat joidenkin määrittelyjen mukaan samaa asiaa."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"olio-ohjelmointi, jossa ohjelma ja sen tila mallinnetaan luokista muodostettujen olioiden avulla."}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonin monipuolisuus tulee hyvin esille siinä, että voimme hyödyntää siinä useita eri paradigmoja - jopa samoissa ohjelmissa. Näin voimme hyödyntää tehokkainta ja selkeintä tapaa ongelmien ratkaisemiseksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan vielä muutamaa funktionaalisen ohjelmoinnin työkalua Pythonissa."}]},{"type":"element","tagName":"h2","properties":{"id":"map","style":"position:relative;"},"children":[{"type":"text","value":"map"},{"type":"element","tagName":"a","properties":{"href":"#map","ariaLabel":"map permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":" suorittaa annetun operaation kaikille annetun iteroitavan sarjan alkioille. Niinpä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":" muistuttaa koostetta monessa mielessä, syntaksi tosin näyttää erilaiselta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkinä funktiokutsua, joka muuttaa merkkijonot kokonaisluvuiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjonolista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"123\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"-10\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"23\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"98\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"0\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"-110\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nluvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"map"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" mjonolista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"\n123\n-10\n23\n98\n0\n-110"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":" yleinen syntaksi on siis"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map(, )"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa map-tyyppisen objektin, jonka voi joko iteroida läpi for-lauseella tai esimerkiksi muuttaa listaksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"list"}]},{"type":"text","value":"-funktiolla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"alkukirjain_isoksi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n alku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n alku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" alku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"upper"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" alku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\ntestilista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kolmas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"neljäs\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nvalmiit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"map"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkukirjain_isoksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" testilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nvalmiit_lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"valmiit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"valmiit_lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['Eka', 'Toka', 'Kolmas', 'Neljäs']"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten esimerkistä huomataan, map-funktiossa voi tietysti käyttää lambda-lausekkeella luodun funktion lisäksi myös "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":"-avainsanalla aiemmin määriteltyä nimettyä funktiota."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellinen esimerkki voitaisiin toteuttaa myös vaikkapa listakoosteen avulla, esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"alkukirjain_isoksi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n alku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n alku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" alku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"upper"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" alku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\ntestilista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kolmas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"neljäs\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n\nvalmiit_lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"alkukirjain_isoksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" testilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"valmiit_lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"...tai esimerkiksi iteroimalla lista läpi for-lauseella ja tallentamalla käsitellyt alkiot uuteen listaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"append"}]},{"type":"text","value":"-metodilla. Onkin tyypillistä, että saman asian voi toteuttaa usealla eri tavalla. Eri vaihtoehtojen tunteminen auttaa valitsemaan niistä ohjelmaan (ja omaan makuun) parhaiten sopivan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kannattaa huomata, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":"-funktion palauttama lopputulos ei ole lista, vaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"iteraattori"}]},{"type":"text","value":"-olio ja vaikka se käyttäytyykin listan tapaan monissa tilanteissa, niin näin ei ole aina."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan seuraavaa esimerkkiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"alkukirjain_isoksi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n alku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n alku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" alku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"upper"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" alku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\ntestilista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kolmas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"neljäs\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# talletetaan map-funktion tulos"}]},{"type":"text","value":"\nvalmiit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"map"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkukirjain_isoksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" testilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" valmiit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"sama uusiksi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" valmiit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eka\nToka\nKolmas\nNeljäs\nsama uusiksi:"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eli kun "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":"-funktion tuloksena olevat nimet yritetään tulostaa toiseen kertaan, ei tulostu mitään. Syynä tälle on se, läpikäynti "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-lauseella käy iteraattorin oliot jo läpi, ja kun samaa yritetään toistamiseen, ei ole enää mitään läpikäytävää!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos ohjelma haluaa tarkastella "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":"-funktion tulosta useampaan kertaan, tulee tulos esimerkiksi muuttaa listaksi antamalla se parametriksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"list"}]},{"type":"text","value":"-konstruktorille:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"testilista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kolmas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"neljäs\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muutetaan map-funktion palauttama iteraattori listaksi"}]},{"type":"text","value":"\nvalmiit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"map"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkukirjain_isoksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" testilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" valmiit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"sama uusiksi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" valmiit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eka\nToka\nKolmas\nNeljäs\nsama uusiksi:\nEka\nToka\nKolmas\nNeljäs"}]}]},{"type":"element","tagName":"h2","properties":{"id":"map-ja-oliot","style":"position:relative;"},"children":[{"type":"text","value":"map ja oliot"},{"type":"element","tagName":"a","properties":{"href":"#map-ja-oliot","ariaLabel":"map ja oliot permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":" voidaan toki käsitellä myös omien luokkien olioita. Asiaan ei liity mitään tavanomaisesta poikkeavaa. Tarkastellaan seuraavaa esimerkkiä"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__numero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" numero\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_rahaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" rahasumma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" rahasumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" rahasumma\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hae_saldo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo\n\nt1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"123456\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Reijo Rahakas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nt2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12321\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Keijo Köyhä \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nt3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"223344\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maija Miljonääri \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntilit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" t2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" t3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nasiakkaat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"map"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" t"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" t"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" asiakkaat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsaldot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"map"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" t"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" t"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" saldo "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" saldot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Reijo Rahakas\nKeijo Köyhä\nMaija Miljonääri\n5000\n1\n1000000"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodissa selvitetään ensin funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":" avulla tilien omistajat. Huomaa miten lambda-funktiolla haetaan attribuuttina oleva nimi pankkitiliolioista:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"asiakkaat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"map"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" t"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" t"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän jälkeen haetaan samalla tyylillä jokaisen pankkitilin saldo. Lambda-funktio on nyt hieman erilainen, sillä saldo saadaan selville kutsumalla pankkitiliolion metodia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"saldot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"map"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" t"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" t"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Suoritukset","tmcname":"osa12-11_suoritukset"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on mukana kurssisuoritusta kuvaava luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Suoritus"}]},{"type":"text","value":", joka toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"suoritus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opiskelijan_nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kurssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvosana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka Python\nOhjelmoinnin perusteet\n5\nPekka Python, arvosana kurssilta Ohjelmoinnin perusteet 5"}]}]},{"type":"element","tagName":"h2","properties":{"id":"suorittajat","style":"position:relative;"},"children":[{"type":"text","value":"Suorittajat"},{"type":"element","tagName":"a","properties":{"href":"#suorittajat","ariaLabel":"suorittajat permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suorittajien_nimet(suoritukset: list)"}]},{"type":"text","value":" joka saa parametriksi listan suoritus-olioita. Funktio palauttaa listan, jolta löytyy suorittajien nimet."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"s1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olivia Ohjelmoija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin jatkokurssi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" suorittajien_nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"s1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka Python\nOlivia Ohjelmoija\nPekka Python"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta funktio käyttäen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":"-funktiota!"}]},{"type":"element","tagName":"h2","properties":{"id":"kurssit","style":"position:relative;"},"children":[{"type":"text","value":"Kurssit"},{"type":"element","tagName":"a","properties":{"href":"#kurssit","ariaLabel":"kurssit permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kurssien_nimet(suoritukset: list)"}]},{"type":"text","value":" joka saa parametriksi listan suoritus-olioita. Funktio palauttaa listan, jolla on suorituksessa olevien kurssien nimet aakkosjärjestyksessä. Kukin kurssi esiintyy listalla vain kerran."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"s1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olivia Ohjelmoija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin jatkokurssi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" kurssien_nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"s1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmoinnin jatkokurssi\nOhjelmoinnin perusteet"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hyödynnä funktion toteutuksessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":"-funktiota. Se ei tosin yksistään riitä, joten tarvitset muutakin..."}]}]},{"type":"element","tagName":"h2","properties":{"id":"filter","style":"position:relative;"},"children":[{"type":"text","value":"filter"},{"type":"element","tagName":"a","properties":{"href":"#filter","ariaLabel":"filter permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"filter"}]},{"type":"text","value":" muistuttaa funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":", mutta nimensä mukaisesti se ei poimi kaikkia alkioita lähteestä, vaan ainoastaan ne, joille annettu funktio palauttaa arvon True."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan taas ensin esimerkkiä funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"14"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nparilliset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"filter"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" parilliset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2\n6\n4\n10\n14"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sama esimerkki voitaisiin kirjoittaa ilman lambda-lauseketta määrittelemällä funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":"-avainsanalla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"onko_parillinen"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n\nluvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"14"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nparilliset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"filter"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"onko_parillinen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" parilliset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toiminnallisuuden kannalta ohjelmat ovat täysin yhtäläiset. Onkin mielipidekysymys kumpaa pitää selkeämpänä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan vielä toista esimerkkiä suodattamisesta. Ohjelmassa poimitaan kalalistasta ainoastaan ne kalat, jotka ovat vähintään 1000 gramman painoisia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kala"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Luokka mallintaa tietynpainoista kalaa \"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" laji"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" paino"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"laji "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" laji\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paino "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" paino\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__repr__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"laji"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paino"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" g.)\""}]}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n k1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hauki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1870"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n k2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ahven\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"763"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n k3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hauki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3410"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n k4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Turska\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2449"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n k5 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Särki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"210"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n kalat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"k1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k5"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n ylikiloiset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"filter"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" kala "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paino "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kalat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" kala "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" ylikiloiset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hauki (1870 g.)\nHauki (3410 g.)\nTurska (2449 g.)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Taas kerran sama voitaisiin toteuttaa listakoosteena:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ylikiloiset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"kala "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" kala "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" kalat "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paino "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"filter-palauttaa-iteraattorin","style":"position:relative;"},"children":[{"type":"text","value":"filter palauttaa iteraattorin"},{"type":"element","tagName":"a","properties":{"href":"#filter-palauttaa-iteraattorin","ariaLabel":"filter palauttaa iteraattorin permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":" tapaan, myös funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"filter"}]},{"type":"text","value":" palauttaa listan sijaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"iteraattorin"}]},{"type":"text","value":" ja on tilanteita joissa on syytä olla varuillaan sillä iteraattorin voi käydä läpi vain kerran. Eli seuraava yritys tulostaa suuret kalat kahteen kertaan ei onnistu:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"k1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hauki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1870"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nk2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ahven\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"763"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nk3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hauki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3410"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nk4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Turska\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2449"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nk5 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Särki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"210"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkalat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"k1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k5"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nylikiloiset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"filter"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" kala "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paino "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kalat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" kala "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" ylikiloiset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"sama uudelleen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" kala "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" ylikiloiset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostuu"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hauki (1870 g.)\nHauki (3410 g.)\nTurska (2449 g.)\nsama uudelleen"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"filter"}]},{"type":"text","value":" tulosta on tarve käsitellä useaan kertaan, tulee se muuttaa esimerkiksi listaksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kalat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"k1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" k5"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muutetaan tulos listaksi kutsumalla list-konstruktorioa"}]},{"type":"text","value":"\nylikiloiset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"filter"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" kala "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" kala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paino "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kalat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Rajatut suoritukset","tmcname":"osa12-12_rajatut_suoritukset"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä jatketaan luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Suoritus"}]},{"type":"text","value":" käyttämistä"}]},{"type":"element","tagName":"h2","properties":{"id":"hyvaksytyt-suoritukset","style":"position:relative;"},"children":[{"type":"text","value":"Hyväksytyt suoritukset"},{"type":"element","tagName":"a","properties":{"href":"#hyvaksytyt-suoritukset","ariaLabel":"hyvaksytyt suoritukset permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hyvaksytyt(suoritukset: list)"}]},{"type":"text","value":" joka saa parametriksi listan suoritus-olioita. Funktio palauttaa listan, jolta löytyy suorituksista ne, joiden arvosana on vähintään 1."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"s1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olivia Ohjelmoija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin jatkokurssi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" suoritus "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" hyvaksytyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"s1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka Python, arvosana kurssilta Ohjelmoinnin perusteet 3\nOlivia Ohjelmoija arvosana kurssilta Ohjelmoinnin perusteet 5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta funktio käyttäen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"filter"}]},{"type":"text","value":"-funktiota!"}]},{"type":"element","tagName":"h2","properties":{"id":"arvosanan-suoritukset","style":"position:relative;"},"children":[{"type":"text","value":"Arvosanan suoritukset"},{"type":"element","tagName":"a","properties":{"href":"#arvosanan-suoritukset","ariaLabel":"arvosanan suoritukset permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suoritus_arvosanalla(suoritukset: list, arvosana: int)"}]},{"type":"text","value":" joka saa parametriksi listan suoritus-olioita sekä kokonaisluvun. Funktio palauttaa listan, jolta löytyy suorituksista ne, joiden arvosana on sama kuin toisen parametrin arvo."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"s1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olivia Ohjelmoija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tietoliikenteen perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olivia Ohjelmoija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Johdatus yliopistomatematiikkaan\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" suoritus "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" suoritus_arvosanalla"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"s1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka Python, arvosana kurssilta Ohjelmoinnin perusteet 3\nPekka Python, arvosana kurssilta Tietoliikenteen perusteet 3\nOlivia Ohjelmoija, arvosana kurssilta Johdatus yliopistomatematiikkaan 3"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta funktio käyttäen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"filter"}]},{"type":"text","value":"-funktiota!"}]},{"type":"element","tagName":"h2","properties":{"id":"kurssin-suorittajat","style":"position:relative;"},"children":[{"type":"text","value":"Kurssin suorittajat"},{"type":"element","tagName":"a","properties":{"href":"#kurssin-suorittajat","ariaLabel":"kurssin suorittajat permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kurssin_suorittajat(suoritukset: list, kurssi: str)"}]},{"type":"text","value":" joka saa parametriksi listan suoritus-olioita sekä kurssin nimen. Funktio palauttaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"aakkosjärjestyksessä"}]},{"type":"text","value":" niiden opiskelijoiden nimet, jotka ovat suorittaneet parametrina olevan kurssin arvosanalla joka on suurempi kuin nolla."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"s1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olivia Ohjelmoija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tietoliikenteen perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tietoliikenteen perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Niilo Nörtti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tietoliikenteen perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" suoritus "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" kurssin_suorittajat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"s1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tietoliikenteen perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Niilo Nörtti\nOlivia Ohjelmoija"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta funktio käyttäen funktioita "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"filter"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":"."}]}]},{"type":"element","tagName":"h2","properties":{"id":"reduce","style":"position:relative;"},"children":[{"type":"text","value":"reduce"},{"type":"element","tagName":"a","properties":{"href":"#reduce","ariaLabel":"reduce permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Viimeinen tarkastelemamme funktio on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":". Kuten funktion nimi vihjaa, sen tarkoituksena on vähentää sarjan alkioiden määrä. Itse asiassa alkioiden sijasta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":" palauttaa yksittäisen arvon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Reduce toimii sitten, että se pitää mukanaan koko ajan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"arvoa"}]},{"type":"text","value":", jota se muuttaa yksi kerrallaan käydessään läpi listan alkioita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on esimerkki, joka summaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":"-funktion avulla listan luvut yhteen. Huomaa, että Pythonin versiosta 3 alkaen funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":" pitää erikseen ottaa käyttöön moduulista "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"functools"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" functools "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":"\n\nlista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nlukujen_summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"reduce"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lukujen_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"11"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkiä hieman tarkemmin. Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":" saa kolme parametria. Parametreista toisena on läpikäytävä lista, ja kolmantena on laskennan alkuarvo. Koska laskemme listan alkioiden summaa, on sopiva alkuarvo nolla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ensimmäisenä parametrina on funktio, joka suorittaa toimenpiteen yksi kerrallaan kullekin listan alkiolle. Tällä kertaa funktio on seuraava:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" alkio"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiolla on kaksi parametria. Näistä ensimmäinen on laskennan sen hetkinen tulos ja toinen parametri on käsittelyvuorossa oleva listan alkio. Funktio laskee uuden arvon parametriensa perusteella. Tässä tapauksessa uusi arvio on vanha summa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"plus"}]},{"type":"text","value":" kyseisen alkion arvo."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":" toiminta hahmottuu kenties selkeämmin, jos käytetään lambdan sijaan normaalia funktiota apuna ja tehdään funktiosta aputulostuksia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" functools "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":"\n\nlista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# reducen apufunktio joka huolehtii yhden alkion arvon lisäämisestä summaan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"summaaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"summa nyt "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", vuorossa alkio "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# uusi summa on vanha summa + alkion arvo"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" alkio\n\nlukujen_summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"reduce"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lukujen_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma tulostaa:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"summa nyt 0, vuorossa alkio 2\nsumma nyt 2, vuorossa alkio 3\nsumma nyt 5, vuorossa alkio 1\nsumma nyt 6, vuorossa alkio 5\n11"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ensimmäisenä siis käsitellään listan alkio, jonka arvo on 2. Tässä vaiheessa summa on 0, eli sillä on reducelle annettu alkuarvo. Funktio laskee ja palauttaa näiden summan eli 0 + 2."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä arvo on parametrin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa"}]},{"type":"text","value":" arvona kun funktiota kutsutaan seuraavalle listan alkiolle eli luvulle 3. Funktio laskee ja palauttaa 2 + 3, joka taas toimii parametrina seuraavalle funktiokutsulle."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen esimerkkimme laskee kaikkien listassa olevien kokonaislukujen tulon."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" functools "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":"\n\nlista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\ntulo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"reduce"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" tulo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" tulo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"480"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska on kyse tulosta, ei alkuarvo voi olla nyt 0 (miten käy jos se olisi nolla?), vaan sopiva arvo sille on 1."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aivan kuten "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"filter"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"map"}]},{"type":"text","value":", myös "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":" voi käsitellä minkä tahansa tyyppisiä olioita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkinä pankin tilien yhteenlasketun saldon selvittämistä reducella:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__numero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" numero\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_rahaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" rahasumma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" rahasumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" rahasumma\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hae_saldo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo\n\nt1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"123456\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Reijo Rahakas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nt2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12321\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Keijo Köyhä \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nt3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"223344\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maija Miljonääri \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntilit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"t1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" t2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" t3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" functools "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"saldojen_summaaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"yht_saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" yht_saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsaldot_yhteensa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"reduce"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"saldojen_summaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pankissa rahaa yhteensä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"saldot_yhteensa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma tulostaa:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"pankissa rahaa yhteensä\n1005001"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa miten funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"saldojen_summaaja"}]},{"type":"text","value":" \"kaivaa\" saldon jokaisen tiliolion sisältä kutsumalla tilille saldon palauttavaa metodia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"saldojen_summaaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"yht_saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" yht_saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Alkuarvoton reduce"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":" kolmas parametri eli alkuarvo ei itse asiassa ole kaikissa tilanteissa pakollinen. Esimerkiksi summan laskeminen onnistuisi "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ilman"}]},{"type":"text","value":" alkuarvoa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nlukujen_summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"reduce"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lambda"}]},{"type":"text","value":" summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lukujen_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos alkuarvoa ei anneta, toimii listan ensimmäinen luku alkuarvona ja \"redusointi\" aloitetaan vasta listan toisesta alkiosta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että jos käsiteltävän listan alkiot ovat eri tyyppisiä kuin laskettava arvo, on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":"-funktion kolmas parametri välttämätön. Jos yrittäisimme olla tili-esimerkissä käyttämättä alkuarvoa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"saldot_yhteensa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"reduce"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"saldojen_summaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"olisi seurauksena virhe"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"TypeError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" unsupported operand "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"s"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Pankkitili'"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'int'"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"sillä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":"-funktion parametri "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"yht_saldo"}]},{"type":"text","value":" saisi ensimmäisellä kerralla arvokseen listan ensimmäisen pankkitilin ja sen summaaminen pankkitilin saldoon ei olisi mahdollista."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Opintopisteet","tmcname":"osa12-13_opintopisteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan tässä tehtävässä hieman erilaista versiota luokasta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Suoritus"}]},{"type":"text","value":". Tällä kertaa se kuvastaa ainoastaan yksittäisen opiskelijan kurssisuorituksia. Luokka toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"suoritus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tietorakenteet ja algoritmit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kurssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvosana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tietorakenteet ja algoritmit (10 op) arvosana 3\nTietorakenteet ja algoritmit\n10\n3"}]}]},{"type":"element","tagName":"h2","properties":{"id":"opintopistemaara","style":"position:relative;"},"children":[{"type":"text","value":"Opintopistemäärä"},{"type":"element","tagName":"a","properties":{"href":"#opintopistemaara","ariaLabel":"opintopistemaara permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kaikkien_opintopisteiden_summa"}]},{"type":"text","value":", joka saa parametriksi listan suorituksia ja laskee suoritusten yhteenlasketun opintopistemäärän. Funktio toimii seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"s1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin jatkokutssi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tietorakenteet ja algoritmit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kaikkien_opintopisteiden_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"s1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"20"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta funktio käyttäen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":"-funktiota!"}]},{"type":"element","tagName":"h2","properties":{"id":"hyvaksyttyjen-opintopistemaara","style":"position:relative;"},"children":[{"type":"text","value":"Hyväksyttyjen opintopistemäärä"},{"type":"element","tagName":"a","properties":{"href":"#hyvaksyttyjen-opintopistemaara","ariaLabel":"hyvaksyttyjen opintopistemaara permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hyvaksyttyjen_opintopisteiden_summa"}]},{"type":"text","value":", joka saa parametriksi listan suorituksia ja laskee arvosanan 1 tai parempien omaavien suoritusten yhteenlasketun opintopistemäärän. Funktio toimii seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"s1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin jatkokutssi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tietorakenteet ja algoritmit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" hyvaksyttyjen_opintopisteiden_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"s1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"15"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta funktio käyttäen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":"- ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"filter"}]},{"type":"text","value":"-funktiota!"}]},{"type":"element","tagName":"h2","properties":{"id":"hyvaksyttyjen-suoritusten-keskiarvo","style":"position:relative;"},"children":[{"type":"text","value":"Hyväksyttyjen suoritusten keskiarvo"},{"type":"element","tagName":"a","properties":{"href":"#hyvaksyttyjen-suoritusten-keskiarvo","ariaLabel":"hyvaksyttyjen suoritusten keskiarvo permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"keskiarvo"}]},{"type":"text","value":", joka saa parametriksi listan suorituksia ja laskee arvosanan 1 tai parempien omaavien suoritusten arvosanojen keskiarvon. Funktio toimii seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"s1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin jatkokutssi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tietorakenteet ja algoritmit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" keskiarvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"s1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4.0"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hyödynnä funktion toteutuksessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reduce"}]},{"type":"text","value":"- ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"filter"}]},{"type":"text","value":"-funktiota!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"/osa-12/3-funktionaalista-ohjelmointia#filter-palauttaa-iteraattorin"},"children":[{"type":"text","value":"Tämä"}]},{"type":"text","value":" lienee syytä pitää mielessä tätä tehtävää tehdessä-"}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät mitä tarkoitetaan funktonaalisella ohjelmoinilla
  • \n
  • Osaat hyödyntää operaatioita map, reduce ja filter omissa ohjelmissasi
  • \n

Funktionaalisella ohjelmoinnilla tarkoitetaan ohjelmointiparadigmaa, jossa vältetään tilan muutoksia mahdollisimman pitkälle. Muuttujien sijasta ohjelman suoritus perustuu funktionaalisessa ohjelmoinnissa mahdollisimman pitkälti funktioiden keskinäisiin kutsuihin.

Aikaisemmin esitetyt lambda-lausekkeet ja listakoosteet ovat esimerkkejä funktionaalisesta ohjelmointityylistä, koska niitä käyttämällä voidaan välttää ohjelman tilan muutokset - esimerkiksi lambda-lausekkeella voimme luoda funktion ilman että viittausta siihen tallennetaan mihinkään.

Funktionaalinen ohjelmointi on esimerkki ohjelmointiparadigmasta eli ohjelmointityylistä. Muita tyypillisiä ja kurssilla jo aiemmin käsiteltyjä paradigmoja ovat esimerkiksi

    \n
  • imperatiivinen paradigma, joka perustuu peräkkäisiin komentoihin ja niiden suorittamiseen järjestyksessä
  • \n
  • proseduraalinen paradigma, jossa ohjelma jaetaan pienempiin aliohjelmiin. Imperatiivinen ja proseduraalinen paradigma tarkoittavat joidenkin määrittelyjen mukaan samaa asiaa.
  • \n
  • olio-ohjelmointi, jossa ohjelma ja sen tila mallinnetaan luokista muodostettujen olioiden avulla.
  • \n

Pythonin monipuolisuus tulee hyvin esille siinä, että voimme hyödyntää siinä useita eri paradigmoja - jopa samoissa ohjelmissa. Näin voimme hyödyntää tehokkainta ja selkeintä tapaa ongelmien ratkaisemiseksi.

Tarkastellaan vielä muutamaa funktionaalisen ohjelmoinnin työkalua Pythonissa.

map

Funktio map suorittaa annetun operaation kaikille annetun iteroitavan sarjan alkioille. Niinpä map muistuttaa koostetta monessa mielessä, syntaksi tosin näyttää erilaiselta.

Tarkastellaan esimerkkinä funktiokutsua, joka muuttaa merkkijonot kokonaisluvuiksi:

mjonolista = [\"123\",\"-10\", \"23\", \"98\", \"0\", \"-110\"]\n\nluvut = map(lambda x : int(x), mjonolista)\n\nprint(luvut)\n\nfor luku in luvut:\n    print(luku)

<map object at 0x0000021A4BFA9A90>\n123\n-10\n23\n98\n0\n-110

Funktion map yleinen syntaksi on siis

map(<funktio, jota alkioille kutsutaan>, <sarja, jonka alkioille funktiota kutsutaan>)

Funktio palauttaa map-tyyppisen objektin, jonka voi joko iteroida läpi for-lauseella tai esimerkiksi muuttaa listaksi list-funktiolla:

def alkukirjain_isoksi(mjono: str):\n    alku = mjono[0]\n    alku = alku.upper()\n    return alku + mjono[1:]\n\ntestilista = [\"eka\", \"toka\", \"kolmas\", \"neljäs\"]\n\nvalmiit = map(alkukirjain_isoksi, testilista)\n\nvalmiit_lista = list(valmiit)\nprint(valmiit_lista)

['Eka', 'Toka', 'Kolmas', 'Neljäs']

Kuten esimerkistä huomataan, map-funktiossa voi tietysti käyttää lambda-lausekkeella luodun funktion lisäksi myös def-avainsanalla aiemmin määriteltyä nimettyä funktiota.

Edellinen esimerkki voitaisiin toteuttaa myös vaikkapa listakoosteen avulla, esimerkiksi:

def alkukirjain_isoksi(mjono: str):\n    alku = mjono[0]\n    alku = alku.upper()\n    return alku + mjono[1:]\n\ntestilista = [\"eka\", \"toka\", \"kolmas\", \"neljäs\"]\n\n\nvalmiit_lista = [alkukirjain_isoksi(alkio) for alkio in testilista]\nprint(valmiit_lista)

...tai esimerkiksi iteroimalla lista läpi for-lauseella ja tallentamalla käsitellyt alkiot uuteen listaan append-metodilla. Onkin tyypillistä, että saman asian voi toteuttaa usealla eri tavalla. Eri vaihtoehtojen tunteminen auttaa valitsemaan niistä ohjelmaan (ja omaan makuun) parhaiten sopivan.

Kannattaa huomata, että map-funktion palauttama lopputulos ei ole lista, vaan iteraattori-olio ja vaikka se käyttäytyykin listan tapaan monissa tilanteissa, niin näin ei ole aina.

Tarkastellaan seuraavaa esimerkkiä:

def alkukirjain_isoksi(mjono: str):\n    alku = mjono[0]\n    alku = alku.upper()\n    return alku + mjono[1:]\n\ntestilista = [\"eka\", \"toka\", \"kolmas\", \"neljäs\"]\n\n# talletetaan map-funktion tulos\nvalmiit = map(alkukirjain_isoksi, testilista)\n\nfor sana in valmiit:\n  print(sana)\n\nprint(\"sama uusiksi:\")\nfor sana in valmiit:\n  print(sana)

Tulostus on seuraava:

Eka\nToka\nKolmas\nNeljäs\nsama uusiksi:

Eli kun map-funktion tuloksena olevat nimet yritetään tulostaa toiseen kertaan, ei tulostu mitään. Syynä tälle on se, läpikäynti for-lauseella käy iteraattorin oliot jo läpi, ja kun samaa yritetään toistamiseen, ei ole enää mitään läpikäytävää!

Jos ohjelma haluaa tarkastella map-funktion tulosta useampaan kertaan, tulee tulos esimerkiksi muuttaa listaksi antamalla se parametriksi list-konstruktorille:

testilista = [\"eka\", \"toka\", \"kolmas\", \"neljäs\"]\n\n# muutetaan map-funktion palauttama iteraattori listaksi\nvalmiit = list(map(alkukirjain_isoksi, testilista))\n\nfor sana in valmiit:\n  print(sana)\n\nprint(\"sama uusiksi:\")\nfor sana in valmiit:\n  print(sana)

Eka\nToka\nKolmas\nNeljäs\nsama uusiksi:\nEka\nToka\nKolmas\nNeljäs

map ja oliot

Funktiolla map voidaan toki käsitellä myös omien luokkien olioita. Asiaan ei liity mitään tavanomaisesta poikkeavaa. Tarkastellaan seuraavaa esimerkkiä

class Pankkitili:\n    def __init__(self, numero: str, nimi: str, saldo: float):\n        self.__numero = numero\n        self.nimi = nimi\n        self.__saldo = saldo\n\n    def lisaa_rahaa(self, rahasumma: float):\n        if rahasumma > 0:\n            self.__saldo += rahasumma\n\n    def hae_saldo(self):\n        return self.__saldo\n\nt1 = Pankkitili(\"123456\", \"Reijo Rahakas\", 5000)\nt2 = Pankkitili(\"12321\", \"Keijo Köyhä \", 1)\nt3 = Pankkitili(\"223344\", \"Maija Miljonääri \", 1000000)\n\ntilit = [t1, t2, t3]\n\nasiakkaat = map(lambda t: t.nimi, tilit)\nfor nimi in asiakkaat:\n  print(nimi)\n\nsaldot = map(lambda t: t.hae_saldo(), tilit)\nfor saldo in saldot:\n  print(saldo)

Reijo Rahakas\nKeijo Köyhä\nMaija Miljonääri\n5000\n1\n1000000

Koodissa selvitetään ensin funktion map avulla tilien omistajat. Huomaa miten lambda-funktiolla haetaan attribuuttina oleva nimi pankkitiliolioista:

asiakkaat = map(lambda t: t.nimi, tilit)

Tämän jälkeen haetaan samalla tyylillä jokaisen pankkitilin saldo. Lambda-funktio on nyt hieman erilainen, sillä saldo saadaan selville kutsumalla pankkitiliolion metodia:

saldot = map(lambda t: t.hae_saldo(), tilit)

Tehtäväpohjassa on mukana kurssisuoritusta kuvaava luokka Suoritus, joka toimii seuraavasti:

suoritus = Suoritus(\"Pekka Python\", \"Ohjelmoinnin perusteet\", 5)\nprint(suoritus.opiskelijan_nimi)\nprint(suoritus.kurssi)\nprint(suoritus.arvosana)\nprint(suoritus)

Pekka Python\nOhjelmoinnin perusteet\n5\nPekka Python, arvosana kurssilta Ohjelmoinnin perusteet 5

Suorittajat

Tee funktio suorittajien_nimet(suoritukset: list) joka saa parametriksi listan suoritus-olioita. Funktio palauttaa listan, jolta löytyy suorittajien nimet.

s1 = Suoritus(\"Pekka Python\", \"Ohjelmoinnin perusteet\", 3)\ns2 = Suoritus(\"Olivia Ohjelmoija\", \"Ohjelmoinnin perusteet\", 5)\ns3 = Suoritus(\"Pekka Python\", \"Ohjelmoinnin jatkokurssi\", 2)\n\nfor nimi in suorittajien_nimet([s1, s2, s3]):\n    print(nimi)

Pekka Python\nOlivia Ohjelmoija\nPekka Python

Toteuta funktio käyttäen map-funktiota!

Kurssit

Tee funktio kurssien_nimet(suoritukset: list) joka saa parametriksi listan suoritus-olioita. Funktio palauttaa listan, jolla on suorituksessa olevien kurssien nimet aakkosjärjestyksessä. Kukin kurssi esiintyy listalla vain kerran.

s1 = Suoritus(\"Pekka Python\", \"Ohjelmoinnin perusteet\", 3)\ns2 = Suoritus(\"Olivia Ohjelmoija\", \"Ohjelmoinnin perusteet\", 5)\ns3 = Suoritus(\"Pekka Python\", \"Ohjelmoinnin jatkokurssi\", 2)\n\nfor nimi in kurssien_nimet([s1, s2, s3]):\n    print(nimi)

Ohjelmoinnin jatkokurssi\nOhjelmoinnin perusteet

Hyödynnä funktion toteutuksessa map-funktiota. Se ei tosin yksistään riitä, joten tarvitset muutakin...

filter

Funktio filter muistuttaa funktiota map, mutta nimensä mukaisesti se ei poimi kaikkia alkioita lähteestä, vaan ainoastaan ne, joille annettu funktio palauttaa arvon True.

Tarkastellaan taas ensin esimerkkiä funktion käytöstä:

luvut = [1, 2, 3, 5, 6, 4, 9, 10, 14, 15]\n\nparilliset = filter(lambda luku: luku % 2 == 0, luvut)\n\nfor luku in parilliset:\n    print(luku)

2\n6\n4\n10\n14

Sama esimerkki voitaisiin kirjoittaa ilman lambda-lauseketta määrittelemällä funktio def-avainsanalla:

def onko_parillinen(luku: int):\n    if luku % 2 == 0:\n        return True\n    return False\n\nluvut = [1, 2, 3, 5, 6, 4, 9, 10, 14, 15]\n\nparilliset = filter(onko_parillinen, luvut)\n\nfor luku in parilliset:\n    print(luku)

Toiminnallisuuden kannalta ohjelmat ovat täysin yhtäläiset. Onkin mielipidekysymys kumpaa pitää selkeämpänä.

Tarkastellaan vielä toista esimerkkiä suodattamisesta. Ohjelmassa poimitaan kalalistasta ainoastaan ne kalat, jotka ovat vähintään 1000 gramman painoisia:

class Kala:\n    \"\"\" Luokka mallintaa tietynpainoista kalaa \"\"\"\n    def __init__(self, laji: str, paino: int):\n        self.laji = laji\n        self.paino = paino\n\n    def __repr__(self):\n        return f\"{self.laji} ({self.paino} g.)\"\n\nif __name__ == \"__main__\":\n    k1 = Kala(\"Hauki\", 1870)\n    k2 = Kala(\"Ahven\", 763)\n    k3 = Kala(\"Hauki\", 3410)\n    k4 = Kala(\"Turska\", 2449)\n    k5 = Kala(\"Särki\", 210)\n\n    kalat = [k1, k2, k3, k4, k5]\n\n    ylikiloiset = filter(lambda kala : kala.paino >= 1000, kalat)\n\n    for kala in ylikiloiset:\n        print(kala)

Hauki (1870 g.)\nHauki (3410 g.)\nTurska (2449 g.)

Taas kerran sama voitaisiin toteuttaa listakoosteena:

ylikiloiset = [kala for kala in kalat if kala.paino >= 1000]

filter palauttaa iteraattorin

Funktion map tapaan, myös funktio filter palauttaa listan sijaan iteraattorin ja on tilanteita joissa on syytä olla varuillaan sillä iteraattorin voi käydä läpi vain kerran. Eli seuraava yritys tulostaa suuret kalat kahteen kertaan ei onnistu:

k1 = Kala(\"Hauki\", 1870)\nk2 = Kala(\"Ahven\", 763)\nk3 = Kala(\"Hauki\", 3410)\nk4 = Kala(\"Turska\", 2449)\nk5 = Kala(\"Särki\", 210)\n\nkalat = [k1, k2, k3, k4, k5]\n\nylikiloiset = filter(lambda kala : kala.paino >= 1000, kalat)\n\nfor kala in ylikiloiset:\n    print(kala)\n\nprint(\"sama uudelleen\")\n\nfor kala in ylikiloiset:\n    print(kala)

Tulostuu

Hauki (1870 g.)\nHauki (3410 g.)\nTurska (2449 g.)\nsama uudelleen

Jos funktion filter tulosta on tarve käsitellä useaan kertaan, tulee se muuttaa esimerkiksi listaksi:

kalat = [k1, k2, k3, k4, k5]\n\n# muutetaan tulos listaksi kutsumalla list-konstruktorioa\nylikiloiset = list(filter(lambda kala : kala.paino >= 1000, kalat))

Tässä tehtävässä jatketaan luokan Suoritus käyttämistä

Hyväksytyt suoritukset

Tee funktio hyvaksytyt(suoritukset: list) joka saa parametriksi listan suoritus-olioita. Funktio palauttaa listan, jolta löytyy suorituksista ne, joiden arvosana on vähintään 1.

s1 = Suoritus(\"Pekka Python\", \"Ohjelmoinnin perusteet\", 3)\ns2 = Suoritus(\"Olivia Ohjelmoija\", \"Ohjelmoinnin perusteet\", 5)\ns3 = Suoritus(\"Pekka Python\", \"Ohjelmoinnin jatkokurssi\", 0)\n\nfor suoritus in hyvaksytyt([s1, s2, s3]):\n    print(suoritus)

Pekka Python, arvosana kurssilta Ohjelmoinnin perusteet 3\nOlivia Ohjelmoija arvosana kurssilta Ohjelmoinnin perusteet 5

Toteuta funktio käyttäen filter-funktiota!

Arvosanan suoritukset

Tee funktio suoritus_arvosanalla(suoritukset: list, arvosana: int) joka saa parametriksi listan suoritus-olioita sekä kokonaisluvun. Funktio palauttaa listan, jolta löytyy suorituksista ne, joiden arvosana on sama kuin toisen parametrin arvo.

s1 = Suoritus(\"Pekka Python\", \"Ohjelmoinnin perusteet\", 3)\ns2 = Suoritus(\"Olivia Ohjelmoija\", \"Ohjelmoinnin perusteet\", 5)\ns3 = Suoritus(\"Pekka Python\", \"Tietoliikenteen perusteet\", 3)\ns4 = Suoritus(\"Olivia Ohjelmoija\", \"Johdatus yliopistomatematiikkaan\", 3)\n\nfor suoritus in suoritus_arvosanalla([s1, s2, s3, s4], 3):\n    print(suoritus)

Pekka Python, arvosana kurssilta Ohjelmoinnin perusteet 3\nPekka Python, arvosana kurssilta Tietoliikenteen perusteet 3\nOlivia Ohjelmoija, arvosana kurssilta Johdatus yliopistomatematiikkaan 3

Toteuta funktio käyttäen filter-funktiota!

Kurssin suorittajat

Tee funktio kurssin_suorittajat(suoritukset: list, kurssi: str) joka saa parametriksi listan suoritus-olioita sekä kurssin nimen. Funktio palauttaa aakkosjärjestyksessä niiden opiskelijoiden nimet, jotka ovat suorittaneet parametrina olevan kurssin arvosanalla joka on suurempi kuin nolla.

s1 = Suoritus(\"Pekka Python\", \"Ohjelmoinnin perusteet\", 3)\ns2 = Suoritus(\"Olivia Ohjelmoija\", \"Tietoliikenteen perusteet\", 5)\ns3 = Suoritus(\"Pekka Python\", \"Tietoliikenteen perusteet\", 0)\ns4 = Suoritus(\"Niilo Nörtti\", \"Tietoliikenteen perusteet\", 3)\n\nfor suoritus in kurssin_suorittajat([s1, s2, s3, s4], \"Tietoliikenteen perusteet\"):\n    print(suoritus)

Niilo Nörtti\nOlivia Ohjelmoija

Toteuta funktio käyttäen funktioita filter ja map.

reduce

Viimeinen tarkastelemamme funktio on reduce. Kuten funktion nimi vihjaa, sen tarkoituksena on vähentää sarjan alkioiden määrä. Itse asiassa alkioiden sijasta reduce palauttaa yksittäisen arvon.

Reduce toimii sitten, että se pitää mukanaan koko ajan arvoa, jota se muuttaa yksi kerrallaan käydessään läpi listan alkioita.

Seuraavassa on esimerkki, joka summaa reduce-funktion avulla listan luvut yhteen. Huomaa, että Pythonin versiosta 3 alkaen funktio reduce pitää erikseen ottaa käyttöön moduulista functools.

from functools import reduce\n\nlista = [2, 3, 1, 5]\n\nlukujen_summa = reduce(lambda summa, alkio: summa + alkio, lista, 0)\n\nprint(lukujen_summa)

11

Tarkastellaan esimerkkiä hieman tarkemmin. Funktio reduce saa kolme parametria. Parametreista toisena on läpikäytävä lista, ja kolmantena on laskennan alkuarvo. Koska laskemme listan alkioiden summaa, on sopiva alkuarvo nolla.

Ensimmäisenä parametrina on funktio, joka suorittaa toimenpiteen yksi kerrallaan kullekin listan alkiolle. Tällä kertaa funktio on seuraava:

lambda summa, alkio: summa + alkio

Funktiolla on kaksi parametria. Näistä ensimmäinen on laskennan sen hetkinen tulos ja toinen parametri on käsittelyvuorossa oleva listan alkio. Funktio laskee uuden arvon parametriensa perusteella. Tässä tapauksessa uusi arvio on vanha summa plus kyseisen alkion arvo.

Funktion reduce toiminta hahmottuu kenties selkeämmin, jos käytetään lambdan sijaan normaalia funktiota apuna ja tehdään funktiosta aputulostuksia:

from functools import reduce\n\nlista = [2, 3, 1, 5]\n\n# reducen apufunktio joka huolehtii yhden alkion arvon lisäämisestä summaan\ndef summaaja(summa, alkio):\n  print(f\"summa nyt {summa}, vuorossa alkio {alkio}\")\n  # uusi summa on vanha summa + alkion arvo\n  return summa + alkio\n\nlukujen_summa = reduce(summaaja, lista, 0)\n\nprint(lukujen_summa)

Ohjelma tulostaa:

summa nyt 0, vuorossa alkio 2\nsumma nyt 2, vuorossa alkio 3\nsumma nyt 5, vuorossa alkio 1\nsumma nyt 6, vuorossa alkio 5\n11

Ensimmäisenä siis käsitellään listan alkio, jonka arvo on 2. Tässä vaiheessa summa on 0, eli sillä on reducelle annettu alkuarvo. Funktio laskee ja palauttaa näiden summan eli 0 + 2.

Tämä arvo on parametrin summa arvona kun funktiota kutsutaan seuraavalle listan alkiolle eli luvulle 3. Funktio laskee ja palauttaa 2 + 3, joka taas toimii parametrina seuraavalle funktiokutsulle.

Toinen esimerkkimme laskee kaikkien listassa olevien kokonaislukujen tulon.

from functools import reduce\n\nlista = [2, 2, 4, 3, 5, 2]\n\ntulo = reduce(lambda tulo, alkio: tulo * alkio, lista, 1)\n\nprint(tulo)

480

Koska on kyse tulosta, ei alkuarvo voi olla nyt 0 (miten käy jos se olisi nolla?), vaan sopiva arvo sille on 1.

Aivan kuten filter ja map, myös reduce voi käsitellä minkä tahansa tyyppisiä olioita.

Tarkastellaan esimerkkinä pankin tilien yhteenlasketun saldon selvittämistä reducella:

class Pankkitili:\n    def __init__(self, numero: str, nimi: str, saldo: float):\n        self.__numero = numero\n        self.nimi = nimi\n        self.__saldo = saldo\n\n    def lisaa_rahaa(self, rahasumma: float):\n        if rahasumma > 0:\n            self.__saldo += rahasumma\n\n    def hae_saldo(self):\n        return self.__saldo\n\nt1 = Pankkitili(\"123456\", \"Reijo Rahakas\", 5000)\nt2 = Pankkitili(\"12321\", \"Keijo Köyhä \", 1)\nt3 = Pankkitili(\"223344\", \"Maija Miljonääri \", 1000000)\n\ntilit = [t1, t2, t3]\n\nfrom functools import reduce\n\ndef saldojen_summaaja(yht_saldo, tili):\n  return yht_saldo + tili.hae_saldo()\n\nsaldot_yhteensa = reduce(saldojen_summaaja, tilit, 0)\n\nprint(\"pankissa rahaa yhteensä\")\nprint(saldot_yhteensa)

Ohjelma tulostaa:

pankissa rahaa yhteensä\n1005001

Huomaa miten funktio saldojen_summaaja \"kaivaa\" saldon jokaisen tiliolion sisältä kutsumalla tilille saldon palauttavaa metodia:

def saldojen_summaaja(yht_saldo, tili):\n  return yht_saldo + tili.hae_saldo()

Funktion reduce kolmas parametri eli alkuarvo ei itse asiassa ole kaikissa tilanteissa pakollinen. Esimerkiksi summan laskeminen onnistuisi ilman alkuarvoa:

lista = [2, 3, 1, 5]\n\nlukujen_summa = reduce(lambda summa, alkio: summa + alkio, lista)\n\nprint(lukujen_summa)

Jos alkuarvoa ei anneta, toimii listan ensimmäinen luku alkuarvona ja \"redusointi\" aloitetaan vasta listan toisesta alkiosta.

Huomaa, että jos käsiteltävän listan alkiot ovat eri tyyppisiä kuin laskettava arvo, on reduce-funktion kolmas parametri välttämätön. Jos yrittäisimme olla tili-esimerkissä käyttämättä alkuarvoa:

saldot_yhteensa = reduce(saldojen_summaaja, tilit)

olisi seurauksena virhe

TypeError: unsupported operand type(s) for +: 'Pankkitili' and 'int'

sillä reduce-funktion parametri yht_saldo saisi ensimmäisellä kerralla arvokseen listan ensimmäisen pankkitilin ja sen summaaminen pankkitilin saldoon ei olisi mahdollista.

Tarkastellaan tässä tehtävässä hieman erilaista versiota luokasta Suoritus. Tällä kertaa se kuvastaa ainoastaan yksittäisen opiskelijan kurssisuorituksia. Luokka toimii seuraavasti:

suoritus = Suoritus(\"Tietorakenteet ja algoritmit\", 3, 10)\nprint(suoritus)\nprint(suoritus.kurssi)\nprint(suoritus.opintopisteet)\nprint(suoritus.arvosana)

Tietorakenteet ja algoritmit (10 op) arvosana 3\nTietorakenteet ja algoritmit\n10\n3

Opintopistemäärä

Toteuta funktio kaikkien_opintopisteiden_summa, joka saa parametriksi listan suorituksia ja laskee suoritusten yhteenlasketun opintopistemäärän. Funktio toimii seuraavasti

s1 = Suoritus(\"Ohjelmoinnin perusteet\", 5, 5)\ns2 = Suoritus(\"Ohjelmoinnin jatkokutssi\", 4, 5)\ns3 = Suoritus(\"Tietorakenteet ja algoritmit\", 3, 10)\nsumma = kaikkien_opintopisteiden_summa([s1, s2, s3])\nprint(summa)

20

Toteuta funktio käyttäen reduce-funktiota!

Hyväksyttyjen opintopistemäärä

Toteuta funktio hyvaksyttyjen_opintopisteiden_summa, joka saa parametriksi listan suorituksia ja laskee arvosanan 1 tai parempien omaavien suoritusten yhteenlasketun opintopistemäärän. Funktio toimii seuraavasti

s1 = Suoritus(\"Ohjelmoinnin perusteet\", 5, 5)\ns2 = Suoritus(\"Ohjelmoinnin jatkokutssi\", 0, 4)\ns3 = Suoritus(\"Tietorakenteet ja algoritmit\", 3, 10)\nsumma = hyvaksyttyjen_opintopisteiden_summa([s1, s2, s3])\nprint(summa)

15

Toteuta funktio käyttäen reduce- ja filter-funktiota!

Hyväksyttyjen suoritusten keskiarvo

Toteuta funktio keskiarvo, joka saa parametriksi listan suorituksia ja laskee arvosanan 1 tai parempien omaavien suoritusten arvosanojen keskiarvon. Funktio toimii seuraavasti

s1 = Suoritus(\"Ohjelmoinnin perusteet\", 5, 5)\ns2 = Suoritus(\"Ohjelmoinnin jatkokutssi\", 0, 4)\ns3 = Suoritus(\"Tietorakenteet ja algoritmit\", 3, 10)\nsumma = keskiarvo([s1, s2, s3])\nprint(summa)

4.0

Hyödynnä funktion toteutuksessa reduce- ja filter-funktiota!

Tämä lienee syytä pitää mielessä tätä tehtävää tehdessä-

","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-12/3-funktionaalista-ohjelmointia.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-12/4-saannolliset-lausekkeet/page-data.json b/page-data/osa-12/4-saannolliset-lausekkeet/page-data.json index e83666440..565c6aeb5 100644 --- a/page-data/osa-12/4-saannolliset-lausekkeet/page-data.json +++ b/page-data/osa-12/4-saannolliset-lausekkeet/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-12/4-saannolliset-lausekkeet", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät mitä tarkoitetan säännöllisellä lausekkeella"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat hyödyntää säännöllisiä lausekkeita omissa ohjelmissasi"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python on mainio työkalu tekstin käsittelemiseen. Yksi työkalu tekstin käsittelemisessä ovat\n"},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"säännölliset lausekkeet"}]},{"type":"text","value":" ("},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"regular expressions"}]},{"type":"text","value":"), joiden avulla voi esimerkiksi poimia ja etsiä merkkijonoja, jotka ovat tietyn muotoisia. Tässä osiossa käydään läpi säännöllisten lausekkeiden perusteita, ja löydät lisää tietoa Pythonin omasta "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/howto/regex.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"tutoriaalista"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"h2","properties":{"id":"mita-ovat-saannolliset-lausekkeet","style":"position:relative;"},"children":[{"type":"text","value":"Mitä ovat säännölliset lausekkeet?"},{"type":"element","tagName":"a","properties":{"href":"#mita-ovat-saannolliset-lausekkeet","ariaLabel":"mita ovat saannolliset lausekkeet permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Säännölliset lausekkeet ovat tavallaan ohjelmointikieli ohjelmointikielen sisällä. Lausekkeilla on oma syntaksinsa, jonka mukaan ne määritellään. Ideana on, että säännöllisellä lausekkeella määritellään sellaisten merkkijonojen joukko, jotka ovat tiettyjen sääntöjen mukaisia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkistellaan yksinkertaista esimerkkiä lausekkeiden käytöstä ennen tarkempaa perehtymistä sääntöihin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" re\n\nsanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ponneton\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ponttooni\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pullero\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pallon\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# merkkijonon tulee alkaa \"P\" ja päättyä \"on\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" re"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"search"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"^P.*on$\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"löytyy!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python löytyy!\nPonneton löytyy!\nPallon löytyy!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa säännöllisiä lausekkeita voi käsitellä moduulin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"re"}]},{"type":"text","value":" avulla. Esimerkiksi yllä olevassa koodissa oleva metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"search"}]},{"type":"text","value":" etsii merkkijonosta osaa, joka täsmää annettuun säännölliseen lausekkeeseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että säännöllinen lauseke annetaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"merkkijonona"}]},{"type":"text","value":" funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"search"}]},{"type":"text","value":" parametriksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen esimerkki etsii merkkijonosta luvut. Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"findall"}]},{"type":"text","value":" palauttaa kaikki säännölliseen lausekkeeseen täsmäävät osajonot listana:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" re\n\nlause "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Eka, 2 !#kolmas 44 viisi 678xyz962\""}]},{"type":"text","value":"\n\nluvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" re"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"findall"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\\d+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2\n44\n678\n962"}]}]},{"type":"element","tagName":"h2","properties":{"id":"saannollisten-lausekkeiden-syntaksi","style":"position:relative;"},"children":[{"type":"text","value":"Säännöllisten lausekkeiden syntaksi"},{"type":"element","tagName":"a","properties":{"href":"#saannollisten-lausekkeiden-syntaksi","ariaLabel":"saannollisten lausekkeiden syntaksi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan seuraavaksi syntaksia, jota säännöllisissä lausekkeissa käytetään. Useimmissa esimerkeissä käytetään samaa testiohjelmaa eri syötteillä."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" re\n\nlauseke "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna lauseke: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna merkkijono: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" re"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"search"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lauseke"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Osuma!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ei osumaa.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"h3","properties":{"id":"vaihtoehtoiset-alijonot","style":"position:relative;"},"children":[{"type":"text","value":"Vaihtoehtoiset alijonot"},{"type":"element","tagName":"a","properties":{"href":"#vaihtoehtoiset-alijonot","ariaLabel":"vaihtoehtoiset alijonot permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pystyviivalla voidaan erottaa vaihtoehtoisia osajonoja. Esimerkiksi lauseke "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"911|112"}]},{"type":"text","value":" täsmää merkkijonoihin, joista löytyy joko osajono "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"911"}]},{"type":"text","value":" tai osajono "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"112"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lauseke: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"aa|ee|ii"}]},{"type":"text","value":"\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"saapas"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"teema"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"iilimato"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ooppera"}]},{"type":"text","value":"\nEi osumaa.\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"uuttera"}]},{"type":"text","value":"\nEi osumaa."}]}]},{"type":"element","tagName":"h3","properties":{"id":"merkkijoukot","style":"position:relative;"},"children":[{"type":"text","value":"Merkkijoukot"},{"type":"element","tagName":"a","properties":{"href":"#merkkijoukot","ariaLabel":"merkkijoukot permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hakasulkeiden väliin voidaan merkitä joukko hyväksyttyjä merkkejä. Esimerkiksi merkintä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[aeio]"}]},{"type":"text","value":" täsmää jonoihin, joista löytyy jokin merkeistä a, e, i, tai o. Merkintätapa sallii myös väliviivan käytön. Merkintä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[0-68a-d]"}]},{"type":"text","value":" hyväksyy jonot, joista löytyy numero nollasta kuuteen, kahdeksikko tai merkki väliltä a...d. Merkintä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[1-3][0-9]"}]},{"type":"text","value":" hyväksyy kaksinumeroiset luvut väliltä 10...39."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lauseke: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"[C-FRSÖ]"}]},{"type":"text","value":"\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"C"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"E"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"G"}]},{"type":"text","value":"\nEi osumaa.\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"R"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Ö"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"T"}]},{"type":"text","value":"\nEi osumaa."}]}]},{"type":"element","tagName":"h3","properties":{"id":"toistaminen","style":"position:relative;"},"children":[{"type":"text","value":"Toistaminen"},{"type":"element","tagName":"a","properties":{"href":"#toistaminen","ariaLabel":"toistaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lausekkeen osaa voidaan toistaa esimerkiksi seuraavien operaattorien avulla:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" toistaa osaa minkä tahansa määrän kertoja (myös nolla)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" toistaa osaa minkä tahansa määrän kertoja (ainakin yhden)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"{m}"}]},{"type":"text","value":" toistaa osaa täsmälleen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"m"}]},{"type":"text","value":" kertaa"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Operaattorit viittaavat niitä edeltävään lausekkeen osaan. Esimerkiksi lauseke "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ba+b"}]},{"type":"text","value":" hyväksyy esimerkiksi osajonot "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"bab"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"baab"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"baaaaaaaaaaab"}]},{"type":"text","value":". Lauseke "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"A[BCDE]*Z"}]},{"type":"text","value":" puolestaan hyväksyy esimerkiksi osajonot "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"AZ"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ADZ"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ABCDEBCDEBCDEZ"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lauseke: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1[234]*5"}]},{"type":"text","value":"\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"15"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"125"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"145"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"12342345"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"126"}]},{"type":"text","value":"\nEi osumaa.\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"165"}]},{"type":"text","value":"\nEi osumaa."}]}]},{"type":"element","tagName":"h3","properties":{"id":"muita-erikoismerkkeja","style":"position:relative;"},"children":[{"type":"text","value":"Muita erikoismerkkejä"},{"type":"element","tagName":"a","properties":{"href":"#muita-erikoismerkkeja","ariaLabel":"muita erikoismerkkeja permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pisteellä merkitään mitä tahansa yksittäistä merkkiä. Niinpä merkintä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"c...o"}]},{"type":"text","value":" vastaa esimerkiksi merkkijonoja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"c-3po"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"combo"}]},{"type":"text","value":". Merkillä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"^"}]},{"type":"text","value":" voidaan määritellä, että osuman pitää löytyä merkkijonon alusta, ja vastaavasti merkillä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$"}]},{"type":"text","value":", että sen on oltava lopussa. Näillä voidaan näppärästi myös rajata sääntö koskemaan vain annettuja merkkejä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lauseke: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"^[123]*$"}]},{"type":"text","value":"\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nEi osumaa.\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1221"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"333333333"}]},{"type":"text","value":"\nOsuma!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kenoviivaa voidaan käyttää etsimään erikoismerkkejä. Merkintä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"1+"}]},{"type":"text","value":" tarkoittaa yhtä tai useampaa ykköstä, mutta merkintä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"1\\+"}]},{"type":"text","value":" merkkijonoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"1+"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lauseke: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"^\\*"}]},{"type":"text","value":"\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"moi*"}]},{"type":"text","value":"\nEi osumaa.\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"m*o*i"}]},{"type":"text","value":"\nEi osumaa.\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"*moi"}]},{"type":"text","value":"\nOsuma!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kaarisulkeilla voidaan ryhmitellä lausekkeen osia. Esimerkiksi lauseke "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(ab)+c"}]},{"type":"text","value":" hyväksyy jonot "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"abc"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ababc"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ababababababc"}]},{"type":"text","value":", mutta ei esimerkiksi jonoja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ac"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"bc"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lauseke: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"^(jabba).*(hut)$"}]},{"type":"text","value":"\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"jabba the hut"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"jabba a hut"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"jarmo the hut"}]},{"type":"text","value":"\nEi osumaa.\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"jabba the smut"}]},{"type":"text","value":"\nEi osumaa."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Säännölliset lausekkeet","tmcname":"osa12-14_saannolliset_lausekkeet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Harjoitellaan hieman säännöllisten lausekkeiden käyttöä."}]},{"type":"element","tagName":"h2","properties":{"id":"viikonpaivat","style":"position:relative;"},"children":[{"type":"text","value":"Viikonpäivät"},{"type":"element","tagName":"a","properties":{"href":"#viikonpaivat","ariaLabel":"viikonpaivat permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee säännöllisen lausekkeen avulla funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"on_viikonpaiva(merkkijono: str)"}]},{"type":"text","value":" joka palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", jos sen parametrina saama merkkijono sisältää viikonpäivän lyhenteen (ma, ti, ke, to, pe, la tai su)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"on_viikonpaiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ma\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"on_viikonpaiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pe\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"on_viikonpaiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\nTrue\nFalse"}]}]},{"type":"element","tagName":"h2","properties":{"id":"vokaalitarkistus","style":"position:relative;"},"children":[{"type":"text","value":"Vokaalitarkistus"},{"type":"element","tagName":"a","properties":{"href":"#vokaalitarkistus","ariaLabel":"vokaalitarkistus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kaikki_vokaaleja(merkkijono: str)"}]},{"type":"text","value":", joka tarkistaa säännöllisen lausekkeen avulla, ovatko parametrina annetun merkkijonon kaikki merkit vokaaleja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kaikki_vokaaleja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eioueioieoieouyyyy\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kaikki_vokaaleja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"autoooo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\nFalse"}]}]},{"type":"element","tagName":"h2","properties":{"id":"kellonaika","style":"position:relative;"},"children":[{"type":"text","value":"Kellonaika"},{"type":"element","tagName":"a","properties":{"href":"#kellonaika","ariaLabel":"kellonaika permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kellonaika(merkkijono: str)"}]},{"type":"text","value":", joka tarkistaa säännöllisen lausekkeen avulla, onko parametrina oleva merkkijono muotoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tt:mm:ss"}]},{"type":"text","value":" oleva kellonaika (tunnit, minuutit ja sekunnit kaksinumeroisina)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kellonaika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12:43:01\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kellonaika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"AB:01:CD\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kellonaika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"17:59:59\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kellonaika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"33:66:77\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\nFalse\nTrue\nFalse"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"loppuhuipennus","style":"position:relative;"},"children":[{"type":"text","value":"Loppuhuipennus"},{"type":"element","tagName":"a","properties":{"href":"#loppuhuipennus","ariaLabel":"loppuhuipennus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Harjoitellaan vielä osan lopussa hieman laajemman ohjelman tekemistä olioita hyödyntäen. Tämä tehtävä ei sijainnistaan huolimatta liity mitenkään säännöllisiin lausekkeisiin, mutta luvun "},{"type":"element","tagName":"a","properties":{"href":"/osa-12/1-funktio-parametrina"},"children":[{"type":"text","value":"Funktio parametrina"}]},{"type":"text","value":" asia tulee olemaan tarpeen ja myös "},{"type":"element","tagName":"a","properties":{"href":"/osa-11/1-koosteet"},"children":[{"type":"text","value":"listakoosteet"}]},{"type":"text","value":" voivat olla käyttökelpoisia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sovelluksen rakenteelle voi ottaa inspiraatiota osan 10 "},{"type":"element","tagName":"a","properties":{"href":"/osa-10/4-lisaa-esimerkkeja"},"children":[{"type":"text","value":"viimeisestä luvusta"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Tilastot ojennukseen","tmcname":"osa12-15_tilastot_ojennukseen"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä tehdään sovellus, jonka avulla on mahdollista tarkastella NHL-jääkiekkoliigan tilastoja muutamassa hieman erilaisessa muodossa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjan mukana tulee kaksi json-muodossa olevaa tiedostoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"osa.json"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kaikki.json"}]},{"type":"text","value":", näistä ensimmäinen on tarkoitettu lähinnä testailun avuksi. Jälkimmäinen sisältää kaikkien kaudella 2019-20 pelanneiden pelaajien statistiikat."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yksittäisen pelaajan tiedot ovat muodossa"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"json"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-json"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-json"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"name\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Patrik Laine\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"nationality\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"FIN\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"assists\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"35"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"goals\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"28"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"penalties\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"22"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"team\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"WPG\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"games\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"68"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"ja molemmat tiedostoista sisältävät yksittäisten pelaajien tiedot taulukossa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos et muista, miten json-muotoinen tiedosto saadaan luettua Python-ohjelmaan, voit kerrata tämän "},{"type":"element","tagName":"a","properties":{"href":"/osa-7/4-datan-kasittely#json-tiedoston-lukeminen"},"children":[{"type":"text","value":"osan 7 materiaalista"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee nyt ohjelma, joka kysyy aluksi tiedoston nimeä ja tarjoaa sitten seuraavat toiminnot:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"yksittäisen pelaajan tietojen haku nimen perusteella"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"listaus joukkueiden nimien lyhenteistä (aakkosjärjestyksessä)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"listaus maiden nimien lyhenteistä (aakkosjärjestyksessä)"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Näistä toiminnoista saa yhden pisteen. Ohjelman tulee toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tiedosto: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"osa.json"}]},{"type":"text","value":"\nluettiin 14 pelaajan tiedot"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komennot:\n0 lopeta\n1 hae pelaaja\n2 joukkueet\n3 maat\n4 joukkueen pelaajat\n5 maan pelaajat\n6 eniten pisteitä\n7 eniten maaleja"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Travis Zajac"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Travis Zajac NJD  9 + 16 = 25\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nBUF\nCGY\nDAL\nNJD\nNYI\nOTT\nPIT\nWPG\nWSH"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nCAN\nCHE\nCZE\nSWE\nUSA"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että pelaajien tulostusasun pitää olla täsmälleen seuraavanlainen:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Leon Draisaitl EDM 43 + 67 = 110\nConnor McDavid EDM 34 + 63 = 97\nTravis Zajac NJD  9 + 16 = 25\nMike Green EDM 3 + 8 = 11\nMarkus Granlund EDM 3 + 1 = 4\n123456789012345678901234567890123456789\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Alimman rivin numerot on lisätty helpottamaan oikean merkkimäärän laskemista. Joukkueen nimen lyhenne siis tulostetaan alkaen rivin 22. merkistä. Plus on rivin 30. merkki ja = rivin 35. merkki. Kaikki luvut tulee tasata oikeaan reunaan omaa tulostusaluettaan. Tyhjät kohdat ovat välilyöntejä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostuksen muotoilu kannattaa hoitaa f-merkkijonoina samaan tapaan kuin "},{"type":"element","tagName":"a","properties":{"href":"/osa-6/1-tiedostojen-lukeminen#programming-exercise-kurssin-tulokset-osa-3"},"children":[{"type":"text","value":"tässä"}]},{"type":"text","value":" osan 6 tehtävässä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavat toiminnot tuovat toisen pisteen:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"joukkueen pelaajien listaaminen pisteiden (joka saadaan laskemalla "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"goals"}]},{"type":"text","value":" + "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"assits"}]},{"type":"text","value":") mukaisessa järjestyksessä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"tietyn maan pelaajien listaaminen pisteiden mukaisessa järjestyksessä"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toiminnallisuus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tiedosto: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"osa.json"}]},{"type":"text","value":"\nluettiin 14 pelaajan tiedot"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komennot:\n0 lopeta\n1 hae pelaaja\n2 joukkueet\n3 maat\n4 joukkueen pelaajat\n5 maan pelaajat\n6 eniten pisteitä\n7 eniten maaleja"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\njoukkue: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"OTT"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Drake Batherson OTT 3 + 7 = 10\nJonathan Davidsson OTT 0 + 1 = 1\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nmaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"CAN"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Jared McCann PIT 14 + 21 = 35\nTravis Zajac NJD 9 + 16 = 25\nTaylor Fedun DAL 2 + 7 = 9\nMark Jankowski CGY 5 + 2 = 7\nLogan Shaw WPG 3 + 2 = 5\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kolmannen pisteen saa seuraavilla toiminnoilla:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"n eniten pistettä saanutta pelaajaa\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"jos kahden pelaajan pistemäärä on sama, ratkaisee maalimäärä"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"n eniten maaleja ("},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"goals"}]},{"type":"text","value":") tehnyttä pelaajaa\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"jos kahden pelaajan maalimäärä on sama, järjestyksen ratkaisee se kummalla on vähemmän otteluja ("},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"games"}]},{"type":"text","value":")"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toiminnallisuus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tiedosto: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"osa.json"}]},{"type":"text","value":"\nluettiin 14 pelaajan tiedot"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komennot:\n0 lopeta\n1 hae pelaaja\n2 joukkueet\n3 maat\n4 joukkueen pelaajat\n5 maan pelaajat\n6 eniten pisteitä\n7 eniten maaleja"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"6"}]},{"type":"text","value":"\nkuinka monta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Jakub Vrana WSH 25 + 27 = 52\nJared McCann PIT 14 + 21 = 35\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"6"}]},{"type":"text","value":"\nkuinka monta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Jakub Vrana WSH 25 + 27 = 52\nJared McCann PIT 14 + 21 = 35\nJohn Klingberg DAL 6 + 26 = 32\nTravis Zajac NJD 9 + 16 = 25\nConor Sheary BUF 10 + 13 = 23\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"7"}]},{"type":"text","value":"\nkuinka monta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"6"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Jakub Vrana WSH 25 + 27 = 52\nJared McCann PIT 14 + 21 = 35\nConor Sheary BUF 10 + 13 = 23\nTravis Zajac NJD 9 + 16 = 25\nJohn Klingberg DAL 6 + 26 = 32\nMark Jankowski CGY 5 + 2 = 7\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa lopuksi osion loppukyselyyn:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"9d660c41-3094-5bf4-b084-30407dea276d"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät mitä tarkoitetan säännöllisellä lausekkeella
  • \n
  • Osaat hyödyntää säännöllisiä lausekkeita omissa ohjelmissasi
  • \n

Python on mainio työkalu tekstin käsittelemiseen. Yksi työkalu tekstin käsittelemisessä ovat\nsäännölliset lausekkeet (regular expressions), joiden avulla voi esimerkiksi poimia ja etsiä merkkijonoja, jotka ovat tietyn muotoisia. Tässä osiossa käydään läpi säännöllisten lausekkeiden perusteita, ja löydät lisää tietoa Pythonin omasta tutoriaalista.

Mitä ovat säännölliset lausekkeet?

Säännölliset lausekkeet ovat tavallaan ohjelmointikieli ohjelmointikielen sisällä. Lausekkeilla on oma syntaksinsa, jonka mukaan ne määritellään. Ideana on, että säännöllisellä lausekkeella määritellään sellaisten merkkijonojen joukko, jotka ovat tiettyjen sääntöjen mukaisia.

Tarkistellaan yksinkertaista esimerkkiä lausekkeiden käytöstä ennen tarkempaa perehtymistä sääntöihin:

import re\n\nsanat = [\"Python\", \"Ponneton\", \"Ponttooni\", \"Pullero\", \"Pallon\"]\n\nfor sana in sanat:\n    # merkkijonon tulee alkaa \"P\" ja päättyä \"on\"\n    if re.search(\"^P.*on$\", sana):\n        print(sana, \"löytyy!\")

Python löytyy!\nPonneton löytyy!\nPallon löytyy!

Pythonissa säännöllisiä lausekkeita voi käsitellä moduulin re avulla. Esimerkiksi yllä olevassa koodissa oleva metodi search etsii merkkijonosta osaa, joka täsmää annettuun säännölliseen lausekkeeseen.

Huomaa, että säännöllinen lauseke annetaan merkkijonona funktion search parametriksi.

Toinen esimerkki etsii merkkijonosta luvut. Metodi findall palauttaa kaikki säännölliseen lausekkeeseen täsmäävät osajonot listana:

import re\n\nlause = \"Eka, 2 !#kolmas 44 viisi 678xyz962\"\n\nluvut = re.findall(\"\\d+\", lause)\n\nfor luku in luvut:\n    print(luku)

2\n44\n678\n962

Säännöllisten lausekkeiden syntaksi

Tarkastellaan seuraavaksi syntaksia, jota säännöllisissä lausekkeissa käytetään. Useimmissa esimerkeissä käytetään samaa testiohjelmaa eri syötteillä.

import re\n\nlauseke = input(\"Anna lauseke: \")\n\nwhile True:\n    mjono = input(\"Anna merkkijono: \")\n    if mjono == \"\":\n        break\n    if re.search(lauseke, mjono):\n        print(\"Osuma!\")\n    else:\n        print(\"Ei osumaa.\")

Vaihtoehtoiset alijonot

Pystyviivalla voidaan erottaa vaihtoehtoisia osajonoja. Esimerkiksi lauseke 911|112 täsmää merkkijonoihin, joista löytyy joko osajono 911 tai osajono 112.

Esimerkiksi

Anna lauseke: aa|ee|ii\nAnna testijono: saapas\nOsuma!\nAnna testijono: teema\nOsuma!\nAnna testijono: iilimato\nOsuma!\nAnna testijono: ooppera\nEi osumaa.\nAnna testijono: uuttera\nEi osumaa.

Merkkijoukot

Hakasulkeiden väliin voidaan merkitä joukko hyväksyttyjä merkkejä. Esimerkiksi merkintä [aeio] täsmää jonoihin, joista löytyy jokin merkeistä a, e, i, tai o. Merkintätapa sallii myös väliviivan käytön. Merkintä [0-68a-d] hyväksyy jonot, joista löytyy numero nollasta kuuteen, kahdeksikko tai merkki väliltä a...d. Merkintä [1-3][0-9] hyväksyy kaksinumeroiset luvut väliltä 10...39.

Esimerkiksi:

Anna lauseke: [C-FRSÖ]\nAnna testijono: C\nOsuma!\nAnna testijono: E\nOsuma!\nAnna testijono: G\nEi osumaa.\nAnna testijono: R\nOsuma!\nAnna testijono: Ö\nOsuma!\nAnna testijono: T\nEi osumaa.

Toistaminen

Lausekkeen osaa voidaan toistaa esimerkiksi seuraavien operaattorien avulla:

    \n
  • * toistaa osaa minkä tahansa määrän kertoja (myös nolla)
  • \n
  • + toistaa osaa minkä tahansa määrän kertoja (ainakin yhden)
  • \n
  • {m} toistaa osaa täsmälleen m kertaa
  • \n

Operaattorit viittaavat niitä edeltävään lausekkeen osaan. Esimerkiksi lauseke ba+b hyväksyy esimerkiksi osajonot bab, baab ja baaaaaaaaaaab. Lauseke A[BCDE]*Z puolestaan hyväksyy esimerkiksi osajonot AZ, ADZ tai ABCDEBCDEBCDEZ.

Esimerkiksi:

Anna lauseke: 1[234]*5\nAnna testijono: 15\nOsuma!\nAnna testijono: 125\nOsuma!\nAnna testijono: 145\nOsuma!\nAnna testijono: 12342345\nOsuma!\nAnna testijono: 126\nEi osumaa.\nAnna testijono: 165\nEi osumaa.

Muita erikoismerkkejä

Pisteellä merkitään mitä tahansa yksittäistä merkkiä. Niinpä merkintä c...o vastaa esimerkiksi merkkijonoja c-3po tai combo. Merkillä ^ voidaan määritellä, että osuman pitää löytyä merkkijonon alusta, ja vastaavasti merkillä $, että sen on oltava lopussa. Näillä voidaan näppärästi myös rajata sääntö koskemaan vain annettuja merkkejä:

Anna lauseke: ^[123]*$\nAnna testijono: 4\nEi osumaa.\nAnna testijono: 1221\nOsuma!\nAnna testijono: 333333333\nOsuma!

Kenoviivaa voidaan käyttää etsimään erikoismerkkejä. Merkintä 1+ tarkoittaa yhtä tai useampaa ykköstä, mutta merkintä 1\\+ merkkijonoa 1+.

Esimerkiksi

Anna lauseke: ^\\*\nAnna testijono: moi*\nEi osumaa.\nAnna testijono: m*o*i\nEi osumaa.\nAnna testijono: *moi\nOsuma!

Kaarisulkeilla voidaan ryhmitellä lausekkeen osia. Esimerkiksi lauseke (ab)+c hyväksyy jonot abc, ababc ja ababababababc, mutta ei esimerkiksi jonoja ac tai bc.

Esimerkiksi

Anna lauseke: ^(jabba).*(hut)$\nAnna testijono: jabba the hut\nOsuma!\nAnna testijono: jabba a hut\nOsuma!\nAnna testijono: jarmo the hut\nEi osumaa.\nAnna testijono: jabba the smut\nEi osumaa.

Harjoitellaan hieman säännöllisten lausekkeiden käyttöä.

Viikonpäivät

Tee säännöllisen lausekkeen avulla funktio on_viikonpaiva(merkkijono: str) joka palauttaa True, jos sen parametrina saama merkkijono sisältää viikonpäivän lyhenteen (ma, ti, ke, to, pe, la tai su).

Esimerkki funktion kutsumisesta:

print(on_viikonpaiva(\"ma\"))\nprint(on_viikonpaiva(\"pe\"))\nprint(on_viikonpaiva(\"tu\"))

True\nTrue\nFalse

Vokaalitarkistus

Tee funktio kaikki_vokaaleja(merkkijono: str), joka tarkistaa säännöllisen lausekkeen avulla, ovatko parametrina annetun merkkijonon kaikki merkit vokaaleja.

Esimerkki funktion kutsumisesta:

print(kaikki_vokaaleja(\"eioueioieoieouyyyy\"))\nprint(kaikki_vokaaleja(\"autoooo\"))

True\nFalse

Kellonaika

Tee funktio kellonaika(merkkijono: str), joka tarkistaa säännöllisen lausekkeen avulla, onko parametrina oleva merkkijono muotoa tt:mm:ss oleva kellonaika (tunnit, minuutit ja sekunnit kaksinumeroisina).

Esimerkki funktion kutsumisesta:

print(kellonaika(\"12:43:01\"))\nprint(kellonaika(\"AB:01:CD\"))\nprint(kellonaika(\"17:59:59\"))\nprint(kellonaika(\"33:66:77\"))

True\nFalse\nTrue\nFalse

Loppuhuipennus

Harjoitellaan vielä osan lopussa hieman laajemman ohjelman tekemistä olioita hyödyntäen. Tämä tehtävä ei sijainnistaan huolimatta liity mitenkään säännöllisiin lausekkeisiin, mutta luvun Funktio parametrina asia tulee olemaan tarpeen ja myös listakoosteet voivat olla käyttökelpoisia.

Sovelluksen rakenteelle voi ottaa inspiraatiota osan 10 viimeisestä luvusta.

Tässä tehtävässä tehdään sovellus, jonka avulla on mahdollista tarkastella NHL-jääkiekkoliigan tilastoja muutamassa hieman erilaisessa muodossa.

Tehtäväpohjan mukana tulee kaksi json-muodossa olevaa tiedostoa osa.json ja kaikki.json, näistä ensimmäinen on tarkoitettu lähinnä testailun avuksi. Jälkimmäinen sisältää kaikkien kaudella 2019-20 pelanneiden pelaajien statistiikat.

Yksittäisen pelaajan tiedot ovat muodossa

{\n    \"name\": \"Patrik Laine\",\n    \"nationality\": \"FIN\",\n    \"assists\": 35,\n    \"goals\": 28,\n    \"penalties\": 22,\n    \"team\": \"WPG\",\n    \"games\": 68\n},

ja molemmat tiedostoista sisältävät yksittäisten pelaajien tiedot taulukossa.

Jos et muista, miten json-muotoinen tiedosto saadaan luettua Python-ohjelmaan, voit kerrata tämän osan 7 materiaalista.

Tee nyt ohjelma, joka kysyy aluksi tiedoston nimeä ja tarjoaa sitten seuraavat toiminnot:

    \n
  • yksittäisen pelaajan tietojen haku nimen perusteella
  • \n
  • listaus joukkueiden nimien lyhenteistä (aakkosjärjestyksessä)
  • \n
  • listaus maiden nimien lyhenteistä (aakkosjärjestyksessä)
  • \n

Näistä toiminnoista saa yhden pisteen. Ohjelman tulee toimia seuraavasti:

tiedosto: osa.json\nluettiin 14 pelaajan tiedot

komennot:\n0 lopeta\n1 hae pelaaja\n2 joukkueet\n3 maat\n4 joukkueen pelaajat\n5 maan pelaajat\n6 eniten pisteitä\n7 eniten maaleja

komento: 1\nnimi: Travis Zajac

\nTravis Zajac         NJD   9 + 16 =  25\n

komento: 2\nBUF\nCGY\nDAL\nNJD\nNYI\nOTT\nPIT\nWPG\nWSH

komento: 3\nCAN\nCHE\nCZE\nSWE\nUSA

komento: 0

Huomaa, että pelaajien tulostusasun pitää olla täsmälleen seuraavanlainen:

\nLeon Draisaitl       EDM  43 + 67 = 110\nConnor McDavid       EDM  34 + 63 =  97\nTravis Zajac         NJD   9 + 16 =  25\nMike Green           EDM   3 +  8 =  11\nMarkus Granlund      EDM   3 +  1 =   4\n123456789012345678901234567890123456789\n

Alimman rivin numerot on lisätty helpottamaan oikean merkkimäärän laskemista. Joukkueen nimen lyhenne siis tulostetaan alkaen rivin 22. merkistä. Plus on rivin 30. merkki ja = rivin 35. merkki. Kaikki luvut tulee tasata oikeaan reunaan omaa tulostusaluettaan. Tyhjät kohdat ovat välilyöntejä.

Tulostuksen muotoilu kannattaa hoitaa f-merkkijonoina samaan tapaan kuin tässä osan 6 tehtävässä.

Seuraavat toiminnot tuovat toisen pisteen:

    \n
  • joukkueen pelaajien listaaminen pisteiden (joka saadaan laskemalla goals + assits) mukaisessa järjestyksessä
  • \n
  • tietyn maan pelaajien listaaminen pisteiden mukaisessa järjestyksessä
  • \n

Toiminnallisuus on seuraava:

tiedosto: osa.json\nluettiin 14 pelaajan tiedot

komennot:\n0 lopeta\n1 hae pelaaja\n2 joukkueet\n3 maat\n4 joukkueen pelaajat\n5 maan pelaajat\n6 eniten pisteitä\n7 eniten maaleja

komento: 4\njoukkue: OTT

\nDrake Batherson      OTT   3 +  7 =  10\nJonathan Davidsson   OTT   0 +  1 =   1\n

komento: 5\nmaa: CAN

\nJared McCann         PIT  14 + 21 =  35\nTravis Zajac         NJD   9 + 16 =  25\nTaylor Fedun         DAL   2 +  7 =   9\nMark Jankowski       CGY   5 +  2 =   7\nLogan Shaw           WPG   3 +  2 =   5\n

komento: 0

Kolmannen pisteen saa seuraavilla toiminnoilla:

    \n
  • n eniten pistettä saanutta pelaajaa\n
      \n
    • jos kahden pelaajan pistemäärä on sama, ratkaisee maalimäärä
    • \n
    \n
  • \n
  • n eniten maaleja (goals) tehnyttä pelaajaa\n
      \n
    • jos kahden pelaajan maalimäärä on sama, järjestyksen ratkaisee se kummalla on vähemmän otteluja (games)
    • \n
    \n
  • \n

Toiminnallisuus on seuraava:

tiedosto: osa.json\nluettiin 14 pelaajan tiedot

komennot:\n0 lopeta\n1 hae pelaaja\n2 joukkueet\n3 maat\n4 joukkueen pelaajat\n5 maan pelaajat\n6 eniten pisteitä\n7 eniten maaleja

komento: 6\nkuinka monta: 2

\nJakub Vrana          WSH  25 + 27 =  52\nJared McCann         PIT  14 + 21 =  35\n

komento: 6\nkuinka monta: 5

\nJakub Vrana          WSH  25 + 27 =  52\nJared McCann         PIT  14 + 21 =  35\nJohn Klingberg       DAL   6 + 26 =  32\nTravis Zajac         NJD   9 + 16 =  25\nConor Sheary         BUF  10 + 13 =  23\n

komento: 7\nkuinka monta: 6

\nJakub Vrana          WSH  25 + 27 =  52\nJared McCann         PIT  14 + 21 =  35\nConor Sheary         BUF  10 + 13 =  23\nTravis Zajac         NJD   9 + 16 =  25\nJohn Klingberg       DAL   6 + 26 =  32\nMark Jankowski       CGY   5 +  2 =   7\n

komento: 0

Vastaa lopuksi osion loppukyselyyn:

","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-12/4-saannolliset-lausekkeet.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät mitä tarkoitetan säännöllisellä lausekkeella"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat hyödyntää säännöllisiä lausekkeita omissa ohjelmissasi"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python on mainio työkalu tekstin käsittelemiseen. Yksi työkalu tekstin käsittelemisessä ovat\n"},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"säännölliset lausekkeet"}]},{"type":"text","value":" ("},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"regular expressions"}]},{"type":"text","value":"), joiden avulla voi esimerkiksi poimia ja etsiä merkkijonoja, jotka ovat tietyn muotoisia. Tässä osiossa käydään läpi säännöllisten lausekkeiden perusteita, ja löydät lisää tietoa Pythonin omasta "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/howto/regex.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"tutoriaalista"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"h2","properties":{"id":"mita-ovat-saannolliset-lausekkeet","style":"position:relative;"},"children":[{"type":"text","value":"Mitä ovat säännölliset lausekkeet?"},{"type":"element","tagName":"a","properties":{"href":"#mita-ovat-saannolliset-lausekkeet","ariaLabel":"mita ovat saannolliset lausekkeet permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Säännölliset lausekkeet ovat tavallaan ohjelmointikieli ohjelmointikielen sisällä. Lausekkeilla on oma syntaksinsa, jonka mukaan ne määritellään. Ideana on, että säännöllisellä lausekkeella määritellään sellaisten merkkijonojen joukko, jotka ovat tiettyjen sääntöjen mukaisia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkistellaan yksinkertaista esimerkkiä lausekkeiden käytöstä ennen tarkempaa perehtymistä sääntöihin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" re\n\nsanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ponneton\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ponttooni\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pullero\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pallon\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# merkkijonon tulee alkaa \"P\" ja päättyä \"on\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" re"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"search"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"^P.*on$\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"löytyy!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python löytyy!\nPonneton löytyy!\nPallon löytyy!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa säännöllisiä lausekkeita voi käsitellä moduulin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"re"}]},{"type":"text","value":" avulla. Esimerkiksi yllä olevassa koodissa oleva metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"search"}]},{"type":"text","value":" etsii merkkijonosta osaa, joka täsmää annettuun säännölliseen lausekkeeseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että säännöllinen lauseke annetaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"merkkijonona"}]},{"type":"text","value":" funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"search"}]},{"type":"text","value":" parametriksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen esimerkki etsii merkkijonosta luvut. Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"findall"}]},{"type":"text","value":" palauttaa kaikki säännölliseen lausekkeeseen täsmäävät osajonot listana:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" re\n\nlause "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Eka, 2 !#kolmas 44 viisi 678xyz962\""}]},{"type":"text","value":"\n\nluvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" re"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"findall"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\\d+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2\n44\n678\n962"}]}]},{"type":"element","tagName":"h2","properties":{"id":"saannollisten-lausekkeiden-syntaksi","style":"position:relative;"},"children":[{"type":"text","value":"Säännöllisten lausekkeiden syntaksi"},{"type":"element","tagName":"a","properties":{"href":"#saannollisten-lausekkeiden-syntaksi","ariaLabel":"saannollisten lausekkeiden syntaksi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan seuraavaksi syntaksia, jota säännöllisissä lausekkeissa käytetään. Useimmissa esimerkeissä käytetään samaa testiohjelmaa eri syötteillä."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" re\n\nlauseke "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna lauseke: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna merkkijono: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" re"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"search"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lauseke"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Osuma!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ei osumaa.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"h3","properties":{"id":"vaihtoehtoiset-alijonot","style":"position:relative;"},"children":[{"type":"text","value":"Vaihtoehtoiset alijonot"},{"type":"element","tagName":"a","properties":{"href":"#vaihtoehtoiset-alijonot","ariaLabel":"vaihtoehtoiset alijonot permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pystyviivalla voidaan erottaa vaihtoehtoisia osajonoja. Esimerkiksi lauseke "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"911|112"}]},{"type":"text","value":" täsmää merkkijonoihin, joista löytyy joko osajono "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"911"}]},{"type":"text","value":" tai osajono "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"112"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lauseke: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"aa|ee|ii"}]},{"type":"text","value":"\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"saapas"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"teema"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"iilimato"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ooppera"}]},{"type":"text","value":"\nEi osumaa.\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"uuttera"}]},{"type":"text","value":"\nEi osumaa."}]}]},{"type":"element","tagName":"h3","properties":{"id":"merkkijoukot","style":"position:relative;"},"children":[{"type":"text","value":"Merkkijoukot"},{"type":"element","tagName":"a","properties":{"href":"#merkkijoukot","ariaLabel":"merkkijoukot permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hakasulkeiden väliin voidaan merkitä joukko hyväksyttyjä merkkejä. Esimerkiksi merkintä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[aeio]"}]},{"type":"text","value":" täsmää jonoihin, joista löytyy jokin merkeistä a, e, i, tai o. Merkintätapa sallii myös väliviivan käytön. Merkintä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[0-68a-d]"}]},{"type":"text","value":" hyväksyy jonot, joista löytyy numero nollasta kuuteen, kahdeksikko tai merkki väliltä a...d. Merkintä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[1-3][0-9]"}]},{"type":"text","value":" hyväksyy kaksinumeroiset luvut väliltä 10...39."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lauseke: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"[C-FRSÖ]"}]},{"type":"text","value":"\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"C"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"E"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"G"}]},{"type":"text","value":"\nEi osumaa.\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"R"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Ö"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"T"}]},{"type":"text","value":"\nEi osumaa."}]}]},{"type":"element","tagName":"h3","properties":{"id":"toistaminen","style":"position:relative;"},"children":[{"type":"text","value":"Toistaminen"},{"type":"element","tagName":"a","properties":{"href":"#toistaminen","ariaLabel":"toistaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lausekkeen osaa voidaan toistaa esimerkiksi seuraavien operaattorien avulla:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" toistaa osaa minkä tahansa määrän kertoja (myös nolla)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" toistaa osaa minkä tahansa määrän kertoja (ainakin yhden)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"{m}"}]},{"type":"text","value":" toistaa osaa täsmälleen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"m"}]},{"type":"text","value":" kertaa"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Operaattorit viittaavat niitä edeltävään lausekkeen osaan. Esimerkiksi lauseke "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ba+b"}]},{"type":"text","value":" hyväksyy esimerkiksi osajonot "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"bab"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"baab"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"baaaaaaaaaaab"}]},{"type":"text","value":". Lauseke "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"A[BCDE]*Z"}]},{"type":"text","value":" puolestaan hyväksyy esimerkiksi osajonot "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"AZ"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ADZ"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ABCDEBCDEBCDEZ"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lauseke: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1[234]*5"}]},{"type":"text","value":"\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"15"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"125"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"145"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"12342345"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"126"}]},{"type":"text","value":"\nEi osumaa.\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"165"}]},{"type":"text","value":"\nEi osumaa."}]}]},{"type":"element","tagName":"h3","properties":{"id":"muita-erikoismerkkeja","style":"position:relative;"},"children":[{"type":"text","value":"Muita erikoismerkkejä"},{"type":"element","tagName":"a","properties":{"href":"#muita-erikoismerkkeja","ariaLabel":"muita erikoismerkkeja permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pisteellä merkitään mitä tahansa yksittäistä merkkiä. Niinpä merkintä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"c...o"}]},{"type":"text","value":" vastaa esimerkiksi merkkijonoja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"c-3po"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"combo"}]},{"type":"text","value":". Merkillä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"^"}]},{"type":"text","value":" voidaan määritellä, että osuman pitää löytyä merkkijonon alusta, ja vastaavasti merkillä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$"}]},{"type":"text","value":", että sen on oltava lopussa. Näillä voidaan näppärästi myös rajata sääntö koskemaan vain annettuja merkkejä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lauseke: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"^[123]*$"}]},{"type":"text","value":"\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nEi osumaa.\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1221"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"333333333"}]},{"type":"text","value":"\nOsuma!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kenoviivaa voidaan käyttää etsimään erikoismerkkejä. Merkintä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"1+"}]},{"type":"text","value":" tarkoittaa yhtä tai useampaa ykköstä, mutta merkintä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"1\\+"}]},{"type":"text","value":" merkkijonoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"1+"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lauseke: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"^\\*"}]},{"type":"text","value":"\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"moi*"}]},{"type":"text","value":"\nEi osumaa.\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"m*o*i"}]},{"type":"text","value":"\nEi osumaa.\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"*moi"}]},{"type":"text","value":"\nOsuma!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kaarisulkeilla voidaan ryhmitellä lausekkeen osia. Esimerkiksi lauseke "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(ab)+c"}]},{"type":"text","value":" hyväksyy jonot "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"abc"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ababc"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ababababababc"}]},{"type":"text","value":", mutta ei esimerkiksi jonoja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ac"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"bc"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lauseke: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"^(jabba).*(hut)$"}]},{"type":"text","value":"\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"jabba the hut"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"jabba a hut"}]},{"type":"text","value":"\nOsuma!\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"jarmo the hut"}]},{"type":"text","value":"\nEi osumaa.\nAnna testijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"jabba the smut"}]},{"type":"text","value":"\nEi osumaa."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Säännölliset lausekkeet","tmcname":"osa12-14_saannolliset_lausekkeet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Harjoitellaan hieman säännöllisten lausekkeiden käyttöä."}]},{"type":"element","tagName":"h2","properties":{"id":"viikonpaivat","style":"position:relative;"},"children":[{"type":"text","value":"Viikonpäivät"},{"type":"element","tagName":"a","properties":{"href":"#viikonpaivat","ariaLabel":"viikonpaivat permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee säännöllisen lausekkeen avulla funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"on_viikonpaiva(merkkijono: str)"}]},{"type":"text","value":" joka palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", jos sen parametrina saama merkkijono sisältää viikonpäivän lyhenteen (ma, ti, ke, to, pe, la tai su)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"on_viikonpaiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ma\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"on_viikonpaiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pe\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"on_viikonpaiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\nTrue\nFalse"}]}]},{"type":"element","tagName":"h2","properties":{"id":"vokaalitarkistus","style":"position:relative;"},"children":[{"type":"text","value":"Vokaalitarkistus"},{"type":"element","tagName":"a","properties":{"href":"#vokaalitarkistus","ariaLabel":"vokaalitarkistus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kaikki_vokaaleja(merkkijono: str)"}]},{"type":"text","value":", joka tarkistaa säännöllisen lausekkeen avulla, ovatko parametrina annetun merkkijonon kaikki merkit vokaaleja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kaikki_vokaaleja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eioueioieoieouyyyy\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kaikki_vokaaleja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"autoooo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\nFalse"}]}]},{"type":"element","tagName":"h2","properties":{"id":"kellonaika","style":"position:relative;"},"children":[{"type":"text","value":"Kellonaika"},{"type":"element","tagName":"a","properties":{"href":"#kellonaika","ariaLabel":"kellonaika permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kellonaika(merkkijono: str)"}]},{"type":"text","value":", joka tarkistaa säännöllisen lausekkeen avulla, onko parametrina oleva merkkijono muotoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tt:mm:ss"}]},{"type":"text","value":" oleva kellonaika (tunnit, minuutit ja sekunnit kaksinumeroisina)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kellonaika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12:43:01\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kellonaika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"AB:01:CD\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kellonaika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"17:59:59\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kellonaika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"33:66:77\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\nFalse\nTrue\nFalse"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"loppuhuipennus","style":"position:relative;"},"children":[{"type":"text","value":"Loppuhuipennus"},{"type":"element","tagName":"a","properties":{"href":"#loppuhuipennus","ariaLabel":"loppuhuipennus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Harjoitellaan vielä osan lopussa hieman laajemman ohjelman tekemistä olioita hyödyntäen. Tämä tehtävä ei sijainnistaan huolimatta liity mitenkään säännöllisiin lausekkeisiin, mutta luvun "},{"type":"element","tagName":"a","properties":{"href":"/osa-12/1-funktio-parametrina"},"children":[{"type":"text","value":"Funktio parametrina"}]},{"type":"text","value":" asia tulee olemaan tarpeen ja myös "},{"type":"element","tagName":"a","properties":{"href":"/osa-11/1-koosteet"},"children":[{"type":"text","value":"listakoosteet"}]},{"type":"text","value":" voivat olla käyttökelpoisia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sovelluksen rakenteelle voi ottaa inspiraatiota osan 10 "},{"type":"element","tagName":"a","properties":{"href":"/osa-10/4-lisaa-esimerkkeja"},"children":[{"type":"text","value":"viimeisestä luvusta"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Tilastot ojennukseen","tmcname":"osa12-15_tilastot_ojennukseen"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä tehdään sovellus, jonka avulla on mahdollista tarkastella NHL-jääkiekkoliigan tilastoja muutamassa hieman erilaisessa muodossa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjan mukana tulee kaksi json-muodossa olevaa tiedostoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"osa.json"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kaikki.json"}]},{"type":"text","value":", näistä ensimmäinen on tarkoitettu lähinnä testailun avuksi. Jälkimmäinen sisältää kaikkien kaudella 2019-20 pelanneiden pelaajien statistiikat."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yksittäisen pelaajan tiedot ovat muodossa"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"json"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-json"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-json"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"name\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Patrik Laine\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"nationality\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"FIN\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"assists\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"35"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"goals\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"28"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"penalties\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"22"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"team\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"WPG\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"games\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"68"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"ja molemmat tiedostoista sisältävät yksittäisten pelaajien tiedot taulukossa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos et muista, miten json-muotoinen tiedosto saadaan luettua Python-ohjelmaan, voit kerrata tämän "},{"type":"element","tagName":"a","properties":{"href":"/osa-7/4-datan-kasittely#json-tiedoston-lukeminen"},"children":[{"type":"text","value":"osan 7 materiaalista"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee nyt ohjelma, joka kysyy aluksi tiedoston nimeä ja tarjoaa sitten seuraavat toiminnot:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"yksittäisen pelaajan tietojen haku nimen perusteella"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"listaus joukkueiden nimien lyhenteistä (aakkosjärjestyksessä)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"listaus maiden nimien lyhenteistä (aakkosjärjestyksessä)"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Näistä toiminnoista saa yhden pisteen. Ohjelman tulee toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tiedosto: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"osa.json"}]},{"type":"text","value":"\nluettiin 14 pelaajan tiedot"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komennot:\n0 lopeta\n1 hae pelaaja\n2 joukkueet\n3 maat\n4 joukkueen pelaajat\n5 maan pelaajat\n6 eniten pisteitä\n7 eniten maaleja"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Travis Zajac"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Travis Zajac NJD  9 + 16 = 25\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nBUF\nCGY\nDAL\nNJD\nNYI\nOTT\nPIT\nWPG\nWSH"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nCAN\nCHE\nCZE\nSWE\nUSA"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että pelaajien tulostusasun pitää olla täsmälleen seuraavanlainen:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Leon Draisaitl EDM 43 + 67 = 110\nConnor McDavid EDM 34 + 63 = 97\nTravis Zajac NJD  9 + 16 = 25\nMike Green EDM 3 + 8 = 11\nMarkus Granlund EDM 3 + 1 = 4\n123456789012345678901234567890123456789\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Alimman rivin numerot on lisätty helpottamaan oikean merkkimäärän laskemista. Joukkueen nimen lyhenne siis tulostetaan alkaen rivin 22. merkistä. Plus on rivin 30. merkki ja = rivin 35. merkki. Kaikki luvut tulee tasata oikeaan reunaan omaa tulostusaluettaan. Tyhjät kohdat ovat välilyöntejä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostuksen muotoilu kannattaa hoitaa f-merkkijonoina samaan tapaan kuin "},{"type":"element","tagName":"a","properties":{"href":"/osa-6/1-tiedostojen-lukeminen#programming-exercise-kurssin-tulokset-osa-3"},"children":[{"type":"text","value":"tässä"}]},{"type":"text","value":" osan 6 tehtävässä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavat toiminnot tuovat toisen pisteen:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"joukkueen pelaajien listaaminen pisteiden (joka saadaan laskemalla "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"goals"}]},{"type":"text","value":" + "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"assits"}]},{"type":"text","value":") mukaisessa järjestyksessä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"tietyn maan pelaajien listaaminen pisteiden mukaisessa järjestyksessä"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toiminnallisuus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tiedosto: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"osa.json"}]},{"type":"text","value":"\nluettiin 14 pelaajan tiedot"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komennot:\n0 lopeta\n1 hae pelaaja\n2 joukkueet\n3 maat\n4 joukkueen pelaajat\n5 maan pelaajat\n6 eniten pisteitä\n7 eniten maaleja"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\njoukkue: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"OTT"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Drake Batherson OTT 3 + 7 = 10\nJonathan Davidsson OTT 0 + 1 = 1\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nmaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"CAN"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Jared McCann PIT 14 + 21 = 35\nTravis Zajac NJD 9 + 16 = 25\nTaylor Fedun DAL 2 + 7 = 9\nMark Jankowski CGY 5 + 2 = 7\nLogan Shaw WPG 3 + 2 = 5\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kolmannen pisteen saa seuraavilla toiminnoilla:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"n eniten pistettä saanutta pelaajaa\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"jos kahden pelaajan pistemäärä on sama, ratkaisee maalimäärä"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"n eniten maaleja ("},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"goals"}]},{"type":"text","value":") tehnyttä pelaajaa\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"jos kahden pelaajan maalimäärä on sama, järjestyksen ratkaisee se kummalla on vähemmän otteluja ("},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"games"}]},{"type":"text","value":")"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toiminnallisuus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tiedosto: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"osa.json"}]},{"type":"text","value":"\nluettiin 14 pelaajan tiedot"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komennot:\n0 lopeta\n1 hae pelaaja\n2 joukkueet\n3 maat\n4 joukkueen pelaajat\n5 maan pelaajat\n6 eniten pisteitä\n7 eniten maaleja"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"6"}]},{"type":"text","value":"\nkuinka monta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Jakub Vrana WSH 25 + 27 = 52\nJared McCann PIT 14 + 21 = 35\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"6"}]},{"type":"text","value":"\nkuinka monta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Jakub Vrana WSH 25 + 27 = 52\nJared McCann PIT 14 + 21 = 35\nJohn Klingberg DAL 6 + 26 = 32\nTravis Zajac NJD 9 + 16 = 25\nConor Sheary BUF 10 + 13 = 23\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"7"}]},{"type":"text","value":"\nkuinka monta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"6"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Jakub Vrana WSH 25 + 27 = 52\nJared McCann PIT 14 + 21 = 35\nConor Sheary BUF 10 + 13 = 23\nTravis Zajac NJD 9 + 16 = 25\nJohn Klingberg DAL 6 + 26 = 32\nMark Jankowski CGY 5 + 2 = 7\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa lopuksi osion loppukyselyyn:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"9d660c41-3094-5bf4-b084-30407dea276d"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät mitä tarkoitetan säännöllisellä lausekkeella
  • \n
  • Osaat hyödyntää säännöllisiä lausekkeita omissa ohjelmissasi
  • \n

Python on mainio työkalu tekstin käsittelemiseen. Yksi työkalu tekstin käsittelemisessä ovat\nsäännölliset lausekkeet (regular expressions), joiden avulla voi esimerkiksi poimia ja etsiä merkkijonoja, jotka ovat tietyn muotoisia. Tässä osiossa käydään läpi säännöllisten lausekkeiden perusteita, ja löydät lisää tietoa Pythonin omasta tutoriaalista.

Mitä ovat säännölliset lausekkeet?

Säännölliset lausekkeet ovat tavallaan ohjelmointikieli ohjelmointikielen sisällä. Lausekkeilla on oma syntaksinsa, jonka mukaan ne määritellään. Ideana on, että säännöllisellä lausekkeella määritellään sellaisten merkkijonojen joukko, jotka ovat tiettyjen sääntöjen mukaisia.

Tarkistellaan yksinkertaista esimerkkiä lausekkeiden käytöstä ennen tarkempaa perehtymistä sääntöihin:

import re\n\nsanat = [\"Python\", \"Ponneton\", \"Ponttooni\", \"Pullero\", \"Pallon\"]\n\nfor sana in sanat:\n    # merkkijonon tulee alkaa \"P\" ja päättyä \"on\"\n    if re.search(\"^P.*on$\", sana):\n        print(sana, \"löytyy!\")

Python löytyy!\nPonneton löytyy!\nPallon löytyy!

Pythonissa säännöllisiä lausekkeita voi käsitellä moduulin re avulla. Esimerkiksi yllä olevassa koodissa oleva metodi search etsii merkkijonosta osaa, joka täsmää annettuun säännölliseen lausekkeeseen.

Huomaa, että säännöllinen lauseke annetaan merkkijonona funktion search parametriksi.

Toinen esimerkki etsii merkkijonosta luvut. Metodi findall palauttaa kaikki säännölliseen lausekkeeseen täsmäävät osajonot listana:

import re\n\nlause = \"Eka, 2 !#kolmas 44 viisi 678xyz962\"\n\nluvut = re.findall(\"\\d+\", lause)\n\nfor luku in luvut:\n    print(luku)

2\n44\n678\n962

Säännöllisten lausekkeiden syntaksi

Tarkastellaan seuraavaksi syntaksia, jota säännöllisissä lausekkeissa käytetään. Useimmissa esimerkeissä käytetään samaa testiohjelmaa eri syötteillä.

import re\n\nlauseke = input(\"Anna lauseke: \")\n\nwhile True:\n    mjono = input(\"Anna merkkijono: \")\n    if mjono == \"\":\n        break\n    if re.search(lauseke, mjono):\n        print(\"Osuma!\")\n    else:\n        print(\"Ei osumaa.\")

Vaihtoehtoiset alijonot

Pystyviivalla voidaan erottaa vaihtoehtoisia osajonoja. Esimerkiksi lauseke 911|112 täsmää merkkijonoihin, joista löytyy joko osajono 911 tai osajono 112.

Esimerkiksi

Anna lauseke: aa|ee|ii\nAnna testijono: saapas\nOsuma!\nAnna testijono: teema\nOsuma!\nAnna testijono: iilimato\nOsuma!\nAnna testijono: ooppera\nEi osumaa.\nAnna testijono: uuttera\nEi osumaa.

Merkkijoukot

Hakasulkeiden väliin voidaan merkitä joukko hyväksyttyjä merkkejä. Esimerkiksi merkintä [aeio] täsmää jonoihin, joista löytyy jokin merkeistä a, e, i, tai o. Merkintätapa sallii myös väliviivan käytön. Merkintä [0-68a-d] hyväksyy jonot, joista löytyy numero nollasta kuuteen, kahdeksikko tai merkki väliltä a...d. Merkintä [1-3][0-9] hyväksyy kaksinumeroiset luvut väliltä 10...39.

Esimerkiksi:

Anna lauseke: [C-FRSÖ]\nAnna testijono: C\nOsuma!\nAnna testijono: E\nOsuma!\nAnna testijono: G\nEi osumaa.\nAnna testijono: R\nOsuma!\nAnna testijono: Ö\nOsuma!\nAnna testijono: T\nEi osumaa.

Toistaminen

Lausekkeen osaa voidaan toistaa esimerkiksi seuraavien operaattorien avulla:

    \n
  • * toistaa osaa minkä tahansa määrän kertoja (myös nolla)
  • \n
  • + toistaa osaa minkä tahansa määrän kertoja (ainakin yhden)
  • \n
  • {m} toistaa osaa täsmälleen m kertaa
  • \n

Operaattorit viittaavat niitä edeltävään lausekkeen osaan. Esimerkiksi lauseke ba+b hyväksyy esimerkiksi osajonot bab, baab ja baaaaaaaaaaab. Lauseke A[BCDE]*Z puolestaan hyväksyy esimerkiksi osajonot AZ, ADZ tai ABCDEBCDEBCDEZ.

Esimerkiksi:

Anna lauseke: 1[234]*5\nAnna testijono: 15\nOsuma!\nAnna testijono: 125\nOsuma!\nAnna testijono: 145\nOsuma!\nAnna testijono: 12342345\nOsuma!\nAnna testijono: 126\nEi osumaa.\nAnna testijono: 165\nEi osumaa.

Muita erikoismerkkejä

Pisteellä merkitään mitä tahansa yksittäistä merkkiä. Niinpä merkintä c...o vastaa esimerkiksi merkkijonoja c-3po tai combo. Merkillä ^ voidaan määritellä, että osuman pitää löytyä merkkijonon alusta, ja vastaavasti merkillä $, että sen on oltava lopussa. Näillä voidaan näppärästi myös rajata sääntö koskemaan vain annettuja merkkejä:

Anna lauseke: ^[123]*$\nAnna testijono: 4\nEi osumaa.\nAnna testijono: 1221\nOsuma!\nAnna testijono: 333333333\nOsuma!

Kenoviivaa voidaan käyttää etsimään erikoismerkkejä. Merkintä 1+ tarkoittaa yhtä tai useampaa ykköstä, mutta merkintä 1\\+ merkkijonoa 1+.

Esimerkiksi

Anna lauseke: ^\\*\nAnna testijono: moi*\nEi osumaa.\nAnna testijono: m*o*i\nEi osumaa.\nAnna testijono: *moi\nOsuma!

Kaarisulkeilla voidaan ryhmitellä lausekkeen osia. Esimerkiksi lauseke (ab)+c hyväksyy jonot abc, ababc ja ababababababc, mutta ei esimerkiksi jonoja ac tai bc.

Esimerkiksi

Anna lauseke: ^(jabba).*(hut)$\nAnna testijono: jabba the hut\nOsuma!\nAnna testijono: jabba a hut\nOsuma!\nAnna testijono: jarmo the hut\nEi osumaa.\nAnna testijono: jabba the smut\nEi osumaa.

Harjoitellaan hieman säännöllisten lausekkeiden käyttöä.

Viikonpäivät

Tee säännöllisen lausekkeen avulla funktio on_viikonpaiva(merkkijono: str) joka palauttaa True, jos sen parametrina saama merkkijono sisältää viikonpäivän lyhenteen (ma, ti, ke, to, pe, la tai su).

Esimerkki funktion kutsumisesta:

print(on_viikonpaiva(\"ma\"))\nprint(on_viikonpaiva(\"pe\"))\nprint(on_viikonpaiva(\"tu\"))

True\nTrue\nFalse

Vokaalitarkistus

Tee funktio kaikki_vokaaleja(merkkijono: str), joka tarkistaa säännöllisen lausekkeen avulla, ovatko parametrina annetun merkkijonon kaikki merkit vokaaleja.

Esimerkki funktion kutsumisesta:

print(kaikki_vokaaleja(\"eioueioieoieouyyyy\"))\nprint(kaikki_vokaaleja(\"autoooo\"))

True\nFalse

Kellonaika

Tee funktio kellonaika(merkkijono: str), joka tarkistaa säännöllisen lausekkeen avulla, onko parametrina oleva merkkijono muotoa tt:mm:ss oleva kellonaika (tunnit, minuutit ja sekunnit kaksinumeroisina).

Esimerkki funktion kutsumisesta:

print(kellonaika(\"12:43:01\"))\nprint(kellonaika(\"AB:01:CD\"))\nprint(kellonaika(\"17:59:59\"))\nprint(kellonaika(\"33:66:77\"))

True\nFalse\nTrue\nFalse

Loppuhuipennus

Harjoitellaan vielä osan lopussa hieman laajemman ohjelman tekemistä olioita hyödyntäen. Tämä tehtävä ei sijainnistaan huolimatta liity mitenkään säännöllisiin lausekkeisiin, mutta luvun Funktio parametrina asia tulee olemaan tarpeen ja myös listakoosteet voivat olla käyttökelpoisia.

Sovelluksen rakenteelle voi ottaa inspiraatiota osan 10 viimeisestä luvusta.

Tässä tehtävässä tehdään sovellus, jonka avulla on mahdollista tarkastella NHL-jääkiekkoliigan tilastoja muutamassa hieman erilaisessa muodossa.

Tehtäväpohjan mukana tulee kaksi json-muodossa olevaa tiedostoa osa.json ja kaikki.json, näistä ensimmäinen on tarkoitettu lähinnä testailun avuksi. Jälkimmäinen sisältää kaikkien kaudella 2019-20 pelanneiden pelaajien statistiikat.

Yksittäisen pelaajan tiedot ovat muodossa

{\n    \"name\": \"Patrik Laine\",\n    \"nationality\": \"FIN\",\n    \"assists\": 35,\n    \"goals\": 28,\n    \"penalties\": 22,\n    \"team\": \"WPG\",\n    \"games\": 68\n},

ja molemmat tiedostoista sisältävät yksittäisten pelaajien tiedot taulukossa.

Jos et muista, miten json-muotoinen tiedosto saadaan luettua Python-ohjelmaan, voit kerrata tämän osan 7 materiaalista.

Tee nyt ohjelma, joka kysyy aluksi tiedoston nimeä ja tarjoaa sitten seuraavat toiminnot:

    \n
  • yksittäisen pelaajan tietojen haku nimen perusteella
  • \n
  • listaus joukkueiden nimien lyhenteistä (aakkosjärjestyksessä)
  • \n
  • listaus maiden nimien lyhenteistä (aakkosjärjestyksessä)
  • \n

Näistä toiminnoista saa yhden pisteen. Ohjelman tulee toimia seuraavasti:

tiedosto: osa.json\nluettiin 14 pelaajan tiedot

komennot:\n0 lopeta\n1 hae pelaaja\n2 joukkueet\n3 maat\n4 joukkueen pelaajat\n5 maan pelaajat\n6 eniten pisteitä\n7 eniten maaleja

komento: 1\nnimi: Travis Zajac

\nTravis Zajac         NJD   9 + 16 =  25\n

komento: 2\nBUF\nCGY\nDAL\nNJD\nNYI\nOTT\nPIT\nWPG\nWSH

komento: 3\nCAN\nCHE\nCZE\nSWE\nUSA

komento: 0

Huomaa, että pelaajien tulostusasun pitää olla täsmälleen seuraavanlainen:

\nLeon Draisaitl       EDM  43 + 67 = 110\nConnor McDavid       EDM  34 + 63 =  97\nTravis Zajac         NJD   9 + 16 =  25\nMike Green           EDM   3 +  8 =  11\nMarkus Granlund      EDM   3 +  1 =   4\n123456789012345678901234567890123456789\n

Alimman rivin numerot on lisätty helpottamaan oikean merkkimäärän laskemista. Joukkueen nimen lyhenne siis tulostetaan alkaen rivin 22. merkistä. Plus on rivin 30. merkki ja = rivin 35. merkki. Kaikki luvut tulee tasata oikeaan reunaan omaa tulostusaluettaan. Tyhjät kohdat ovat välilyöntejä.

Tulostuksen muotoilu kannattaa hoitaa f-merkkijonoina samaan tapaan kuin tässä osan 6 tehtävässä.

Seuraavat toiminnot tuovat toisen pisteen:

    \n
  • joukkueen pelaajien listaaminen pisteiden (joka saadaan laskemalla goals + assits) mukaisessa järjestyksessä
  • \n
  • tietyn maan pelaajien listaaminen pisteiden mukaisessa järjestyksessä
  • \n

Toiminnallisuus on seuraava:

tiedosto: osa.json\nluettiin 14 pelaajan tiedot

komennot:\n0 lopeta\n1 hae pelaaja\n2 joukkueet\n3 maat\n4 joukkueen pelaajat\n5 maan pelaajat\n6 eniten pisteitä\n7 eniten maaleja

komento: 4\njoukkue: OTT

\nDrake Batherson      OTT   3 +  7 =  10\nJonathan Davidsson   OTT   0 +  1 =   1\n

komento: 5\nmaa: CAN

\nJared McCann         PIT  14 + 21 =  35\nTravis Zajac         NJD   9 + 16 =  25\nTaylor Fedun         DAL   2 +  7 =   9\nMark Jankowski       CGY   5 +  2 =   7\nLogan Shaw           WPG   3 +  2 =   5\n

komento: 0

Kolmannen pisteen saa seuraavilla toiminnoilla:

    \n
  • n eniten pistettä saanutta pelaajaa\n
      \n
    • jos kahden pelaajan pistemäärä on sama, ratkaisee maalimäärä
    • \n
    \n
  • \n
  • n eniten maaleja (goals) tehnyttä pelaajaa\n
      \n
    • jos kahden pelaajan maalimäärä on sama, järjestyksen ratkaisee se kummalla on vähemmän otteluja (games)
    • \n
    \n
  • \n

Toiminnallisuus on seuraava:

tiedosto: osa.json\nluettiin 14 pelaajan tiedot

komennot:\n0 lopeta\n1 hae pelaaja\n2 joukkueet\n3 maat\n4 joukkueen pelaajat\n5 maan pelaajat\n6 eniten pisteitä\n7 eniten maaleja

komento: 6\nkuinka monta: 2

\nJakub Vrana          WSH  25 + 27 =  52\nJared McCann         PIT  14 + 21 =  35\n

komento: 6\nkuinka monta: 5

\nJakub Vrana          WSH  25 + 27 =  52\nJared McCann         PIT  14 + 21 =  35\nJohn Klingberg       DAL   6 + 26 =  32\nTravis Zajac         NJD   9 + 16 =  25\nConor Sheary         BUF  10 + 13 =  23\n

komento: 7\nkuinka monta: 6

\nJakub Vrana          WSH  25 + 27 =  52\nJared McCann         PIT  14 + 21 =  35\nConor Sheary         BUF  10 + 13 =  23\nTravis Zajac         NJD   9 + 16 =  25\nJohn Klingberg       DAL   6 + 26 =  32\nMark Jankowski       CGY   5 +  2 =   7\n

komento: 0

Vastaa lopuksi osion loppukyselyyn:

","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-12/4-saannolliset-lausekkeet.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-12/page-data.json b/page-data/osa-12/page-data.json index a51ead469..af085a810 100644 --- a/page-data/osa-12/page-data.json +++ b/page-data/osa-12/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-part-overview-template-js", "path": "/osa-12", - "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-12","title":"Osa 12"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-12/index.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-12","title":"Osa 12"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-12/index.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-13/1-pygame-kayttoon/page-data.json b/page-data/osa-13/1-pygame-kayttoon/page-data.json index bf0031145..67b5ffd25 100644 --- a/page-data/osa-13/1-pygame-kayttoon/page-data.json +++ b/page-data/osa-13/1-pygame-kayttoon/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-13/1-pygame-kayttoon", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Olet asentanut Pygame-kirjaston koneellesi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat luoda ikkunan ja sulkea ohjelman"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat piirtää ikkunaan tiedostossa olevan kuvan"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kurssin kahdella viimeisellä viikolla tutustumme Pygame-kirjastoon, joka on peliohjelmointiin tarkoitettu Python-kirjasto. Pygamen avulla pystyy piirtämään grafiikkaa, käsittelemään näppäimistön ja hiiren tapahtumia ja tekemään muuta peleissä tarvittavaa."}]},{"type":"element","tagName":"h2","properties":{"id":"pygamen-asentaminen","style":"position:relative;"},"children":[{"type":"text","value":"Pygamen asentaminen"},{"type":"element","tagName":"a","properties":{"href":"#pygamen-asentaminen","ariaLabel":"pygamen asentaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"h3","properties":{"id":"linux","style":"position:relative;"},"children":[{"type":"text","value":"Linux"},{"type":"element","tagName":"a","properties":{"href":"#linux","ariaLabel":"linux permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Avaa komentorivi ja kirjoita "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pip3 install pygame"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 399px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/a92634cb53af0aa1734e9ca12ca79562/a307d/pygame_linux.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 60.434782608695656%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAyElEQVQoz+2Oy26CYBSE/5XXxssTKAWqUQSixmorKhEEfgQv7/8un8FqorELFm5MXHyZyZnJ5IhEBgSeyy4Oz5rGIZG/JokC9lvJerVgn0gOaYwMPOLQ57jbMp994/w8IrzuL5G5YtNzWKoTpOkSGkuc1oh07HOcRrj6FLOmYje/sBr6n9a1fxFWVWNY62B/6FgVDbuqk93Mssqo3j1nme8X2hhF5cKtv0cYJYV+VigpD2T3azYof+ZC5C3mHc09+PQP34MvPHgC7r1OntPJWSAAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/a92634cb53af0aa1734e9ca12ca79562/a0b58/pygame_linux.webp 230w","/static/a92634cb53af0aa1734e9ca12ca79562/66086/pygame_linux.webp 399w"],"sizes":"(max-width: 399px) 100vw, 399px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/a92634cb53af0aa1734e9ca12ca79562/81c8e/pygame_linux.png 230w","/static/a92634cb53af0aa1734e9ca12ca79562/a307d/pygame_linux.png 399w"],"sizes":"(max-width: 399px) 100vw, 399px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/a92634cb53af0aa1734e9ca12ca79562/a307d/pygame_linux.png","alt":"pygame linux","title":"pygame linux","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"h3","properties":{"id":"windows","style":"position:relative;"},"children":[{"type":"text","value":"Windows"},{"type":"element","tagName":"a","properties":{"href":"#windows","ariaLabel":"windows permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Avaa Windowsin terminaali napauttamalla vasemman alakulman Windows-painiketta. Kirjoita aukeavaan ikkunaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"cmd"}]},{"type":"text","value":" ja paina enter:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 392px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/76954afbb36ac5953d205b7cdab98ff6/0acb4/13_1_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 173.47826086956525%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAjCAIAAAAblL1PAAAACXBIWXMAAA7DAAAOwwHHb6hkAAADp0lEQVRIx+2VT0gjVxzHp0g1kwlqNEmJqUTblB6EPewaEKGlINKlhW5Peyhb2GNPwkIPhUJvPRVakP6hQr0UlvoHm6yaSfaSVTdqEpdQt8ZsTGidxJ3JG2cmk0ky+fPevDKZVUrQrnruly+PuXze7/d+v/d7Q9hsNovFEgwGYUu1Wq3RaGiaJsuypmn4P0W43e6BgYHl5eVMJoMQKhQKsixDCBOJBITwPKxeryOEiJ6ens7OziBNY4xVVW02GkjTjJjay0QMDg66XK7FhYVcLndwcPB0d1dRFIPELxPhdDrtNtt3vz7YFfBGVt7IlsJpMZyWwmnxUVoKPxPXs0rk7+qZ1tOmKOqLb2fffW/i3tc/LCT4n0N/zDx8OvPwz9lw6qdA4n40v5yq+PZK/qTSZsJqtVos1Jff//bVjO/HQOJ+7PncE/AgVfUly/79si9Z9iWV3/dKZ1qHzaRpdiHAIfzsuL73vLLHVfdB7dQpUD/PLdhspldX/soe8IXCBUv1omBWq5UkyUBAb5VcKgHAHzJMVVUxxlBDSNNOrWm4zTpsMpGhUBBjLAgCy7KpVKpcLl8kBaNglvn5+XQ6I4kSAEBRlGKxCAAoFAo8zx8fH7Msq7ZyadtOhymKWlxcPDo6KhaLHMcBAGRZFgQBtCSKIsdxjUbj3Mhzc3PJ5L4sy7lcDgDAMAzLshzHGVvwPM+yLMMw+Xz+3xf+ReSlpSUAQLlcBgBIkiQIgrEqiiJJUrFYNHIRBAEh1F7t1dVVURQzmUw+n89mszzPX7RgJEnSNN1sNhVFqVQqqqrWarXmidomycAghPpUnfQ5YAwzwzDValU8kSAIZ8avVCr6PLf6bAqFQsZ++DL6H74s3NfXR5LkFWHj6b0i7Ha7nU4n3Xq3Lw17PB632x0IBK4C9/b2Xv3MY2NjXq/X7/efXvdLwA6Hg6KolZUVjHGtVoMQ1i8svVUGXK/XeZ4/PDxUVRUhpGGMEEIQYg1BCJGm6StCuPUBNQQRJCiK6ujomJ6ejsVi4XCYpulIJPJkJ76x9mh7OxqJxdY2t3biO4/XH29H41ubW+vrkXg8Hl3bjG1FCa/XOzk5SRD677Krq2t4+I3B113Eq+bR21P9Dvv4a92fjnsIgrj74biru+v66Jt3PnnnFYKw3r1mfqufGBoaGhkZMZlMDofDbDbb7HZ7v9Uy4Jn65pebH30wcX3is1t3eoff/vjzqWs3bozevHV76l5vn936vqd7yP4P6JyrnQ25/+oAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/76954afbb36ac5953d205b7cdab98ff6/a0b58/13_1_1.webp 230w","/static/76954afbb36ac5953d205b7cdab98ff6/86099/13_1_1.webp 392w"],"sizes":"(max-width: 392px) 100vw, 392px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/76954afbb36ac5953d205b7cdab98ff6/81c8e/13_1_1.png 230w","/static/76954afbb36ac5953d205b7cdab98ff6/0acb4/13_1_1.png 392w"],"sizes":"(max-width: 392px) 100vw, 392px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/76954afbb36ac5953d205b7cdab98ff6/0acb4/13_1_1.png","alt":"13 1 1","title":"13 1 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita auenneeeseen komentokehoteikkunaan seuraava komentosarja ja paina "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"enter"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pip3 install pygame"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä asentaa Pygame-paketin koneellesi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Asennus voi vaatia järjestelmänvalvojan oikeuksia. Jos ylläoleva ei toimi, voit yrittää ajaa terminaalin järjestelmänvalvojana (valitse Windows-valikko, paina hiiren kakkospainiketta CMD-valinnan päällä ja valitse \"Run as administrator\" tai \"Aja järjestelmänvalvojana\")."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että asennus vaatii että olet asennusvaiheessa ohjeiden mukaisesti valinnut kohdan \"Add Python 3.XX to path\", katso "},{"type":"element","tagName":"a","properties":{"href":"https://www.mooc.fi/fi/installation/vscode#python3","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"ohjeet"}]}]},{"type":"element","tagName":"h3","properties":{"id":"mac","style":"position:relative;"},"children":[{"type":"text","value":"Mac"},{"type":"element","tagName":"a","properties":{"href":"#mac","ariaLabel":"mac permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Avaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Terminaali"}]},{"type":"text","value":", esim. painamalla oikean yläkulman suurennuslasi-symbolia:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 746px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/77ceacb61dfaf80c7c442a4225b65e87/62de4/13-1-2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 24.347826086956523%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAABYlAAAWJQFJUiTwAAABGUlEQVQY02OYs2Rje9/sSTOWzlmycdKsZVPmrJg6Z+WC5Zt7py7s6J/dO2nehDnLW6bOb+mftWD55oUrN/VPXVNRPW3SzEVzlqxn0Lf207Hw1rPyhTF89Kx99W38tM08VE3dZE2c7S18z7gX99gnqll7G9n6alt6q5u561l56lv7MLCIaLGIaLGKaLMIQ0kWYU1GIQ1GYU1JMf1QKbs6OY9OeW8DcVMGQTUWIQ1mYQ1WEU0mIQ1mQXUGPnkzEJIzhSBeOVMeWRNZOQtHRYdAZRdzBTt+OVMGaQMOWWOQrKwJCMlASGMGfgVzfjlTXhkjXlljXhlDHil9PmkDNRlTKRkTNlljVjkTPnkzIXlzPnlzXpDRUJvAbFMAjAFKS35RLdoAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/77ceacb61dfaf80c7c442a4225b65e87/a0b58/13-1-2.webp 230w","/static/77ceacb61dfaf80c7c442a4225b65e87/bc10c/13-1-2.webp 460w","/static/77ceacb61dfaf80c7c442a4225b65e87/f7ebd/13-1-2.webp 746w"],"sizes":"(max-width: 746px) 100vw, 746px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/77ceacb61dfaf80c7c442a4225b65e87/81c8e/13-1-2.png 230w","/static/77ceacb61dfaf80c7c442a4225b65e87/08a84/13-1-2.png 460w","/static/77ceacb61dfaf80c7c442a4225b65e87/62de4/13-1-2.png 746w"],"sizes":"(max-width: 746px) 100vw, 746px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/77ceacb61dfaf80c7c442a4225b65e87/62de4/13-1-2.png","alt":"13 1 2","title":"13 1 2","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita aukeavaan teksikenttään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"terminal"}]},{"type":"text","value":" ja paina enter:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/a310ec5ccf9438989514ad8da107dcc3/47218/13-1-3.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 66.95652173913044%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAABYlAAAWJQFJUiTwAAACa0lEQVQozy2STXLTQBCFdYFwgzh3IlmFDeQGkAQ2LKGo4hBAQhWp7FglQMohln8iO7Yly7JkzWime370M5LsACeg5KTq23W97ur3njX3poNup2t3Bv0+53z9+aL63ilGcx1zlRZK50pnSmdCapQKUQHKvCi/nZ0PnKFlDyZt22nbo+vu3cQnvhP4HvEXHEArnUn1qASUHAQHAahUmg+c0cwPrIOP3dcn+PbcvDw1h6fF8Vn55swcfjVOkJs8lypXOi9MvVr/Xf/5V5Q1CiVUWlYrqVLr99XNz+vBzdB3PDKeM2/BZyF4IeeodZoJmZqy/vTl5PmLg929vXfvPxSm0UuVAUirb/fa1+3e7W0UkygmhFCaJJRSFFKoFIQq6/XR8fHOTuvJ1tbT3T1TrQGl0hmgsJxhMBxPnYnrBVFMgaFuAM1AMZCUYW7ql6+Otre3W63W/v6zLDeMI0rNAK1Ob2L3h+2b3tW17frhkkAYs3DJ4gQJEyRBDspx7i4vf11c/Oh0eknCCWEJw0UYW+4s6N+OnOHE88NFRBdLuohoEBHKxcNxAIkgXW8+Hk8TyilhyyWlCUw93/LcmTube37QpJLmchOPUBnKdIMWQgMIShkhjDHgXHCOHCRNuEVRzfxgNJ66ng/YxCBUo0GhUahHUAmppUql1KIhlSprfg4TGS1JGMVhFLPGx2bQ3NyIYQMKHUZkPPFcz3+ojc7yxu04pjFJHiCUMY4gFEeVbKymDBgXwWLpDO96fcfu9jmI5i+ZMY6WTvMGnWmdZXluTFlWa1OtTFkXpipMWZgKmmKiaJaKsqrr1X29ui/L+j/LRoPjTcXpPgAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/a310ec5ccf9438989514ad8da107dcc3/a0b58/13-1-3.webp 230w","/static/a310ec5ccf9438989514ad8da107dcc3/bc10c/13-1-3.webp 460w","/static/a310ec5ccf9438989514ad8da107dcc3/966d8/13-1-3.webp 920w","/static/a310ec5ccf9438989514ad8da107dcc3/3dddb/13-1-3.webp 1344w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/a310ec5ccf9438989514ad8da107dcc3/81c8e/13-1-3.png 230w","/static/a310ec5ccf9438989514ad8da107dcc3/08a84/13-1-3.png 460w","/static/a310ec5ccf9438989514ad8da107dcc3/c0255/13-1-3.png 920w","/static/a310ec5ccf9438989514ad8da107dcc3/47218/13-1-3.png 1344w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/a310ec5ccf9438989514ad8da107dcc3/c0255/13-1-3.png","alt":"13 1 3","title":"13 1 3","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita auenneeeseen komentokehoteikkunaan seuraava komentosarja ja paina "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"enter"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pip3 install pygame"}]}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/cc8d7c319bc7baf0232b2d92350f9631/d56e1/13-1-4.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 28.695652173913043%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAiElEQVQY06XNwQoCIRSFYd//ZXoJ4dpUIpqEYRZii1y4cRai4xgMGEEboW954PAjcd6BYXd1OR0PhBDGGABgjAkhADBNe8651lpKKYSglHLOHx2yz9ftqp1z1lpjjFIqhDDPc4zRe19Kaa2tm9atHVpqXTa11pRSzrkNQ7/TJ/JdGz3/VR4/vwF1E1iIv4njxgAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/cc8d7c319bc7baf0232b2d92350f9631/a0b58/13-1-4.webp 230w","/static/cc8d7c319bc7baf0232b2d92350f9631/bc10c/13-1-4.webp 460w","/static/cc8d7c319bc7baf0232b2d92350f9631/966d8/13-1-4.webp 920w","/static/cc8d7c319bc7baf0232b2d92350f9631/bbe5b/13-1-4.webp 1130w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/cc8d7c319bc7baf0232b2d92350f9631/81c8e/13-1-4.png 230w","/static/cc8d7c319bc7baf0232b2d92350f9631/08a84/13-1-4.png 460w","/static/cc8d7c319bc7baf0232b2d92350f9631/c0255/13-1-4.png 920w","/static/cc8d7c319bc7baf0232b2d92350f9631/d56e1/13-1-4.png 1130w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/cc8d7c319bc7baf0232b2d92350f9631/c0255/13-1-4.png","alt":"13 1 4","title":"13 1 4","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä asentaa Pygame-paketin koneellesi."}]},{"type":"element","tagName":"h2","properties":{"id":"ensimmainen-ohjelma","style":"position:relative;"},"children":[{"type":"text","value":"Ensimmäinen ohjelma"},{"type":"element","tagName":"a","properties":{"href":"#ensimmainen-ohjelma","ariaLabel":"ensimmainen ohjelma permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä on yksinkertainen Pygamea käyttävä testiohjelma:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nnaytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun ohjelma käynnistetään, se näyttää käyttäjälle seuraavanlaisen ikkunan:"}]},{"type":"element","tagName":"img","properties":{"src":"/d11704399cba1d2075b1135cef373b65/pygame_eka.gif"},"children":[]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmassa ei ole kuitenkaan vielä muuta sisältöä kuin ikkunan näyttäminen. Ohjelman suoritus jatkuu niin kauan, kunnes käyttäjä sulkee ikkunan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Katsotaan seuraavaksi tarkemmin, miten ohjelma on rakentunut. Ohjelman alussa rivi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import pygame"}]},{"type":"text","value":" ottaa mukaan Pygame-kirjaston. Kirjaston käyttäminen alkaa kutsumalla funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.init"}]},{"type":"text","value":", minkä jälkeen ohjelma luo ikkunan funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.display.set_mode"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"naytto"}]},{"type":"text","value":" kautta ikkunaan voidaan viitata myöhemmin esimerkiksi grafiikan piirtämistä varten. Parametri "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(640, 480)"}]},{"type":"text","value":" tarkoittaa, että tässä ohjelmassa ikkunan leveys on 640 pikseliä ja korkeus on 480 pikseliä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavaksi ohjelmassa on kaksi komentoa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"fill"}]},{"type":"text","value":" täyttää näytön annetulla värillä. Tässä tapauksessa värinä on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(0, 0, 0)"}]},{"type":"text","value":", mikä tarkoittaa mustaa. Sitten metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.display.flip"}]},{"type":"text","value":" päivittää näytön sisällön."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän jälkeen alkaa ohjelman "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"pääsilmukka"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pääsilmukka käsittelee tapahtumat, jotka käyttöjärjestelmä välittää ohjelmalle. Joka kierroksella funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.event.get"}]},{"type":"text","value":" antaa listan tapahtumista, jotka ovat syntyneet funktion edellisen kutsukerran jälkeen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tapauksessa ohjelma käsittelee vain tyyppiä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.QUIT"}]},{"type":"text","value":" olevat tapahtumat. Tällainen tapahtuma syntyy, kun käyttäjä sulkee ohjelman esimerkiksi painamalla ikkunan ylänurkassa olevaa raksia. Tämän tapahtuman seurauksena ohjelma sulkee itsensä kutsumalla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"exit"}]},{"type":"text","value":"-funktiota."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit kokeilla, mitä tapahtuu, jos ohjelma ei käsittele tapahtumaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.QUIT"}]},{"type":"text","value":". Tällöin raksin painamisen ei pitäisi vaikuttaa ohjelman toimintaan, mikä on hämmentävää käyttäjälle. Ohjelman voi kuitenkin tässäkin tapauksessa sulkea väkisin komentoriviltä painamalla Control+C."}]},{"type":"element","tagName":"h2","properties":{"id":"kuva-ohjelmaan","style":"position:relative;"},"children":[{"type":"text","value":"Kuva ohjelmaan"},{"type":"element","tagName":"a","properties":{"href":"#kuva-ohjelmaan","ariaLabel":"kuva ohjelmaan permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajennetaan seuraavaksi ohjelmaa niin, että se näyttää ikkunassa kuvan. Tämä onnistuu seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nrobo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"image"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"load"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"robo.png\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nnaytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodi käyttää kuvaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"robo.png"}]},{"type":"text","value":", jossa on robotin kuva:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 50px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/c90257b456f195bb0d06e65ddbbc1728/a1812/robo.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 172%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAiCAYAAABfqvm9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEyklEQVRIx7WWX0hbdxzFTzRWqNTODLWpsWoRfbGQFtMqtIUykGJsuxWq0dptqTWWVTtFR11u/m0VX/YwN6jazUopQx0Iw7AOmzUmG7bGJMJGYd1gjMFehDFSGIPVJX7Hub3tqrONe9gPvtyv53zOSYi54QLrTnl5ebbZbIbJZPIdPnz495ycnMbHHndq9MiQRbpTWFiIPXv2YMeOHV0HDhwQAAdLS0vB4U6NHhmy6c4Wg8HwWklJiWN7bu45AKM7d+5sNZlMHRzu1OiRIcvMRkU67frChQsXxO/3y2d+v8zevi3T09MyOTmpDndq9MiQZWZdx5o/cn0+36/xpaXVyy7XQ1dPT3JqamolGo2qw50aPTJkmXle4fZ33e7Ep8GgfASkfgbkUmenLMRi6nCnRo8MWWaeW+hzuxOfh8OiGI2pcUB8TqdEolF1uFOjR8a3mUKnoiRi0ah8MjOTujYzI7O3bklobk4d7tTokSGbvtDpTMRiMYkvLqa+jceFwcVIRB3u1OiRIZu2UFGURCQSkQ9HRlJDw8O8ytDoqDrq/khLkVE28w69Hk9iNhSSlszM1HlAXuXnqA13avTIkE1XmOt1u3/7IhgUG/CXA0ieBlIeQDjcqdEjQzbt18bj8SSXlpbk6vi4jFy7JmM3bsjo9eurHO7U6JEh+6x3+OT+P3LkSKCrqyvS0919p6+396vzHR3Lb/X1CYc7NXpkyDKzpsHv92N5eVl9BRHJAJCl3Z9bRXhn4ePW1lbhcNe0rRqTpWV07GAXxsbGUFdXp9Pp1HecdeLEiV8GBgb+UBTlgdvtfuB0Oh+63W7haPsDemTIMsMsO9iFioqKzKqqKpSUlPRXVlb+6PV6k/fv35eFhQWJRqMS5/cuHl/VRtXokSHLDLPsYBeOHz+ut9ls2L9//3X+eiiKsrK4uJgKBAKrwWAwFQwGeRVtVI0eGbLMMMsOdsFqteobGxtRXV090t7eLi6Xa4V3AcPhcFg2GnpkyDLDLDvYhYaGBrXQYrFcdTgcTxfKcwrlcSEzzLKDXf9DodWqbzp1Cpbq6qsd587950JmmGUHu3D05En9yTNnsK+2dtTe3a1C8U18hnGtkBlm2cEuHC0u1r9SVoZ9hYVjr5eWinLp0p/RWCz5ZSCQ0v6zqbm5uSRH+68LPTJkmWGWHeyCHdC/CeCljIz3LwPyTn+/fHPvnty9c4ffOfVnan5+Xh3u1OiRIcsMs+xgF5CfDxw7BlitvJWKDh46FHI4HBFbc/NyW1ubNDc3/2S32+9yuFOjR4YsM2qWHex6coxG9cJ7NRwKoaio6AOGAZyemJgAhzs1emS0+/pJds0pKChQfyAGBwe38KnAYrFcuXjxohiNxrP/vKbxLDV6ZMgyo2U3PvX19fqmpibs3bv3Smdnp+Tl5dlNJhOfdcCdGj0yZJ/9DAKATz61NTVZbe3tMJvNw7xP1xdSo0eGbPaznkWePhUWC2oslqHenh4xGAz2XcXF4HCnRo/M5k52dhk7t+3ePdFgs0nOtm32FwsKwOFOjR4Zjd34vA3ovQDqgIl5QL4H5CYgu4A3qgBwuN/UPDJkvVr2X4WNQGYLgH1A/3vAd8PA1x6d7od84OVdj8rAnRo9MmRbtOzjor8BpWPSyH+RAgAAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/c90257b456f195bb0d06e65ddbbc1728/6ac13/robo.webp 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/c90257b456f195bb0d06e65ddbbc1728/a1812/robo.png 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/c90257b456f195bb0d06e65ddbbc1728/a1812/robo.png","alt":"robo","title":"robo","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedoston "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"robo.png"}]},{"type":"text","value":" tulee olla samassa hakemistossa ohjelman lähdekoodin kanssa, jotta ohjelma löytää kuvan. Tämän viikon tehtävissä robotin kuva on valmiina tehtäväpohjissa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt ikkuna näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/0f7db0536914ccd471841bcee4201632/pygame_kuva.gif"},"children":[]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.image.load"}]},{"type":"text","value":" lataa muuttujaan tiedostossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"robo.png"}]},{"type":"text","value":" olevan kuvan. Tämän jälkeen metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"blit"}]},{"type":"text","value":" piirtää kuvan ikkunaan kohtaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(100, 50)"}]},{"type":"text","value":" ja sitten funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.display.flip"}]},{"type":"text","value":" päivittää ikkunan sisällön. Kohta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(100, 50)"}]},{"type":"text","value":" tarkoittaa, että kuvan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"vasen yläkulma"}]},{"type":"text","value":" on kyseisessä kohdassa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että Pygamessa ja yleensä muutenkin ohjelmoinnissa koordinaatisto on rakennettu niin, että piirtoalueen vasen yläkulma on kohdassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(0, 0)"}]},{"type":"text","value":" ja koordinaatit kasvavat x-suunnassa oikealle ja y-suunnassa alaspäin. Tässä tapauksessa ikkunan oikean alakulman koordinaatit ovat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(640, 480)"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuvan voi piirtää moneenkin kohtaan ikkunassa. Esimerkiksi seuraava koodi piirtää kuvan kolmeen eri kohtaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"300"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"200"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tällöin ikkuna näyttää seuraavalta:"}]},{"type":"element","tagName":"img","properties":{"src":"/a7807afa43ad1cc7d9686968e6838712/pygame_kuva2.gif"},"children":[]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava koodi puolestaan piirtää kuvan ikkunan keskelle:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"leveys "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_width"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkorkeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_height"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"320"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"leveys"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"240"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"korkeus"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt ikkuna näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/498f521486feca567f74dd51c44e371b/pygame_kuva3.gif"},"children":[]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"get_width"}]},{"type":"text","value":" antaa kuvan leveyden ja vastaavasti metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"get_height"}]},{"type":"text","value":" antaa kuvan korkeuden. Ikkunan keskikohta on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(320, 240)"}]},{"type":"text","value":", joten tämän avulla saadaan laskettua sopiva kohta kuvan vasemmalle yläkulmalle niin, että kuva sijoittuu ikkunan keskelle."}]},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Pygame-tehtävät"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osan tehtävissä ei ole automaattisia testejä, vaan testi antaa pisteet automaattisesti, kun lähetät ratkaisun palvelimelle. Lähetä ratkaisu vasta sitten, kun se on valmis ja vastaa tehtävänannon vaatimuksia. Vaikka tehtävissä ei ole testejä, kurssin henkilökunta näkee lähetetyt ratkaisut. Myös keskeneräisen ratkaisun lähettäminen TMC Pasteen antaa pisteet automaattisesti, joten sitä ei tule käyttää kysyessä apua tämän osan tehtäviin. Voit kurssin tukikanavilla apua kysyessä käyttää "},{"type":"element","tagName":"a","properties":{"href":"https://pastebin.com/","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Pastebin.com"}]},{"type":"text","value":"ia tai jotain muuta internetin pastebin-palvelua."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos lähetät palvelimelle ratkaisun, joka selkeästi ei vastaa tehtävänantoa, voit menettää pisteet tämän osan tehtävistä."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Neljä robottia","tmcname":"osa13-01_nelja_robottia"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka piirtää robotin jokaiseen ikkunan neljään nurkkaan. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/8ba6d635c4ceb93c2b86711f83589b3a/pygame_nelja.gif"},"children":[]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Robotit rivissä","tmcname":"osa13-02_robotit_rivissa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka piirtää kymmenen robottia riviin. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/8dc589e5970721e2bf8bfe2bd22fa6cf/pygame_rivi.gif"},"children":[]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sata robottia","tmcname":"osa13-03_sata_robottia"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka piirtää sata robottia: kymmenen riviä ja joka rivissä kymmenen robottia. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/7012bfc1e6ade044e03c53f07f35e7a6/pygame_sata.gif"},"children":[]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Satunnaiset robotit","tmcname":"osa13-04_satunnaiset_robotit"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka piirtää "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tuhat"}]},{"type":"text","value":" robottia satunnaisiin paikkoihin. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/61a30808255873a3e24df2fc559d9367/pygame_tuhat.gif"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Olet asentanut Pygame-kirjaston koneellesi
  • \n
  • Osaat luoda ikkunan ja sulkea ohjelman
  • \n
  • Osaat piirtää ikkunaan tiedostossa olevan kuvan
  • \n

Kurssin kahdella viimeisellä viikolla tutustumme Pygame-kirjastoon, joka on peliohjelmointiin tarkoitettu Python-kirjasto. Pygamen avulla pystyy piirtämään grafiikkaa, käsittelemään näppäimistön ja hiiren tapahtumia ja tekemään muuta peleissä tarvittavaa.

Pygamen asentaminen

Linux

Avaa komentorivi ja kirjoita pip3 install pygame.

\n \n \n \n \n \n \"13\n \n \n

Kirjoita auenneeeseen komentokehoteikkunaan seuraava komentosarja ja paina enter:

pip3 install pygame

\n \n \n \n \n \n \"13\n \n \n

Tämä asentaa Pygame-paketin koneellesi.

Ensimmäinen ohjelma

Tässä on yksinkertainen Pygamea käyttävä testiohjelma:

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\n\nnaytto.fill((0,0,0))\npygame.display.flip()\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.QUIT:\n            exit()

Kun ohjelma käynnistetään, se näyttää käyttäjälle seuraavanlaisen ikkunan:

Ohjelmassa ei ole kuitenkaan vielä muuta sisältöä kuin ikkunan näyttäminen. Ohjelman suoritus jatkuu niin kauan, kunnes käyttäjä sulkee ikkunan.

Katsotaan seuraavaksi tarkemmin, miten ohjelma on rakentunut. Ohjelman alussa rivi import pygame ottaa mukaan Pygame-kirjaston. Kirjaston käyttäminen alkaa kutsumalla funktiota pygame.init, minkä jälkeen ohjelma luo ikkunan funktiolla pygame.display.set_mode.

pygame.init()\nnaytto = pygame.display.set_mode((640, 480))

Muuttujan naytto kautta ikkunaan voidaan viitata myöhemmin esimerkiksi grafiikan piirtämistä varten. Parametri (640, 480) tarkoittaa, että tässä ohjelmassa ikkunan leveys on 640 pikseliä ja korkeus on 480 pikseliä.

Seuraavaksi ohjelmassa on kaksi komentoa:

naytto.fill((0, 0, 0))\npygame.display.flip()

Metodi fill täyttää näytön annetulla värillä. Tässä tapauksessa värinä on (0, 0, 0), mikä tarkoittaa mustaa. Sitten metodi pygame.display.flip päivittää näytön sisällön.

Tämän jälkeen alkaa ohjelman pääsilmukka:

while True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.QUIT:\n            exit()

Pääsilmukka käsittelee tapahtumat, jotka käyttöjärjestelmä välittää ohjelmalle. Joka kierroksella funktio pygame.event.get antaa listan tapahtumista, jotka ovat syntyneet funktion edellisen kutsukerran jälkeen.

Tässä tapauksessa ohjelma käsittelee vain tyyppiä pygame.QUIT olevat tapahtumat. Tällainen tapahtuma syntyy, kun käyttäjä sulkee ohjelman esimerkiksi painamalla ikkunan ylänurkassa olevaa raksia. Tämän tapahtuman seurauksena ohjelma sulkee itsensä kutsumalla exit-funktiota.

Voit kokeilla, mitä tapahtuu, jos ohjelma ei käsittele tapahtumaa pygame.QUIT. Tällöin raksin painamisen ei pitäisi vaikuttaa ohjelman toimintaan, mikä on hämmentävää käyttäjälle. Ohjelman voi kuitenkin tässäkin tapauksessa sulkea väkisin komentoriviltä painamalla Control+C.

Kuva ohjelmaan

Laajennetaan seuraavaksi ohjelmaa niin, että se näyttää ikkunassa kuvan. Tämä onnistuu seuraavasti:

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\n\nrobo = pygame.image.load(\"robo.png\")\n\nnaytto.fill((0, 0, 0))\nnaytto.blit(robo, (100, 50))\npygame.display.flip()\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.QUIT:\n            exit()

Koodi käyttää kuvaa robo.png, jossa on robotin kuva:

\n \n

Tämän osan tehtävissä ei ole automaattisia testejä, vaan testi antaa pisteet automaattisesti, kun lähetät ratkaisun palvelimelle. Lähetä ratkaisu vasta sitten, kun se on valmis ja vastaa tehtävänannon vaatimuksia. Vaikka tehtävissä ei ole testejä, kurssin henkilökunta näkee lähetetyt ratkaisut. Myös keskeneräisen ratkaisun lähettäminen TMC Pasteen antaa pisteet automaattisesti, joten sitä ei tule käyttää kysyessä apua tämän osan tehtäviin. Voit kurssin tukikanavilla apua kysyessä käyttää Pastebin.comia tai jotain muuta internetin pastebin-palvelua.

Jos lähetät palvelimelle ratkaisun, joka selkeästi ei vastaa tehtävänantoa, voit menettää pisteet tämän osan tehtävistä.

Tee ohjelma, joka piirtää robotin jokaiseen ikkunan neljään nurkkaan. Ohjelman suorituksen tulee näyttää tältä:

Tee ohjelma, joka piirtää kymmenen robottia riviin. Ohjelman suorituksen tulee näyttää tältä:

Tee ohjelma, joka piirtää sata robottia: kymmenen riviä ja joka rivissä kymmenen robottia. Ohjelman suorituksen tulee näyttää tältä:

Tee ohjelma, joka piirtää tuhat robottia satunnaisiin paikkoihin. Ohjelman suorituksen tulee näyttää tältä:

","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-13/1-pygame-kayttoon.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Olet asentanut Pygame-kirjaston koneellesi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat luoda ikkunan ja sulkea ohjelman"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat piirtää ikkunaan tiedostossa olevan kuvan"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kurssin kahdella viimeisellä viikolla tutustumme Pygame-kirjastoon, joka on peliohjelmointiin tarkoitettu Python-kirjasto. Pygamen avulla pystyy piirtämään grafiikkaa, käsittelemään näppäimistön ja hiiren tapahtumia ja tekemään muuta peleissä tarvittavaa."}]},{"type":"element","tagName":"h2","properties":{"id":"pygamen-asentaminen","style":"position:relative;"},"children":[{"type":"text","value":"Pygamen asentaminen"},{"type":"element","tagName":"a","properties":{"href":"#pygamen-asentaminen","ariaLabel":"pygamen asentaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"h3","properties":{"id":"linux","style":"position:relative;"},"children":[{"type":"text","value":"Linux"},{"type":"element","tagName":"a","properties":{"href":"#linux","ariaLabel":"linux permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Avaa komentorivi ja kirjoita "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pip3 install pygame"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 399px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/a92634cb53af0aa1734e9ca12ca79562/a307d/pygame_linux.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 60.434782608695656%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAyElEQVQoz+2Oy26CYBSE/5XXxssTKAWqUQSixmorKhEEfgQv7/8un8FqorELFm5MXHyZyZnJ5IhEBgSeyy4Oz5rGIZG/JokC9lvJerVgn0gOaYwMPOLQ57jbMp994/w8IrzuL5G5YtNzWKoTpOkSGkuc1oh07HOcRrj6FLOmYje/sBr6n9a1fxFWVWNY62B/6FgVDbuqk93Mssqo3j1nme8X2hhF5cKtv0cYJYV+VigpD2T3azYof+ZC5C3mHc09+PQP34MvPHgC7r1OntPJWSAAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/a92634cb53af0aa1734e9ca12ca79562/a0b58/pygame_linux.webp 230w","/static/a92634cb53af0aa1734e9ca12ca79562/66086/pygame_linux.webp 399w"],"sizes":"(max-width: 399px) 100vw, 399px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/a92634cb53af0aa1734e9ca12ca79562/81c8e/pygame_linux.png 230w","/static/a92634cb53af0aa1734e9ca12ca79562/a307d/pygame_linux.png 399w"],"sizes":"(max-width: 399px) 100vw, 399px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/a92634cb53af0aa1734e9ca12ca79562/a307d/pygame_linux.png","alt":"pygame linux","title":"pygame linux","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"h3","properties":{"id":"windows","style":"position:relative;"},"children":[{"type":"text","value":"Windows"},{"type":"element","tagName":"a","properties":{"href":"#windows","ariaLabel":"windows permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Avaa Windowsin terminaali napauttamalla vasemman alakulman Windows-painiketta. Kirjoita aukeavaan ikkunaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"cmd"}]},{"type":"text","value":" ja paina enter:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 392px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/76954afbb36ac5953d205b7cdab98ff6/0acb4/13_1_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 173.47826086956525%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAjCAIAAAAblL1PAAAACXBIWXMAAA7DAAAOwwHHb6hkAAADp0lEQVRIx+2VT0gjVxzHp0g1kwlqNEmJqUTblB6EPewaEKGlINKlhW5Peyhb2GNPwkIPhUJvPRVakP6hQr0UlvoHm6yaSfaSVTdqEpdQt8ZsTGidxJ3JG2cmk0ky+fPevDKZVUrQrnruly+PuXze7/d+v/d7Q9hsNovFEgwGYUu1Wq3RaGiaJsuypmn4P0W43e6BgYHl5eVMJoMQKhQKsixDCBOJBITwPKxeryOEiJ6ens7OziBNY4xVVW02GkjTjJjay0QMDg66XK7FhYVcLndwcPB0d1dRFIPELxPhdDrtNtt3vz7YFfBGVt7IlsJpMZyWwmnxUVoKPxPXs0rk7+qZ1tOmKOqLb2fffW/i3tc/LCT4n0N/zDx8OvPwz9lw6qdA4n40v5yq+PZK/qTSZsJqtVos1Jff//bVjO/HQOJ+7PncE/AgVfUly/79si9Z9iWV3/dKZ1qHzaRpdiHAIfzsuL73vLLHVfdB7dQpUD/PLdhspldX/soe8IXCBUv1omBWq5UkyUBAb5VcKgHAHzJMVVUxxlBDSNNOrWm4zTpsMpGhUBBjLAgCy7KpVKpcLl8kBaNglvn5+XQ6I4kSAEBRlGKxCAAoFAo8zx8fH7Msq7ZyadtOhymKWlxcPDo6KhaLHMcBAGRZFgQBtCSKIsdxjUbj3Mhzc3PJ5L4sy7lcDgDAMAzLshzHGVvwPM+yLMMw+Xz+3xf+ReSlpSUAQLlcBgBIkiQIgrEqiiJJUrFYNHIRBAEh1F7t1dVVURQzmUw+n89mszzPX7RgJEnSNN1sNhVFqVQqqqrWarXmidomycAghPpUnfQ5YAwzwzDValU8kSAIZ8avVCr6PLf6bAqFQsZ++DL6H74s3NfXR5LkFWHj6b0i7Ha7nU4n3Xq3Lw17PB632x0IBK4C9/b2Xv3MY2NjXq/X7/efXvdLwA6Hg6KolZUVjHGtVoMQ1i8svVUGXK/XeZ4/PDxUVRUhpGGMEEIQYg1BCJGm6StCuPUBNQQRJCiK6ujomJ6ejsVi4XCYpulIJPJkJ76x9mh7OxqJxdY2t3biO4/XH29H41ubW+vrkXg8Hl3bjG1FCa/XOzk5SRD677Krq2t4+I3B113Eq+bR21P9Dvv4a92fjnsIgrj74biru+v66Jt3PnnnFYKw3r1mfqufGBoaGhkZMZlMDofDbDbb7HZ7v9Uy4Jn65pebH30wcX3is1t3eoff/vjzqWs3bozevHV76l5vn936vqd7yP4P6JyrnQ25/+oAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/76954afbb36ac5953d205b7cdab98ff6/a0b58/13_1_1.webp 230w","/static/76954afbb36ac5953d205b7cdab98ff6/86099/13_1_1.webp 392w"],"sizes":"(max-width: 392px) 100vw, 392px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/76954afbb36ac5953d205b7cdab98ff6/81c8e/13_1_1.png 230w","/static/76954afbb36ac5953d205b7cdab98ff6/0acb4/13_1_1.png 392w"],"sizes":"(max-width: 392px) 100vw, 392px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/76954afbb36ac5953d205b7cdab98ff6/0acb4/13_1_1.png","alt":"13 1 1","title":"13 1 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita auenneeeseen komentokehoteikkunaan seuraava komentosarja ja paina "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"enter"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pip3 install pygame"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä asentaa Pygame-paketin koneellesi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Asennus voi vaatia järjestelmänvalvojan oikeuksia. Jos ylläoleva ei toimi, voit yrittää ajaa terminaalin järjestelmänvalvojana (valitse Windows-valikko, paina hiiren kakkospainiketta CMD-valinnan päällä ja valitse \"Run as administrator\" tai \"Aja järjestelmänvalvojana\")."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että asennus vaatii että olet asennusvaiheessa ohjeiden mukaisesti valinnut kohdan \"Add Python 3.XX to path\", katso "},{"type":"element","tagName":"a","properties":{"href":"https://www.mooc.fi/fi/installation/vscode#python3","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"ohjeet"}]}]},{"type":"element","tagName":"h3","properties":{"id":"mac","style":"position:relative;"},"children":[{"type":"text","value":"Mac"},{"type":"element","tagName":"a","properties":{"href":"#mac","ariaLabel":"mac permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Avaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Terminaali"}]},{"type":"text","value":", esim. painamalla oikean yläkulman suurennuslasi-symbolia:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 746px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/77ceacb61dfaf80c7c442a4225b65e87/62de4/13-1-2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 24.347826086956523%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAABYlAAAWJQFJUiTwAAABGUlEQVQY02OYs2Rje9/sSTOWzlmycdKsZVPmrJg6Z+WC5Zt7py7s6J/dO2nehDnLW6bOb+mftWD55oUrN/VPXVNRPW3SzEVzlqxn0Lf207Hw1rPyhTF89Kx99W38tM08VE3dZE2c7S18z7gX99gnqll7G9n6alt6q5u561l56lv7MLCIaLGIaLGKaLMIQ0kWYU1GIQ1GYU1JMf1QKbs6OY9OeW8DcVMGQTUWIQ1mYQ1WEU0mIQ1mQXUGPnkzEJIzhSBeOVMeWRNZOQtHRYdAZRdzBTt+OVMGaQMOWWOQrKwJCMlASGMGfgVzfjlTXhkjXlljXhlDHil9PmkDNRlTKRkTNlljVjkTPnkzIXlzPnlzXpDRUJvAbFMAjAFKS35RLdoAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/77ceacb61dfaf80c7c442a4225b65e87/a0b58/13-1-2.webp 230w","/static/77ceacb61dfaf80c7c442a4225b65e87/bc10c/13-1-2.webp 460w","/static/77ceacb61dfaf80c7c442a4225b65e87/f7ebd/13-1-2.webp 746w"],"sizes":"(max-width: 746px) 100vw, 746px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/77ceacb61dfaf80c7c442a4225b65e87/81c8e/13-1-2.png 230w","/static/77ceacb61dfaf80c7c442a4225b65e87/08a84/13-1-2.png 460w","/static/77ceacb61dfaf80c7c442a4225b65e87/62de4/13-1-2.png 746w"],"sizes":"(max-width: 746px) 100vw, 746px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/77ceacb61dfaf80c7c442a4225b65e87/62de4/13-1-2.png","alt":"13 1 2","title":"13 1 2","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita aukeavaan teksikenttään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"terminal"}]},{"type":"text","value":" ja paina enter:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/a310ec5ccf9438989514ad8da107dcc3/47218/13-1-3.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 66.95652173913044%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAABYlAAAWJQFJUiTwAAACa0lEQVQozy2STXLTQBCFdYFwgzh3IlmFDeQGkAQ2LKGo4hBAQhWp7FglQMohln8iO7Yly7JkzWime370M5LsACeg5KTq23W97ur3njX3poNup2t3Bv0+53z9+aL63ilGcx1zlRZK50pnSmdCapQKUQHKvCi/nZ0PnKFlDyZt22nbo+vu3cQnvhP4HvEXHEArnUn1qASUHAQHAahUmg+c0cwPrIOP3dcn+PbcvDw1h6fF8Vn55swcfjVOkJs8lypXOi9MvVr/Xf/5V5Q1CiVUWlYrqVLr99XNz+vBzdB3PDKeM2/BZyF4IeeodZoJmZqy/vTl5PmLg929vXfvPxSm0UuVAUirb/fa1+3e7W0UkygmhFCaJJRSFFKoFIQq6/XR8fHOTuvJ1tbT3T1TrQGl0hmgsJxhMBxPnYnrBVFMgaFuAM1AMZCUYW7ql6+Otre3W63W/v6zLDeMI0rNAK1Ob2L3h+2b3tW17frhkkAYs3DJ4gQJEyRBDspx7i4vf11c/Oh0eknCCWEJw0UYW+4s6N+OnOHE88NFRBdLuohoEBHKxcNxAIkgXW8+Hk8TyilhyyWlCUw93/LcmTube37QpJLmchOPUBnKdIMWQgMIShkhjDHgXHCOHCRNuEVRzfxgNJ66ng/YxCBUo0GhUahHUAmppUql1KIhlSprfg4TGS1JGMVhFLPGx2bQ3NyIYQMKHUZkPPFcz3+ojc7yxu04pjFJHiCUMY4gFEeVbKymDBgXwWLpDO96fcfu9jmI5i+ZMY6WTvMGnWmdZXluTFlWa1OtTFkXpipMWZgKmmKiaJaKsqrr1X29ui/L+j/LRoPjTcXpPgAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/a310ec5ccf9438989514ad8da107dcc3/a0b58/13-1-3.webp 230w","/static/a310ec5ccf9438989514ad8da107dcc3/bc10c/13-1-3.webp 460w","/static/a310ec5ccf9438989514ad8da107dcc3/966d8/13-1-3.webp 920w","/static/a310ec5ccf9438989514ad8da107dcc3/3dddb/13-1-3.webp 1344w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/a310ec5ccf9438989514ad8da107dcc3/81c8e/13-1-3.png 230w","/static/a310ec5ccf9438989514ad8da107dcc3/08a84/13-1-3.png 460w","/static/a310ec5ccf9438989514ad8da107dcc3/c0255/13-1-3.png 920w","/static/a310ec5ccf9438989514ad8da107dcc3/47218/13-1-3.png 1344w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/a310ec5ccf9438989514ad8da107dcc3/c0255/13-1-3.png","alt":"13 1 3","title":"13 1 3","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita auenneeeseen komentokehoteikkunaan seuraava komentosarja ja paina "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"enter"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pip3 install pygame"}]}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/cc8d7c319bc7baf0232b2d92350f9631/d56e1/13-1-4.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 28.695652173913043%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAiElEQVQY06XNwQoCIRSFYd//ZXoJ4dpUIpqEYRZii1y4cRai4xgMGEEboW954PAjcd6BYXd1OR0PhBDGGABgjAkhADBNe8651lpKKYSglHLOHx2yz9ftqp1z1lpjjFIqhDDPc4zRe19Kaa2tm9atHVpqXTa11pRSzrkNQ7/TJ/JdGz3/VR4/vwF1E1iIv4njxgAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/cc8d7c319bc7baf0232b2d92350f9631/a0b58/13-1-4.webp 230w","/static/cc8d7c319bc7baf0232b2d92350f9631/bc10c/13-1-4.webp 460w","/static/cc8d7c319bc7baf0232b2d92350f9631/966d8/13-1-4.webp 920w","/static/cc8d7c319bc7baf0232b2d92350f9631/bbe5b/13-1-4.webp 1130w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/cc8d7c319bc7baf0232b2d92350f9631/81c8e/13-1-4.png 230w","/static/cc8d7c319bc7baf0232b2d92350f9631/08a84/13-1-4.png 460w","/static/cc8d7c319bc7baf0232b2d92350f9631/c0255/13-1-4.png 920w","/static/cc8d7c319bc7baf0232b2d92350f9631/d56e1/13-1-4.png 1130w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/cc8d7c319bc7baf0232b2d92350f9631/c0255/13-1-4.png","alt":"13 1 4","title":"13 1 4","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä asentaa Pygame-paketin koneellesi."}]},{"type":"element","tagName":"h2","properties":{"id":"ensimmainen-ohjelma","style":"position:relative;"},"children":[{"type":"text","value":"Ensimmäinen ohjelma"},{"type":"element","tagName":"a","properties":{"href":"#ensimmainen-ohjelma","ariaLabel":"ensimmainen ohjelma permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä on yksinkertainen Pygamea käyttävä testiohjelma:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nnaytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun ohjelma käynnistetään, se näyttää käyttäjälle seuraavanlaisen ikkunan:"}]},{"type":"element","tagName":"img","properties":{"src":"/d11704399cba1d2075b1135cef373b65/pygame_eka.gif"},"children":[]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmassa ei ole kuitenkaan vielä muuta sisältöä kuin ikkunan näyttäminen. Ohjelman suoritus jatkuu niin kauan, kunnes käyttäjä sulkee ikkunan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Katsotaan seuraavaksi tarkemmin, miten ohjelma on rakentunut. Ohjelman alussa rivi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import pygame"}]},{"type":"text","value":" ottaa mukaan Pygame-kirjaston. Kirjaston käyttäminen alkaa kutsumalla funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.init"}]},{"type":"text","value":", minkä jälkeen ohjelma luo ikkunan funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.display.set_mode"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"naytto"}]},{"type":"text","value":" kautta ikkunaan voidaan viitata myöhemmin esimerkiksi grafiikan piirtämistä varten. Parametri "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(640, 480)"}]},{"type":"text","value":" tarkoittaa, että tässä ohjelmassa ikkunan leveys on 640 pikseliä ja korkeus on 480 pikseliä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavaksi ohjelmassa on kaksi komentoa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"fill"}]},{"type":"text","value":" täyttää näytön annetulla värillä. Tässä tapauksessa värinä on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(0, 0, 0)"}]},{"type":"text","value":", mikä tarkoittaa mustaa. Sitten metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.display.flip"}]},{"type":"text","value":" päivittää näytön sisällön."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän jälkeen alkaa ohjelman "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"pääsilmukka"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pääsilmukka käsittelee tapahtumat, jotka käyttöjärjestelmä välittää ohjelmalle. Joka kierroksella funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.event.get"}]},{"type":"text","value":" antaa listan tapahtumista, jotka ovat syntyneet funktion edellisen kutsukerran jälkeen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tapauksessa ohjelma käsittelee vain tyyppiä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.QUIT"}]},{"type":"text","value":" olevat tapahtumat. Tällainen tapahtuma syntyy, kun käyttäjä sulkee ohjelman esimerkiksi painamalla ikkunan ylänurkassa olevaa raksia. Tämän tapahtuman seurauksena ohjelma sulkee itsensä kutsumalla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"exit"}]},{"type":"text","value":"-funktiota."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit kokeilla, mitä tapahtuu, jos ohjelma ei käsittele tapahtumaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.QUIT"}]},{"type":"text","value":". Tällöin raksin painamisen ei pitäisi vaikuttaa ohjelman toimintaan, mikä on hämmentävää käyttäjälle. Ohjelman voi kuitenkin tässäkin tapauksessa sulkea väkisin komentoriviltä painamalla Control+C."}]},{"type":"element","tagName":"h2","properties":{"id":"kuva-ohjelmaan","style":"position:relative;"},"children":[{"type":"text","value":"Kuva ohjelmaan"},{"type":"element","tagName":"a","properties":{"href":"#kuva-ohjelmaan","ariaLabel":"kuva ohjelmaan permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajennetaan seuraavaksi ohjelmaa niin, että se näyttää ikkunassa kuvan. Tämä onnistuu seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nrobo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"image"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"load"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"robo.png\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nnaytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodi käyttää kuvaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"robo.png"}]},{"type":"text","value":", jossa on robotin kuva:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 50px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/c90257b456f195bb0d06e65ddbbc1728/a1812/robo.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 172%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAiCAYAAABfqvm9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEyklEQVRIx7WWX0hbdxzFTzRWqNTODLWpsWoRfbGQFtMqtIUykGJsuxWq0dptqTWWVTtFR11u/m0VX/YwN6jazUopQx0Iw7AOmzUmG7bGJMJGYd1gjMFehDFSGIPVJX7Hub3tqrONe9gPvtyv53zOSYi54QLrTnl5ebbZbIbJZPIdPnz495ycnMbHHndq9MiQRbpTWFiIPXv2YMeOHV0HDhwQAAdLS0vB4U6NHhmy6c4Wg8HwWklJiWN7bu45AKM7d+5sNZlMHRzu1OiRIcvMRkU67frChQsXxO/3y2d+v8zevi3T09MyOTmpDndq9MiQZWZdx5o/cn0+36/xpaXVyy7XQ1dPT3JqamolGo2qw50aPTJkmXle4fZ33e7Ep8GgfASkfgbkUmenLMRi6nCnRo8MWWaeW+hzuxOfh8OiGI2pcUB8TqdEolF1uFOjR8a3mUKnoiRi0ah8MjOTujYzI7O3bklobk4d7tTokSGbvtDpTMRiMYkvLqa+jceFwcVIRB3u1OiRIZu2UFGURCQSkQ9HRlJDw8O8ytDoqDrq/khLkVE28w69Hk9iNhSSlszM1HlAXuXnqA13avTIkE1XmOt1u3/7IhgUG/CXA0ieBlIeQDjcqdEjQzbt18bj8SSXlpbk6vi4jFy7JmM3bsjo9eurHO7U6JEh+6x3+OT+P3LkSKCrqyvS0919p6+396vzHR3Lb/X1CYc7NXpkyDKzpsHv92N5eVl9BRHJAJCl3Z9bRXhn4ePW1lbhcNe0rRqTpWV07GAXxsbGUFdXp9Pp1HecdeLEiV8GBgb+UBTlgdvtfuB0Oh+63W7haPsDemTIMsMsO9iFioqKzKqqKpSUlPRXVlb+6PV6k/fv35eFhQWJRqMS5/cuHl/VRtXokSHLDLPsYBeOHz+ut9ls2L9//3X+eiiKsrK4uJgKBAKrwWAwFQwGeRVtVI0eGbLMMMsOdsFqteobGxtRXV090t7eLi6Xa4V3AcPhcFg2GnpkyDLDLDvYhYaGBrXQYrFcdTgcTxfKcwrlcSEzzLKDXf9DodWqbzp1Cpbq6qsd587950JmmGUHu3D05En9yTNnsK+2dtTe3a1C8U18hnGtkBlm2cEuHC0u1r9SVoZ9hYVjr5eWinLp0p/RWCz5ZSCQ0v6zqbm5uSRH+68LPTJkmWGWHeyCHdC/CeCljIz3LwPyTn+/fHPvnty9c4ffOfVnan5+Xh3u1OiRIcsMs+xgF5CfDxw7BlitvJWKDh46FHI4HBFbc/NyW1ubNDc3/2S32+9yuFOjR4YsM2qWHex6coxG9cJ7NRwKoaio6AOGAZyemJgAhzs1emS0+/pJds0pKChQfyAGBwe38KnAYrFcuXjxohiNxrP/vKbxLDV6ZMgyo2U3PvX19fqmpibs3bv3Smdnp+Tl5dlNJhOfdcCdGj0yZJ/9DAKATz61NTVZbe3tMJvNw7xP1xdSo0eGbPaznkWePhUWC2oslqHenh4xGAz2XcXF4HCnRo/M5k52dhk7t+3ePdFgs0nOtm32FwsKwOFOjR4Zjd34vA3ovQDqgIl5QL4H5CYgu4A3qgBwuN/UPDJkvVr2X4WNQGYLgH1A/3vAd8PA1x6d7od84OVdj8rAnRo9MmRbtOzjor8BpWPSyH+RAgAAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/c90257b456f195bb0d06e65ddbbc1728/6ac13/robo.webp 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/c90257b456f195bb0d06e65ddbbc1728/a1812/robo.png 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/c90257b456f195bb0d06e65ddbbc1728/a1812/robo.png","alt":"robo","title":"robo","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedoston "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"robo.png"}]},{"type":"text","value":" tulee olla samassa hakemistossa ohjelman lähdekoodin kanssa, jotta ohjelma löytää kuvan. Tämän viikon tehtävissä robotin kuva on valmiina tehtäväpohjissa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt ikkuna näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/0f7db0536914ccd471841bcee4201632/pygame_kuva.gif"},"children":[]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.image.load"}]},{"type":"text","value":" lataa muuttujaan tiedostossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"robo.png"}]},{"type":"text","value":" olevan kuvan. Tämän jälkeen metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"blit"}]},{"type":"text","value":" piirtää kuvan ikkunaan kohtaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(100, 50)"}]},{"type":"text","value":" ja sitten funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.display.flip"}]},{"type":"text","value":" päivittää ikkunan sisällön. Kohta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(100, 50)"}]},{"type":"text","value":" tarkoittaa, että kuvan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"vasen yläkulma"}]},{"type":"text","value":" on kyseisessä kohdassa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että Pygamessa ja yleensä muutenkin ohjelmoinnissa koordinaatisto on rakennettu niin, että piirtoalueen vasen yläkulma on kohdassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(0, 0)"}]},{"type":"text","value":" ja koordinaatit kasvavat x-suunnassa oikealle ja y-suunnassa alaspäin. Tässä tapauksessa ikkunan oikean alakulman koordinaatit ovat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(640, 480)"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuvan voi piirtää moneenkin kohtaan ikkunassa. Esimerkiksi seuraava koodi piirtää kuvan kolmeen eri kohtaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"300"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"200"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tällöin ikkuna näyttää seuraavalta:"}]},{"type":"element","tagName":"img","properties":{"src":"/a7807afa43ad1cc7d9686968e6838712/pygame_kuva2.gif"},"children":[]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava koodi puolestaan piirtää kuvan ikkunan keskelle:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"leveys "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_width"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkorkeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_height"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"320"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"leveys"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"240"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"korkeus"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt ikkuna näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/498f521486feca567f74dd51c44e371b/pygame_kuva3.gif"},"children":[]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"get_width"}]},{"type":"text","value":" antaa kuvan leveyden ja vastaavasti metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"get_height"}]},{"type":"text","value":" antaa kuvan korkeuden. Ikkunan keskikohta on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(320, 240)"}]},{"type":"text","value":", joten tämän avulla saadaan laskettua sopiva kohta kuvan vasemmalle yläkulmalle niin, että kuva sijoittuu ikkunan keskelle."}]},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Pygame-tehtävät"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osan tehtävissä ei ole automaattisia testejä, vaan testi antaa pisteet automaattisesti, kun lähetät ratkaisun palvelimelle. Lähetä ratkaisu vasta sitten, kun se on valmis ja vastaa tehtävänannon vaatimuksia. Vaikka tehtävissä ei ole testejä, kurssin henkilökunta näkee lähetetyt ratkaisut. Myös keskeneräisen ratkaisun lähettäminen TMC Pasteen antaa pisteet automaattisesti, joten sitä ei tule käyttää kysyessä apua tämän osan tehtäviin. Voit kurssin tukikanavilla apua kysyessä käyttää "},{"type":"element","tagName":"a","properties":{"href":"https://pastebin.com/","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Pastebin.com"}]},{"type":"text","value":"ia tai jotain muuta internetin pastebin-palvelua."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos lähetät palvelimelle ratkaisun, joka selkeästi ei vastaa tehtävänantoa, voit menettää pisteet tämän osan tehtävistä."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Neljä robottia","tmcname":"osa13-01_nelja_robottia"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka piirtää robotin jokaiseen ikkunan neljään nurkkaan. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/8ba6d635c4ceb93c2b86711f83589b3a/pygame_nelja.gif"},"children":[]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Robotit rivissä","tmcname":"osa13-02_robotit_rivissa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka piirtää kymmenen robottia riviin. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/8dc589e5970721e2bf8bfe2bd22fa6cf/pygame_rivi.gif"},"children":[]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sata robottia","tmcname":"osa13-03_sata_robottia"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka piirtää sata robottia: kymmenen riviä ja joka rivissä kymmenen robottia. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/7012bfc1e6ade044e03c53f07f35e7a6/pygame_sata.gif"},"children":[]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Satunnaiset robotit","tmcname":"osa13-04_satunnaiset_robotit"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka piirtää "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tuhat"}]},{"type":"text","value":" robottia satunnaisiin paikkoihin. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/61a30808255873a3e24df2fc559d9367/pygame_tuhat.gif"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Olet asentanut Pygame-kirjaston koneellesi
  • \n
  • Osaat luoda ikkunan ja sulkea ohjelman
  • \n
  • Osaat piirtää ikkunaan tiedostossa olevan kuvan
  • \n

Kurssin kahdella viimeisellä viikolla tutustumme Pygame-kirjastoon, joka on peliohjelmointiin tarkoitettu Python-kirjasto. Pygamen avulla pystyy piirtämään grafiikkaa, käsittelemään näppäimistön ja hiiren tapahtumia ja tekemään muuta peleissä tarvittavaa.

Pygamen asentaminen

Linux

Avaa komentorivi ja kirjoita pip3 install pygame.

\n \n \n \n \n \n \"13\n \n \n

Kirjoita auenneeeseen komentokehoteikkunaan seuraava komentosarja ja paina enter:

pip3 install pygame

\n \n \n \n \n \n \"13\n \n \n

Tämä asentaa Pygame-paketin koneellesi.

Ensimmäinen ohjelma

Tässä on yksinkertainen Pygamea käyttävä testiohjelma:

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\n\nnaytto.fill((0,0,0))\npygame.display.flip()\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.QUIT:\n            exit()

Kun ohjelma käynnistetään, se näyttää käyttäjälle seuraavanlaisen ikkunan:

Ohjelmassa ei ole kuitenkaan vielä muuta sisältöä kuin ikkunan näyttäminen. Ohjelman suoritus jatkuu niin kauan, kunnes käyttäjä sulkee ikkunan.

Katsotaan seuraavaksi tarkemmin, miten ohjelma on rakentunut. Ohjelman alussa rivi import pygame ottaa mukaan Pygame-kirjaston. Kirjaston käyttäminen alkaa kutsumalla funktiota pygame.init, minkä jälkeen ohjelma luo ikkunan funktiolla pygame.display.set_mode.

pygame.init()\nnaytto = pygame.display.set_mode((640, 480))

Muuttujan naytto kautta ikkunaan voidaan viitata myöhemmin esimerkiksi grafiikan piirtämistä varten. Parametri (640, 480) tarkoittaa, että tässä ohjelmassa ikkunan leveys on 640 pikseliä ja korkeus on 480 pikseliä.

Seuraavaksi ohjelmassa on kaksi komentoa:

naytto.fill((0, 0, 0))\npygame.display.flip()

Metodi fill täyttää näytön annetulla värillä. Tässä tapauksessa värinä on (0, 0, 0), mikä tarkoittaa mustaa. Sitten metodi pygame.display.flip päivittää näytön sisällön.

Tämän jälkeen alkaa ohjelman pääsilmukka:

while True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.QUIT:\n            exit()

Pääsilmukka käsittelee tapahtumat, jotka käyttöjärjestelmä välittää ohjelmalle. Joka kierroksella funktio pygame.event.get antaa listan tapahtumista, jotka ovat syntyneet funktion edellisen kutsukerran jälkeen.

Tässä tapauksessa ohjelma käsittelee vain tyyppiä pygame.QUIT olevat tapahtumat. Tällainen tapahtuma syntyy, kun käyttäjä sulkee ohjelman esimerkiksi painamalla ikkunan ylänurkassa olevaa raksia. Tämän tapahtuman seurauksena ohjelma sulkee itsensä kutsumalla exit-funktiota.

Voit kokeilla, mitä tapahtuu, jos ohjelma ei käsittele tapahtumaa pygame.QUIT. Tällöin raksin painamisen ei pitäisi vaikuttaa ohjelman toimintaan, mikä on hämmentävää käyttäjälle. Ohjelman voi kuitenkin tässäkin tapauksessa sulkea väkisin komentoriviltä painamalla Control+C.

Kuva ohjelmaan

Laajennetaan seuraavaksi ohjelmaa niin, että se näyttää ikkunassa kuvan. Tämä onnistuu seuraavasti:

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\n\nrobo = pygame.image.load(\"robo.png\")\n\nnaytto.fill((0, 0, 0))\nnaytto.blit(robo, (100, 50))\npygame.display.flip()\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.QUIT:\n            exit()

Koodi käyttää kuvaa robo.png, jossa on robotin kuva:

\n \n

Tämän osan tehtävissä ei ole automaattisia testejä, vaan testi antaa pisteet automaattisesti, kun lähetät ratkaisun palvelimelle. Lähetä ratkaisu vasta sitten, kun se on valmis ja vastaa tehtävänannon vaatimuksia. Vaikka tehtävissä ei ole testejä, kurssin henkilökunta näkee lähetetyt ratkaisut. Myös keskeneräisen ratkaisun lähettäminen TMC Pasteen antaa pisteet automaattisesti, joten sitä ei tule käyttää kysyessä apua tämän osan tehtäviin. Voit kurssin tukikanavilla apua kysyessä käyttää Pastebin.comia tai jotain muuta internetin pastebin-palvelua.

Jos lähetät palvelimelle ratkaisun, joka selkeästi ei vastaa tehtävänantoa, voit menettää pisteet tämän osan tehtävistä.

Tee ohjelma, joka piirtää robotin jokaiseen ikkunan neljään nurkkaan. Ohjelman suorituksen tulee näyttää tältä:

Tee ohjelma, joka piirtää kymmenen robottia riviin. Ohjelman suorituksen tulee näyttää tältä:

Tee ohjelma, joka piirtää sata robottia: kymmenen riviä ja joka rivissä kymmenen robottia. Ohjelman suorituksen tulee näyttää tältä:

Tee ohjelma, joka piirtää tuhat robottia satunnaisiin paikkoihin. Ohjelman suorituksen tulee näyttää tältä:

","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-13/1-pygame-kayttoon.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-13/2-animaatio/page-data.json b/page-data/osa-13/2-animaatio/page-data.json index 840ce038f..def19b2a5 100644 --- a/page-data/osa-13/2-animaatio/page-data.json +++ b/page-data/osa-13/2-animaatio/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-13/2-animaatio", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten voi toteuttaa animaation"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat tahdistaa ohjelman nopeuden kellon avulla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää trigonometriaa animaatiossa"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Monissa peleissä on tarvetta saada aikaan liikkuvia hahmoja, joten seuraava luonteva askel on opetella animaation tekeminen. Animaatio syntyy, kun kuva piirretään eri kohtiin näytöllä sopivasti ajastettuna."}]},{"type":"element","tagName":"h2","properties":{"id":"animaation-tekeminen","style":"position:relative;"},"children":[{"type":"text","value":"Animaation tekeminen"},{"type":"element","tagName":"a","properties":{"href":"#animaation-tekeminen","ariaLabel":"animaation tekeminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava koodi luo animaation, jossa robotti kulkee vasemmalta oikealle ikkunassa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nrobo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"image"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"load"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"robo.png\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nx "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\ny "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nkello "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"time"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"Clock"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"60"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suoritus näyttää seuraavalta:"}]},{"type":"element","tagName":"img","properties":{"src":"/e0ac2065e7c54214a7440186eb4b9a5b/pygame_animaatio.gif"},"children":[]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Katsotaan taas tarkemmin, mitä ohjelmassa tapahtuu. Jotta kuva pystyy liikkumaan, ohjelmassa täytyy olla tieto sen paikasta. Tämä onnistuu ottamalla käyttöön kaksi muuttujaa, jotka sisältävät kuvan vasemman yläkulman koordinaatit:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\ny "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän lisäksi määritellään kello, jonka avulla pystyy huolehtimaan siitä, että animaation nopeus on sopiva:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kello "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"time"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"Clock"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pääsilmukan sisällä on koodi, joka piirtää kuvan sen nykyiseen paikkaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ensin kutsutaan metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"fill"}]},{"type":"text","value":", joka tyhjentää ikkunan mustalla värillä. Väri määritellään RGB-muodossa parametrilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(0, 0, 0)"}]},{"type":"text","value":", mikä tarkoittaa, että värin punainen, vihreä ja sininen komponentti on 0 eli väri on musta. Jokainen komponentti voi olla välillä 0–255. Esimerkiksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(255, 255, 255)"}]},{"type":"text","value":" on valkoinen ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(255, 0, 0)"}]},{"type":"text","value":" on punainen. Verkossa on monia työkaluja, joiden avulla voi tutkia RGB-värejä, kuten "},{"type":"element","tagName":"a","properties":{"href":"https://www.rapidtables.com/web/color/RGB_Color.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"RGB Color Codes Chart"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän jälkeen kuva piirretään tuttuun tapaan metodilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"blit"}]},{"type":"text","value":" ja lopuksi ikkunan sisältö päivitetään funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.display.flip"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Silmukan päätteeksi muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":" arvo kasvaa, minkä ansiosta kuva liikkuu pikselin eteenpäin joka kierroksella:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisäksi silmukan lopussa suoritetaan kellon metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tick"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"60"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tick"}]},{"type":"text","value":" huolehtii siitä, että animaation nopeus on sopiva: se tahdistaa silmukan niin, että silmukka pyritään suorittamaan 60 kertaa sekunnissa. Toisin sanoen kuva liikkuu sekunnissa 60 pikseliä oikealle. Tämä vastaa suunnilleen pelien yhteydessä käytettävää termiä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"FPS"}]},{"type":"text","value":" ("},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"frames per second"}]},{"type":"text","value":")."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tick"}]},{"type":"text","value":" on hyödyllinen, koska sen avulla animaatio toimii periaatteessa yhtä nopeasti jokaisella koneella. Jos silmukassa ei olisi tällaista ajastusta, pelin nopeus riippuisi siitä, kuinka nopeasti pelaajan kone toimii."}]},{"type":"element","tagName":"h2","properties":{"id":"seinaan-tormaaminen","style":"position:relative;"},"children":[{"type":"text","value":"Seinään törmääminen"},{"type":"element","tagName":"a","properties":{"href":"#seinaan-tormaaminen","ariaLabel":"seinaan tormaaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Äskeinen animaatio on muuten hieno, mutta kun robotti etenee ikkunan ulkopuolelle, animaatio jatkuu ja robotti katoaa näkyvistä. Tehdään seuraavaksi ohjelmaan parannus, jonka avulla robotin suunta muuttuu, jos se törmää seinään."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nrobo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"image"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"load"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"robo.png\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nx "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\ny "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nnopeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkello "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"time"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"Clock"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n \n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" nopeus\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nopeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_width"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nopeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"nopeus\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nopeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nopeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"nopeus\n\n kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"60"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suoritus näyttää nyt tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/5dac9b07ba4879c217b0b35a817a727f/pygame_animaatio2.gif"},"children":[]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt ohjelmassa on uusi muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nopeus"}]},{"type":"text","value":", joka määrittää robotin liikkumistavan. Positiivinen nopeus tarkoittaa liikkumista oikealle ja negatiivinen nopeus tarkoittaa liikkumista vasemmalle. Tässä tapauksessa kun nopeus on 1, robotti liikkuu oikealle, ja kun nopeus on –1, robotti liikkuu vasemmalle."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavat rivit huolehtivat, että robotti osaa törmätä seinään:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nopeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_width"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nopeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"nopeus\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nopeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nopeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"nopeus"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos nopeus on positiivinen eli robotti liikkuu oikealle ja sen oikea reuna menee ikkunan oikean reunan ulkopuolelle, robotin suunta muuttuu käänteiseksi eli se alkaa liikkua vasemmalle. Vastaavasti jos nopeus on negatiivinen ja robotin vasen reuna menee ikkunan vasemman reunan ulkopuolelle, suunta muuttuu taas käänteiseksi eli robotti alkaa liikkua oikealle."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän koodin ansiosta robotti jatkaa loputtomasti rataa, jossa se liikkuu ensin koko ikkunan verran oikealle, sitten takaisin vasemmalle, sitten taas oikealle, jne."}]},{"type":"element","tagName":"h2","properties":{"id":"pyoriva-animaatio","style":"position:relative;"},"children":[{"type":"text","value":"Pyörivä animaatio"},{"type":"element","tagName":"a","properties":{"href":"#pyoriva-animaatio","ariaLabel":"pyoriva animaatio permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehdään vielä animaatio, jossa robotti "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"pyörii"}]},{"type":"text","value":" ikkunan keskipisteen ympärillä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" math\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nrobo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"image"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"load"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"robo.png\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkulma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nkello "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"time"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"Clock"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"320"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"cos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_width"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"240"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_height"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n kulma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.01"}]},{"type":"text","value":"\n kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"60"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suoritus näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/ce164a1f214ed31343271340f9157733/pygame_pyorinta.gif"},"children":[]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pyörimisanimaatio saadaan toteutettua trigonometrian avulla: muuttujassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kulma"}]},{"type":"text","value":" on radiaaneina robotin sijainnin kulma suhteessa ikkunan keskipisteeseen. Tästä saadaan laskettua sini- ja kosinifunktioilla robotin sijainti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"320"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"cos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_width"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"240"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_height"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä tarkoittaa, että robotin sijainti on ympyrällä, jonka säde on 100. Kosini antaa x-suuntaisen sijainnin ja sini puolestaan y-suuntaisen sijainnin. Jotta animaatio näyttää hyvältä, robotti lisäksi keskitetään niin, että sen keskipiste on ympyrällä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joka kierroksella muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kulma"}]},{"type":"text","value":" arvo kasvaa 0.01:llä. Koska radiaaneissa täysi ympyrä on 2π eli noin 6.28, robotti pyörii suunnilleen kierroksen verran 10 sekunnissa."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Pystyliike","tmcname":"osa13-05_pystyliike"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee animaatio, jossa robotti liikkuu vuorotellen ylös ja alas. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/7dfa8e1aefab9c5f0586d8148b819543/pygame_pysty.gif"},"children":[]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Reunan kierto","tmcname":"osa13-06_reunan_kierto"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee animaatio, jossa robotti kiertää ympäri ikkunan reunaa. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/b313e2cd6e747c9b47375655616b0e2d/pygame_kierto.gif"},"children":[]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kaksi robottia","tmcname":"osa13-07_kaksi_robottia"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee animaatio, jossa kaksi robottia kulkee näytöllä vuorotellen oikealle ja vasemmalle. Alempi robotti kulkee tuplavauhtia. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/5b2b134a4afcdbaa9c11796d3cadb5e2/pygame_liike2.gif"},"children":[]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Piirileikki","tmcname":"osa13-08_piirileikki"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee animaatio, jossa on kymmenen robottia piirileikissä. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/c8832b391e97f55d98358c8f0e5bfd57/pygame_piiri.gif"},"children":[]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Pomppiva pallo","tmcname":"osa13-09_pomppiva_pallo"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee animaatio, jossa pallo kimpoaa ikkunan reunoilta. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/e9503906920a8a19bc3a33143b0dde81/pygame_pallo.gif"},"children":[]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on palloa varten kuvatiedosto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pallo.png"}]},{"type":"text","value":"."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Robotti-invaasio","tmcname":"osa13-10_robotti_invaasio"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee animaatio, jossa taivaalta tippuu satunnaisesti robotteja. Kun robotti laskeutuu maahan, se lähtee joko vasemmalle tai oikealle ja katoaa lopuksi ruudulta. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/23bd928da4c554324efdf7de4806cc60/pygame_invaasio.gif"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, miten voi toteuttaa animaation
  • \n
  • Osaat tahdistaa ohjelman nopeuden kellon avulla
  • \n
  • Osaat käyttää trigonometriaa animaatiossa
  • \n

Monissa peleissä on tarvetta saada aikaan liikkuvia hahmoja, joten seuraava luonteva askel on opetella animaation tekeminen. Animaatio syntyy, kun kuva piirretään eri kohtiin näytöllä sopivasti ajastettuna.

Animaation tekeminen

Seuraava koodi luo animaation, jossa robotti kulkee vasemmalta oikealle ikkunassa:

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\n\nrobo = pygame.image.load(\"robo.png\")\n\nx = 0\ny = 0\nkello = pygame.time.Clock()\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.QUIT:\n            exit()\n\n    naytto.fill((0, 0, 0))\n    naytto.blit(robo, (x, y))\n    pygame.display.flip()\n\n    x += 1\n    kello.tick(60)

Ohjelman suoritus näyttää seuraavalta:

Katsotaan taas tarkemmin, mitä ohjelmassa tapahtuu. Jotta kuva pystyy liikkumaan, ohjelmassa täytyy olla tieto sen paikasta. Tämä onnistuu ottamalla käyttöön kaksi muuttujaa, jotka sisältävät kuvan vasemman yläkulman koordinaatit:

x = 0\ny = 0

Tämän lisäksi määritellään kello, jonka avulla pystyy huolehtimaan siitä, että animaation nopeus on sopiva:

kello = pygame.time.Clock()

Pääsilmukan sisällä on koodi, joka piirtää kuvan sen nykyiseen paikkaan:

    naytto.fill((0, 0, 0))\n    naytto.blit(robo, (x, y))\n    pygame.display.flip()

Ensin kutsutaan metodia fill, joka tyhjentää ikkunan mustalla värillä. Väri määritellään RGB-muodossa parametrilla (0, 0, 0), mikä tarkoittaa, että värin punainen, vihreä ja sininen komponentti on 0 eli väri on musta. Jokainen komponentti voi olla välillä 0–255. Esimerkiksi (255, 255, 255) on valkoinen ja (255, 0, 0) on punainen. Verkossa on monia työkaluja, joiden avulla voi tutkia RGB-värejä, kuten RGB Color Codes Chart.

Tämän jälkeen kuva piirretään tuttuun tapaan metodilla blit ja lopuksi ikkunan sisältö päivitetään funktiolla pygame.display.flip.

Silmukan päätteeksi muuttujan x arvo kasvaa, minkä ansiosta kuva liikkuu pikselin eteenpäin joka kierroksella:

    x += 1

Lisäksi silmukan lopussa suoritetaan kellon metodi tick:

    kello.tick(60)

Metodi tick huolehtii siitä, että animaation nopeus on sopiva: se tahdistaa silmukan niin, että silmukka pyritään suorittamaan 60 kertaa sekunnissa. Toisin sanoen kuva liikkuu sekunnissa 60 pikseliä oikealle. Tämä vastaa suunnilleen pelien yhteydessä käytettävää termiä FPS (frames per second).

Metodi tick on hyödyllinen, koska sen avulla animaatio toimii periaatteessa yhtä nopeasti jokaisella koneella. Jos silmukassa ei olisi tällaista ajastusta, pelin nopeus riippuisi siitä, kuinka nopeasti pelaajan kone toimii.

Seinään törmääminen

Äskeinen animaatio on muuten hieno, mutta kun robotti etenee ikkunan ulkopuolelle, animaatio jatkuu ja robotti katoaa näkyvistä. Tehdään seuraavaksi ohjelmaan parannus, jonka avulla robotin suunta muuttuu, jos se törmää seinään.

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\n\nrobo = pygame.image.load(\"robo.png\")\n\nx = 0\ny = 0\nnopeus = 1\nkello = pygame.time.Clock()\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.QUIT:\n            exit()\n\n    naytto.fill((0, 0, 0))\n    naytto.blit(robo, (x, y))\n    pygame.display.flip()\n    \n    x += nopeus\n    if nopeus > 0 and x+robo.get_width() >= 640:\n        nopeus = -nopeus\n    if nopeus < 0 and x <= 0:\n        nopeus = -nopeus\n\n    kello.tick(60)

Ohjelman suoritus näyttää nyt tältä:

Nyt ohjelmassa on uusi muuttuja nopeus, joka määrittää robotin liikkumistavan. Positiivinen nopeus tarkoittaa liikkumista oikealle ja negatiivinen nopeus tarkoittaa liikkumista vasemmalle. Tässä tapauksessa kun nopeus on 1, robotti liikkuu oikealle, ja kun nopeus on –1, robotti liikkuu vasemmalle.

Seuraavat rivit huolehtivat, että robotti osaa törmätä seinään:

    if nopeus > 0 and x+robo.get_width() >= 640:\n        nopeus = -nopeus\n    if nopeus < 0 and x <= 0:\n        nopeus = -nopeus

Jos nopeus on positiivinen eli robotti liikkuu oikealle ja sen oikea reuna menee ikkunan oikean reunan ulkopuolelle, robotin suunta muuttuu käänteiseksi eli se alkaa liikkua vasemmalle. Vastaavasti jos nopeus on negatiivinen ja robotin vasen reuna menee ikkunan vasemman reunan ulkopuolelle, suunta muuttuu taas käänteiseksi eli robotti alkaa liikkua oikealle.

Tämän koodin ansiosta robotti jatkaa loputtomasti rataa, jossa se liikkuu ensin koko ikkunan verran oikealle, sitten takaisin vasemmalle, sitten taas oikealle, jne.

Pyörivä animaatio

Tehdään vielä animaatio, jossa robotti pyörii ikkunan keskipisteen ympärillä:

import pygame\nimport math\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\n\nrobo = pygame.image.load(\"robo.png\")\n\nkulma = 0\nkello = pygame.time.Clock()\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.QUIT:\n            exit()\n\n    x = 320+math.cos(kulma)*100-robo.get_width()/2\n    y = 240+math.sin(kulma)*100-robo.get_height()/2\n\n    naytto.fill((0, 0, 0))\n    naytto.blit(robo, (x, y))\n    pygame.display.flip()\n\n    kulma += 0.01\n    kello.tick(60)

Ohjelman suoritus näyttää tältä:

Pyörimisanimaatio saadaan toteutettua trigonometrian avulla: muuttujassa kulma on radiaaneina robotin sijainnin kulma suhteessa ikkunan keskipisteeseen. Tästä saadaan laskettua sini- ja kosinifunktioilla robotin sijainti:

        x = 320+math.cos(kulma)*100-robo.get_width()/2\n        y = 240+math.sin(kulma)*100-robo.get_height()/2

Tämä tarkoittaa, että robotin sijainti on ympyrällä, jonka säde on 100. Kosini antaa x-suuntaisen sijainnin ja sini puolestaan y-suuntaisen sijainnin. Jotta animaatio näyttää hyvältä, robotti lisäksi keskitetään niin, että sen keskipiste on ympyrällä.

Joka kierroksella muuttujan kulma arvo kasvaa 0.01:llä. Koska radiaaneissa täysi ympyrä on 2π eli noin 6.28, robotti pyörii suunnilleen kierroksen verran 10 sekunnissa.

Tee animaatio, jossa robotti liikkuu vuorotellen ylös ja alas. Ohjelman suorituksen tulee näyttää tältä:

Tee animaatio, jossa robotti kiertää ympäri ikkunan reunaa. Ohjelman suorituksen tulee näyttää tältä:

Tee animaatio, jossa kaksi robottia kulkee näytöllä vuorotellen oikealle ja vasemmalle. Alempi robotti kulkee tuplavauhtia. Ohjelman suorituksen tulee näyttää tältä:

Tee animaatio, jossa on kymmenen robottia piirileikissä. Ohjelman suorituksen tulee näyttää tältä:

Tee animaatio, jossa pallo kimpoaa ikkunan reunoilta. Ohjelman suorituksen tulee näyttää tältä:

Tehtäväpohjassa on palloa varten kuvatiedosto pallo.png.

Tee animaatio, jossa taivaalta tippuu satunnaisesti robotteja. Kun robotti laskeutuu maahan, se lähtee joko vasemmalle tai oikealle ja katoaa lopuksi ruudulta. Ohjelman suorituksen tulee näyttää tältä:

","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-13/2-animaatio.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten voi toteuttaa animaation"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat tahdistaa ohjelman nopeuden kellon avulla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää trigonometriaa animaatiossa"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Monissa peleissä on tarvetta saada aikaan liikkuvia hahmoja, joten seuraava luonteva askel on opetella animaation tekeminen. Animaatio syntyy, kun kuva piirretään eri kohtiin näytöllä sopivasti ajastettuna."}]},{"type":"element","tagName":"h2","properties":{"id":"animaation-tekeminen","style":"position:relative;"},"children":[{"type":"text","value":"Animaation tekeminen"},{"type":"element","tagName":"a","properties":{"href":"#animaation-tekeminen","ariaLabel":"animaation tekeminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava koodi luo animaation, jossa robotti kulkee vasemmalta oikealle ikkunassa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nrobo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"image"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"load"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"robo.png\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nx "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\ny "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nkello "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"time"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"Clock"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"60"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suoritus näyttää seuraavalta:"}]},{"type":"element","tagName":"img","properties":{"src":"/e0ac2065e7c54214a7440186eb4b9a5b/pygame_animaatio.gif"},"children":[]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Katsotaan taas tarkemmin, mitä ohjelmassa tapahtuu. Jotta kuva pystyy liikkumaan, ohjelmassa täytyy olla tieto sen paikasta. Tämä onnistuu ottamalla käyttöön kaksi muuttujaa, jotka sisältävät kuvan vasemman yläkulman koordinaatit:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\ny "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän lisäksi määritellään kello, jonka avulla pystyy huolehtimaan siitä, että animaation nopeus on sopiva:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kello "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"time"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"Clock"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pääsilmukan sisällä on koodi, joka piirtää kuvan sen nykyiseen paikkaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ensin kutsutaan metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"fill"}]},{"type":"text","value":", joka tyhjentää ikkunan mustalla värillä. Väri määritellään RGB-muodossa parametrilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(0, 0, 0)"}]},{"type":"text","value":", mikä tarkoittaa, että värin punainen, vihreä ja sininen komponentti on 0 eli väri on musta. Jokainen komponentti voi olla välillä 0–255. Esimerkiksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(255, 255, 255)"}]},{"type":"text","value":" on valkoinen ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(255, 0, 0)"}]},{"type":"text","value":" on punainen. Verkossa on monia työkaluja, joiden avulla voi tutkia RGB-värejä, kuten "},{"type":"element","tagName":"a","properties":{"href":"https://www.rapidtables.com/web/color/RGB_Color.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"RGB Color Codes Chart"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän jälkeen kuva piirretään tuttuun tapaan metodilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"blit"}]},{"type":"text","value":" ja lopuksi ikkunan sisältö päivitetään funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.display.flip"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Silmukan päätteeksi muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":" arvo kasvaa, minkä ansiosta kuva liikkuu pikselin eteenpäin joka kierroksella:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisäksi silmukan lopussa suoritetaan kellon metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tick"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"60"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tick"}]},{"type":"text","value":" huolehtii siitä, että animaation nopeus on sopiva: se tahdistaa silmukan niin, että silmukka pyritään suorittamaan 60 kertaa sekunnissa. Toisin sanoen kuva liikkuu sekunnissa 60 pikseliä oikealle. Tämä vastaa suunnilleen pelien yhteydessä käytettävää termiä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"FPS"}]},{"type":"text","value":" ("},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"frames per second"}]},{"type":"text","value":")."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tick"}]},{"type":"text","value":" on hyödyllinen, koska sen avulla animaatio toimii periaatteessa yhtä nopeasti jokaisella koneella. Jos silmukassa ei olisi tällaista ajastusta, pelin nopeus riippuisi siitä, kuinka nopeasti pelaajan kone toimii."}]},{"type":"element","tagName":"h2","properties":{"id":"seinaan-tormaaminen","style":"position:relative;"},"children":[{"type":"text","value":"Seinään törmääminen"},{"type":"element","tagName":"a","properties":{"href":"#seinaan-tormaaminen","ariaLabel":"seinaan tormaaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Äskeinen animaatio on muuten hieno, mutta kun robotti etenee ikkunan ulkopuolelle, animaatio jatkuu ja robotti katoaa näkyvistä. Tehdään seuraavaksi ohjelmaan parannus, jonka avulla robotin suunta muuttuu, jos se törmää seinään."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nrobo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"image"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"load"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"robo.png\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nx "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\ny "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nnopeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nkello "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"time"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"Clock"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n \n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" nopeus\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nopeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_width"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nopeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"nopeus\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nopeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nopeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"nopeus\n\n kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"60"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suoritus näyttää nyt tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/5dac9b07ba4879c217b0b35a817a727f/pygame_animaatio2.gif"},"children":[]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt ohjelmassa on uusi muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nopeus"}]},{"type":"text","value":", joka määrittää robotin liikkumistavan. Positiivinen nopeus tarkoittaa liikkumista oikealle ja negatiivinen nopeus tarkoittaa liikkumista vasemmalle. Tässä tapauksessa kun nopeus on 1, robotti liikkuu oikealle, ja kun nopeus on –1, robotti liikkuu vasemmalle."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavat rivit huolehtivat, että robotti osaa törmätä seinään:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nopeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_width"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nopeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"nopeus\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nopeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nopeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"nopeus"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos nopeus on positiivinen eli robotti liikkuu oikealle ja sen oikea reuna menee ikkunan oikean reunan ulkopuolelle, robotin suunta muuttuu käänteiseksi eli se alkaa liikkua vasemmalle. Vastaavasti jos nopeus on negatiivinen ja robotin vasen reuna menee ikkunan vasemman reunan ulkopuolelle, suunta muuttuu taas käänteiseksi eli robotti alkaa liikkua oikealle."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän koodin ansiosta robotti jatkaa loputtomasti rataa, jossa se liikkuu ensin koko ikkunan verran oikealle, sitten takaisin vasemmalle, sitten taas oikealle, jne."}]},{"type":"element","tagName":"h2","properties":{"id":"pyoriva-animaatio","style":"position:relative;"},"children":[{"type":"text","value":"Pyörivä animaatio"},{"type":"element","tagName":"a","properties":{"href":"#pyoriva-animaatio","ariaLabel":"pyoriva animaatio permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehdään vielä animaatio, jossa robotti "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"pyörii"}]},{"type":"text","value":" ikkunan keskipisteen ympärillä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" math\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nrobo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"image"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"load"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"robo.png\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkulma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nkello "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"time"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"Clock"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"320"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"cos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_width"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"240"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_height"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n kulma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.01"}]},{"type":"text","value":"\n kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"60"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suoritus näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/ce164a1f214ed31343271340f9157733/pygame_pyorinta.gif"},"children":[]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pyörimisanimaatio saadaan toteutettua trigonometrian avulla: muuttujassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kulma"}]},{"type":"text","value":" on radiaaneina robotin sijainnin kulma suhteessa ikkunan keskipisteeseen. Tästä saadaan laskettua sini- ja kosinifunktioilla robotin sijainti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"320"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"cos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_width"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"240"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_height"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä tarkoittaa, että robotin sijainti on ympyrällä, jonka säde on 100. Kosini antaa x-suuntaisen sijainnin ja sini puolestaan y-suuntaisen sijainnin. Jotta animaatio näyttää hyvältä, robotti lisäksi keskitetään niin, että sen keskipiste on ympyrällä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joka kierroksella muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kulma"}]},{"type":"text","value":" arvo kasvaa 0.01:llä. Koska radiaaneissa täysi ympyrä on 2π eli noin 6.28, robotti pyörii suunnilleen kierroksen verran 10 sekunnissa."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Pystyliike","tmcname":"osa13-05_pystyliike"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee animaatio, jossa robotti liikkuu vuorotellen ylös ja alas. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/7dfa8e1aefab9c5f0586d8148b819543/pygame_pysty.gif"},"children":[]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Reunan kierto","tmcname":"osa13-06_reunan_kierto"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee animaatio, jossa robotti kiertää ympäri ikkunan reunaa. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/b313e2cd6e747c9b47375655616b0e2d/pygame_kierto.gif"},"children":[]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kaksi robottia","tmcname":"osa13-07_kaksi_robottia"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee animaatio, jossa kaksi robottia kulkee näytöllä vuorotellen oikealle ja vasemmalle. Alempi robotti kulkee tuplavauhtia. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/5b2b134a4afcdbaa9c11796d3cadb5e2/pygame_liike2.gif"},"children":[]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Piirileikki","tmcname":"osa13-08_piirileikki"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee animaatio, jossa on kymmenen robottia piirileikissä. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/c8832b391e97f55d98358c8f0e5bfd57/pygame_piiri.gif"},"children":[]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Pomppiva pallo","tmcname":"osa13-09_pomppiva_pallo"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee animaatio, jossa pallo kimpoaa ikkunan reunoilta. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/e9503906920a8a19bc3a33143b0dde81/pygame_pallo.gif"},"children":[]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on palloa varten kuvatiedosto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pallo.png"}]},{"type":"text","value":"."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Robotti-invaasio","tmcname":"osa13-10_robotti_invaasio"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee animaatio, jossa taivaalta tippuu satunnaisesti robotteja. Kun robotti laskeutuu maahan, se lähtee joko vasemmalle tai oikealle ja katoaa lopuksi ruudulta. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/23bd928da4c554324efdf7de4806cc60/pygame_invaasio.gif"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, miten voi toteuttaa animaation
  • \n
  • Osaat tahdistaa ohjelman nopeuden kellon avulla
  • \n
  • Osaat käyttää trigonometriaa animaatiossa
  • \n

Monissa peleissä on tarvetta saada aikaan liikkuvia hahmoja, joten seuraava luonteva askel on opetella animaation tekeminen. Animaatio syntyy, kun kuva piirretään eri kohtiin näytöllä sopivasti ajastettuna.

Animaation tekeminen

Seuraava koodi luo animaation, jossa robotti kulkee vasemmalta oikealle ikkunassa:

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\n\nrobo = pygame.image.load(\"robo.png\")\n\nx = 0\ny = 0\nkello = pygame.time.Clock()\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.QUIT:\n            exit()\n\n    naytto.fill((0, 0, 0))\n    naytto.blit(robo, (x, y))\n    pygame.display.flip()\n\n    x += 1\n    kello.tick(60)

Ohjelman suoritus näyttää seuraavalta:

Katsotaan taas tarkemmin, mitä ohjelmassa tapahtuu. Jotta kuva pystyy liikkumaan, ohjelmassa täytyy olla tieto sen paikasta. Tämä onnistuu ottamalla käyttöön kaksi muuttujaa, jotka sisältävät kuvan vasemman yläkulman koordinaatit:

x = 0\ny = 0

Tämän lisäksi määritellään kello, jonka avulla pystyy huolehtimaan siitä, että animaation nopeus on sopiva:

kello = pygame.time.Clock()

Pääsilmukan sisällä on koodi, joka piirtää kuvan sen nykyiseen paikkaan:

    naytto.fill((0, 0, 0))\n    naytto.blit(robo, (x, y))\n    pygame.display.flip()

Ensin kutsutaan metodia fill, joka tyhjentää ikkunan mustalla värillä. Väri määritellään RGB-muodossa parametrilla (0, 0, 0), mikä tarkoittaa, että värin punainen, vihreä ja sininen komponentti on 0 eli väri on musta. Jokainen komponentti voi olla välillä 0–255. Esimerkiksi (255, 255, 255) on valkoinen ja (255, 0, 0) on punainen. Verkossa on monia työkaluja, joiden avulla voi tutkia RGB-värejä, kuten RGB Color Codes Chart.

Tämän jälkeen kuva piirretään tuttuun tapaan metodilla blit ja lopuksi ikkunan sisältö päivitetään funktiolla pygame.display.flip.

Silmukan päätteeksi muuttujan x arvo kasvaa, minkä ansiosta kuva liikkuu pikselin eteenpäin joka kierroksella:

    x += 1

Lisäksi silmukan lopussa suoritetaan kellon metodi tick:

    kello.tick(60)

Metodi tick huolehtii siitä, että animaation nopeus on sopiva: se tahdistaa silmukan niin, että silmukka pyritään suorittamaan 60 kertaa sekunnissa. Toisin sanoen kuva liikkuu sekunnissa 60 pikseliä oikealle. Tämä vastaa suunnilleen pelien yhteydessä käytettävää termiä FPS (frames per second).

Metodi tick on hyödyllinen, koska sen avulla animaatio toimii periaatteessa yhtä nopeasti jokaisella koneella. Jos silmukassa ei olisi tällaista ajastusta, pelin nopeus riippuisi siitä, kuinka nopeasti pelaajan kone toimii.

Seinään törmääminen

Äskeinen animaatio on muuten hieno, mutta kun robotti etenee ikkunan ulkopuolelle, animaatio jatkuu ja robotti katoaa näkyvistä. Tehdään seuraavaksi ohjelmaan parannus, jonka avulla robotin suunta muuttuu, jos se törmää seinään.

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\n\nrobo = pygame.image.load(\"robo.png\")\n\nx = 0\ny = 0\nnopeus = 1\nkello = pygame.time.Clock()\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.QUIT:\n            exit()\n\n    naytto.fill((0, 0, 0))\n    naytto.blit(robo, (x, y))\n    pygame.display.flip()\n    \n    x += nopeus\n    if nopeus > 0 and x+robo.get_width() >= 640:\n        nopeus = -nopeus\n    if nopeus < 0 and x <= 0:\n        nopeus = -nopeus\n\n    kello.tick(60)

Ohjelman suoritus näyttää nyt tältä:

Nyt ohjelmassa on uusi muuttuja nopeus, joka määrittää robotin liikkumistavan. Positiivinen nopeus tarkoittaa liikkumista oikealle ja negatiivinen nopeus tarkoittaa liikkumista vasemmalle. Tässä tapauksessa kun nopeus on 1, robotti liikkuu oikealle, ja kun nopeus on –1, robotti liikkuu vasemmalle.

Seuraavat rivit huolehtivat, että robotti osaa törmätä seinään:

    if nopeus > 0 and x+robo.get_width() >= 640:\n        nopeus = -nopeus\n    if nopeus < 0 and x <= 0:\n        nopeus = -nopeus

Jos nopeus on positiivinen eli robotti liikkuu oikealle ja sen oikea reuna menee ikkunan oikean reunan ulkopuolelle, robotin suunta muuttuu käänteiseksi eli se alkaa liikkua vasemmalle. Vastaavasti jos nopeus on negatiivinen ja robotin vasen reuna menee ikkunan vasemman reunan ulkopuolelle, suunta muuttuu taas käänteiseksi eli robotti alkaa liikkua oikealle.

Tämän koodin ansiosta robotti jatkaa loputtomasti rataa, jossa se liikkuu ensin koko ikkunan verran oikealle, sitten takaisin vasemmalle, sitten taas oikealle, jne.

Pyörivä animaatio

Tehdään vielä animaatio, jossa robotti pyörii ikkunan keskipisteen ympärillä:

import pygame\nimport math\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\n\nrobo = pygame.image.load(\"robo.png\")\n\nkulma = 0\nkello = pygame.time.Clock()\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.QUIT:\n            exit()\n\n    x = 320+math.cos(kulma)*100-robo.get_width()/2\n    y = 240+math.sin(kulma)*100-robo.get_height()/2\n\n    naytto.fill((0, 0, 0))\n    naytto.blit(robo, (x, y))\n    pygame.display.flip()\n\n    kulma += 0.01\n    kello.tick(60)

Ohjelman suoritus näyttää tältä:

Pyörimisanimaatio saadaan toteutettua trigonometrian avulla: muuttujassa kulma on radiaaneina robotin sijainnin kulma suhteessa ikkunan keskipisteeseen. Tästä saadaan laskettua sini- ja kosinifunktioilla robotin sijainti:

        x = 320+math.cos(kulma)*100-robo.get_width()/2\n        y = 240+math.sin(kulma)*100-robo.get_height()/2

Tämä tarkoittaa, että robotin sijainti on ympyrällä, jonka säde on 100. Kosini antaa x-suuntaisen sijainnin ja sini puolestaan y-suuntaisen sijainnin. Jotta animaatio näyttää hyvältä, robotti lisäksi keskitetään niin, että sen keskipiste on ympyrällä.

Joka kierroksella muuttujan kulma arvo kasvaa 0.01:llä. Koska radiaaneissa täysi ympyrä on 2π eli noin 6.28, robotti pyörii suunnilleen kierroksen verran 10 sekunnissa.

Tee animaatio, jossa robotti liikkuu vuorotellen ylös ja alas. Ohjelman suorituksen tulee näyttää tältä:

Tee animaatio, jossa robotti kiertää ympäri ikkunan reunaa. Ohjelman suorituksen tulee näyttää tältä:

Tee animaatio, jossa kaksi robottia kulkee näytöllä vuorotellen oikealle ja vasemmalle. Alempi robotti kulkee tuplavauhtia. Ohjelman suorituksen tulee näyttää tältä:

Tee animaatio, jossa on kymmenen robottia piirileikissä. Ohjelman suorituksen tulee näyttää tältä:

Tee animaatio, jossa pallo kimpoaa ikkunan reunoilta. Ohjelman suorituksen tulee näyttää tältä:

Tehtäväpohjassa on palloa varten kuvatiedosto pallo.png.

Tee animaatio, jossa taivaalta tippuu satunnaisesti robotteja. Kun robotti laskeutuu maahan, se lähtee joko vasemmalle tai oikealle ja katoaa lopuksi ruudulta. Ohjelman suorituksen tulee näyttää tältä:

","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-13/2-animaatio.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-13/3-tapahtumat/page-data.json b/page-data/osa-13/3-tapahtumat/page-data.json index d3b9a23e3..f6575433b 100644 --- a/page-data/osa-13/3-tapahtumat/page-data.json +++ b/page-data/osa-13/3-tapahtumat/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-13/3-tapahtumat", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Olet tutustunut Pygamen tapahtumiin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat tehdä ohjelman, joka lukee näppäimistön painalluksia"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat tehdä ohjelman, joka lukee hiiren tapahtumia"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tähän asti olemme toteuttaneet Pygame-ohjelman pääsilmukan niin, että se käy läpi tapahtumat ja tunnistaa tapahtuman "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.QUIT"}]},{"type":"text","value":", mutta ei käsittele muita tapahtumia. Nyt on aika tutustua tarkemmin tapahtumien käsittelyyn."}]},{"type":"element","tagName":"h2","properties":{"id":"tapahtumien-kasittely","style":"position:relative;"},"children":[{"type":"text","value":"Tapahtumien käsittely"},{"type":"element","tagName":"a","properties":{"href":"#tapahtumien-kasittely","ariaLabel":"tapahtumien kasittely permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava koodi näyttää, mitä tapahtumia syntyy ohjelman suorituksen aikana:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun ohjelmaa käytetään hetki, se voi tulostaa esimerkiksi seuraavanlaisia tapahtumia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"x"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-x"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-x"]},"children":[{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä ensimmäiset tapahtumat liittyvät hiiren käyttämiseen, seuraavat tapahtumat näppäimistön käyttämiseen ja viimeinen tapahtuma sulkee ohjelman. Jokaisella tapahtumalla on tyyppi ja mahdollisesti lisätietoa, josta voi päätellä esimerkiksi hiiren sijainnin tai painetun näppäimen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tapahtumia voi etsiä Pygamen dokumentaatiosta mutta usein tehokas tapa löytää sopiva tapahtuma on käyttää yllä olevaa koodia ja tutkia, millainen tapahtuma syntyy, kun ohjelmassa tapahtuu haluttu asia."}]},{"type":"element","tagName":"h2","properties":{"id":"nappaimiston-kasittely","style":"position:relative;"},"children":[{"type":"text","value":"Näppäimistön käsittely"},{"type":"element","tagName":"a","properties":{"href":"#nappaimiston-kasittely","ariaLabel":"nappaimiston kasittely permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma tunnistaa tapahtumat, joissa käyttäjä painaa oikealle tai vasemmalle nuolinäppäintä. Ohjelma tulostaa testiksi tiedon näppäimen painamisesta."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"KEYDOWN"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_LEFT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vasemmalle\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_RIGHT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"oikealle\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä vakiot "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.K_LEFT"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.K_RIGHT"}]},{"type":"text","value":" tarkoittavat nuolinäppäimiä vasemmalle ja oikealle. Näppäimistön eri näppäimiä vastaavat vakiot on listattu "},{"type":"element","tagName":"a","properties":{"href":"https://www.pygame.org/docs/ref/key.html#key-constants-label","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Pygamen dokumentaatiossa"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi kun käyttäjä painaa ensin kahdesti oikealle, sitten kerran vasemmalle ja lopuksi kerran oikealle, ohjelman tulostus on seuraava:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"x"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-x"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-x"]},"children":[{"type":"text","value":"oikealle\noikealle\nvasemmalle\noikealle"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme nyt tehdä ohjelman, jossa käyttäjä pystyy liikuttamaan hahmoa oikealle ja vasemmalle nuolinäppäimillä. Tämä onnistuu seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nrobo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"image"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"load"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"robo.png\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nx "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\ny "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_height"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"KEYDOWN"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_LEFT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_RIGHT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suoritus voi näyttää seuraavalta:"}]},{"type":"element","tagName":"img","properties":{"src":"/aac8387e39d3bb4adbfc1c36cae57345/pygame_liikutus.gif"},"children":[]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä muuttujat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"y"}]},{"type":"text","value":" sisältävät hahmon sijainnin. Käyttäjä pystyy muuttamaan muuttujaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":", ja muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"y"}]},{"type":"text","value":" on asetettu niin, että hahmo on ikkunan alalaidassa. Kun käyttäjä painaa vasemmalle tai oikealle nuolinäppäintä, hahmo liikkuu vastaavasti 10 pikseliä oikealle tai vasemmalle."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yllä oleva ohjelma toimii muuten hyvin, mutta pelikokemuksessa on puutteena, että näppäintä pitää painaa uudestaan aina, kun haluaa liikkua askeleen oikealle tai vasemmalle. Olisi parempi, että voi pitää näppäintä pohjassa ja hahmo liikkuu niin kauan, kuin näppäin on pohjassa. Seuraava koodi mahdollistaa tämän:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nrobo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"image"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"load"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"robo.png\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nx "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\ny "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_height"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\noikealle "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\nvasemmalle "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n\nkello "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"time"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"Clock"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"KEYDOWN"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_LEFT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n vasemmalle "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_RIGHT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n oikealle "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"KEYUP"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_LEFT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n vasemmalle "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_RIGHT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n oikealle "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" oikealle"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" vasemmalle"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"60"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodissa on nyt muuttujat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"oikealle"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vasemmalle"}]},{"type":"text","value":", joissa pidetään tietoa siitä, kuuluuko hahmon liikkua tällä hetkellä oikealle tai vasemmalle. Kun käyttäjä painaa alas nuolinäppäimen, vastaava muuttuja saa arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", ja kun käyttäjä nostaa alas nuolinäppäimen, vastaava muuttuja saa arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hahmon liike on tahdistettu kellon avulla niin, että liikkumista tapahtuu 60 kertaa sekunnissa. Jos nuolinäppäin on alhaalla, hahmo liikkuu 2 pikseliä oikealle tai vasemmalle. Tämän seurauksena hahmo liikkuu 120 pikseliä sekunnissa, jos nuolinäppäin on painettuna."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Neljä suuntaa","tmcname":"osa13-11_nelja_suuntaa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, jossa pelaaja pystyy ohjaamaan robottia neljään suuntaan nuolinäppäimillä. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/0461dfa5cb7291b279185dba96dfd819/pygame_nelja_suuntaa.gif"},"children":[]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Neljä seinää","tmcname":"osa13-12_nelja_seinaa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Paranna edellistä ohjelmaa niin, että robotti ei pysty menemään ikkunan ulkopuolelle mistään reunasta. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/bddcb9af6c636563eea121e3360b7b37/pygame_nelja_seinaa.gif"},"children":[]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kaksi pelaajaa","tmcname":"osa13-13_kaksi_pelaajaa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, jossa kaksi pelaajaa voi ohjata omia robottejaan. Toinen pelaaja käyttää nuolinäppäimiä ja toinen esimerkiksi w-s-a-d. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/57101a815ad1b5363307bc90dc112da6/pygame_kaksi_pelaajaa.gif"},"children":[]}]},{"type":"element","tagName":"h2","properties":{"id":"hiiren-kasittely","style":"position:relative;"},"children":[{"type":"text","value":"Hiiren käsittely"},{"type":"element","tagName":"a","properties":{"href":"#hiiren-kasittely","ariaLabel":"hiiren kasittely permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava koodi tunnistaa tapahtumat, jossa käyttäjä painaa hiiren nappia ikkunan alueella:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"MOUSEBUTTONDOWN"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"painoit nappia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"button"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kohdassa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suoritus voi näyttää tältä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"x"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-x"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-x"]},"children":[{"type":"text","value":"painoit nappia 1 kohdassa (82, 135)\npainoit nappia 1 kohdassa (369, 135)\npainoit nappia 1 kohdassa (269, 297)\npainoit nappia 3 kohdassa (515, 324)"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä nappi 1 tarkoittaa hiiren vasenta nappia ja nappi 3 tarkoittaa hiiren oikeaa nappia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma yhdistää hiiren käsittelyn ja kuvan piirtämisen. Kun käyttäjä painaa hiirellä ikkunan alueella, robotti piirretään hiiren kohtaan."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nrobo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"image"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"load"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"robo.png\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"MOUSEBUTTONDOWN"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_width"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_height"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suoritus voi näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/a41511bd13655f68553cc7e34de61edf/pygame_hiiri.gif"},"children":[]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma puolestaan toteuttaa animaation, jossa robotti seuraa hiirtä. Robotin sijainti on muuttujissa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"robo_x"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"robo_y"}]},{"type":"text","value":", ja kun hiiri liikkuu, sen sijainti merkitään muuttujiin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kohde_x"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kohde_y"}]},{"type":"text","value":". Jos robotti ei ole hiiren kohdalla, se liikkuu sopivaan suuntaan."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nrobo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"image"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"load"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"robo.png\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nrobo_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nrobo_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nkohde_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nkohde_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\nkello "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"time"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"Clock"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"MOUSEMOTION"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n kohde_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_width"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n kohde_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_height"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" robo_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" kohde_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n robo_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" robo_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" kohde_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n robo_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" robo_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" kohde_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n robo_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" robo_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" kohde_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n robo_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" robo_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"60"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suoritus voi näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/cd4d53df2a1564c181f38b7a2d45e7c9/pygame_hiiri2.gif"},"children":[]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Robotti ja hiiri","tmcname":"osa13-14_robotti_ja_hiiri"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, jossa robotti seuraa hiirtä niin, että robotin keskikohta on aina hiiren kohdalla. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/58d3b2e994913c8089688bcde5e4ed86/pygame_robotti_hiiri.gif"},"children":[]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Robotin paikka","tmcname":"osa13-15_robotin_paikka"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, jossa robotti on satunnaisessa paikassa ikkunassa. Kun pelaaja painaa hiirellä robotista, se siirtyy aina uuteen paikkaan. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/93991031970283be78df3ba4341a7362/pygame_robotti_paikka.gif"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Olet tutustunut Pygamen tapahtumiin
  • \n
  • Osaat tehdä ohjelman, joka lukee näppäimistön painalluksia
  • \n
  • Osaat tehdä ohjelman, joka lukee hiiren tapahtumia
  • \n

Tähän asti olemme toteuttaneet Pygame-ohjelman pääsilmukan niin, että se käy läpi tapahtumat ja tunnistaa tapahtuman pygame.QUIT, mutta ei käsittele muita tapahtumia. Nyt on aika tutustua tarkemmin tapahtumien käsittelyyn.

Tapahtumien käsittely

Seuraava koodi näyttää, mitä tapahtumia syntyy ohjelman suorituksen aikana:

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        print(tapahtuma)\n        if tapahtuma.type == pygame.QUIT:\n            exit()

Kun ohjelmaa käytetään hetki, se voi tulostaa esimerkiksi seuraavanlaisia tapahtumia:

<Event(4-MouseMotion {'pos': (495, 274), 'rel': (495, 274), 'buttons': (0, 0, 0), 'window': None})>\n<Event(4-MouseMotion {'pos': (494, 274), 'rel': (-1, 0), 'buttons': (0, 0, 0), 'window': None})>\n<Event(4-MouseMotion {'pos': (492, 274), 'rel': (-2, 0), 'buttons': (0, 0, 0), 'window': None})>\n<Event(4-MouseMotion {'pos': (491, 274), 'rel': (-1, 0), 'buttons': (0, 0, 0), 'window': None})>\n<Event(5-MouseButtonDown {'pos': (491, 274), 'button': 1, 'window': None})>\n<Event(6-MouseButtonUp {'pos': (491, 274), 'button': 1, 'window': None})>\n<Event(2-KeyDown {'unicode': 'a', 'key': 97, 'mod': 0, 'scancode': 38, 'window': None})>\n<Event(3-KeyUp {'key': 97, 'mod': 0, 'scancode': 38, 'window': None})>\n<Event(2-KeyDown {'unicode': 'b', 'key': 98, 'mod': 0, 'scancode': 56, 'window': None})>\n<Event(3-KeyUp {'key': 98, 'mod': 0, 'scancode': 56, 'window': None})>\n<Event(2-KeyDown {'unicode': 'c', 'key': 99, 'mod': 0, 'scancode': 54, 'window': None})>\n<Event(3-KeyUp {'key': 99, 'mod': 0, 'scancode': 54, 'window': None})>\n<Event(12-Quit {})>

Tässä ensimmäiset tapahtumat liittyvät hiiren käyttämiseen, seuraavat tapahtumat näppäimistön käyttämiseen ja viimeinen tapahtuma sulkee ohjelman. Jokaisella tapahtumalla on tyyppi ja mahdollisesti lisätietoa, josta voi päätellä esimerkiksi hiiren sijainnin tai painetun näppäimen.

Tapahtumia voi etsiä Pygamen dokumentaatiosta mutta usein tehokas tapa löytää sopiva tapahtuma on käyttää yllä olevaa koodia ja tutkia, millainen tapahtuma syntyy, kun ohjelmassa tapahtuu haluttu asia.

Näppäimistön käsittely

Seuraava ohjelma tunnistaa tapahtumat, joissa käyttäjä painaa oikealle tai vasemmalle nuolinäppäintä. Ohjelma tulostaa testiksi tiedon näppäimen painamisesta.

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.KEYDOWN:\n            if tapahtuma.key == pygame.K_LEFT:\n                print(\"vasemmalle\")\n            if tapahtuma.key == pygame.K_RIGHT:\n                print(\"oikealle\")\n\n        if tapahtuma.type == pygame.QUIT:\n            exit()

Tässä vakiot pygame.K_LEFT ja pygame.K_RIGHT tarkoittavat nuolinäppäimiä vasemmalle ja oikealle. Näppäimistön eri näppäimiä vastaavat vakiot on listattu Pygamen dokumentaatiossa.

Esimerkiksi kun käyttäjä painaa ensin kahdesti oikealle, sitten kerran vasemmalle ja lopuksi kerran oikealle, ohjelman tulostus on seuraava:

oikealle\noikealle\nvasemmalle\noikealle

Voimme nyt tehdä ohjelman, jossa käyttäjä pystyy liikuttamaan hahmoa oikealle ja vasemmalle nuolinäppäimillä. Tämä onnistuu seuraavasti:

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\n\nrobo = pygame.image.load(\"robo.png\")\nx = 0\ny = 480-robo.get_height()\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.KEYDOWN:\n            if tapahtuma.key == pygame.K_LEFT:\n                x -= 10\n            if tapahtuma.key == pygame.K_RIGHT:\n                x += 10\n\n        if tapahtuma.type == pygame.QUIT:\n            exit()\n\n    naytto.fill((0, 0, 0))\n    naytto.blit(robo, (x, y))\n    pygame.display.flip()

Ohjelman suoritus voi näyttää seuraavalta:

Tässä muuttujat x ja y sisältävät hahmon sijainnin. Käyttäjä pystyy muuttamaan muuttujaa x, ja muuttuja y on asetettu niin, että hahmo on ikkunan alalaidassa. Kun käyttäjä painaa vasemmalle tai oikealle nuolinäppäintä, hahmo liikkuu vastaavasti 10 pikseliä oikealle tai vasemmalle.

Yllä oleva ohjelma toimii muuten hyvin, mutta pelikokemuksessa on puutteena, että näppäintä pitää painaa uudestaan aina, kun haluaa liikkua askeleen oikealle tai vasemmalle. Olisi parempi, että voi pitää näppäintä pohjassa ja hahmo liikkuu niin kauan, kuin näppäin on pohjassa. Seuraava koodi mahdollistaa tämän:

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\n\nrobo = pygame.image.load(\"robo.png\")\nx = 0\ny = 480-robo.get_height()\n\noikealle = False\nvasemmalle = False\n\nkello = pygame.time.Clock()\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.KEYDOWN:\n            if tapahtuma.key == pygame.K_LEFT:\n                vasemmalle = True\n            if tapahtuma.key == pygame.K_RIGHT:\n                oikealle = True\n\n        if tapahtuma.type == pygame.KEYUP:\n            if tapahtuma.key == pygame.K_LEFT:\n                vasemmalle = False\n            if tapahtuma.key == pygame.K_RIGHT:\n                oikealle = False\n\n        if tapahtuma.type == pygame.QUIT:\n            exit()\n\n    if oikealle:\n        x += 2\n    if vasemmalle:\n        x -= 2\n\n    naytto.fill((0, 0, 0))\n    naytto.blit(robo, (x, y))\n    pygame.display.flip()\n\n    kello.tick(60)

Koodissa on nyt muuttujat oikealle ja vasemmalle, joissa pidetään tietoa siitä, kuuluuko hahmon liikkua tällä hetkellä oikealle tai vasemmalle. Kun käyttäjä painaa alas nuolinäppäimen, vastaava muuttuja saa arvon True, ja kun käyttäjä nostaa alas nuolinäppäimen, vastaava muuttuja saa arvon False.

Hahmon liike on tahdistettu kellon avulla niin, että liikkumista tapahtuu 60 kertaa sekunnissa. Jos nuolinäppäin on alhaalla, hahmo liikkuu 2 pikseliä oikealle tai vasemmalle. Tämän seurauksena hahmo liikkuu 120 pikseliä sekunnissa, jos nuolinäppäin on painettuna.

Tee ohjelma, jossa pelaaja pystyy ohjaamaan robottia neljään suuntaan nuolinäppäimillä. Ohjelman suorituksen tulee näyttää tältä:

Paranna edellistä ohjelmaa niin, että robotti ei pysty menemään ikkunan ulkopuolelle mistään reunasta. Ohjelman suorituksen tulee näyttää tältä:

Tee ohjelma, jossa kaksi pelaajaa voi ohjata omia robottejaan. Toinen pelaaja käyttää nuolinäppäimiä ja toinen esimerkiksi w-s-a-d. Ohjelman suorituksen tulee näyttää tältä:

Hiiren käsittely

Seuraava koodi tunnistaa tapahtumat, jossa käyttäjä painaa hiiren nappia ikkunan alueella:

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.MOUSEBUTTONDOWN:\n            print(\"painoit nappia\", tapahtuma.button, \"kohdassa\", tapahtuma.pos)\n\n        if tapahtuma.type == pygame.QUIT:\n            exit()

Ohjelman suoritus voi näyttää tältä:

painoit nappia 1 kohdassa (82, 135)\npainoit nappia 1 kohdassa (369, 135)\npainoit nappia 1 kohdassa (269, 297)\npainoit nappia 3 kohdassa (515, 324)

Tässä nappi 1 tarkoittaa hiiren vasenta nappia ja nappi 3 tarkoittaa hiiren oikeaa nappia.

Seuraava ohjelma yhdistää hiiren käsittelyn ja kuvan piirtämisen. Kun käyttäjä painaa hiirellä ikkunan alueella, robotti piirretään hiiren kohtaan.

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\n\nrobo = pygame.image.load(\"robo.png\")\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.MOUSEBUTTONDOWN:\n            x = tapahtuma.pos[0]-robo.get_width()/2\n            y = tapahtuma.pos[1]-robo.get_height()/2\n\n            naytto.fill((0, 0, 0))\n            naytto.blit(robo, (x, y))\n            pygame.display.flip()\n\n        if tapahtuma.type == pygame.QUIT:\n            exit()

Ohjelman suoritus voi näyttää tältä:

Seuraava ohjelma puolestaan toteuttaa animaation, jossa robotti seuraa hiirtä. Robotin sijainti on muuttujissa robo_x ja robo_y, ja kun hiiri liikkuu, sen sijainti merkitään muuttujiin kohde_x ja kohde_y. Jos robotti ei ole hiiren kohdalla, se liikkuu sopivaan suuntaan.

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\n\nrobo = pygame.image.load(\"robo.png\")\n\nrobo_x = 0\nrobo_y = 0\nkohde_x = 0\nkohde_y = 0\n\nkello = pygame.time.Clock()\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.MOUSEMOTION:\n            kohde_x = tapahtuma.pos[0]-robo.get_width()/2\n            kohde_y = tapahtuma.pos[1]-robo.get_height()/2\n\n        if tapahtuma.type == pygame.QUIT:\n            exit(0)\n\n    if robo_x > kohde_x:\n        robo_x -= 1\n    if robo_x < kohde_x:\n        robo_x += 1\n    if robo_y > kohde_y:\n        robo_y -= 1\n    if robo_y < kohde_y:\n        robo_y += 1\n\n    naytto.fill((0, 0, 0))\n    naytto.blit(robo, (robo_x, robo_y))\n    pygame.display.flip()\n\n    kello.tick(60)

Ohjelman suoritus voi näyttää tältä:

Tee ohjelma, jossa robotti seuraa hiirtä niin, että robotin keskikohta on aina hiiren kohdalla. Ohjelman suorituksen tulee näyttää tältä:

Tee ohjelma, jossa robotti on satunnaisessa paikassa ikkunassa. Kun pelaaja painaa hiirellä robotista, se siirtyy aina uuteen paikkaan. Ohjelman suorituksen tulee näyttää tältä:

","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-13/3-tapahtumat.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Olet tutustunut Pygamen tapahtumiin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat tehdä ohjelman, joka lukee näppäimistön painalluksia"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat tehdä ohjelman, joka lukee hiiren tapahtumia"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tähän asti olemme toteuttaneet Pygame-ohjelman pääsilmukan niin, että se käy läpi tapahtumat ja tunnistaa tapahtuman "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.QUIT"}]},{"type":"text","value":", mutta ei käsittele muita tapahtumia. Nyt on aika tutustua tarkemmin tapahtumien käsittelyyn."}]},{"type":"element","tagName":"h2","properties":{"id":"tapahtumien-kasittely","style":"position:relative;"},"children":[{"type":"text","value":"Tapahtumien käsittely"},{"type":"element","tagName":"a","properties":{"href":"#tapahtumien-kasittely","ariaLabel":"tapahtumien kasittely permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava koodi näyttää, mitä tapahtumia syntyy ohjelman suorituksen aikana:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun ohjelmaa käytetään hetki, se voi tulostaa esimerkiksi seuraavanlaisia tapahtumia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"x"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-x"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-x"]},"children":[{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä ensimmäiset tapahtumat liittyvät hiiren käyttämiseen, seuraavat tapahtumat näppäimistön käyttämiseen ja viimeinen tapahtuma sulkee ohjelman. Jokaisella tapahtumalla on tyyppi ja mahdollisesti lisätietoa, josta voi päätellä esimerkiksi hiiren sijainnin tai painetun näppäimen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tapahtumia voi etsiä Pygamen dokumentaatiosta mutta usein tehokas tapa löytää sopiva tapahtuma on käyttää yllä olevaa koodia ja tutkia, millainen tapahtuma syntyy, kun ohjelmassa tapahtuu haluttu asia."}]},{"type":"element","tagName":"h2","properties":{"id":"nappaimiston-kasittely","style":"position:relative;"},"children":[{"type":"text","value":"Näppäimistön käsittely"},{"type":"element","tagName":"a","properties":{"href":"#nappaimiston-kasittely","ariaLabel":"nappaimiston kasittely permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma tunnistaa tapahtumat, joissa käyttäjä painaa oikealle tai vasemmalle nuolinäppäintä. Ohjelma tulostaa testiksi tiedon näppäimen painamisesta."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"KEYDOWN"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_LEFT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vasemmalle\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_RIGHT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"oikealle\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä vakiot "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.K_LEFT"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.K_RIGHT"}]},{"type":"text","value":" tarkoittavat nuolinäppäimiä vasemmalle ja oikealle. Näppäimistön eri näppäimiä vastaavat vakiot on listattu "},{"type":"element","tagName":"a","properties":{"href":"https://www.pygame.org/docs/ref/key.html#key-constants-label","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Pygamen dokumentaatiossa"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi kun käyttäjä painaa ensin kahdesti oikealle, sitten kerran vasemmalle ja lopuksi kerran oikealle, ohjelman tulostus on seuraava:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"x"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-x"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-x"]},"children":[{"type":"text","value":"oikealle\noikealle\nvasemmalle\noikealle"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme nyt tehdä ohjelman, jossa käyttäjä pystyy liikuttamaan hahmoa oikealle ja vasemmalle nuolinäppäimillä. Tämä onnistuu seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nrobo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"image"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"load"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"robo.png\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nx "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\ny "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_height"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"KEYDOWN"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_LEFT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_RIGHT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suoritus voi näyttää seuraavalta:"}]},{"type":"element","tagName":"img","properties":{"src":"/aac8387e39d3bb4adbfc1c36cae57345/pygame_liikutus.gif"},"children":[]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä muuttujat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"y"}]},{"type":"text","value":" sisältävät hahmon sijainnin. Käyttäjä pystyy muuttamaan muuttujaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":", ja muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"y"}]},{"type":"text","value":" on asetettu niin, että hahmo on ikkunan alalaidassa. Kun käyttäjä painaa vasemmalle tai oikealle nuolinäppäintä, hahmo liikkuu vastaavasti 10 pikseliä oikealle tai vasemmalle."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yllä oleva ohjelma toimii muuten hyvin, mutta pelikokemuksessa on puutteena, että näppäintä pitää painaa uudestaan aina, kun haluaa liikkua askeleen oikealle tai vasemmalle. Olisi parempi, että voi pitää näppäintä pohjassa ja hahmo liikkuu niin kauan, kuin näppäin on pohjassa. Seuraava koodi mahdollistaa tämän:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nrobo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"image"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"load"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"robo.png\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nx "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\ny "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_height"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\noikealle "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\nvasemmalle "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n\nkello "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"time"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"Clock"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"KEYDOWN"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_LEFT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n vasemmalle "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_RIGHT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n oikealle "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"KEYUP"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_LEFT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n vasemmalle "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_RIGHT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n oikealle "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" oikealle"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" vasemmalle"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"60"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodissa on nyt muuttujat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"oikealle"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vasemmalle"}]},{"type":"text","value":", joissa pidetään tietoa siitä, kuuluuko hahmon liikkua tällä hetkellä oikealle tai vasemmalle. Kun käyttäjä painaa alas nuolinäppäimen, vastaava muuttuja saa arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", ja kun käyttäjä nostaa alas nuolinäppäimen, vastaava muuttuja saa arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hahmon liike on tahdistettu kellon avulla niin, että liikkumista tapahtuu 60 kertaa sekunnissa. Jos nuolinäppäin on alhaalla, hahmo liikkuu 2 pikseliä oikealle tai vasemmalle. Tämän seurauksena hahmo liikkuu 120 pikseliä sekunnissa, jos nuolinäppäin on painettuna."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Neljä suuntaa","tmcname":"osa13-11_nelja_suuntaa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, jossa pelaaja pystyy ohjaamaan robottia neljään suuntaan nuolinäppäimillä. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/0461dfa5cb7291b279185dba96dfd819/pygame_nelja_suuntaa.gif"},"children":[]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Neljä seinää","tmcname":"osa13-12_nelja_seinaa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Paranna edellistä ohjelmaa niin, että robotti ei pysty menemään ikkunan ulkopuolelle mistään reunasta. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/bddcb9af6c636563eea121e3360b7b37/pygame_nelja_seinaa.gif"},"children":[]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kaksi pelaajaa","tmcname":"osa13-13_kaksi_pelaajaa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, jossa kaksi pelaajaa voi ohjata omia robottejaan. Toinen pelaaja käyttää nuolinäppäimiä ja toinen esimerkiksi w-s-a-d. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/57101a815ad1b5363307bc90dc112da6/pygame_kaksi_pelaajaa.gif"},"children":[]}]},{"type":"element","tagName":"h2","properties":{"id":"hiiren-kasittely","style":"position:relative;"},"children":[{"type":"text","value":"Hiiren käsittely"},{"type":"element","tagName":"a","properties":{"href":"#hiiren-kasittely","ariaLabel":"hiiren kasittely permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava koodi tunnistaa tapahtumat, jossa käyttäjä painaa hiiren nappia ikkunan alueella:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"MOUSEBUTTONDOWN"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"painoit nappia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"button"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kohdassa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suoritus voi näyttää tältä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"x"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-x"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-x"]},"children":[{"type":"text","value":"painoit nappia 1 kohdassa (82, 135)\npainoit nappia 1 kohdassa (369, 135)\npainoit nappia 1 kohdassa (269, 297)\npainoit nappia 3 kohdassa (515, 324)"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä nappi 1 tarkoittaa hiiren vasenta nappia ja nappi 3 tarkoittaa hiiren oikeaa nappia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma yhdistää hiiren käsittelyn ja kuvan piirtämisen. Kun käyttäjä painaa hiirellä ikkunan alueella, robotti piirretään hiiren kohtaan."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nrobo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"image"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"load"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"robo.png\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"MOUSEBUTTONDOWN"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_width"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_height"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suoritus voi näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/a41511bd13655f68553cc7e34de61edf/pygame_hiiri.gif"},"children":[]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma puolestaan toteuttaa animaation, jossa robotti seuraa hiirtä. Robotin sijainti on muuttujissa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"robo_x"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"robo_y"}]},{"type":"text","value":", ja kun hiiri liikkuu, sen sijainti merkitään muuttujiin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kohde_x"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kohde_y"}]},{"type":"text","value":". Jos robotti ei ole hiiren kohdalla, se liikkuu sopivaan suuntaan."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nrobo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"image"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"load"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"robo.png\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nrobo_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nrobo_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nkohde_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nkohde_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\nkello "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"time"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"Clock"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"MOUSEMOTION"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n kohde_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_width"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n kohde_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_height"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" robo_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" kohde_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n robo_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" robo_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" kohde_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n robo_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" robo_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" kohde_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n robo_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" robo_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" kohde_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n robo_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"robo_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" robo_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"60"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suoritus voi näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/cd4d53df2a1564c181f38b7a2d45e7c9/pygame_hiiri2.gif"},"children":[]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Robotti ja hiiri","tmcname":"osa13-14_robotti_ja_hiiri"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, jossa robotti seuraa hiirtä niin, että robotin keskikohta on aina hiiren kohdalla. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/58d3b2e994913c8089688bcde5e4ed86/pygame_robotti_hiiri.gif"},"children":[]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Robotin paikka","tmcname":"osa13-15_robotin_paikka"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, jossa robotti on satunnaisessa paikassa ikkunassa. Kun pelaaja painaa hiirellä robotista, se siirtyy aina uuteen paikkaan. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/93991031970283be78df3ba4341a7362/pygame_robotti_paikka.gif"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Olet tutustunut Pygamen tapahtumiin
  • \n
  • Osaat tehdä ohjelman, joka lukee näppäimistön painalluksia
  • \n
  • Osaat tehdä ohjelman, joka lukee hiiren tapahtumia
  • \n

Tähän asti olemme toteuttaneet Pygame-ohjelman pääsilmukan niin, että se käy läpi tapahtumat ja tunnistaa tapahtuman pygame.QUIT, mutta ei käsittele muita tapahtumia. Nyt on aika tutustua tarkemmin tapahtumien käsittelyyn.

Tapahtumien käsittely

Seuraava koodi näyttää, mitä tapahtumia syntyy ohjelman suorituksen aikana:

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        print(tapahtuma)\n        if tapahtuma.type == pygame.QUIT:\n            exit()

Kun ohjelmaa käytetään hetki, se voi tulostaa esimerkiksi seuraavanlaisia tapahtumia:

<Event(4-MouseMotion {'pos': (495, 274), 'rel': (495, 274), 'buttons': (0, 0, 0), 'window': None})>\n<Event(4-MouseMotion {'pos': (494, 274), 'rel': (-1, 0), 'buttons': (0, 0, 0), 'window': None})>\n<Event(4-MouseMotion {'pos': (492, 274), 'rel': (-2, 0), 'buttons': (0, 0, 0), 'window': None})>\n<Event(4-MouseMotion {'pos': (491, 274), 'rel': (-1, 0), 'buttons': (0, 0, 0), 'window': None})>\n<Event(5-MouseButtonDown {'pos': (491, 274), 'button': 1, 'window': None})>\n<Event(6-MouseButtonUp {'pos': (491, 274), 'button': 1, 'window': None})>\n<Event(2-KeyDown {'unicode': 'a', 'key': 97, 'mod': 0, 'scancode': 38, 'window': None})>\n<Event(3-KeyUp {'key': 97, 'mod': 0, 'scancode': 38, 'window': None})>\n<Event(2-KeyDown {'unicode': 'b', 'key': 98, 'mod': 0, 'scancode': 56, 'window': None})>\n<Event(3-KeyUp {'key': 98, 'mod': 0, 'scancode': 56, 'window': None})>\n<Event(2-KeyDown {'unicode': 'c', 'key': 99, 'mod': 0, 'scancode': 54, 'window': None})>\n<Event(3-KeyUp {'key': 99, 'mod': 0, 'scancode': 54, 'window': None})>\n<Event(12-Quit {})>

Tässä ensimmäiset tapahtumat liittyvät hiiren käyttämiseen, seuraavat tapahtumat näppäimistön käyttämiseen ja viimeinen tapahtuma sulkee ohjelman. Jokaisella tapahtumalla on tyyppi ja mahdollisesti lisätietoa, josta voi päätellä esimerkiksi hiiren sijainnin tai painetun näppäimen.

Tapahtumia voi etsiä Pygamen dokumentaatiosta mutta usein tehokas tapa löytää sopiva tapahtuma on käyttää yllä olevaa koodia ja tutkia, millainen tapahtuma syntyy, kun ohjelmassa tapahtuu haluttu asia.

Näppäimistön käsittely

Seuraava ohjelma tunnistaa tapahtumat, joissa käyttäjä painaa oikealle tai vasemmalle nuolinäppäintä. Ohjelma tulostaa testiksi tiedon näppäimen painamisesta.

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.KEYDOWN:\n            if tapahtuma.key == pygame.K_LEFT:\n                print(\"vasemmalle\")\n            if tapahtuma.key == pygame.K_RIGHT:\n                print(\"oikealle\")\n\n        if tapahtuma.type == pygame.QUIT:\n            exit()

Tässä vakiot pygame.K_LEFT ja pygame.K_RIGHT tarkoittavat nuolinäppäimiä vasemmalle ja oikealle. Näppäimistön eri näppäimiä vastaavat vakiot on listattu Pygamen dokumentaatiossa.

Esimerkiksi kun käyttäjä painaa ensin kahdesti oikealle, sitten kerran vasemmalle ja lopuksi kerran oikealle, ohjelman tulostus on seuraava:

oikealle\noikealle\nvasemmalle\noikealle

Voimme nyt tehdä ohjelman, jossa käyttäjä pystyy liikuttamaan hahmoa oikealle ja vasemmalle nuolinäppäimillä. Tämä onnistuu seuraavasti:

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\n\nrobo = pygame.image.load(\"robo.png\")\nx = 0\ny = 480-robo.get_height()\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.KEYDOWN:\n            if tapahtuma.key == pygame.K_LEFT:\n                x -= 10\n            if tapahtuma.key == pygame.K_RIGHT:\n                x += 10\n\n        if tapahtuma.type == pygame.QUIT:\n            exit()\n\n    naytto.fill((0, 0, 0))\n    naytto.blit(robo, (x, y))\n    pygame.display.flip()

Ohjelman suoritus voi näyttää seuraavalta:

Tässä muuttujat x ja y sisältävät hahmon sijainnin. Käyttäjä pystyy muuttamaan muuttujaa x, ja muuttuja y on asetettu niin, että hahmo on ikkunan alalaidassa. Kun käyttäjä painaa vasemmalle tai oikealle nuolinäppäintä, hahmo liikkuu vastaavasti 10 pikseliä oikealle tai vasemmalle.

Yllä oleva ohjelma toimii muuten hyvin, mutta pelikokemuksessa on puutteena, että näppäintä pitää painaa uudestaan aina, kun haluaa liikkua askeleen oikealle tai vasemmalle. Olisi parempi, että voi pitää näppäintä pohjassa ja hahmo liikkuu niin kauan, kuin näppäin on pohjassa. Seuraava koodi mahdollistaa tämän:

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\n\nrobo = pygame.image.load(\"robo.png\")\nx = 0\ny = 480-robo.get_height()\n\noikealle = False\nvasemmalle = False\n\nkello = pygame.time.Clock()\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.KEYDOWN:\n            if tapahtuma.key == pygame.K_LEFT:\n                vasemmalle = True\n            if tapahtuma.key == pygame.K_RIGHT:\n                oikealle = True\n\n        if tapahtuma.type == pygame.KEYUP:\n            if tapahtuma.key == pygame.K_LEFT:\n                vasemmalle = False\n            if tapahtuma.key == pygame.K_RIGHT:\n                oikealle = False\n\n        if tapahtuma.type == pygame.QUIT:\n            exit()\n\n    if oikealle:\n        x += 2\n    if vasemmalle:\n        x -= 2\n\n    naytto.fill((0, 0, 0))\n    naytto.blit(robo, (x, y))\n    pygame.display.flip()\n\n    kello.tick(60)

Koodissa on nyt muuttujat oikealle ja vasemmalle, joissa pidetään tietoa siitä, kuuluuko hahmon liikkua tällä hetkellä oikealle tai vasemmalle. Kun käyttäjä painaa alas nuolinäppäimen, vastaava muuttuja saa arvon True, ja kun käyttäjä nostaa alas nuolinäppäimen, vastaava muuttuja saa arvon False.

Hahmon liike on tahdistettu kellon avulla niin, että liikkumista tapahtuu 60 kertaa sekunnissa. Jos nuolinäppäin on alhaalla, hahmo liikkuu 2 pikseliä oikealle tai vasemmalle. Tämän seurauksena hahmo liikkuu 120 pikseliä sekunnissa, jos nuolinäppäin on painettuna.

Tee ohjelma, jossa pelaaja pystyy ohjaamaan robottia neljään suuntaan nuolinäppäimillä. Ohjelman suorituksen tulee näyttää tältä:

Paranna edellistä ohjelmaa niin, että robotti ei pysty menemään ikkunan ulkopuolelle mistään reunasta. Ohjelman suorituksen tulee näyttää tältä:

Tee ohjelma, jossa kaksi pelaajaa voi ohjata omia robottejaan. Toinen pelaaja käyttää nuolinäppäimiä ja toinen esimerkiksi w-s-a-d. Ohjelman suorituksen tulee näyttää tältä:

Hiiren käsittely

Seuraava koodi tunnistaa tapahtumat, jossa käyttäjä painaa hiiren nappia ikkunan alueella:

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.MOUSEBUTTONDOWN:\n            print(\"painoit nappia\", tapahtuma.button, \"kohdassa\", tapahtuma.pos)\n\n        if tapahtuma.type == pygame.QUIT:\n            exit()

Ohjelman suoritus voi näyttää tältä:

painoit nappia 1 kohdassa (82, 135)\npainoit nappia 1 kohdassa (369, 135)\npainoit nappia 1 kohdassa (269, 297)\npainoit nappia 3 kohdassa (515, 324)

Tässä nappi 1 tarkoittaa hiiren vasenta nappia ja nappi 3 tarkoittaa hiiren oikeaa nappia.

Seuraava ohjelma yhdistää hiiren käsittelyn ja kuvan piirtämisen. Kun käyttäjä painaa hiirellä ikkunan alueella, robotti piirretään hiiren kohtaan.

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\n\nrobo = pygame.image.load(\"robo.png\")\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.MOUSEBUTTONDOWN:\n            x = tapahtuma.pos[0]-robo.get_width()/2\n            y = tapahtuma.pos[1]-robo.get_height()/2\n\n            naytto.fill((0, 0, 0))\n            naytto.blit(robo, (x, y))\n            pygame.display.flip()\n\n        if tapahtuma.type == pygame.QUIT:\n            exit()

Ohjelman suoritus voi näyttää tältä:

Seuraava ohjelma puolestaan toteuttaa animaation, jossa robotti seuraa hiirtä. Robotin sijainti on muuttujissa robo_x ja robo_y, ja kun hiiri liikkuu, sen sijainti merkitään muuttujiin kohde_x ja kohde_y. Jos robotti ei ole hiiren kohdalla, se liikkuu sopivaan suuntaan.

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\n\nrobo = pygame.image.load(\"robo.png\")\n\nrobo_x = 0\nrobo_y = 0\nkohde_x = 0\nkohde_y = 0\n\nkello = pygame.time.Clock()\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.MOUSEMOTION:\n            kohde_x = tapahtuma.pos[0]-robo.get_width()/2\n            kohde_y = tapahtuma.pos[1]-robo.get_height()/2\n\n        if tapahtuma.type == pygame.QUIT:\n            exit(0)\n\n    if robo_x > kohde_x:\n        robo_x -= 1\n    if robo_x < kohde_x:\n        robo_x += 1\n    if robo_y > kohde_y:\n        robo_y -= 1\n    if robo_y < kohde_y:\n        robo_y += 1\n\n    naytto.fill((0, 0, 0))\n    naytto.blit(robo, (robo_x, robo_y))\n    pygame.display.flip()\n\n    kello.tick(60)

Ohjelman suoritus voi näyttää tältä:

Tee ohjelma, jossa robotti seuraa hiirtä niin, että robotin keskikohta on aina hiiren kohdalla. Ohjelman suorituksen tulee näyttää tältä:

Tee ohjelma, jossa robotti on satunnaisessa paikassa ikkunassa. Kun pelaaja painaa hiirellä robotista, se siirtyy aina uuteen paikkaan. Ohjelman suorituksen tulee näyttää tältä:

","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-13/3-tapahtumat.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-13/4-lisaa-tekniikoita/page-data.json b/page-data/osa-13/4-lisaa-tekniikoita/page-data.json index 82c9a0a9c..c3dd88d7b 100644 --- a/page-data/osa-13/4-lisaa-tekniikoita/page-data.json +++ b/page-data/osa-13/4-lisaa-tekniikoita/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-13/4-lisaa-tekniikoita", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten ikkunan otsikkoa voi muuttaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat piirtää kuvioita Pygamessa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat piirtää ikkunaan myös tekstiä"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"ikkunan-otsikko","style":"position:relative;"},"children":[{"type":"text","value":"Ikkunan otsikko"},{"type":"element","tagName":"a","properties":{"href":"#ikkunan-otsikko","ariaLabel":"ikkunan otsikko permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma näyttää ammattimaisemmalta, jos ikkunan otsikkopalkissa ei lue \"pygame window\" vaan ohjelman todellinen nimi. Tämä onnistuu näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_caption"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suuri seikkailu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"kuvioiden-piirtaminen","style":"position:relative;"},"children":[{"type":"text","value":"Kuvioiden piirtäminen"},{"type":"element","tagName":"a","properties":{"href":"#kuvioiden-piirtaminen","ariaLabel":"kuvioiden piirtaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma luo kuvan, jossa on suorakulmio, ympyrä ja viiva:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"draw"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rect"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"255"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"200"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"250"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"draw"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"circle"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"255"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"200"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"150"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"40"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"draw"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"line"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"255"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"80"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"120"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"300"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"160"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulos näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/9a7380e2e818c94a080d41344f073d5a/pygame_kuviot.gif"},"children":[]},{"type":"element","tagName":"h2","properties":{"id":"tekstin-piirtaminen","style":"position:relative;"},"children":[{"type":"text","value":"Tekstin piirtäminen"},{"type":"element","tagName":"a","properties":{"href":"#tekstin-piirtaminen","ariaLabel":"tekstin piirtaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tekstin piirtäminen tapahtuu Pygame-kirjastossa niin, että ensin luodaan tekstiä vastaava kuva ja sen jälkeen piirretään kuva näytölle. Seuraava ohjelma esittelee asiaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nfontti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"font"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"SysFont"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arial\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nteksti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" fontti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"render"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moikka!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"255"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"teksti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suoritus näyttää seuraavalta:"}]},{"type":"element","tagName":"img","properties":{"src":"/ff536f08ddabdda8d522cc90c967ca8e/pygame_teksti.gif"},"children":[]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.font.SysFont"}]},{"type":"text","value":" luo fonttiolion, joka käyttää järjestelmän fonttia Arial kokona 24. Tämän jälkeen olion metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"render"}]},{"type":"text","value":" luo kuvan, jossa lukee teksti \"Moikka!\" punaisella värillä, ja tämä kuva piirretään ikkunaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että eri järjestelmissä on saatavilla eri fontit. Jos järjestelmässä ei ole fonttia Arial (mikä tosin on yleinen fontti), yllä oleva koodi käyttää sen sijasta järjestelmän oletusfonttia. Toinen mahdollisuus on käyttää metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.font.Font"}]},{"type":"text","value":", jolle annetaan hakemistossa olevan fonttitiedoston nimi."}]},{"type":"element","tagName":"h2","properties":{"id":"tehtavat","style":"position:relative;"},"children":[{"type":"text","value":"Tehtävät"},{"type":"element","tagName":"a","properties":{"href":"#tehtavat","ariaLabel":"tehtavat permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä on pari vaikeampaa tehtävää, joiden avulla voit harjoitella lisää tämän luvun asioita."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kello","tmcname":"osa13-16_kello"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka näyttää graafisesti kellonajan. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/0e95a9664e02d0dd939be3ebfd4725d5/pygame_kello.gif"},"children":[]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Asteroidit","tmcname":"osa13-17_asteroidit"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee peli, jossa pelaaja ohjaa robottia vasemmalle ja oikealle ja tavoitteena on kerätä taivaalta putoavia asteroideja. Pelaaja saa pisteen jokaisesta kerätystä asteroidista, ja pistemäärä näytetään ikkunan ylälaidassa. Peli päättyy, kun pelaaja ei saa kiinni asteroidia. Pelin tulisi näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/589bb5f7fafc7f948dfab758f0bd6273/pygame_asteroidit.gif"},"children":[]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on asteroidia varten kuvatiedosto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kivi.png"}]},{"type":"text","value":"."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa lopuksi osion loppukyselyyn:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, miten ikkunan otsikkoa voi muuttaa
  • \n
  • Osaat piirtää kuvioita Pygamessa
  • \n
  • Osaat piirtää ikkunaan myös tekstiä
  • \n

Ikkunan otsikko

Ohjelma näyttää ammattimaisemmalta, jos ikkunan otsikkopalkissa ei lue \"pygame window\" vaan ohjelman todellinen nimi. Tämä onnistuu näin:

pygame.display.set_caption(\"Suuri seikkailu\")

Kuvioiden piirtäminen

Seuraava ohjelma luo kuvan, jossa on suorakulmio, ympyrä ja viiva:

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\nnaytto.fill((0, 0, 0))\n\npygame.draw.rect(naytto, (0, 255, 0), (50, 100, 200, 250))\npygame.draw.circle(naytto, (255, 0, 0), (200, 150), 40)\npygame.draw.line(naytto, (0, 0, 255), (80, 120), (300, 160), 2)\n\npygame.display.flip()\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.QUIT:\n            exit()

Ohjelman tulos näyttää tältä:

Tekstin piirtäminen

Tekstin piirtäminen tapahtuu Pygame-kirjastossa niin, että ensin luodaan tekstiä vastaava kuva ja sen jälkeen piirretään kuva näytölle. Seuraava ohjelma esittelee asiaa:

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\nnaytto.fill((0, 0, 0))\n\nfontti = pygame.font.SysFont(\"Arial\", 24)\nteksti = fontti.render(\"Moikka!\", True, (255, 0, 0))\nnaytto.blit(teksti, (100, 50))\npygame.display.flip()\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.QUIT:\n            exit()

Ohjelman suoritus näyttää seuraavalta:

Tässä metodi pygame.font.SysFont luo fonttiolion, joka käyttää järjestelmän fonttia Arial kokona 24. Tämän jälkeen olion metodi render luo kuvan, jossa lukee teksti \"Moikka!\" punaisella värillä, ja tämä kuva piirretään ikkunaan.

Huomaa, että eri järjestelmissä on saatavilla eri fontit. Jos järjestelmässä ei ole fonttia Arial (mikä tosin on yleinen fontti), yllä oleva koodi käyttää sen sijasta järjestelmän oletusfonttia. Toinen mahdollisuus on käyttää metodia pygame.font.Font, jolle annetaan hakemistossa olevan fonttitiedoston nimi.

Tehtävät

Tässä on pari vaikeampaa tehtävää, joiden avulla voit harjoitella lisää tämän luvun asioita.

Tee ohjelma, joka näyttää graafisesti kellonajan. Ohjelman suorituksen tulee näyttää tältä:

Tee peli, jossa pelaaja ohjaa robottia vasemmalle ja oikealle ja tavoitteena on kerätä taivaalta putoavia asteroideja. Pelaaja saa pisteen jokaisesta kerätystä asteroidista, ja pistemäärä näytetään ikkunan ylälaidassa. Peli päättyy, kun pelaaja ei saa kiinni asteroidia. Pelin tulisi näyttää tältä:

Tehtäväpohjassa on asteroidia varten kuvatiedosto kivi.png.

Vastaa lopuksi osion loppukyselyyn:

","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-13/4-lisaa-tekniikoita.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten ikkunan otsikkoa voi muuttaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat piirtää kuvioita Pygamessa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat piirtää ikkunaan myös tekstiä"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"ikkunan-otsikko","style":"position:relative;"},"children":[{"type":"text","value":"Ikkunan otsikko"},{"type":"element","tagName":"a","properties":{"href":"#ikkunan-otsikko","ariaLabel":"ikkunan otsikko permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma näyttää ammattimaisemmalta, jos ikkunan otsikkopalkissa ei lue \"pygame window\" vaan ohjelman todellinen nimi. Tämä onnistuu näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_caption"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suuri seikkailu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"kuvioiden-piirtaminen","style":"position:relative;"},"children":[{"type":"text","value":"Kuvioiden piirtäminen"},{"type":"element","tagName":"a","properties":{"href":"#kuvioiden-piirtaminen","ariaLabel":"kuvioiden piirtaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma luo kuvan, jossa on suorakulmio, ympyrä ja viiva:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"draw"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rect"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"255"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"200"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"250"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"draw"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"circle"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"255"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"200"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"150"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"40"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"draw"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"line"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"255"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"80"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"120"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"300"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"160"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulos näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/9a7380e2e818c94a080d41344f073d5a/pygame_kuviot.gif"},"children":[]},{"type":"element","tagName":"h2","properties":{"id":"tekstin-piirtaminen","style":"position:relative;"},"children":[{"type":"text","value":"Tekstin piirtäminen"},{"type":"element","tagName":"a","properties":{"href":"#tekstin-piirtaminen","ariaLabel":"tekstin piirtaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tekstin piirtäminen tapahtuu Pygame-kirjastossa niin, että ensin luodaan tekstiä vastaava kuva ja sen jälkeen piirretään kuva näytölle. Seuraava ohjelma esittelee asiaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"640"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"480"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nfontti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"font"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"SysFont"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arial\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nteksti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" fontti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"render"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moikka!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"255"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnaytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"teksti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suoritus näyttää seuraavalta:"}]},{"type":"element","tagName":"img","properties":{"src":"/ff536f08ddabdda8d522cc90c967ca8e/pygame_teksti.gif"},"children":[]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.font.SysFont"}]},{"type":"text","value":" luo fonttiolion, joka käyttää järjestelmän fonttia Arial kokona 24. Tämän jälkeen olion metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"render"}]},{"type":"text","value":" luo kuvan, jossa lukee teksti \"Moikka!\" punaisella värillä, ja tämä kuva piirretään ikkunaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että eri järjestelmissä on saatavilla eri fontit. Jos järjestelmässä ei ole fonttia Arial (mikä tosin on yleinen fontti), yllä oleva koodi käyttää sen sijasta järjestelmän oletusfonttia. Toinen mahdollisuus on käyttää metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pygame.font.Font"}]},{"type":"text","value":", jolle annetaan hakemistossa olevan fonttitiedoston nimi."}]},{"type":"element","tagName":"h2","properties":{"id":"tehtavat","style":"position:relative;"},"children":[{"type":"text","value":"Tehtävät"},{"type":"element","tagName":"a","properties":{"href":"#tehtavat","ariaLabel":"tehtavat permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä on pari vaikeampaa tehtävää, joiden avulla voit harjoitella lisää tämän luvun asioita."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kello","tmcname":"osa13-16_kello"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka näyttää graafisesti kellonajan. Ohjelman suorituksen tulee näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/0e95a9664e02d0dd939be3ebfd4725d5/pygame_kello.gif"},"children":[]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Asteroidit","tmcname":"osa13-17_asteroidit"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee peli, jossa pelaaja ohjaa robottia vasemmalle ja oikealle ja tavoitteena on kerätä taivaalta putoavia asteroideja. Pelaaja saa pisteen jokaisesta kerätystä asteroidista, ja pistemäärä näytetään ikkunan ylälaidassa. Peli päättyy, kun pelaaja ei saa kiinni asteroidia. Pelin tulisi näyttää tältä:"}]},{"type":"element","tagName":"img","properties":{"src":"/589bb5f7fafc7f948dfab758f0bd6273/pygame_asteroidit.gif"},"children":[]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on asteroidia varten kuvatiedosto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kivi.png"}]},{"type":"text","value":"."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa lopuksi osion loppukyselyyn:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, miten ikkunan otsikkoa voi muuttaa
  • \n
  • Osaat piirtää kuvioita Pygamessa
  • \n
  • Osaat piirtää ikkunaan myös tekstiä
  • \n

Ikkunan otsikko

Ohjelma näyttää ammattimaisemmalta, jos ikkunan otsikkopalkissa ei lue \"pygame window\" vaan ohjelman todellinen nimi. Tämä onnistuu näin:

pygame.display.set_caption(\"Suuri seikkailu\")

Kuvioiden piirtäminen

Seuraava ohjelma luo kuvan, jossa on suorakulmio, ympyrä ja viiva:

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\nnaytto.fill((0, 0, 0))\n\npygame.draw.rect(naytto, (0, 255, 0), (50, 100, 200, 250))\npygame.draw.circle(naytto, (255, 0, 0), (200, 150), 40)\npygame.draw.line(naytto, (0, 0, 255), (80, 120), (300, 160), 2)\n\npygame.display.flip()\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.QUIT:\n            exit()

Ohjelman tulos näyttää tältä:

Tekstin piirtäminen

Tekstin piirtäminen tapahtuu Pygame-kirjastossa niin, että ensin luodaan tekstiä vastaava kuva ja sen jälkeen piirretään kuva näytölle. Seuraava ohjelma esittelee asiaa:

import pygame\n\npygame.init()\nnaytto = pygame.display.set_mode((640, 480))\nnaytto.fill((0, 0, 0))\n\nfontti = pygame.font.SysFont(\"Arial\", 24)\nteksti = fontti.render(\"Moikka!\", True, (255, 0, 0))\nnaytto.blit(teksti, (100, 50))\npygame.display.flip()\n\nwhile True:\n    for tapahtuma in pygame.event.get():\n        if tapahtuma.type == pygame.QUIT:\n            exit()

Ohjelman suoritus näyttää seuraavalta:

Tässä metodi pygame.font.SysFont luo fonttiolion, joka käyttää järjestelmän fonttia Arial kokona 24. Tämän jälkeen olion metodi render luo kuvan, jossa lukee teksti \"Moikka!\" punaisella värillä, ja tämä kuva piirretään ikkunaan.

Huomaa, että eri järjestelmissä on saatavilla eri fontit. Jos järjestelmässä ei ole fonttia Arial (mikä tosin on yleinen fontti), yllä oleva koodi käyttää sen sijasta järjestelmän oletusfonttia. Toinen mahdollisuus on käyttää metodia pygame.font.Font, jolle annetaan hakemistossa olevan fonttitiedoston nimi.

Tehtävät

Tässä on pari vaikeampaa tehtävää, joiden avulla voit harjoitella lisää tämän luvun asioita.

Tee ohjelma, joka näyttää graafisesti kellonajan. Ohjelman suorituksen tulee näyttää tältä:

Tee peli, jossa pelaaja ohjaa robottia vasemmalle ja oikealle ja tavoitteena on kerätä taivaalta putoavia asteroideja. Pelaaja saa pisteen jokaisesta kerätystä asteroidista, ja pistemäärä näytetään ikkunan ylälaidassa. Peli päättyy, kun pelaaja ei saa kiinni asteroidia. Pelin tulisi näyttää tältä:

Tehtäväpohjassa on asteroidia varten kuvatiedosto kivi.png.

Vastaa lopuksi osion loppukyselyyn:

","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-13/4-lisaa-tekniikoita.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-13/page-data.json b/page-data/osa-13/page-data.json index ed2fcfecf..bcf6021f2 100644 --- a/page-data/osa-13/page-data.json +++ b/page-data/osa-13/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-part-overview-template-js", "path": "/osa-13", - "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-13","title":"Osa 13"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-13/index.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-13","title":"Osa 13"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-13/index.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-14/1-peliprojekti/page-data.json b/page-data/osa-14/1-peliprojekti/page-data.json index bc70ad6e2..78c41bbcd 100644 --- a/page-data/osa-14/1-peliprojekti/page-data.json +++ b/page-data/osa-14/1-peliprojekti/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-14/1-peliprojekti", - "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä osassa tehdään Pygamen avulla hieman laajempi peli, joka on muunnelma perinteisestä Sokoban-pelistä. Pelaaja ohjaa ruudukossa olevaa robottia, jonka tehtävänä on työntää laatikot oikeille paikoille käyttäen mahdollisimman vähän siirtoja."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lopullinen peli tulee näyttämään tältä:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 852px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/e334a0f0fea9438564e48d0bba7cbbc4/47ff6/peli.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 44.34782608695652%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAAsTAAALEwEAmpwYAAACGUlEQVQozyWO0UsaAQCH73RHlgm10ztbJUEvkkIzzrsHxRPShx56LUYRkqVPC2rhqZ2iKGiEiFDsdAX2T0SshxhGk/J9hG+tWlIRBA41xm+4fY+/7+H7EbFYLBQKybKcSqWi0agkSfF4PJlMbm5urq9vJBIJeWtLkqRYLJZOpyVJikQi4XBYluVMJkOYzWaP12u323t6epxOp9frHR4eHhkZmZ6eFkVRq9VOcdzMzMz4+Pjg4KAoim632+PxGI1GjuOIvb09ALVajef5x8dHAH6/f2lpCUCj0TCZTOfn5wD29/dnZ2cBtNttAKurq1arlSgmk/fV6tfT09/N5sPzM4AVv39hcRHAz+vr0bGx7+Xyj8vL6sVFs9l8eXl5enoCEAgEbDYbkd/ZAfCtUnGL4kOlUj07q9Zqv66u7iuV45OTer3euLn58/paKpXm5+dbrdb/dz6fr1tWFAXA8dHRu6Gh57s7AJ8V5UuxCOD29vbTxka9XgeQz+c5jgPQ6XQABIPByclJ4sPCwu7u7sry8qjJlM5my4eHgiBwdnvp4CC7va3T6T6urZXL5bm5OYvFUigUcrmcoigul0sQBEJDUQRBUG+6qMku/RpNf19fd1Srdb29lEqlJkmKojQazT9PqlQqkiR5niem9HoLy7IGg4GmLQxjZVlerx+laRPLvmcYM00LDDPBsm+7nmZZlmEYo9E4MDDgcDj+AisL8KSDCe9vAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/e334a0f0fea9438564e48d0bba7cbbc4/a0b58/peli.webp 230w","/static/e334a0f0fea9438564e48d0bba7cbbc4/bc10c/peli.webp 460w","/static/e334a0f0fea9438564e48d0bba7cbbc4/39392/peli.webp 852w"],"sizes":"(max-width: 852px) 100vw, 852px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/e334a0f0fea9438564e48d0bba7cbbc4/81c8e/peli.png 230w","/static/e334a0f0fea9438564e48d0bba7cbbc4/08a84/peli.png 460w","/static/e334a0f0fea9438564e48d0bba7cbbc4/47ff6/peli.png 852w"],"sizes":"(max-width: 852px) 100vw, 852px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/e334a0f0fea9438564e48d0bba7cbbc4/47ff6/peli.png","alt":"peli","title":"peli","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"pelin-pohja","style":"position:relative;"},"children":[{"type":"text","value":"Pelin pohja"},{"type":"element","tagName":"a","properties":{"href":"#pelin-pohja","ariaLabel":"pelin pohja permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aloitetaan tekemällä pelille pohja, joka piirtää näkyviin pelin aloitustilanteen. Toteutamme pelin luokkaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Sokoban"}]},{"type":"text","value":", jonka sisällä on pelissä tarvittavat toiminnot. Ensimmäisessä vaiheessa luokan sisältö on seuraava:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Sokoban"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n \n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lataa_kuvat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"uusi_peli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n \n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kuvat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_width"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n nayton_korkeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus\n nayton_leveys "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"naytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nayton_leveys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nayton_korkeus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_caption"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sokoban\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"silmukka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lataa_kuvat"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kuvat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lattia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"seina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kohde\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"laatikko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"robo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"valmis\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kohderobo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kuvat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"image"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"load"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\".png\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"uusi_peli"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"silmukka"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tutki_tapahtumat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"piirra_naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tutki_tapahtumat"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"piirra_naytto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" y "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n ruutu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kuvat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"ruutu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n Sokoban"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä saa aikaan ikkunan, jossa on pelin aloitustilanne. Katsotaan seuraavaksi tarkemmin luokassa olevaa koodia."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"konstruktori","style":"position:relative;"},"children":[{"type":"text","value":"Konstruktori"},{"type":"element","tagName":"a","properties":{"href":"#konstruktori","ariaLabel":"konstruktori permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokan konstruktori aloittaa Pygamen käyttämisen, alustaa pelissä tarvittavia muuttujia ja tietorakenteita sekä lopuksi kutsuu metodia, jossa on pelin pääsilmukka."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n \n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lataa_kuvat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"uusi_peli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n \n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kuvat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_width"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n nayton_korkeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus\n nayton_leveys "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"naytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nayton_leveys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nayton_korkeus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_caption"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sokoban\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"silmukka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lataa_kuvat"}]},{"type":"text","value":" lataa listaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kuvat"}]},{"type":"text","value":" pelin käyttämät kuvat ja metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"uusi_peli"}]},{"type":"text","value":" luo kaksiulotteisen listan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kartta"}]},{"type":"text","value":", jossa on kuvattu ruudukon sisältö alussa."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän jälkeen muuttujiin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"korkeus"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"leveys"}]},{"type":"text","value":" laitetaan ruudukon korkeus ja leveys ja muuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"skaala"}]},{"type":"text","value":" laitetaan yhden ruudun koko. Koska jokainen kuva on neliön muotoinen ja yhtä suuri, ruudun koko saadaan hakemalla ensimmäisen kuvan leveys. Tämän avulla saadaan laskettua näytön korkeus ja leveys, minkä avulla voidaan luoda sopivan kokoinen ikkuna pelille."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"kuvien-lataaminen","style":"position:relative;"},"children":[{"type":"text","value":"Kuvien lataaminen"},{"type":"element","tagName":"a","properties":{"href":"#kuvien-lataaminen","ariaLabel":"kuvien lataaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lataa_kuvat"}]},{"type":"text","value":" lataa pelin tarvitsemat kuvat:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lataa_kuvat"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kuvat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lattia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"seina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kohde\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"laatikko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"robo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"valmis\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kohderobo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kuvat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"image"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"load"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\".png\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelissä on käytössä seuraavat kuvat:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"lattiaruutu","style":"position:relative;"},"children":[{"type":"text","value":"Lattiaruutu"},{"type":"element","tagName":"a","properties":{"href":"#lattiaruutu","ariaLabel":"lattiaruutu permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 50px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/9aefcdf4192b60fb3bf21288d49a0bd5/a1812/lattia.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAO0lEQVQ4y2M4dOjQ/7Nnz1IFg8xiADGoBUBmwQ389+8fRZh+BpIKRg0cNXDUwMFp4OAtbahWwFK7CgAAGH0Lv64YzdcAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/9aefcdf4192b60fb3bf21288d49a0bd5/6ac13/lattia.webp 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/9aefcdf4192b60fb3bf21288d49a0bd5/a1812/lattia.png 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/9aefcdf4192b60fb3bf21288d49a0bd5/a1812/lattia.png","alt":"lattia","title":"lattia","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedoston nimi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lattia.png"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Sijainti listalla 0"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"seinaruutu","style":"position:relative;"},"children":[{"type":"text","value":"Seinäruutu"},{"type":"element","tagName":"a","properties":{"href":"#seinaruutu","ariaLabel":"seinaruutu permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 50px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/73ec5a44eba6d09dfe097ba346137a94/a1812/seina.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAASElEQVQ4y+3VMQoAMAgDwPhX/YSft0RwLrQZHQI6eGNEZpa7V0R8hQYtcAAgSVvUuZjZMzS3bQ2oyIILLrjgHZTVl7xg1S/gAHx86WTsjKFcAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/73ec5a44eba6d09dfe097ba346137a94/6ac13/seina.webp 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/73ec5a44eba6d09dfe097ba346137a94/a1812/seina.png 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/73ec5a44eba6d09dfe097ba346137a94/a1812/seina.png","alt":"seina","title":"seina","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedoston nimi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"seina.png"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Sijainti listalla 1"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"kohderuutu","style":"position:relative;"},"children":[{"type":"text","value":"Kohderuutu"},{"type":"element","tagName":"a","properties":{"href":"#kohderuutu","ariaLabel":"kohderuutu permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 50px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/36b1cacabf9fb62e1c67fc5e6cfa50e3/a1812/kohde.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABHElEQVQ4y7WVPQ6CUAzHWRw0yBG8gfEK3oCJlRNwB2/gBZzZPAU7I0zsbmiigQjav6nlgS+CUyVp0lfa3+vH4+EkSYI0TVWEWQ4rWg+zeiAR2fJ8gu53EL8z0ragpvn2JfoBZP3xGCBsK0vQ5WLbeMOPuHEgK00j+Z9OwG4HrNfAbAYsFoDvA3E81Gg2ngS2rThmGbBcAo4j4nmA6w7rIOiZ70xHgd1uyHPJhgPDUNa3G3C9AscjsNlY0OmSDXC7lYD9fnqcBhrHUnLXJhvIUhTiuFoBVSXB3AbOgKWuxcaZsp/v99O3gaa5h4M4RpEEmgEZYFfau3zu6XwOOp9BX+dQHahe8l+Gon5s1A/2Xz499ctB8/pSu2C1fwEvukCRvM6VtZAAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/36b1cacabf9fb62e1c67fc5e6cfa50e3/6ac13/kohde.webp 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/36b1cacabf9fb62e1c67fc5e6cfa50e3/a1812/kohde.png 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/36b1cacabf9fb62e1c67fc5e6cfa50e3/a1812/kohde.png","alt":"kohde","title":"kohde","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedoston nimi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kohde.png"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Sijainti listalla 2"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Robotin tulee siirtää jokin laatikko tähän ruutuun"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"laatikko","style":"position:relative;"},"children":[{"type":"text","value":"Laatikko"},{"type":"element","tagName":"a","properties":{"href":"#laatikko","ariaLabel":"laatikko permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 50px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/6e7afd4acd3f9b214a5c43273b23c834/a1812/laatikko.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAzElEQVQ4y+2VPQqEMBCFvZxVjqAWAVN4CH8KtfEQQfAk9h5DC09go295Abcx7sIyWyzswIPATL6ZgckkGMcR0zSJiKyABykj6wnc9/0jyHEcThcgbds2zPOMZVneinHruvqBZ3XDMCAMQ2itEUUR4jj2ir4kSaCUctBLyyfQWossy9B1Heq6RtM0XtHHGEJZ6S2w73ukaeouFUVxqzzPHZSVsv2XQGMM2rZFWZaoqsorQpmU7f+BvwgUHRvxwRZ7euLL4WvrS2TBSn8BD7avDfrO6ztPAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/6e7afd4acd3f9b214a5c43273b23c834/6ac13/laatikko.webp 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/6e7afd4acd3f9b214a5c43273b23c834/a1812/laatikko.png 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/6e7afd4acd3f9b214a5c43273b23c834/a1812/laatikko.png","alt":"laatikko","title":"laatikko","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedoston nimi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"laatikko.png"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Sijainti listalla 3"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"robotti","style":"position:relative;"},"children":[{"type":"text","value":"Robotti"},{"type":"element","tagName":"a","properties":{"href":"#robotti","ariaLabel":"robotti permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 50px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/5fb4f02fac6c4d361c9057099bc9f890/a1812/robo.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB/klEQVQ4y5VV0WraYBjttbe+QR+iF32KXvdOWOeckVEGveqtF71qi6CusDFW6sSQJcwNklFHEcHZGfsAjdFCQCiFQew6qugZ58OUIqY1Hxw8nnP+w5+QP1mp1+uwbTsUlmWh1WoJyJ/KsmuFJGxG9/d4oyjo93oCcmphw66Hwul0KphMJvLf8zx8Oj5G/uQEFVUVkFOjx2E2WPdsYdd18S6Xw/v1dXwtlwXk1OhFLnT7fXw4OsLHjQ2Yug7TMIRToxe50HEcfC6XYZ2f47tpCsip0Ytc2Lu6QuHwEJl4HMlYDK9iMSjxuGj0ol8y72GhgNzuLrKKIiCn5i57D4MQZ+j70DQNVdNEMpMRkFOj9zj75A7l+RuNkM1mUSwW8a1axRdNE5BTo8fM/LrQQt/3kUgkUKlU5ITwBBDk1Oj5s10uVTgcDpFKpVAqldBoNFCr1QTk1OgxE6nwxdYWVFVFs9l82CE5NXqRCv/e3iKztob8/j5+np1B13UBef7gQDxmlioMzGvPww/LQjqdhmEYAnJq17OzPL8mdIfBL+d1MonBYCAgD+ZxdulCPhgvd3bkZUCQj6IWBua/8Ri/9vbwdnUV7uWlgJwavWcveX7uxmOcbm/jdHMTf25uBOTU7maFC1+wiz4B7XYbHdtGx3Hwu9tF5+JCINxxxGNm0SfgP7rpf7Qvj0ecAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/5fb4f02fac6c4d361c9057099bc9f890/6ac13/robo.webp 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/5fb4f02fac6c4d361c9057099bc9f890/a1812/robo.png 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/5fb4f02fac6c4d361c9057099bc9f890/a1812/robo.png","alt":"robo","title":"robo","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedoston nimi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"robo.png"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Sijainti listalla 4"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"laatikko-kohderuudussa","style":"position:relative;"},"children":[{"type":"text","value":"Laatikko kohderuudussa"},{"type":"element","tagName":"a","properties":{"href":"#laatikko-kohderuudussa","ariaLabel":"laatikko kohderuudussa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 50px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/15225a12ccfe0e42a543bea73f4ff889/a1812/valmis.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABk0lEQVQ4y7WVPWsCQRCG7UTEX5Em/0IQbLS18gM80MLOIpgYb/fOu9mNcpD8g4hglzZtCNjbpkqrhV0IITb6hllivrzEDy4LL7dwew8zs+/MxcbjMSaTSSRiVow3US1mfQCXy+VBkNVqZbQB5LVYLDCdTjGbzbaKz83n83DgOrrRaIRsNgvLslAqlVAul0PF7yqVCvL5vIFupLwGDgYDNBoNBEEAIoJS6pu075unT2TOMJQj/RU4HA5Rq9XMR1LKTzkOHCFwphRs14UUwkA5Uk7/T2C9XofWGo7jwGWQ66IrJU57PdzmcrjLZNAmgiYy6e8FZJAnhIGNikU8J5O4ajbR8bzDgB0inCuFfquFp1QK15aFVr8PVwhTlt2BXCvPw6BahW638XB8jPt0GidBYCLmmu4FvFAKZ1rj8egIr/G4Adq+b2rK4ovaC9gjMsCbQgEviQQuuW5EpqZ8SXsBv9rGkRJd24bd7Zq9fI9OCGF8utU2YcYmraF+mJx2NXZo64W04NbWi3w4/Nv4imTARv0LeAO8hwm47qNppgAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/15225a12ccfe0e42a543bea73f4ff889/6ac13/valmis.webp 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/15225a12ccfe0e42a543bea73f4ff889/a1812/valmis.png 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/15225a12ccfe0e42a543bea73f4ff889/a1812/valmis.png","alt":"valmis","title":"valmis","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedoston nimi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"valmis.png"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Sijainti listalla 5"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Laatikko on saatu siirrettyä kohderuutuun"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"kohderuutu-ja-robotti","style":"position:relative;"},"children":[{"type":"text","value":"Kohderuutu ja robotti"},{"type":"element","tagName":"a","properties":{"href":"#kohderuutu-ja-robotti","ariaLabel":"kohderuutu ja robotti permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 50px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/70f904da050def3ee01b9b01b0b50b16/a1812/kohderobo.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAC2klEQVQ4y41VXUsiURiemyANL7wRgm4q6D9U0B+IgrroIvrAqDVNWWKLrK66qD9gVEOrbF9axvSlSxq2hS1tVtoH1NWoSwlLdhEkFY3ps5wz4/bl2B54Zp55z/s+877nnHeG8fv9CAaDsvB6vQgEAhSE5/IlWgwhckN4fMRnoxG/o1EKwolNbhCtf4LpdJoilUrR59jlJaZnZjA2Nwfn4iIF4cQWi8WoD/HNxH0oGL64ADs6Cmt5Odbm5ymsFRVgLRaEef4/BYmTVFLk5AS28XF8q6uDZ3kZnpUVym0si0g8LgomkzRGXjCZBM3v+Bh8SQkcHAfv/j6+ezwU3oMDOBwO8DqdKEjipCzfCz49iRmenwN5eYgqFBi3WmFSq6FTKtGpVMKoVlNblGGA2lpRULbkjGBVFcAwiJhMYB0OWMxmDBuNFJaBAbBTU4gUFVGf1OysWLIgZBEkF55Hiry9tBSJeBzc6ipc6+vQmUwULrcbnM+HhNUqCtbUiLHJ5BtBKbv05CR1FDo7McyymLBY4Ha5sMRxFO61NUx8/YrhwUEI+flAQQHSNzdiMrkEb1tboe3thdNupx1COoAgsLcH59IStPX1uCWVqFQyglLJaXK+GAYJjQZ6rRb2hQX83NnB5uYmBeF2pxP65mYkiGB1tRj3ruQXm4LKSurc3tSERY7Dr91d+Le3KQgntvaWFlFwejrHpmQEz85wp1LBpNFgzG7Hj60tLHu9FIST9jMpFLhraHjVYbIHm06FQoiXlWGjvx9dej1WhoYougwGbPT1IW40Pi+T7MGWWg+CIN6vroCeHhg6OvCnsJDC0NYG2GzPxyyzmbk+Di/PFVmZT2YzwqenFIQL0o6SJfq45BeTD4KAvZERfCkuRiQSoSCc2B6kF76NeSX4dtwnk/B1d8PX2Iib62sKwontXhLM+oHN9gs4PDxEKBhEiOdxEA4jdHREQTnP0znik+0X8BeOmjrCN4yzpAAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/70f904da050def3ee01b9b01b0b50b16/6ac13/kohderobo.webp 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/70f904da050def3ee01b9b01b0b50b16/a1812/kohderobo.png 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/70f904da050def3ee01b9b01b0b50b16/a1812/kohderobo.png","alt":"kohderobo","title":"kohderobo","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedoston nimi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kohderobo.png"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Sijainti listalla 6"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Robotti voi myös olla kohderuudussa"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"ruudukon-luonti","style":"position:relative;"},"children":[{"type":"text","value":"Ruudukon luonti"},{"type":"element","tagName":"a","properties":{"href":"#ruudukon-luonti","ariaLabel":"ruudukon luonti permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"uusi_peli"}]},{"type":"text","value":" muodostaa ruudukon aloitustilanteen:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"uusi_peli"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi luo kaksiulotteisen listan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kartta"}]},{"type":"text","value":", jossa käytetään kuvien tunnuksia samassa järjestyksessä kuin kuvat on ladattu listaan. Tämän avulla pelin muistissa on tieto siitä, mikä on ruudukon tilanne tällä hetkellä."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että jokainen ruudukon luku on alussa välillä 0–4. Missään ruudussa ei ole lukua 5 tai 6, koska mikään laatikko tai robotti ei ole alussa kohderuudussa."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"pelisilmukka","style":"position:relative;"},"children":[{"type":"text","value":"Pelisilmukka"},{"type":"element","tagName":"a","properties":{"href":"#pelisilmukka","ariaLabel":"pelisilmukka permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelisilmukka kutsuu joka kierroksella kahta metodia: "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tutki_tapahtumat"}]},{"type":"text","value":" käy läpi viime kierroksen jälkeen syntyneet tapahtumat ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"piirra_naytto"}]},{"type":"text","value":" päivittää näytön sisällön."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"silmukka"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tutki_tapahtumat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"piirra_naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tutki_tapahtumat"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"piirra_naytto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" y "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n ruutu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kuvat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"ruutu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tällä hetkellä ainoa pelin tunnistama tapahtuma on pelin sulkeminen (esimerkiksi pelaaja painaa ikkunassa olevaa raksia). Tässä tilanteessa peli sulkee itsensä kutsumalla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"exit"}]},{"type":"text","value":"-funktiota."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Näytön piirtäminen toteutetaan käymällä ruudukon sisältö ja piirtämällä jokaista ruutua vastaava kuva oikeaan paikkaan."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että koordinaatteja x ja y käytetään eri päin eri tilanteissa. Kaksiulotteisen listan indeksoinnissa on luontevaa antaa ensin y ja sitten x, koska ensimmäinen indeksi tarkoittaa riviä ja toinen indeksi tarkoittaa saraketta. Kuitenkin Pygamen metodeissa annetaan ensin x ja y, kuten grafiikassa on yleensä tapana."}]}],"data":{"quirksMode":false}},"html":"

Tässä osassa tehdään Pygamen avulla hieman laajempi peli, joka on muunnelma perinteisestä Sokoban-pelistä. Pelaaja ohjaa ruudukossa olevaa robottia, jonka tehtävänä on työntää laatikot oikeille paikoille käyttäen mahdollisimman vähän siirtoja.

\n

Lopullinen peli tulee näyttämään tältä:

\n\n \n \n \n \n \n \"peli\"\n \n \n \n

Pelin pohja

\n

Aloitetaan tekemällä pelille pohja, joka piirtää näkyviin pelin aloitustilanteen. Toteutamme pelin luokkaan Sokoban, jonka sisällä on pelissä tarvittavat toiminnot. Ensimmäisessä vaiheessa luokan sisältö on seuraava:

\n
import pygame\n\nclass Sokoban:\n    def __init__(self):\n        pygame.init()\n        \n        self.lataa_kuvat()\n        self.uusi_peli()\n        \n        self.korkeus = len(self.kartta)\n        self.leveys = len(self.kartta[0])\n        self.skaala = self.kuvat[0].get_width()\n\n        nayton_korkeus = self.skaala * self.korkeus\n        nayton_leveys = self.skaala * self.leveys\n        self.naytto = pygame.display.set_mode((nayton_leveys, nayton_korkeus))\n\n        pygame.display.set_caption(\"Sokoban\")\n\n        self.silmukka()\n\n    def lataa_kuvat(self):\n        self.kuvat = []\n        for nimi in [\"lattia\", \"seina\", \"kohde\", \"laatikko\", \"robo\", \"valmis\", \"kohderobo\"]:\n            self.kuvat.append(pygame.image.load(nimi + \".png\"))\n\n    def uusi_peli(self):\n        self.kartta = [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],\n                       [1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1],\n                       [1, 2, 3, 0, 0, 0, 1, 0, 0, 1, 2, 3, 0, 0, 0, 0, 1],\n                       [1, 0, 0, 1, 2, 3, 0, 2, 3, 0, 0, 0, 1, 0, 0, 0, 1],\n                       [1, 0, 4, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1],\n                       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]\n\n    def silmukka(self):\n        while True:\n            self.tutki_tapahtumat()\n            self.piirra_naytto()\n\n    def tutki_tapahtumat(self):\n        for tapahtuma in pygame.event.get():\n            if tapahtuma.type == pygame.QUIT:\n                exit()\n\n    def piirra_naytto(self):\n        self.naytto.fill((0, 0, 0))\n\n        for y in range(self.korkeus):\n            for x in range(self.leveys):\n                ruutu = self.kartta[y][x]\n                self.naytto.blit(self.kuvat[ruutu], (x * self.skaala, y * self.skaala))\n\n        pygame.display.flip()\n\nif __name__ == \"__main__\":\n    Sokoban()
\n

Tämä saa aikaan ikkunan, jossa on pelin aloitustilanne. Katsotaan seuraavaksi tarkemmin luokassa olevaa koodia.

\n

Konstruktori

\n

Luokan konstruktori aloittaa Pygamen käyttämisen, alustaa pelissä tarvittavia muuttujia ja tietorakenteita sekä lopuksi kutsuu metodia, jossa on pelin pääsilmukka.

\n
    def __init__(self):\n        pygame.init()\n        \n        self.lataa_kuvat()\n        self.uusi_peli()\n        \n        self.korkeus = len(self.kartta)\n        self.leveys = len(self.kartta[0])\n        self.skaala = self.kuvat[0].get_width()\n\n        nayton_korkeus = self.skaala * self.korkeus\n        nayton_leveys = self.skaala * self.leveys\n        self.naytto = pygame.display.set_mode((nayton_leveys, nayton_korkeus))\n\n        pygame.display.set_caption(\"Sokoban\")\n\n        self.silmukka()
\n

Metodi lataa_kuvat lataa listaan kuvat pelin käyttämät kuvat ja metodi uusi_peli luo kaksiulotteisen listan kartta, jossa on kuvattu ruudukon sisältö alussa.

\n

Tämän jälkeen muuttujiin korkeus ja leveys laitetaan ruudukon korkeus ja leveys ja muuttujaan skaala laitetaan yhden ruudun koko. Koska jokainen kuva on neliön muotoinen ja yhtä suuri, ruudun koko saadaan hakemalla ensimmäisen kuvan leveys. Tämän avulla saadaan laskettua näytön korkeus ja leveys, minkä avulla voidaan luoda sopivan kokoinen ikkuna pelille.

\n

Kuvien lataaminen

\n

Metodi lataa_kuvat lataa pelin tarvitsemat kuvat:

\n
    def lataa_kuvat(self):\n        self.kuvat = []\n        for nimi in [\"lattia\", \"seina\", \"kohde\", \"laatikko\", \"robo\", \"valmis\", \"kohderobo\"]:\n            self.kuvat.append(pygame.image.load(nimi + \".png\"))
\n

Pelissä on käytössä seuraavat kuvat:

\n

Lattiaruutu

\n\n \n \n \n \n \n \"seina\"\n \n \n \n
    \n
  • Tiedoston nimi seina.png
  • \n
  • Sijainti listalla 1
  • \n
\n

Kohderuutu

\n\n \n \n \n \n \n \"laatikko\"\n \n \n \n
    \n
  • Tiedoston nimi laatikko.png
  • \n
  • Sijainti listalla 3
  • \n
\n

Robotti

\n\n \n \n \n \n \n \"robo\"\n \n \n \n
    \n
  • Tiedoston nimi robo.png
  • \n
  • Sijainti listalla 4
  • \n
\n

Laatikko kohderuudussa

\n\n \n \n \n \n \n \"valmis\"\n \n \n \n
    \n
  • Tiedoston nimi valmis.png
  • \n
  • Sijainti listalla 5
  • \n
  • Laatikko on saatu siirrettyä kohderuutuun
  • \n
\n

Kohderuutu ja robotti

\n\n \n \n \n \n \n \"kohderobo\"\n \n \n \n
    \n
  • Tiedoston nimi kohderobo.png
  • \n
  • Sijainti listalla 6
  • \n
  • Robotti voi myös olla kohderuudussa
  • \n
\n

Ruudukon luonti

\n

Metodi uusi_peli muodostaa ruudukon aloitustilanteen:

\n
    def uusi_peli(self):\n        self.kartta = [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],\n                       [1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1],\n                       [1, 2, 3, 0, 0, 0, 1, 0, 0, 1, 2, 3, 0, 0, 0, 0, 1],\n                       [1, 0, 0, 1, 2, 3, 0, 2, 3, 0, 0, 0, 1, 0, 0, 0, 1],\n                       [1, 0, 4, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1],\n                       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
\n

Metodi luo kaksiulotteisen listan kartta, jossa käytetään kuvien tunnuksia samassa järjestyksessä kuin kuvat on ladattu listaan. Tämän avulla pelin muistissa on tieto siitä, mikä on ruudukon tilanne tällä hetkellä.

\n

Huomaa, että jokainen ruudukon luku on alussa välillä 0–4. Missään ruudussa ei ole lukua 5 tai 6, koska mikään laatikko tai robotti ei ole alussa kohderuudussa.

\n

Pelisilmukka

\n

Pelisilmukka kutsuu joka kierroksella kahta metodia: tutki_tapahtumat käy läpi viime kierroksen jälkeen syntyneet tapahtumat ja piirra_naytto päivittää näytön sisällön.

\n
    def silmukka(self):\n        while True:\n            self.tutki_tapahtumat()\n            self.piirra_naytto()\n\n    def tutki_tapahtumat(self):\n        for tapahtuma in pygame.event.get():\n            if tapahtuma.type == pygame.QUIT:\n                exit()\n\n    def piirra_naytto(self):\n        self.naytto.fill((0, 0, 0))\n\n        for y in range(self.korkeus):\n            for x in range(self.leveys):\n                ruutu = self.kartta[y][x]\n                self.naytto.blit(self.kuvat[ruutu], (x * self.skaala, y * self.skaala))\n\n        pygame.display.flip()
\n

Tällä hetkellä ainoa pelin tunnistama tapahtuma on pelin sulkeminen (esimerkiksi pelaaja painaa ikkunassa olevaa raksia). Tässä tilanteessa peli sulkee itsensä kutsumalla exit-funktiota.

\n

Näytön piirtäminen toteutetaan käymällä ruudukon sisältö ja piirtämällä jokaista ruutua vastaava kuva oikeaan paikkaan.

\n

Huomaa, että koordinaatteja x ja y käytetään eri päin eri tilanteissa. Kaksiulotteisen listan indeksoinnissa on luontevaa antaa ensin y ja sitten x, koska ensimmäinen indeksi tarkoittaa riviä ja toinen indeksi tarkoittaa saraketta. Kuitenkin Pygamen metodeissa annetaan ensin x ja y, kuten grafiikassa on yleensä tapana.

","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-14/1-peliprojekti.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä osassa tehdään Pygamen avulla hieman laajempi peli, joka on muunnelma perinteisestä Sokoban-pelistä. Pelaaja ohjaa ruudukossa olevaa robottia, jonka tehtävänä on työntää laatikot oikeille paikoille käyttäen mahdollisimman vähän siirtoja."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lopullinen peli tulee näyttämään tältä:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 852px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/e334a0f0fea9438564e48d0bba7cbbc4/47ff6/peli.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 44.34782608695652%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAAsTAAALEwEAmpwYAAACGUlEQVQozyWO0UsaAQCH73RHlgm10ztbJUEvkkIzzrsHxRPShx56LUYRkqVPC2rhqZ2iKGiEiFDsdAX2T0SshxhGk/J9hG+tWlIRBA41xm+4fY+/7+H7EbFYLBQKybKcSqWi0agkSfF4PJlMbm5urq9vJBIJeWtLkqRYLJZOpyVJikQi4XBYluVMJkOYzWaP12u323t6epxOp9frHR4eHhkZmZ6eFkVRq9VOcdzMzMz4+Pjg4KAoim632+PxGI1GjuOIvb09ALVajef5x8dHAH6/f2lpCUCj0TCZTOfn5wD29/dnZ2cBtNttAKurq1arlSgmk/fV6tfT09/N5sPzM4AVv39hcRHAz+vr0bGx7+Xyj8vL6sVFs9l8eXl5enoCEAgEbDYbkd/ZAfCtUnGL4kOlUj07q9Zqv66u7iuV45OTer3euLn58/paKpXm5+dbrdb/dz6fr1tWFAXA8dHRu6Gh57s7AJ8V5UuxCOD29vbTxka9XgeQz+c5jgPQ6XQABIPByclJ4sPCwu7u7sry8qjJlM5my4eHgiBwdnvp4CC7va3T6T6urZXL5bm5OYvFUigUcrmcoigul0sQBEJDUQRBUG+6qMku/RpNf19fd1Srdb29lEqlJkmKojQazT9PqlQqkiR5niem9HoLy7IGg4GmLQxjZVlerx+laRPLvmcYM00LDDPBsm+7nmZZlmEYo9E4MDDgcDj+AisL8KSDCe9vAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/e334a0f0fea9438564e48d0bba7cbbc4/a0b58/peli.webp 230w","/static/e334a0f0fea9438564e48d0bba7cbbc4/bc10c/peli.webp 460w","/static/e334a0f0fea9438564e48d0bba7cbbc4/39392/peli.webp 852w"],"sizes":"(max-width: 852px) 100vw, 852px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/e334a0f0fea9438564e48d0bba7cbbc4/81c8e/peli.png 230w","/static/e334a0f0fea9438564e48d0bba7cbbc4/08a84/peli.png 460w","/static/e334a0f0fea9438564e48d0bba7cbbc4/47ff6/peli.png 852w"],"sizes":"(max-width: 852px) 100vw, 852px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/e334a0f0fea9438564e48d0bba7cbbc4/47ff6/peli.png","alt":"peli","title":"peli","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"pelin-pohja","style":"position:relative;"},"children":[{"type":"text","value":"Pelin pohja"},{"type":"element","tagName":"a","properties":{"href":"#pelin-pohja","ariaLabel":"pelin pohja permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aloitetaan tekemällä pelille pohja, joka piirtää näkyviin pelin aloitustilanteen. Toteutamme pelin luokkaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Sokoban"}]},{"type":"text","value":", jonka sisällä on pelissä tarvittavat toiminnot. Ensimmäisessä vaiheessa luokan sisältö on seuraava:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" pygame\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Sokoban"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n \n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lataa_kuvat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"uusi_peli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n \n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kuvat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_width"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n nayton_korkeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus\n nayton_leveys "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"naytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nayton_leveys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nayton_korkeus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_caption"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sokoban\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"silmukka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lataa_kuvat"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kuvat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lattia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"seina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kohde\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"laatikko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"robo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"valmis\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kohderobo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kuvat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"image"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"load"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\".png\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"uusi_peli"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"silmukka"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tutki_tapahtumat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"piirra_naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tutki_tapahtumat"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"piirra_naytto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" y "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n ruutu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kuvat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"ruutu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n Sokoban"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä saa aikaan ikkunan, jossa on pelin aloitustilanne. Katsotaan seuraavaksi tarkemmin luokassa olevaa koodia."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"konstruktori","style":"position:relative;"},"children":[{"type":"text","value":"Konstruktori"},{"type":"element","tagName":"a","properties":{"href":"#konstruktori","ariaLabel":"konstruktori permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokan konstruktori aloittaa Pygamen käyttämisen, alustaa pelissä tarvittavia muuttujia ja tietorakenteita sekä lopuksi kutsuu metodia, jossa on pelin pääsilmukka."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"init"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n \n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lataa_kuvat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"uusi_peli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n \n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kuvat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_width"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n nayton_korkeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus\n nayton_leveys "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"naytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nayton_leveys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nayton_korkeus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_caption"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sokoban\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"silmukka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lataa_kuvat"}]},{"type":"text","value":" lataa listaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kuvat"}]},{"type":"text","value":" pelin käyttämät kuvat ja metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"uusi_peli"}]},{"type":"text","value":" luo kaksiulotteisen listan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kartta"}]},{"type":"text","value":", jossa on kuvattu ruudukon sisältö alussa."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän jälkeen muuttujiin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"korkeus"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"leveys"}]},{"type":"text","value":" laitetaan ruudukon korkeus ja leveys ja muuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"skaala"}]},{"type":"text","value":" laitetaan yhden ruudun koko. Koska jokainen kuva on neliön muotoinen ja yhtä suuri, ruudun koko saadaan hakemalla ensimmäisen kuvan leveys. Tämän avulla saadaan laskettua näytön korkeus ja leveys, minkä avulla voidaan luoda sopivan kokoinen ikkuna pelille."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"kuvien-lataaminen","style":"position:relative;"},"children":[{"type":"text","value":"Kuvien lataaminen"},{"type":"element","tagName":"a","properties":{"href":"#kuvien-lataaminen","ariaLabel":"kuvien lataaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lataa_kuvat"}]},{"type":"text","value":" lataa pelin tarvitsemat kuvat:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lataa_kuvat"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kuvat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lattia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"seina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kohde\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"laatikko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"robo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"valmis\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kohderobo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kuvat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"image"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"load"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\".png\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelissä on käytössä seuraavat kuvat:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"lattiaruutu","style":"position:relative;"},"children":[{"type":"text","value":"Lattiaruutu"},{"type":"element","tagName":"a","properties":{"href":"#lattiaruutu","ariaLabel":"lattiaruutu permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 50px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/9aefcdf4192b60fb3bf21288d49a0bd5/a1812/lattia.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAO0lEQVQ4y2M4dOjQ/7Nnz1IFg8xiADGoBUBmwQ389+8fRZh+BpIKRg0cNXDUwMFp4OAtbahWwFK7CgAAGH0Lv64YzdcAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/9aefcdf4192b60fb3bf21288d49a0bd5/6ac13/lattia.webp 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/9aefcdf4192b60fb3bf21288d49a0bd5/a1812/lattia.png 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/9aefcdf4192b60fb3bf21288d49a0bd5/a1812/lattia.png","alt":"lattia","title":"lattia","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedoston nimi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lattia.png"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Sijainti listalla 0"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"seinaruutu","style":"position:relative;"},"children":[{"type":"text","value":"Seinäruutu"},{"type":"element","tagName":"a","properties":{"href":"#seinaruutu","ariaLabel":"seinaruutu permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 50px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/73ec5a44eba6d09dfe097ba346137a94/a1812/seina.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAASElEQVQ4y+3VMQoAMAgDwPhX/YSft0RwLrQZHQI6eGNEZpa7V0R8hQYtcAAgSVvUuZjZMzS3bQ2oyIILLrjgHZTVl7xg1S/gAHx86WTsjKFcAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/73ec5a44eba6d09dfe097ba346137a94/6ac13/seina.webp 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/73ec5a44eba6d09dfe097ba346137a94/a1812/seina.png 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/73ec5a44eba6d09dfe097ba346137a94/a1812/seina.png","alt":"seina","title":"seina","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedoston nimi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"seina.png"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Sijainti listalla 1"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"kohderuutu","style":"position:relative;"},"children":[{"type":"text","value":"Kohderuutu"},{"type":"element","tagName":"a","properties":{"href":"#kohderuutu","ariaLabel":"kohderuutu permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 50px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/36b1cacabf9fb62e1c67fc5e6cfa50e3/a1812/kohde.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABHElEQVQ4y7WVPQ6CUAzHWRw0yBG8gfEK3oCJlRNwB2/gBZzZPAU7I0zsbmiigQjav6nlgS+CUyVp0lfa3+vH4+EkSYI0TVWEWQ4rWg+zeiAR2fJ8gu53EL8z0ragpvn2JfoBZP3xGCBsK0vQ5WLbeMOPuHEgK00j+Z9OwG4HrNfAbAYsFoDvA3E81Gg2ngS2rThmGbBcAo4j4nmA6w7rIOiZ70xHgd1uyHPJhgPDUNa3G3C9AscjsNlY0OmSDXC7lYD9fnqcBhrHUnLXJhvIUhTiuFoBVSXB3AbOgKWuxcaZsp/v99O3gaa5h4M4RpEEmgEZYFfau3zu6XwOOp9BX+dQHahe8l+Gon5s1A/2Xz499ctB8/pSu2C1fwEvukCRvM6VtZAAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/36b1cacabf9fb62e1c67fc5e6cfa50e3/6ac13/kohde.webp 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/36b1cacabf9fb62e1c67fc5e6cfa50e3/a1812/kohde.png 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/36b1cacabf9fb62e1c67fc5e6cfa50e3/a1812/kohde.png","alt":"kohde","title":"kohde","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedoston nimi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kohde.png"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Sijainti listalla 2"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Robotin tulee siirtää jokin laatikko tähän ruutuun"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"laatikko","style":"position:relative;"},"children":[{"type":"text","value":"Laatikko"},{"type":"element","tagName":"a","properties":{"href":"#laatikko","ariaLabel":"laatikko permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 50px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/6e7afd4acd3f9b214a5c43273b23c834/a1812/laatikko.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAzElEQVQ4y+2VPQqEMBCFvZxVjqAWAVN4CH8KtfEQQfAk9h5DC09go295Abcx7sIyWyzswIPATL6ZgckkGMcR0zSJiKyABykj6wnc9/0jyHEcThcgbds2zPOMZVneinHruvqBZ3XDMCAMQ2itEUUR4jj2ir4kSaCUctBLyyfQWossy9B1Heq6RtM0XtHHGEJZ6S2w73ukaeouFUVxqzzPHZSVsv2XQGMM2rZFWZaoqsorQpmU7f+BvwgUHRvxwRZ7euLL4WvrS2TBSn8BD7avDfrO6ztPAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/6e7afd4acd3f9b214a5c43273b23c834/6ac13/laatikko.webp 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/6e7afd4acd3f9b214a5c43273b23c834/a1812/laatikko.png 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/6e7afd4acd3f9b214a5c43273b23c834/a1812/laatikko.png","alt":"laatikko","title":"laatikko","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedoston nimi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"laatikko.png"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Sijainti listalla 3"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"robotti","style":"position:relative;"},"children":[{"type":"text","value":"Robotti"},{"type":"element","tagName":"a","properties":{"href":"#robotti","ariaLabel":"robotti permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 50px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/5fb4f02fac6c4d361c9057099bc9f890/a1812/robo.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB/klEQVQ4y5VV0WraYBjttbe+QR+iF32KXvdOWOeckVEGveqtF71qi6CusDFW6sSQJcwNklFHEcHZGfsAjdFCQCiFQew6qugZ58OUIqY1Hxw8nnP+w5+QP1mp1+uwbTsUlmWh1WoJyJ/KsmuFJGxG9/d4oyjo93oCcmphw66Hwul0KphMJvLf8zx8Oj5G/uQEFVUVkFOjx2E2WPdsYdd18S6Xw/v1dXwtlwXk1OhFLnT7fXw4OsLHjQ2Yug7TMIRToxe50HEcfC6XYZ2f47tpCsip0Ytc2Lu6QuHwEJl4HMlYDK9iMSjxuGj0ol8y72GhgNzuLrKKIiCn5i57D4MQZ+j70DQNVdNEMpMRkFOj9zj75A7l+RuNkM1mUSwW8a1axRdNE5BTo8fM/LrQQt/3kUgkUKlU5ITwBBDk1Oj5s10uVTgcDpFKpVAqldBoNFCr1QTk1OgxE6nwxdYWVFVFs9l82CE5NXqRCv/e3iKztob8/j5+np1B13UBef7gQDxmlioMzGvPww/LQjqdhmEYAnJq17OzPL8mdIfBL+d1MonBYCAgD+ZxdulCPhgvd3bkZUCQj6IWBua/8Ri/9vbwdnUV7uWlgJwavWcveX7uxmOcbm/jdHMTf25uBOTU7maFC1+wiz4B7XYbHdtGx3Hwu9tF5+JCINxxxGNm0SfgP7rpf7Qvj0ecAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/5fb4f02fac6c4d361c9057099bc9f890/6ac13/robo.webp 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/5fb4f02fac6c4d361c9057099bc9f890/a1812/robo.png 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/5fb4f02fac6c4d361c9057099bc9f890/a1812/robo.png","alt":"robo","title":"robo","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedoston nimi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"robo.png"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Sijainti listalla 4"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"laatikko-kohderuudussa","style":"position:relative;"},"children":[{"type":"text","value":"Laatikko kohderuudussa"},{"type":"element","tagName":"a","properties":{"href":"#laatikko-kohderuudussa","ariaLabel":"laatikko kohderuudussa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 50px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/15225a12ccfe0e42a543bea73f4ff889/a1812/valmis.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABk0lEQVQ4y7WVPWsCQRCG7UTEX5Em/0IQbLS18gM80MLOIpgYb/fOu9mNcpD8g4hglzZtCNjbpkqrhV0IITb6hllivrzEDy4LL7dwew8zs+/MxcbjMSaTSSRiVow3US1mfQCXy+VBkNVqZbQB5LVYLDCdTjGbzbaKz83n83DgOrrRaIRsNgvLslAqlVAul0PF7yqVCvL5vIFupLwGDgYDNBoNBEEAIoJS6pu075unT2TOMJQj/RU4HA5Rq9XMR1LKTzkOHCFwphRs14UUwkA5Uk7/T2C9XofWGo7jwGWQ66IrJU57PdzmcrjLZNAmgiYy6e8FZJAnhIGNikU8J5O4ajbR8bzDgB0inCuFfquFp1QK15aFVr8PVwhTlt2BXCvPw6BahW638XB8jPt0GidBYCLmmu4FvFAKZ1rj8egIr/G4Adq+b2rK4ovaC9gjMsCbQgEviQQuuW5EpqZ8SXsBv9rGkRJd24bd7Zq9fI9OCGF8utU2YcYmraF+mJx2NXZo64W04NbWi3w4/Nv4imTARv0LeAO8hwm47qNppgAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/15225a12ccfe0e42a543bea73f4ff889/6ac13/valmis.webp 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/15225a12ccfe0e42a543bea73f4ff889/a1812/valmis.png 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/15225a12ccfe0e42a543bea73f4ff889/a1812/valmis.png","alt":"valmis","title":"valmis","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedoston nimi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"valmis.png"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Sijainti listalla 5"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Laatikko on saatu siirrettyä kohderuutuun"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"kohderuutu-ja-robotti","style":"position:relative;"},"children":[{"type":"text","value":"Kohderuutu ja robotti"},{"type":"element","tagName":"a","properties":{"href":"#kohderuutu-ja-robotti","ariaLabel":"kohderuutu ja robotti permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 50px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/70f904da050def3ee01b9b01b0b50b16/a1812/kohderobo.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAC2klEQVQ4y41VXUsiURiemyANL7wRgm4q6D9U0B+IgrroIvrAqDVNWWKLrK66qD9gVEOrbF9axvSlSxq2hS1tVtoH1NWoSwlLdhEkFY3ps5wz4/bl2B54Zp55z/s+877nnHeG8fv9CAaDsvB6vQgEAhSE5/IlWgwhckN4fMRnoxG/o1EKwolNbhCtf4LpdJoilUrR59jlJaZnZjA2Nwfn4iIF4cQWi8WoD/HNxH0oGL64ADs6Cmt5Odbm5ymsFRVgLRaEef4/BYmTVFLk5AS28XF8q6uDZ3kZnpUVym0si0g8LgomkzRGXjCZBM3v+Bh8SQkcHAfv/j6+ezwU3oMDOBwO8DqdKEjipCzfCz49iRmenwN5eYgqFBi3WmFSq6FTKtGpVMKoVlNblGGA2lpRULbkjGBVFcAwiJhMYB0OWMxmDBuNFJaBAbBTU4gUFVGf1OysWLIgZBEkF55Hiry9tBSJeBzc6ipc6+vQmUwULrcbnM+HhNUqCtbUiLHJ5BtBKbv05CR1FDo7McyymLBY4Ha5sMRxFO61NUx8/YrhwUEI+flAQQHSNzdiMrkEb1tboe3thdNupx1COoAgsLcH59IStPX1uCWVqFQyglLJaXK+GAYJjQZ6rRb2hQX83NnB5uYmBeF2pxP65mYkiGB1tRj3ruQXm4LKSurc3tSERY7Dr91d+Le3KQgntvaWFlFwejrHpmQEz85wp1LBpNFgzG7Hj60tLHu9FIST9jMpFLhraHjVYbIHm06FQoiXlWGjvx9dej1WhoYougwGbPT1IW40Pi+T7MGWWg+CIN6vroCeHhg6OvCnsJDC0NYG2GzPxyyzmbk+Di/PFVmZT2YzwqenFIQL0o6SJfq45BeTD4KAvZERfCkuRiQSoSCc2B6kF76NeSX4dtwnk/B1d8PX2Iib62sKwontXhLM+oHN9gs4PDxEKBhEiOdxEA4jdHREQTnP0znik+0X8BeOmjrCN4yzpAAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/70f904da050def3ee01b9b01b0b50b16/6ac13/kohderobo.webp 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/70f904da050def3ee01b9b01b0b50b16/a1812/kohderobo.png 50w"],"sizes":"(max-width: 50px) 100vw, 50px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/70f904da050def3ee01b9b01b0b50b16/a1812/kohderobo.png","alt":"kohderobo","title":"kohderobo","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedoston nimi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kohderobo.png"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Sijainti listalla 6"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Robotti voi myös olla kohderuudussa"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"ruudukon-luonti","style":"position:relative;"},"children":[{"type":"text","value":"Ruudukon luonti"},{"type":"element","tagName":"a","properties":{"href":"#ruudukon-luonti","ariaLabel":"ruudukon luonti permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"uusi_peli"}]},{"type":"text","value":" muodostaa ruudukon aloitustilanteen:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"uusi_peli"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi luo kaksiulotteisen listan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kartta"}]},{"type":"text","value":", jossa käytetään kuvien tunnuksia samassa järjestyksessä kuin kuvat on ladattu listaan. Tämän avulla pelin muistissa on tieto siitä, mikä on ruudukon tilanne tällä hetkellä."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että jokainen ruudukon luku on alussa välillä 0–4. Missään ruudussa ei ole lukua 5 tai 6, koska mikään laatikko tai robotti ei ole alussa kohderuudussa."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"pelisilmukka","style":"position:relative;"},"children":[{"type":"text","value":"Pelisilmukka"},{"type":"element","tagName":"a","properties":{"href":"#pelisilmukka","ariaLabel":"pelisilmukka permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelisilmukka kutsuu joka kierroksella kahta metodia: "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tutki_tapahtumat"}]},{"type":"text","value":" käy läpi viime kierroksen jälkeen syntyneet tapahtumat ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"piirra_naytto"}]},{"type":"text","value":" päivittää näytön sisällön."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"silmukka"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tutki_tapahtumat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"piirra_naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tutki_tapahtumat"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"piirra_naytto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fill"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" y "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n ruutu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kuvat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"ruutu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"flip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tällä hetkellä ainoa pelin tunnistama tapahtuma on pelin sulkeminen (esimerkiksi pelaaja painaa ikkunassa olevaa raksia). Tässä tilanteessa peli sulkee itsensä kutsumalla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"exit"}]},{"type":"text","value":"-funktiota."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Näytön piirtäminen toteutetaan käymällä ruudukon sisältö ja piirtämällä jokaista ruutua vastaava kuva oikeaan paikkaan."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että koordinaatteja x ja y käytetään eri päin eri tilanteissa. Kaksiulotteisen listan indeksoinnissa on luontevaa antaa ensin y ja sitten x, koska ensimmäinen indeksi tarkoittaa riviä ja toinen indeksi tarkoittaa saraketta. Kuitenkin Pygamen metodeissa annetaan ensin x ja y, kuten grafiikassa on yleensä tapana."}]}],"data":{"quirksMode":false}},"html":"

Tässä osassa tehdään Pygamen avulla hieman laajempi peli, joka on muunnelma perinteisestä Sokoban-pelistä. Pelaaja ohjaa ruudukossa olevaa robottia, jonka tehtävänä on työntää laatikot oikeille paikoille käyttäen mahdollisimman vähän siirtoja.

\n

Lopullinen peli tulee näyttämään tältä:

\n\n \n \n \n \n \n \"peli\"\n \n \n \n

Pelin pohja

\n

Aloitetaan tekemällä pelille pohja, joka piirtää näkyviin pelin aloitustilanteen. Toteutamme pelin luokkaan Sokoban, jonka sisällä on pelissä tarvittavat toiminnot. Ensimmäisessä vaiheessa luokan sisältö on seuraava:

\n
import pygame\n\nclass Sokoban:\n    def __init__(self):\n        pygame.init()\n        \n        self.lataa_kuvat()\n        self.uusi_peli()\n        \n        self.korkeus = len(self.kartta)\n        self.leveys = len(self.kartta[0])\n        self.skaala = self.kuvat[0].get_width()\n\n        nayton_korkeus = self.skaala * self.korkeus\n        nayton_leveys = self.skaala * self.leveys\n        self.naytto = pygame.display.set_mode((nayton_leveys, nayton_korkeus))\n\n        pygame.display.set_caption(\"Sokoban\")\n\n        self.silmukka()\n\n    def lataa_kuvat(self):\n        self.kuvat = []\n        for nimi in [\"lattia\", \"seina\", \"kohde\", \"laatikko\", \"robo\", \"valmis\", \"kohderobo\"]:\n            self.kuvat.append(pygame.image.load(nimi + \".png\"))\n\n    def uusi_peli(self):\n        self.kartta = [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],\n                       [1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1],\n                       [1, 2, 3, 0, 0, 0, 1, 0, 0, 1, 2, 3, 0, 0, 0, 0, 1],\n                       [1, 0, 0, 1, 2, 3, 0, 2, 3, 0, 0, 0, 1, 0, 0, 0, 1],\n                       [1, 0, 4, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1],\n                       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]\n\n    def silmukka(self):\n        while True:\n            self.tutki_tapahtumat()\n            self.piirra_naytto()\n\n    def tutki_tapahtumat(self):\n        for tapahtuma in pygame.event.get():\n            if tapahtuma.type == pygame.QUIT:\n                exit()\n\n    def piirra_naytto(self):\n        self.naytto.fill((0, 0, 0))\n\n        for y in range(self.korkeus):\n            for x in range(self.leveys):\n                ruutu = self.kartta[y][x]\n                self.naytto.blit(self.kuvat[ruutu], (x * self.skaala, y * self.skaala))\n\n        pygame.display.flip()\n\nif __name__ == \"__main__\":\n    Sokoban()
\n

Tämä saa aikaan ikkunan, jossa on pelin aloitustilanne. Katsotaan seuraavaksi tarkemmin luokassa olevaa koodia.

\n

Konstruktori

\n

Luokan konstruktori aloittaa Pygamen käyttämisen, alustaa pelissä tarvittavia muuttujia ja tietorakenteita sekä lopuksi kutsuu metodia, jossa on pelin pääsilmukka.

\n
    def __init__(self):\n        pygame.init()\n        \n        self.lataa_kuvat()\n        self.uusi_peli()\n        \n        self.korkeus = len(self.kartta)\n        self.leveys = len(self.kartta[0])\n        self.skaala = self.kuvat[0].get_width()\n\n        nayton_korkeus = self.skaala * self.korkeus\n        nayton_leveys = self.skaala * self.leveys\n        self.naytto = pygame.display.set_mode((nayton_leveys, nayton_korkeus))\n\n        pygame.display.set_caption(\"Sokoban\")\n\n        self.silmukka()
\n

Metodi lataa_kuvat lataa listaan kuvat pelin käyttämät kuvat ja metodi uusi_peli luo kaksiulotteisen listan kartta, jossa on kuvattu ruudukon sisältö alussa.

\n

Tämän jälkeen muuttujiin korkeus ja leveys laitetaan ruudukon korkeus ja leveys ja muuttujaan skaala laitetaan yhden ruudun koko. Koska jokainen kuva on neliön muotoinen ja yhtä suuri, ruudun koko saadaan hakemalla ensimmäisen kuvan leveys. Tämän avulla saadaan laskettua näytön korkeus ja leveys, minkä avulla voidaan luoda sopivan kokoinen ikkuna pelille.

\n

Kuvien lataaminen

\n

Metodi lataa_kuvat lataa pelin tarvitsemat kuvat:

\n
    def lataa_kuvat(self):\n        self.kuvat = []\n        for nimi in [\"lattia\", \"seina\", \"kohde\", \"laatikko\", \"robo\", \"valmis\", \"kohderobo\"]:\n            self.kuvat.append(pygame.image.load(nimi + \".png\"))
\n

Pelissä on käytössä seuraavat kuvat:

\n

Lattiaruutu

\n\n \n \n \n \n \n \"seina\"\n \n \n \n
    \n
  • Tiedoston nimi seina.png
  • \n
  • Sijainti listalla 1
  • \n
\n

Kohderuutu

\n\n \n \n \n \n \n \"laatikko\"\n \n \n \n
    \n
  • Tiedoston nimi laatikko.png
  • \n
  • Sijainti listalla 3
  • \n
\n

Robotti

\n\n \n \n \n \n \n \"robo\"\n \n \n \n
    \n
  • Tiedoston nimi robo.png
  • \n
  • Sijainti listalla 4
  • \n
\n

Laatikko kohderuudussa

\n\n \n \n \n \n \n \"valmis\"\n \n \n \n
    \n
  • Tiedoston nimi valmis.png
  • \n
  • Sijainti listalla 5
  • \n
  • Laatikko on saatu siirrettyä kohderuutuun
  • \n
\n

Kohderuutu ja robotti

\n\n \n \n \n \n \n \"kohderobo\"\n \n \n \n
    \n
  • Tiedoston nimi kohderobo.png
  • \n
  • Sijainti listalla 6
  • \n
  • Robotti voi myös olla kohderuudussa
  • \n
\n

Ruudukon luonti

\n

Metodi uusi_peli muodostaa ruudukon aloitustilanteen:

\n
    def uusi_peli(self):\n        self.kartta = [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],\n                       [1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1],\n                       [1, 2, 3, 0, 0, 0, 1, 0, 0, 1, 2, 3, 0, 0, 0, 0, 1],\n                       [1, 0, 0, 1, 2, 3, 0, 2, 3, 0, 0, 0, 1, 0, 0, 0, 1],\n                       [1, 0, 4, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1],\n                       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
\n

Metodi luo kaksiulotteisen listan kartta, jossa käytetään kuvien tunnuksia samassa järjestyksessä kuin kuvat on ladattu listaan. Tämän avulla pelin muistissa on tieto siitä, mikä on ruudukon tilanne tällä hetkellä.

\n

Huomaa, että jokainen ruudukon luku on alussa välillä 0–4. Missään ruudussa ei ole lukua 5 tai 6, koska mikään laatikko tai robotti ei ole alussa kohderuudussa.

\n

Pelisilmukka

\n

Pelisilmukka kutsuu joka kierroksella kahta metodia: tutki_tapahtumat käy läpi viime kierroksen jälkeen syntyneet tapahtumat ja piirra_naytto päivittää näytön sisällön.

\n
    def silmukka(self):\n        while True:\n            self.tutki_tapahtumat()\n            self.piirra_naytto()\n\n    def tutki_tapahtumat(self):\n        for tapahtuma in pygame.event.get():\n            if tapahtuma.type == pygame.QUIT:\n                exit()\n\n    def piirra_naytto(self):\n        self.naytto.fill((0, 0, 0))\n\n        for y in range(self.korkeus):\n            for x in range(self.leveys):\n                ruutu = self.kartta[y][x]\n                self.naytto.blit(self.kuvat[ruutu], (x * self.skaala, y * self.skaala))\n\n        pygame.display.flip()
\n

Tällä hetkellä ainoa pelin tunnistama tapahtuma on pelin sulkeminen (esimerkiksi pelaaja painaa ikkunassa olevaa raksia). Tässä tilanteessa peli sulkee itsensä kutsumalla exit-funktiota.

\n

Näytön piirtäminen toteutetaan käymällä ruudukon sisältö ja piirtämällä jokaista ruutua vastaava kuva oikeaan paikkaan.

\n

Huomaa, että koordinaatteja x ja y käytetään eri päin eri tilanteissa. Kaksiulotteisen listan indeksoinnissa on luontevaa antaa ensin y ja sitten x, koska ensimmäinen indeksi tarkoittaa riviä ja toinen indeksi tarkoittaa saraketta. Kuitenkin Pygamen metodeissa annetaan ensin x ja y, kuten grafiikassa on yleensä tapana.

","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-14/1-peliprojekti.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-14/2-robo-ja-laatikot/page-data.json b/page-data/osa-14/2-robo-ja-laatikot/page-data.json index 16c31fb62..c5900c871 100644 --- a/page-data/osa-14/2-robo-ja-laatikot/page-data.json +++ b/page-data/osa-14/2-robo-ja-laatikot/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-14/2-robo-ja-laatikot", - "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaikein asia Sokoban-pelin toteutuksessa on saada robotti liikkumaan niin, että se pystyy työntämään laatikoita halutulla tavalla. Pelin pitää tunnistaa, milloin robotti pystyy siirtymään pelaajan haluamaan suuntiin, sekä käsitellä oikein tilanteet, joissa robotti työntää laatikkoa. Nyt on aika tarttua tähän haasteeseen."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"nappaimiston-kasittely","style":"position:relative;"},"children":[{"type":"text","value":"Näppäimistön käsittely"},{"type":"element","tagName":"a","properties":{"href":"#nappaimiston-kasittely","ariaLabel":"nappaimiston kasittely permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelaaja ohjaa robottia nuolinäppäimillä, joten tapahtumien käsittelyä täytyy laajentaa niin, että se tarkkailee myös näppäimistön tapahtumia:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tutki_tapahtumat"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"KEYDOWN"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_LEFT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"liiku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_RIGHT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"liiku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_UP"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"liiku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_DOWN"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"liiku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt kun pelaaja painaa nuolinäppäintä, kutsutaan metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"liiku"}]},{"type":"text","value":" sopivilla parametreilla. Ensimmäinen parametri ilmaisee liikkeen määrän pystysuunnassa ja toinen parametri puolestaan ilmaisee liikkeen määrän vaakasuunnassa."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"robotin-etsiminen","style":"position:relative;"},"children":[{"type":"text","value":"Robotin etsiminen"},{"type":"element","tagName":"a","properties":{"href":"#robotin-etsiminen","ariaLabel":"robotin etsiminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelin täytyy tietää robotin sijainti, jotta sitä pystyy siirtämään oikealla tavalla. Seuraava metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"etsi_robo"}]},{"type":"text","value":" selvittää robotin sijainnin:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"etsi_robo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" y "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi käy läpi kaikki ruudukon ruudut ja palauttaa ruudun koordinaatit, jos ruudussa on luku 4 (robotti yksinään) tai luku 6 (robotti kohderuudun päällä)."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ideana on, että aina kun käyttäjä painaa nuolinäppäintä, selvitetään ensin robotin sijainti käymällä läpi ruudukon ruudut. Tämä voi tuntua vähän hitaalta, koska vaihtoehtoisesti voisi myös pitää yllä tietoa robotin sijainnista omissa muuttujissa. Tämän toteutuksen etuna on kuitenkin, että robotin sijainti ei ole tallessa kahdessa paikassa (ruudukossa ja erillisissä muuttujissa) vaan vain yhdessä paikassa, eli muistissa oleva pelin tila on yksinkertaisempi."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"muutokset-ruudukossa","style":"position:relative;"},"children":[{"type":"text","value":"Muutokset ruudukossa"},{"type":"element","tagName":"a","properties":{"href":"#muutokset-ruudukossa","ariaLabel":"muutokset ruudukossa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"liiku"}]},{"type":"text","value":" saa parametreina suunnan, johon pelaaja haluaa robotin liikkuvan, ja metodi joko päivittää ruudukkoa sopivasti tai toteaa, että liikkuminen ei ole mahdollista eikä muuta ruudukon sisältöä."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"liiku"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" liike_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" liike_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n robon_vanha_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" robon_vanha_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"etsi_robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n robon_uusi_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" robon_vanha_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" liike_y\n robon_uusi_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" robon_vanha_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" liike_x\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n laatikon_uusi_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" robon_uusi_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" liike_y\n laatikon_uusi_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" robon_uusi_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" liike_x\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"laatikon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"laatikon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":"\n\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"laatikon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"laatikon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_vanha_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_vanha_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi on melko monimutkainen, joten katsotaan tarkemmin metodin osia:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"robotin-vanha-ja-uusi-sijainti","style":"position:relative;"},"children":[{"type":"text","value":"Robotin vanha ja uusi sijainti"},{"type":"element","tagName":"a","properties":{"href":"#robotin-vanha-ja-uusi-sijainti","ariaLabel":"robotin vanha ja uusi sijainti permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" robon_vanha_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" robon_vanha_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"etsi_robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n robon_uusi_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" robon_vanha_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" liike_y\n robon_uusi_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" robon_vanha_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" liike_x"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi kutsuu ensin metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"etsi_robo"}]},{"type":"text","value":", joka selvittää robotin vanhan sijainnin ennen siirtoa. Tämä sijainti tallennetaan muuttujiin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"robon_vanha_y"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"robon_vanha_x"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän jälkeen muuttujiin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"robon_uusi_y"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"robon_uusi_x"}]},{"type":"text","value":" lasketaan robotin haluttu uusi sijainti. Tämä saadaan laskettua kätevästi, kun tiedossa on vanha sijainti sekä haluttu sijainnin muutos pysty- ja vaakasuunnassa."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"tormaako-robotti-seinaan","style":"position:relative;"},"children":[{"type":"text","value":"Törmääkö robotti seinään?"},{"type":"element","tagName":"a","properties":{"href":"#tormaako-robotti-seinaan","ariaLabel":"tormaako robotti seinaan permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavaksi käsitellään tapaus, jossa pelaaja yrittää ohjata robottia seinään (luku 1 tarkoittaa seinää). Tämä ei ole sallittua, joten tässä tilanteessa ei tapahdu mitään ja metodin suoritus vain loppuu."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"laatikon-siirtyminen","style":"position:relative;"},"children":[{"type":"text","value":"Laatikon siirtyminen"},{"type":"element","tagName":"a","properties":{"href":"#laatikon-siirtyminen","ariaLabel":"laatikon siirtyminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n laatikon_uusi_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" robon_uusi_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" liike_y\n laatikon_uusi_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" robon_uusi_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" liike_x\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"laatikon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"laatikon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":"\n\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"laatikon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"laatikon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos robotin uudessa sijainnissa on luku 3 (laatikko) tai 5 (laatikko kohderuudussa), robotti työntää laatikkoa liikkuessaan. Tätä varten lasketaan muuttujiin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"laatikon_uusi_y"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"laatikon_uusi_x"}]},{"type":"text","value":" laatikon uusi sijainti työntämisen jälkeen."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laatikko ei voi siirtyä, jos uudessa kohdassa on luku 1 (seinäruutu), luku 3 (toinen laatikko) tai luku 5 (toinen laatikko kohderuudussa). Näissä tapauksissa metodi sulkee itsensä eikä tee mitään."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muissa tapauksissa kuitenkin laatikkoa pystyy siirtämään, jolloin laatikon nykyisen ruudun luvusta vähennetään 3 ja uuden ruudun lukuun lisätään 3. Tämä päivittää ruudukkoa oikealla tavalla sekä silloin, kun laatikko on tavallisessa lattiaruudussa tai kohderuudussa."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"robotin-siirtyminen","style":"position:relative;"},"children":[{"type":"text","value":"Robotin siirtyminen"},{"type":"element","tagName":"a","properties":{"href":"#robotin-siirtyminen","ariaLabel":"robotin siirtyminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_vanha_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_vanha_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos metodin suoritus etenee loppuun asti, myös robotin tulee vielä siirtyä. Tämä toteutetaan samalla tavalla kuin laatikon siirtyminen, paitsi että vähennettävä ja lisättävä arvo on 4. Tässäkin tapauksessa ruudukon sisältö muuttuu oikein tilanteissa, joissa robotti on tavallisessa lattiaruudussa tai kohderuudussa."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"refaktorointia","style":"position:relative;"},"children":[{"type":"text","value":"Refaktorointia?"},{"type":"element","tagName":"a","properties":{"href":"#refaktorointia","ariaLabel":"refaktorointia permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä käytetty tapa tallentaa ruudukon tilanne on siinä mielessä kätevä, että yksi ruudukko kuvaa pelin koko tilanteen tiiviissä muodossa ja ruudukkoa on melko helppoa päivittää vähentämällä ja poistamalla sopivasti lukuja."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteutuksen huonona puolena on kuitenkin, että pelin koodin ymmärtäminen voi olla vaikeaa. Esimerkiksi jos ulkopuolinen koodari näkee seuraavan rivin, se näyttää luultavasti mystiseltä."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"laatikon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"laatikon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä on käytetty "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"taikalukuja"}]},{"type":"text","value":" ("},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"magic numbers"}]},{"type":"text","value":") ruutujen esittämiseen, ja koodin lukijan täytyy tietää, että 1 tarkoittaa seinää, 3 tarkoittaa laatikkoa ja 5 tarkoittaa kohderuudussa olevaa laatikkoa."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vielä mystisempiä ovat rivit tyyliin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"koska nyt laatikkoa tarkoittava luku 3 vähennetään ruudun luvusta. Tämä toimii, koska tämä muuttaa tavallisen laatikon lattiaksi ja kohderuudussa olevan laatikon kohderuuduksi, mutta asian ymmärtäminen vaatii huolellista perehtymistä ruutujen numerointiin."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelin koodin lukijan työtä voisi helpottaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"refaktoroimalla"}]},{"type":"text","value":" koodia eli muuttamalla koodin rakennetta paremmaksi ja selkeämmäksi. Tässä tapauksessa helppo muutos olisi käyttää lukujen 0–6 sijasta kuvaavampia ruutujen nimiä, mutta tämä ei selittäisi sitä, miksi lukuja voi vähentää ja lisätä ja ruudukko muuttuu oikealla tavalla."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelin koodin saaminen todella helposti luettavaksi vaatisikin luultavasti paljon suurempaa refaktorointia, kuten ruudukon pysyvän rakenteen tallentamista erillään ja robotin ja laatikoiden sijaintien tallentamista omissa tietorakenteissaan. Toisaalta tämän kääntöpuolena olisi, että koodia voisi tulla paljon lisää ja pelin sisäinen toiminta muuttuisi monimutkaisemmaksi."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Refaktorointiin ja koodin laatuun liittyviin asioihin tutustutaan lisää tulevilla kursseilla, kuten "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Ohjelmistotekniikka"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Ohjelmistotuotanto"}]},{"type":"text","value":"."}]}],"data":{"quirksMode":false}},"html":"

Vaikein asia Sokoban-pelin toteutuksessa on saada robotti liikkumaan niin, että se pystyy työntämään laatikoita halutulla tavalla. Pelin pitää tunnistaa, milloin robotti pystyy siirtymään pelaajan haluamaan suuntiin, sekä käsitellä oikein tilanteet, joissa robotti työntää laatikkoa. Nyt on aika tarttua tähän haasteeseen.

\n

Näppäimistön käsittely

\n

Pelaaja ohjaa robottia nuolinäppäimillä, joten tapahtumien käsittelyä täytyy laajentaa niin, että se tarkkailee myös näppäimistön tapahtumia:

\n
    def tutki_tapahtumat(self):\n        for tapahtuma in pygame.event.get():\n            if tapahtuma.type == pygame.KEYDOWN:\n                if tapahtuma.key == pygame.K_LEFT:\n                    self.liiku(0, -1)\n                if tapahtuma.key == pygame.K_RIGHT:\n                    self.liiku(0, 1)\n                if tapahtuma.key == pygame.K_UP:\n                    self.liiku(-1, 0)\n                if tapahtuma.key == pygame.K_DOWN:\n                    self.liiku(1, 0)\n\n            if tapahtuma.type == pygame.QUIT:\n                exit()
\n

Nyt kun pelaaja painaa nuolinäppäintä, kutsutaan metodia liiku sopivilla parametreilla. Ensimmäinen parametri ilmaisee liikkeen määrän pystysuunnassa ja toinen parametri puolestaan ilmaisee liikkeen määrän vaakasuunnassa.

\n

Robotin etsiminen

\n

Pelin täytyy tietää robotin sijainti, jotta sitä pystyy siirtämään oikealla tavalla. Seuraava metodi etsi_robo selvittää robotin sijainnin:

\n
    def etsi_robo(self):\n        for y in range(self.korkeus):\n            for x in range(self.leveys):\n                if self.kartta[y][x] in [4, 6]:\n                    return (y, x)
\n

Metodi käy läpi kaikki ruudukon ruudut ja palauttaa ruudun koordinaatit, jos ruudussa on luku 4 (robotti yksinään) tai luku 6 (robotti kohderuudun päällä).

\n

Ideana on, että aina kun käyttäjä painaa nuolinäppäintä, selvitetään ensin robotin sijainti käymällä läpi ruudukon ruudut. Tämä voi tuntua vähän hitaalta, koska vaihtoehtoisesti voisi myös pitää yllä tietoa robotin sijainnista omissa muuttujissa. Tämän toteutuksen etuna on kuitenkin, että robotin sijainti ei ole tallessa kahdessa paikassa (ruudukossa ja erillisissä muuttujissa) vaan vain yhdessä paikassa, eli muistissa oleva pelin tila on yksinkertaisempi.

\n

Muutokset ruudukossa

\n

Metodi liiku saa parametreina suunnan, johon pelaaja haluaa robotin liikkuvan, ja metodi joko päivittää ruudukkoa sopivasti tai toteaa, että liikkuminen ei ole mahdollista eikä muuta ruudukon sisältöä.

\n
    def liiku(self, liike_y, liike_x):\n        robon_vanha_y, robon_vanha_x = self.etsi_robo()\n        robon_uusi_y = robon_vanha_y + liike_y\n        robon_uusi_x = robon_vanha_x + liike_x\n\n        if self.kartta[robon_uusi_y][robon_uusi_x] == 1:\n            return\n\n        if self.kartta[robon_uusi_y][robon_uusi_x] in [3, 5]:\n            laatikon_uusi_y = robon_uusi_y + liike_y\n            laatikon_uusi_x = robon_uusi_x + liike_x\n\n            if self.kartta[laatikon_uusi_y][laatikon_uusi_x] in [1, 3, 5]:\n                return\n\n            self.kartta[robon_uusi_y][robon_uusi_x] -= 3\n            self.kartta[laatikon_uusi_y][laatikon_uusi_x] += 3\n\n        self.kartta[robon_vanha_y][robon_vanha_x] -= 4\n        self.kartta[robon_uusi_y][robon_uusi_x] += 4
\n

Metodi on melko monimutkainen, joten katsotaan tarkemmin metodin osia:

\n

Robotin vanha ja uusi sijainti

\n
        robon_vanha_y, robon_vanha_x = self.etsi_robo()\n        robon_uusi_y = robon_vanha_y + liike_y\n        robon_uusi_x = robon_vanha_x + liike_x
\n

Metodi kutsuu ensin metodia etsi_robo, joka selvittää robotin vanhan sijainnin ennen siirtoa. Tämä sijainti tallennetaan muuttujiin robon_vanha_y ja robon_vanha_x.

\n

Tämän jälkeen muuttujiin robon_uusi_y ja robon_uusi_x lasketaan robotin haluttu uusi sijainti. Tämä saadaan laskettua kätevästi, kun tiedossa on vanha sijainti sekä haluttu sijainnin muutos pysty- ja vaakasuunnassa.

\n

Törmääkö robotti seinään?

\n
        if self.kartta[robon_uusi_y][robon_uusi_x] == 1:\n            return
\n

Seuraavaksi käsitellään tapaus, jossa pelaaja yrittää ohjata robottia seinään (luku 1 tarkoittaa seinää). Tämä ei ole sallittua, joten tässä tilanteessa ei tapahdu mitään ja metodin suoritus vain loppuu.

\n

Laatikon siirtyminen

\n
        if self.kartta[robon_uusi_y][robon_uusi_x] in [3, 5]:\n            laatikon_uusi_y = robon_uusi_y + liike_y\n            laatikon_uusi_x = robon_uusi_x + liike_x\n\n            if self.kartta[laatikon_uusi_y][laatikon_uusi_x] in [1, 3, 5]:\n                return\n\n            self.kartta[robon_uusi_y][robon_uusi_x] -= 3\n            self.kartta[laatikon_uusi_y][laatikon_uusi_x] += 3
\n

Jos robotin uudessa sijainnissa on luku 3 (laatikko) tai 5 (laatikko kohderuudussa), robotti työntää laatikkoa liikkuessaan. Tätä varten lasketaan muuttujiin laatikon_uusi_y ja laatikon_uusi_x laatikon uusi sijainti työntämisen jälkeen.

\n

Laatikko ei voi siirtyä, jos uudessa kohdassa on luku 1 (seinäruutu), luku 3 (toinen laatikko) tai luku 5 (toinen laatikko kohderuudussa). Näissä tapauksissa metodi sulkee itsensä eikä tee mitään.

\n

Muissa tapauksissa kuitenkin laatikkoa pystyy siirtämään, jolloin laatikon nykyisen ruudun luvusta vähennetään 3 ja uuden ruudun lukuun lisätään 3. Tämä päivittää ruudukkoa oikealla tavalla sekä silloin, kun laatikko on tavallisessa lattiaruudussa tai kohderuudussa.

\n

Robotin siirtyminen

\n
        self.kartta[robon_vanha_y][robon_vanha_x] -= 4\n        self.kartta[robon_uusi_y][robon_uusi_x] += 4
\n

Jos metodin suoritus etenee loppuun asti, myös robotin tulee vielä siirtyä. Tämä toteutetaan samalla tavalla kuin laatikon siirtyminen, paitsi että vähennettävä ja lisättävä arvo on 4. Tässäkin tapauksessa ruudukon sisältö muuttuu oikein tilanteissa, joissa robotti on tavallisessa lattiaruudussa tai kohderuudussa.

\n

Refaktorointia?

\n

Tässä käytetty tapa tallentaa ruudukon tilanne on siinä mielessä kätevä, että yksi ruudukko kuvaa pelin koko tilanteen tiiviissä muodossa ja ruudukkoa on melko helppoa päivittää vähentämällä ja poistamalla sopivasti lukuja.

\n

Toteutuksen huonona puolena on kuitenkin, että pelin koodin ymmärtäminen voi olla vaikeaa. Esimerkiksi jos ulkopuolinen koodari näkee seuraavan rivin, se näyttää luultavasti mystiseltä.

\n
            if self.kartta[laatikon_uusi_y][laatikon_uusi_x] in [1, 3, 5]:
\n

Tässä on käytetty taikalukuja (magic numbers) ruutujen esittämiseen, ja koodin lukijan täytyy tietää, että 1 tarkoittaa seinää, 3 tarkoittaa laatikkoa ja 5 tarkoittaa kohderuudussa olevaa laatikkoa.

\n

Vielä mystisempiä ovat rivit tyyliin

\n
            self.kartta[robon_uusi_y][robon_uusi_x] -= 3
\n

koska nyt laatikkoa tarkoittava luku 3 vähennetään ruudun luvusta. Tämä toimii, koska tämä muuttaa tavallisen laatikon lattiaksi ja kohderuudussa olevan laatikon kohderuuduksi, mutta asian ymmärtäminen vaatii huolellista perehtymistä ruutujen numerointiin.

\n

Pelin koodin lukijan työtä voisi helpottaa refaktoroimalla koodia eli muuttamalla koodin rakennetta paremmaksi ja selkeämmäksi. Tässä tapauksessa helppo muutos olisi käyttää lukujen 0–6 sijasta kuvaavampia ruutujen nimiä, mutta tämä ei selittäisi sitä, miksi lukuja voi vähentää ja lisätä ja ruudukko muuttuu oikealla tavalla.

\n

Pelin koodin saaminen todella helposti luettavaksi vaatisikin luultavasti paljon suurempaa refaktorointia, kuten ruudukon pysyvän rakenteen tallentamista erillään ja robotin ja laatikoiden sijaintien tallentamista omissa tietorakenteissaan. Toisaalta tämän kääntöpuolena olisi, että koodia voisi tulla paljon lisää ja pelin sisäinen toiminta muuttuisi monimutkaisemmaksi.

\n

Refaktorointiin ja koodin laatuun liittyviin asioihin tutustutaan lisää tulevilla kursseilla, kuten Ohjelmistotekniikka ja Ohjelmistotuotanto.

","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-14/2-robo-ja-laatikot.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaikein asia Sokoban-pelin toteutuksessa on saada robotti liikkumaan niin, että se pystyy työntämään laatikoita halutulla tavalla. Pelin pitää tunnistaa, milloin robotti pystyy siirtymään pelaajan haluamaan suuntiin, sekä käsitellä oikein tilanteet, joissa robotti työntää laatikkoa. Nyt on aika tarttua tähän haasteeseen."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"nappaimiston-kasittely","style":"position:relative;"},"children":[{"type":"text","value":"Näppäimistön käsittely"},{"type":"element","tagName":"a","properties":{"href":"#nappaimiston-kasittely","ariaLabel":"nappaimiston kasittely permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelaaja ohjaa robottia nuolinäppäimillä, joten tapahtumien käsittelyä täytyy laajentaa niin, että se tarkkailee myös näppäimistön tapahtumia:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tutki_tapahtumat"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" tapahtuma "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"event"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"KEYDOWN"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_LEFT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"liiku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_RIGHT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"liiku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_UP"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"liiku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_DOWN"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"liiku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"QUIT"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt kun pelaaja painaa nuolinäppäintä, kutsutaan metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"liiku"}]},{"type":"text","value":" sopivilla parametreilla. Ensimmäinen parametri ilmaisee liikkeen määrän pystysuunnassa ja toinen parametri puolestaan ilmaisee liikkeen määrän vaakasuunnassa."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"robotin-etsiminen","style":"position:relative;"},"children":[{"type":"text","value":"Robotin etsiminen"},{"type":"element","tagName":"a","properties":{"href":"#robotin-etsiminen","ariaLabel":"robotin etsiminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelin täytyy tietää robotin sijainti, jotta sitä pystyy siirtämään oikealla tavalla. Seuraava metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"etsi_robo"}]},{"type":"text","value":" selvittää robotin sijainnin:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"etsi_robo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" y "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi käy läpi kaikki ruudukon ruudut ja palauttaa ruudun koordinaatit, jos ruudussa on luku 4 (robotti yksinään) tai luku 6 (robotti kohderuudun päällä)."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ideana on, että aina kun käyttäjä painaa nuolinäppäintä, selvitetään ensin robotin sijainti käymällä läpi ruudukon ruudut. Tämä voi tuntua vähän hitaalta, koska vaihtoehtoisesti voisi myös pitää yllä tietoa robotin sijainnista omissa muuttujissa. Tämän toteutuksen etuna on kuitenkin, että robotin sijainti ei ole tallessa kahdessa paikassa (ruudukossa ja erillisissä muuttujissa) vaan vain yhdessä paikassa, eli muistissa oleva pelin tila on yksinkertaisempi."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"muutokset-ruudukossa","style":"position:relative;"},"children":[{"type":"text","value":"Muutokset ruudukossa"},{"type":"element","tagName":"a","properties":{"href":"#muutokset-ruudukossa","ariaLabel":"muutokset ruudukossa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"liiku"}]},{"type":"text","value":" saa parametreina suunnan, johon pelaaja haluaa robotin liikkuvan, ja metodi joko päivittää ruudukkoa sopivasti tai toteaa, että liikkuminen ei ole mahdollista eikä muuta ruudukon sisältöä."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"liiku"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" liike_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" liike_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n robon_vanha_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" robon_vanha_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"etsi_robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n robon_uusi_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" robon_vanha_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" liike_y\n robon_uusi_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" robon_vanha_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" liike_x\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n laatikon_uusi_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" robon_uusi_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" liike_y\n laatikon_uusi_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" robon_uusi_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" liike_x\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"laatikon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"laatikon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":"\n\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"laatikon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"laatikon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_vanha_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_vanha_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi on melko monimutkainen, joten katsotaan tarkemmin metodin osia:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"robotin-vanha-ja-uusi-sijainti","style":"position:relative;"},"children":[{"type":"text","value":"Robotin vanha ja uusi sijainti"},{"type":"element","tagName":"a","properties":{"href":"#robotin-vanha-ja-uusi-sijainti","ariaLabel":"robotin vanha ja uusi sijainti permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" robon_vanha_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" robon_vanha_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"etsi_robo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n robon_uusi_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" robon_vanha_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" liike_y\n robon_uusi_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" robon_vanha_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" liike_x"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi kutsuu ensin metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"etsi_robo"}]},{"type":"text","value":", joka selvittää robotin vanhan sijainnin ennen siirtoa. Tämä sijainti tallennetaan muuttujiin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"robon_vanha_y"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"robon_vanha_x"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän jälkeen muuttujiin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"robon_uusi_y"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"robon_uusi_x"}]},{"type":"text","value":" lasketaan robotin haluttu uusi sijainti. Tämä saadaan laskettua kätevästi, kun tiedossa on vanha sijainti sekä haluttu sijainnin muutos pysty- ja vaakasuunnassa."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"tormaako-robotti-seinaan","style":"position:relative;"},"children":[{"type":"text","value":"Törmääkö robotti seinään?"},{"type":"element","tagName":"a","properties":{"href":"#tormaako-robotti-seinaan","ariaLabel":"tormaako robotti seinaan permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavaksi käsitellään tapaus, jossa pelaaja yrittää ohjata robottia seinään (luku 1 tarkoittaa seinää). Tämä ei ole sallittua, joten tässä tilanteessa ei tapahdu mitään ja metodin suoritus vain loppuu."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"laatikon-siirtyminen","style":"position:relative;"},"children":[{"type":"text","value":"Laatikon siirtyminen"},{"type":"element","tagName":"a","properties":{"href":"#laatikon-siirtyminen","ariaLabel":"laatikon siirtyminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n laatikon_uusi_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" robon_uusi_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" liike_y\n laatikon_uusi_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" robon_uusi_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" liike_x\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"laatikon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"laatikon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":"\n\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"laatikon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"laatikon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos robotin uudessa sijainnissa on luku 3 (laatikko) tai 5 (laatikko kohderuudussa), robotti työntää laatikkoa liikkuessaan. Tätä varten lasketaan muuttujiin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"laatikon_uusi_y"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"laatikon_uusi_x"}]},{"type":"text","value":" laatikon uusi sijainti työntämisen jälkeen."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laatikko ei voi siirtyä, jos uudessa kohdassa on luku 1 (seinäruutu), luku 3 (toinen laatikko) tai luku 5 (toinen laatikko kohderuudussa). Näissä tapauksissa metodi sulkee itsensä eikä tee mitään."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muissa tapauksissa kuitenkin laatikkoa pystyy siirtämään, jolloin laatikon nykyisen ruudun luvusta vähennetään 3 ja uuden ruudun lukuun lisätään 3. Tämä päivittää ruudukkoa oikealla tavalla sekä silloin, kun laatikko on tavallisessa lattiaruudussa tai kohderuudussa."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"robotin-siirtyminen","style":"position:relative;"},"children":[{"type":"text","value":"Robotin siirtyminen"},{"type":"element","tagName":"a","properties":{"href":"#robotin-siirtyminen","ariaLabel":"robotin siirtyminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_vanha_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_vanha_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos metodin suoritus etenee loppuun asti, myös robotin tulee vielä siirtyä. Tämä toteutetaan samalla tavalla kuin laatikon siirtyminen, paitsi että vähennettävä ja lisättävä arvo on 4. Tässäkin tapauksessa ruudukon sisältö muuttuu oikein tilanteissa, joissa robotti on tavallisessa lattiaruudussa tai kohderuudussa."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"refaktorointia","style":"position:relative;"},"children":[{"type":"text","value":"Refaktorointia?"},{"type":"element","tagName":"a","properties":{"href":"#refaktorointia","ariaLabel":"refaktorointia permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä käytetty tapa tallentaa ruudukon tilanne on siinä mielessä kätevä, että yksi ruudukko kuvaa pelin koko tilanteen tiiviissä muodossa ja ruudukkoa on melko helppoa päivittää vähentämällä ja poistamalla sopivasti lukuja."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteutuksen huonona puolena on kuitenkin, että pelin koodin ymmärtäminen voi olla vaikeaa. Esimerkiksi jos ulkopuolinen koodari näkee seuraavan rivin, se näyttää luultavasti mystiseltä."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"laatikon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"laatikon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä on käytetty "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"taikalukuja"}]},{"type":"text","value":" ("},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"magic numbers"}]},{"type":"text","value":") ruutujen esittämiseen, ja koodin lukijan täytyy tietää, että 1 tarkoittaa seinää, 3 tarkoittaa laatikkoa ja 5 tarkoittaa kohderuudussa olevaa laatikkoa."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vielä mystisempiä ovat rivit tyyliin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"robon_uusi_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"koska nyt laatikkoa tarkoittava luku 3 vähennetään ruudun luvusta. Tämä toimii, koska tämä muuttaa tavallisen laatikon lattiaksi ja kohderuudussa olevan laatikon kohderuuduksi, mutta asian ymmärtäminen vaatii huolellista perehtymistä ruutujen numerointiin."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelin koodin lukijan työtä voisi helpottaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"refaktoroimalla"}]},{"type":"text","value":" koodia eli muuttamalla koodin rakennetta paremmaksi ja selkeämmäksi. Tässä tapauksessa helppo muutos olisi käyttää lukujen 0–6 sijasta kuvaavampia ruutujen nimiä, mutta tämä ei selittäisi sitä, miksi lukuja voi vähentää ja lisätä ja ruudukko muuttuu oikealla tavalla."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelin koodin saaminen todella helposti luettavaksi vaatisikin luultavasti paljon suurempaa refaktorointia, kuten ruudukon pysyvän rakenteen tallentamista erillään ja robotin ja laatikoiden sijaintien tallentamista omissa tietorakenteissaan. Toisaalta tämän kääntöpuolena olisi, että koodia voisi tulla paljon lisää ja pelin sisäinen toiminta muuttuisi monimutkaisemmaksi."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Refaktorointiin ja koodin laatuun liittyviin asioihin tutustutaan lisää tulevilla kursseilla, kuten "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Ohjelmistotekniikka"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Ohjelmistotuotanto"}]},{"type":"text","value":"."}]}],"data":{"quirksMode":false}},"html":"

Vaikein asia Sokoban-pelin toteutuksessa on saada robotti liikkumaan niin, että se pystyy työntämään laatikoita halutulla tavalla. Pelin pitää tunnistaa, milloin robotti pystyy siirtymään pelaajan haluamaan suuntiin, sekä käsitellä oikein tilanteet, joissa robotti työntää laatikkoa. Nyt on aika tarttua tähän haasteeseen.

\n

Näppäimistön käsittely

\n

Pelaaja ohjaa robottia nuolinäppäimillä, joten tapahtumien käsittelyä täytyy laajentaa niin, että se tarkkailee myös näppäimistön tapahtumia:

\n
    def tutki_tapahtumat(self):\n        for tapahtuma in pygame.event.get():\n            if tapahtuma.type == pygame.KEYDOWN:\n                if tapahtuma.key == pygame.K_LEFT:\n                    self.liiku(0, -1)\n                if tapahtuma.key == pygame.K_RIGHT:\n                    self.liiku(0, 1)\n                if tapahtuma.key == pygame.K_UP:\n                    self.liiku(-1, 0)\n                if tapahtuma.key == pygame.K_DOWN:\n                    self.liiku(1, 0)\n\n            if tapahtuma.type == pygame.QUIT:\n                exit()
\n

Nyt kun pelaaja painaa nuolinäppäintä, kutsutaan metodia liiku sopivilla parametreilla. Ensimmäinen parametri ilmaisee liikkeen määrän pystysuunnassa ja toinen parametri puolestaan ilmaisee liikkeen määrän vaakasuunnassa.

\n

Robotin etsiminen

\n

Pelin täytyy tietää robotin sijainti, jotta sitä pystyy siirtämään oikealla tavalla. Seuraava metodi etsi_robo selvittää robotin sijainnin:

\n
    def etsi_robo(self):\n        for y in range(self.korkeus):\n            for x in range(self.leveys):\n                if self.kartta[y][x] in [4, 6]:\n                    return (y, x)
\n

Metodi käy läpi kaikki ruudukon ruudut ja palauttaa ruudun koordinaatit, jos ruudussa on luku 4 (robotti yksinään) tai luku 6 (robotti kohderuudun päällä).

\n

Ideana on, että aina kun käyttäjä painaa nuolinäppäintä, selvitetään ensin robotin sijainti käymällä läpi ruudukon ruudut. Tämä voi tuntua vähän hitaalta, koska vaihtoehtoisesti voisi myös pitää yllä tietoa robotin sijainnista omissa muuttujissa. Tämän toteutuksen etuna on kuitenkin, että robotin sijainti ei ole tallessa kahdessa paikassa (ruudukossa ja erillisissä muuttujissa) vaan vain yhdessä paikassa, eli muistissa oleva pelin tila on yksinkertaisempi.

\n

Muutokset ruudukossa

\n

Metodi liiku saa parametreina suunnan, johon pelaaja haluaa robotin liikkuvan, ja metodi joko päivittää ruudukkoa sopivasti tai toteaa, että liikkuminen ei ole mahdollista eikä muuta ruudukon sisältöä.

\n
    def liiku(self, liike_y, liike_x):\n        robon_vanha_y, robon_vanha_x = self.etsi_robo()\n        robon_uusi_y = robon_vanha_y + liike_y\n        robon_uusi_x = robon_vanha_x + liike_x\n\n        if self.kartta[robon_uusi_y][robon_uusi_x] == 1:\n            return\n\n        if self.kartta[robon_uusi_y][robon_uusi_x] in [3, 5]:\n            laatikon_uusi_y = robon_uusi_y + liike_y\n            laatikon_uusi_x = robon_uusi_x + liike_x\n\n            if self.kartta[laatikon_uusi_y][laatikon_uusi_x] in [1, 3, 5]:\n                return\n\n            self.kartta[robon_uusi_y][robon_uusi_x] -= 3\n            self.kartta[laatikon_uusi_y][laatikon_uusi_x] += 3\n\n        self.kartta[robon_vanha_y][robon_vanha_x] -= 4\n        self.kartta[robon_uusi_y][robon_uusi_x] += 4
\n

Metodi on melko monimutkainen, joten katsotaan tarkemmin metodin osia:

\n

Robotin vanha ja uusi sijainti

\n
        robon_vanha_y, robon_vanha_x = self.etsi_robo()\n        robon_uusi_y = robon_vanha_y + liike_y\n        robon_uusi_x = robon_vanha_x + liike_x
\n

Metodi kutsuu ensin metodia etsi_robo, joka selvittää robotin vanhan sijainnin ennen siirtoa. Tämä sijainti tallennetaan muuttujiin robon_vanha_y ja robon_vanha_x.

\n

Tämän jälkeen muuttujiin robon_uusi_y ja robon_uusi_x lasketaan robotin haluttu uusi sijainti. Tämä saadaan laskettua kätevästi, kun tiedossa on vanha sijainti sekä haluttu sijainnin muutos pysty- ja vaakasuunnassa.

\n

Törmääkö robotti seinään?

\n
        if self.kartta[robon_uusi_y][robon_uusi_x] == 1:\n            return
\n

Seuraavaksi käsitellään tapaus, jossa pelaaja yrittää ohjata robottia seinään (luku 1 tarkoittaa seinää). Tämä ei ole sallittua, joten tässä tilanteessa ei tapahdu mitään ja metodin suoritus vain loppuu.

\n

Laatikon siirtyminen

\n
        if self.kartta[robon_uusi_y][robon_uusi_x] in [3, 5]:\n            laatikon_uusi_y = robon_uusi_y + liike_y\n            laatikon_uusi_x = robon_uusi_x + liike_x\n\n            if self.kartta[laatikon_uusi_y][laatikon_uusi_x] in [1, 3, 5]:\n                return\n\n            self.kartta[robon_uusi_y][robon_uusi_x] -= 3\n            self.kartta[laatikon_uusi_y][laatikon_uusi_x] += 3
\n

Jos robotin uudessa sijainnissa on luku 3 (laatikko) tai 5 (laatikko kohderuudussa), robotti työntää laatikkoa liikkuessaan. Tätä varten lasketaan muuttujiin laatikon_uusi_y ja laatikon_uusi_x laatikon uusi sijainti työntämisen jälkeen.

\n

Laatikko ei voi siirtyä, jos uudessa kohdassa on luku 1 (seinäruutu), luku 3 (toinen laatikko) tai luku 5 (toinen laatikko kohderuudussa). Näissä tapauksissa metodi sulkee itsensä eikä tee mitään.

\n

Muissa tapauksissa kuitenkin laatikkoa pystyy siirtämään, jolloin laatikon nykyisen ruudun luvusta vähennetään 3 ja uuden ruudun lukuun lisätään 3. Tämä päivittää ruudukkoa oikealla tavalla sekä silloin, kun laatikko on tavallisessa lattiaruudussa tai kohderuudussa.

\n

Robotin siirtyminen

\n
        self.kartta[robon_vanha_y][robon_vanha_x] -= 4\n        self.kartta[robon_uusi_y][robon_uusi_x] += 4
\n

Jos metodin suoritus etenee loppuun asti, myös robotin tulee vielä siirtyä. Tämä toteutetaan samalla tavalla kuin laatikon siirtyminen, paitsi että vähennettävä ja lisättävä arvo on 4. Tässäkin tapauksessa ruudukon sisältö muuttuu oikein tilanteissa, joissa robotti on tavallisessa lattiaruudussa tai kohderuudussa.

\n

Refaktorointia?

\n

Tässä käytetty tapa tallentaa ruudukon tilanne on siinä mielessä kätevä, että yksi ruudukko kuvaa pelin koko tilanteen tiiviissä muodossa ja ruudukkoa on melko helppoa päivittää vähentämällä ja poistamalla sopivasti lukuja.

\n

Toteutuksen huonona puolena on kuitenkin, että pelin koodin ymmärtäminen voi olla vaikeaa. Esimerkiksi jos ulkopuolinen koodari näkee seuraavan rivin, se näyttää luultavasti mystiseltä.

\n
            if self.kartta[laatikon_uusi_y][laatikon_uusi_x] in [1, 3, 5]:
\n

Tässä on käytetty taikalukuja (magic numbers) ruutujen esittämiseen, ja koodin lukijan täytyy tietää, että 1 tarkoittaa seinää, 3 tarkoittaa laatikkoa ja 5 tarkoittaa kohderuudussa olevaa laatikkoa.

\n

Vielä mystisempiä ovat rivit tyyliin

\n
            self.kartta[robon_uusi_y][robon_uusi_x] -= 3
\n

koska nyt laatikkoa tarkoittava luku 3 vähennetään ruudun luvusta. Tämä toimii, koska tämä muuttaa tavallisen laatikon lattiaksi ja kohderuudussa olevan laatikon kohderuuduksi, mutta asian ymmärtäminen vaatii huolellista perehtymistä ruutujen numerointiin.

\n

Pelin koodin lukijan työtä voisi helpottaa refaktoroimalla koodia eli muuttamalla koodin rakennetta paremmaksi ja selkeämmäksi. Tässä tapauksessa helppo muutos olisi käyttää lukujen 0–6 sijasta kuvaavampia ruutujen nimiä, mutta tämä ei selittäisi sitä, miksi lukuja voi vähentää ja lisätä ja ruudukko muuttuu oikealla tavalla.

\n

Pelin koodin saaminen todella helposti luettavaksi vaatisikin luultavasti paljon suurempaa refaktorointia, kuten ruudukon pysyvän rakenteen tallentamista erillään ja robotin ja laatikoiden sijaintien tallentamista omissa tietorakenteissaan. Toisaalta tämän kääntöpuolena olisi, että koodia voisi tulla paljon lisää ja pelin sisäinen toiminta muuttuisi monimutkaisemmaksi.

\n

Refaktorointiin ja koodin laatuun liittyviin asioihin tutustutaan lisää tulevilla kursseilla, kuten Ohjelmistotekniikka ja Ohjelmistotuotanto.

","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-14/2-robo-ja-laatikot.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-14/3-pelin-viimeistely/page-data.json b/page-data/osa-14/3-pelin-viimeistely/page-data.json index 2a133b601..918df5ae6 100644 --- a/page-data/osa-14/3-pelin-viimeistely/page-data.json +++ b/page-data/osa-14/3-pelin-viimeistely/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-14/3-pelin-viimeistely", - "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Peli on jo hyvässä vaiheessa, joten nyt voimme alkaa viimeistellä pelin toteutusta. Lisäämme peliin laskurin, joka näyttää siirtojen määrän, mahdollisuuden aloittaa uusi peli ja sulkea peli näppäinkomennoilla sekä ilmoituksen, kun pelaaja onnistuu läpäisemään pelin."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"siirtolaskuri","style":"position:relative;"},"children":[{"type":"text","value":"Siirtolaskuri"},{"type":"element","tagName":"a","properties":{"href":"#siirtolaskuri","ariaLabel":"siirtolaskuri permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Siirtolaskuri näyttää pelin ikkunan alalaidassa, montako siirtoa pelaaja on tehnyt tähän mennessä. Tämän avulla voi yrittää etsiä ratkaisua, jossa on mahdollisimman vähän siirtoja."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laskurin tekeminen vaatii joitakin muutoksia koodiin. Muutetaan ensin konstruktoria niin, että ikkunassa on tilaa laskurille ja käytettävissä on fontti tekstin piirtämistä varten:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"naytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nayton_leveys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nayton_korkeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fontti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"font"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"SysFont"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arial\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Siirtolaskuri nollataan pelin alussa ja jokainen siirto kasvattaa sitä yhdellä:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"uusi_peli"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"siirrot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"liiku"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" liike_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" liike_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"siirrot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisäksi näytön päivityksen yhteydessä näytetään siirtojen määrä laskurin avulla:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"piirra_naytto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"\n teksti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fontti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"render"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Siirrot: \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"siirrot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"255"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"teksti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"25"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"uusi-peli-ja-pelin-sulkeminen","style":"position:relative;"},"children":[{"type":"text","value":"Uusi peli ja pelin sulkeminen"},{"type":"element","tagName":"a","properties":{"href":"#uusi-peli-ja-pelin-sulkeminen","ariaLabel":"uusi peli ja pelin sulkeminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisätään peliin seuraavaksi näppäinkomennot, joiden avulla pelaaja voi aloittaa uuden pelin painamalla F2 sekä sulkea pelin painamalla Esc. Molemmat toiminnot on helppo toteuttaa:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tutki_tapahtumat"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_F2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"uusi_peli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_ESCAPE"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisäksi piirretään ikkunan alalaitaan pelaajalle tiedoksi, että pelissä on tällaiset toiminnot:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"piirra_naytto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"\n teksti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fontti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"render"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"F2 = uusi peli\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"255"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"teksti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"200"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n teksti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fontti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"render"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Esc = sulje peli\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"255"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"teksti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"400"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"pelin-lapaiseminen","style":"position:relative;"},"children":[{"type":"text","value":"Pelin läpäiseminen"},{"type":"element","tagName":"a","properties":{"href":"#pelin-lapaiseminen","ariaLabel":"pelin lapaiseminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelaaja läpäisee pelin, kun jokainen laatikko on jossain kohderuudussa. Tämä voidaan tarkastaa seuraavalla metodilla:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"peli_lapi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" y "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi käy läpi kaikki ruudut ja jos jossain ruudussa on luku 2 (tyhjä kohderuutu) tai 6 (robotti kohderuudussa), peli ei ole vielä läpäisty ja metodi palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":". Jos mitään tällaista ruutua ei ole ruudukossa, peli kuitenkin on läpäisty ja metodi palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos pelaaja läpäisee pelin, metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"piirra_naytto"}]},{"type":"text","value":" näyttää asiaan kuuluvan viestin:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"piirra_naytto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"peli_lapi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n teksti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fontti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"render"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Onnittelut, läpäisit pelin!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"255"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n teksti_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" teksti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_width"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n teksti_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" teksti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_height"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"draw"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rect"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"teksti_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" teksti_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" teksti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_width"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" teksti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_height"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"teksti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"teksti_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" teksti_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisäksi metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"liiku"}]},{"type":"text","value":" alkua muutetaan niin, että liikkuminen ei ole enää mahdollista, kun pelaaja on läpäissyt pelin:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"liiku"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" liike_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" liike_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"peli_lapi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tilanteessa kuitenkin pelaaja näkee edelleen ruudukon ja lopullisen pelitilanteen."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"vinkki-testauksen","style":"position:relative;"},"children":[{"type":"text","value":"Vinkki testauksen"},{"type":"element","tagName":"a","properties":{"href":"#vinkki-testauksen","ariaLabel":"vinkki testauksen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelin kehityksen aikana tulee helposti tarve tarkastaa, mitä tapahtuu jossain vaiheessa myöhemmin pelissä. Esimerkiksi tässä pelissä tällainen tapahtuma on pelin läpäiseminen ja siitä tuleva ilmoitus."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tällaisen tapahtuman testaaminen voi olla hankalaa, jos esimerkiksi pitää aina läpäistä koko peli ennen kuin tapahtuman näkee. Kuitenkin pelin ohjelmoija voi helposti tehdä koodiin väliaikaisia muutoksia, jotka helpottavat testausta. Esimerkiksi pelin läpäisyä voi testata muuttamalla koodia näin:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"peli_lapi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt metodi palauttaa aina "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":" eli peli on läpäisty heti pelin alkaessa. Tämän avulla voi mukavasti varmistaa, että pelin lopussa tuleva ilmoitus näyttää oikealta eikä pelaaja pysty enää siirtymään ruudukossa. Sitten kun pelin päättyminen toimii oikein, metodin voi jälleen palauttaa ennalleen."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"peli-githubiin","style":"position:relative;"},"children":[{"type":"text","value":"Peli GitHubiin"},{"type":"element","tagName":"a","properties":{"href":"#peli-githubiin","ariaLabel":"peli githubiin permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Peli on nyt valmis ja voit hakea pelin lopullisen koodin ja kuvat GitHubista:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://github.com/moocfi/sokoban","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"https://github.com/moocfi/sokoban"}]}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"GitHub on hyvä paikka omille ohjelmointiprojekteille: sen avulla projektin koodin ja muut tiedostot saa talteen Git-versionhallintaan ja projektin pystyy helposti jakamaan muille. GitHubia käytetään paljon myöhemmillä tietojenkäsittelytieteen kursseilla."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"montako-siirtoa-tarvitaan","style":"position:relative;"},"children":[{"type":"text","value":"Montako siirtoa tarvitaan?"},{"type":"element","tagName":"a","properties":{"href":"#montako-siirtoa-tarvitaan","ariaLabel":"montako siirtoa tarvitaan permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaikka pelin ruudukko on melko pieni, peli ei ole helppo. Ensimmäinen haaste on onnistua läpäisemään peli, ja sen jälkeen haasteena on keksiä ratkaisu, jossa siirtojen määrä on mahdollisimman pieni. Kuinka lyhyen ratkaisun onnistut muodostamaan?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lyhimmän mahdollisen ratkaisun etsiminen käsin on hyvin vaikeaa, mutta tässäkin voi käyttää apuna ohjelmointia. Kurssilla "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Tietorakenteet ja algoritmit"}]},{"type":"text","value":" tutustutaan tekniikoihin, joiden avulla voidaan löytää automaattisesti lyhin mahdollinen ratkaisu peliin."}]}],"data":{"quirksMode":false}},"html":"

Peli on jo hyvässä vaiheessa, joten nyt voimme alkaa viimeistellä pelin toteutusta. Lisäämme peliin laskurin, joka näyttää siirtojen määrän, mahdollisuuden aloittaa uusi peli ja sulkea peli näppäinkomennoilla sekä ilmoituksen, kun pelaaja onnistuu läpäisemään pelin.

\n

Siirtolaskuri

\n

Siirtolaskuri näyttää pelin ikkunan alalaidassa, montako siirtoa pelaaja on tehnyt tähän mennessä. Tämän avulla voi yrittää etsiä ratkaisua, jossa on mahdollisimman vähän siirtoja.

\n

Laskurin tekeminen vaatii joitakin muutoksia koodiin. Muutetaan ensin konstruktoria niin, että ikkunassa on tilaa laskurille ja käytettävissä on fontti tekstin piirtämistä varten:

\n
    def __init__(self):\n        ...\n        self.naytto = pygame.display.set_mode((nayton_leveys, nayton_korkeus + self.skaala))\n\n        self.fontti = pygame.font.SysFont(\"Arial\", 24)\n        ...
\n

Siirtolaskuri nollataan pelin alussa ja jokainen siirto kasvattaa sitä yhdellä:

\n
    def uusi_peli(self):\n        ...\n        self.siirrot = 0
\n
    def liiku(self, liike_y, liike_x):\n        ...\n        self.siirrot += 1\n
\n

Lisäksi näytön päivityksen yhteydessä näytetään siirtojen määrä laskurin avulla:

\n
    def piirra_naytto(self):\n        ...\n        teksti = self.fontti.render(\"Siirrot: \" + str(self.siirrot), True, (255, 0, 0))\n        self.naytto.blit(teksti, (25, self.korkeus * self.skaala + 10))\n        ...
\n

Uusi peli ja pelin sulkeminen

\n

Lisätään peliin seuraavaksi näppäinkomennot, joiden avulla pelaaja voi aloittaa uuden pelin painamalla F2 sekä sulkea pelin painamalla Esc. Molemmat toiminnot on helppo toteuttaa:

\n
    def tutki_tapahtumat(self):\n        ...\n                if tapahtuma.key == pygame.K_F2:\n                    self.uusi_peli()\n                if tapahtuma.key == pygame.K_ESCAPE:\n                    exit()\n        ...
\n

Lisäksi piirretään ikkunan alalaitaan pelaajalle tiedoksi, että pelissä on tällaiset toiminnot:

\n
    def piirra_naytto(self):\n        ...\n        teksti = self.fontti.render(\"F2 = uusi peli\", True, (255, 0, 0))\n        self.naytto.blit(teksti, (200, self.korkeus * self.skaala + 10))\n\n        teksti = self.fontti.render(\"Esc = sulje peli\", True, (255, 0, 0))\n        self.naytto.blit(teksti, (400, self.korkeus * self.skaala + 10))\n        ...
\n

Pelin läpäiseminen

\n

Pelaaja läpäisee pelin, kun jokainen laatikko on jossain kohderuudussa. Tämä voidaan tarkastaa seuraavalla metodilla:

\n
    def peli_lapi(self):\n        for y in range(self.korkeus):\n            for x in range(self.leveys):\n                if self.kartta[y][x] in [2, 6]:\n                    return False\n        return True
\n

Metodi käy läpi kaikki ruudut ja jos jossain ruudussa on luku 2 (tyhjä kohderuutu) tai 6 (robotti kohderuudussa), peli ei ole vielä läpäisty ja metodi palauttaa False. Jos mitään tällaista ruutua ei ole ruudukossa, peli kuitenkin on läpäisty ja metodi palauttaa True.

\n

Jos pelaaja läpäisee pelin, metodi piirra_naytto näyttää asiaan kuuluvan viestin:

\n
    def piirra_naytto(self):\n        ...\n        if self.peli_lapi():\n            teksti = self.fontti.render(\"Onnittelut, läpäisit pelin!\", True, (255, 0, 0))\n            teksti_x = self.skaala * self.leveys / 2 - teksti.get_width() / 2\n            teksti_y = self.skaala * self.korkeus / 2 - teksti.get_height() / 2\n            pygame.draw.rect(self.naytto, (0, 0, 0), (teksti_x, teksti_y, teksti.get_width(), teksti.get_height()))\n            self.naytto.blit(teksti, (teksti_x, teksti_y))\n        ...
\n

Lisäksi metodin liiku alkua muutetaan niin, että liikkuminen ei ole enää mahdollista, kun pelaaja on läpäissyt pelin:

\n
    def liiku(self, liike_y, liike_x):\n        if self.peli_lapi():\n            return\n        ...
\n

Tässä tilanteessa kuitenkin pelaaja näkee edelleen ruudukon ja lopullisen pelitilanteen.

\n

Vinkki testauksen

\n

Pelin kehityksen aikana tulee helposti tarve tarkastaa, mitä tapahtuu jossain vaiheessa myöhemmin pelissä. Esimerkiksi tässä pelissä tällainen tapahtuma on pelin läpäiseminen ja siitä tuleva ilmoitus.

\n

Tällaisen tapahtuman testaaminen voi olla hankalaa, jos esimerkiksi pitää aina läpäistä koko peli ennen kuin tapahtuman näkee. Kuitenkin pelin ohjelmoija voi helposti tehdä koodiin väliaikaisia muutoksia, jotka helpottavat testausta. Esimerkiksi pelin läpäisyä voi testata muuttamalla koodia näin:

\n
    def peli_lapi(self):\n        return True
\n

Nyt metodi palauttaa aina True eli peli on läpäisty heti pelin alkaessa. Tämän avulla voi mukavasti varmistaa, että pelin lopussa tuleva ilmoitus näyttää oikealta eikä pelaaja pysty enää siirtymään ruudukossa. Sitten kun pelin päättyminen toimii oikein, metodin voi jälleen palauttaa ennalleen.

\n

Peli GitHubiin

\n

Peli on nyt valmis ja voit hakea pelin lopullisen koodin ja kuvat GitHubista:

\n\n

GitHub on hyvä paikka omille ohjelmointiprojekteille: sen avulla projektin koodin ja muut tiedostot saa talteen Git-versionhallintaan ja projektin pystyy helposti jakamaan muille. GitHubia käytetään paljon myöhemmillä tietojenkäsittelytieteen kursseilla.

\n

Montako siirtoa tarvitaan?

\n

Vaikka pelin ruudukko on melko pieni, peli ei ole helppo. Ensimmäinen haaste on onnistua läpäisemään peli, ja sen jälkeen haasteena on keksiä ratkaisu, jossa siirtojen määrä on mahdollisimman pieni. Kuinka lyhyen ratkaisun onnistut muodostamaan?

\n

Lyhimmän mahdollisen ratkaisun etsiminen käsin on hyvin vaikeaa, mutta tässäkin voi käyttää apuna ohjelmointia. Kurssilla Tietorakenteet ja algoritmit tutustutaan tekniikoihin, joiden avulla voidaan löytää automaattisesti lyhin mahdollinen ratkaisu peliin.

","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-14/3-pelin-viimeistely.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Peli on jo hyvässä vaiheessa, joten nyt voimme alkaa viimeistellä pelin toteutusta. Lisäämme peliin laskurin, joka näyttää siirtojen määrän, mahdollisuuden aloittaa uusi peli ja sulkea peli näppäinkomennoilla sekä ilmoituksen, kun pelaaja onnistuu läpäisemään pelin."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"siirtolaskuri","style":"position:relative;"},"children":[{"type":"text","value":"Siirtolaskuri"},{"type":"element","tagName":"a","properties":{"href":"#siirtolaskuri","ariaLabel":"siirtolaskuri permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Siirtolaskuri näyttää pelin ikkunan alalaidassa, montako siirtoa pelaaja on tehnyt tähän mennessä. Tämän avulla voi yrittää etsiä ratkaisua, jossa on mahdollisimman vähän siirtoja."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laskurin tekeminen vaatii joitakin muutoksia koodiin. Muutetaan ensin konstruktoria niin, että ikkunassa on tilaa laskurille ja käytettävissä on fontti tekstin piirtämistä varten:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"naytto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"display"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"set_mode"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nayton_leveys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nayton_korkeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fontti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"font"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"SysFont"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arial\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Siirtolaskuri nollataan pelin alussa ja jokainen siirto kasvattaa sitä yhdellä:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"uusi_peli"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"siirrot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"liiku"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" liike_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" liike_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"siirrot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisäksi näytön päivityksen yhteydessä näytetään siirtojen määrä laskurin avulla:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"piirra_naytto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"\n teksti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fontti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"render"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Siirrot: \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"siirrot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"255"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"teksti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"25"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"uusi-peli-ja-pelin-sulkeminen","style":"position:relative;"},"children":[{"type":"text","value":"Uusi peli ja pelin sulkeminen"},{"type":"element","tagName":"a","properties":{"href":"#uusi-peli-ja-pelin-sulkeminen","ariaLabel":"uusi peli ja pelin sulkeminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisätään peliin seuraavaksi näppäinkomennot, joiden avulla pelaaja voi aloittaa uuden pelin painamalla F2 sekä sulkea pelin painamalla Esc. Molemmat toiminnot on helppo toteuttaa:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tutki_tapahtumat"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_F2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"uusi_peli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tapahtuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"key "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"K_ESCAPE"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n exit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisäksi piirretään ikkunan alalaitaan pelaajalle tiedoksi, että pelissä on tällaiset toiminnot:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"piirra_naytto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"\n teksti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fontti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"render"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"F2 = uusi peli\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"255"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"teksti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"200"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n teksti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fontti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"render"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Esc = sulje peli\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"255"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"teksti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"400"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"pelin-lapaiseminen","style":"position:relative;"},"children":[{"type":"text","value":"Pelin läpäiseminen"},{"type":"element","tagName":"a","properties":{"href":"#pelin-lapaiseminen","ariaLabel":"pelin lapaiseminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelaaja läpäisee pelin, kun jokainen laatikko on jossain kohderuudussa. Tämä voidaan tarkastaa seuraavalla metodilla:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"peli_lapi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" y "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kartta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi käy läpi kaikki ruudut ja jos jossain ruudussa on luku 2 (tyhjä kohderuutu) tai 6 (robotti kohderuudussa), peli ei ole vielä läpäisty ja metodi palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":". Jos mitään tällaista ruutua ei ole ruudukossa, peli kuitenkin on läpäisty ja metodi palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos pelaaja läpäisee pelin, metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"piirra_naytto"}]},{"type":"text","value":" näyttää asiaan kuuluvan viestin:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"piirra_naytto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"peli_lapi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n teksti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fontti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"render"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Onnittelut, läpäisit pelin!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"255"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n teksti_x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" teksti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_width"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n teksti_y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"skaala "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" teksti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_height"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n pygame"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"draw"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rect"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"teksti_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" teksti_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" teksti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_width"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" teksti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"get_height"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"naytto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"blit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"teksti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"teksti_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" teksti_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisäksi metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"liiku"}]},{"type":"text","value":" alkua muutetaan niin, että liikkuminen ei ole enää mahdollista, kun pelaaja on läpäissyt pelin:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"liiku"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" liike_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" liike_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"peli_lapi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tilanteessa kuitenkin pelaaja näkee edelleen ruudukon ja lopullisen pelitilanteen."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"vinkki-testauksen","style":"position:relative;"},"children":[{"type":"text","value":"Vinkki testauksen"},{"type":"element","tagName":"a","properties":{"href":"#vinkki-testauksen","ariaLabel":"vinkki testauksen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelin kehityksen aikana tulee helposti tarve tarkastaa, mitä tapahtuu jossain vaiheessa myöhemmin pelissä. Esimerkiksi tässä pelissä tällainen tapahtuma on pelin läpäiseminen ja siitä tuleva ilmoitus."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tällaisen tapahtuman testaaminen voi olla hankalaa, jos esimerkiksi pitää aina läpäistä koko peli ennen kuin tapahtuman näkee. Kuitenkin pelin ohjelmoija voi helposti tehdä koodiin väliaikaisia muutoksia, jotka helpottavat testausta. Esimerkiksi pelin läpäisyä voi testata muuttamalla koodia näin:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"peli_lapi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt metodi palauttaa aina "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":" eli peli on läpäisty heti pelin alkaessa. Tämän avulla voi mukavasti varmistaa, että pelin lopussa tuleva ilmoitus näyttää oikealta eikä pelaaja pysty enää siirtymään ruudukossa. Sitten kun pelin päättyminen toimii oikein, metodin voi jälleen palauttaa ennalleen."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"peli-githubiin","style":"position:relative;"},"children":[{"type":"text","value":"Peli GitHubiin"},{"type":"element","tagName":"a","properties":{"href":"#peli-githubiin","ariaLabel":"peli githubiin permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Peli on nyt valmis ja voit hakea pelin lopullisen koodin ja kuvat GitHubista:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://github.com/moocfi/sokoban","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"https://github.com/moocfi/sokoban"}]}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"GitHub on hyvä paikka omille ohjelmointiprojekteille: sen avulla projektin koodin ja muut tiedostot saa talteen Git-versionhallintaan ja projektin pystyy helposti jakamaan muille. GitHubia käytetään paljon myöhemmillä tietojenkäsittelytieteen kursseilla."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"montako-siirtoa-tarvitaan","style":"position:relative;"},"children":[{"type":"text","value":"Montako siirtoa tarvitaan?"},{"type":"element","tagName":"a","properties":{"href":"#montako-siirtoa-tarvitaan","ariaLabel":"montako siirtoa tarvitaan permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaikka pelin ruudukko on melko pieni, peli ei ole helppo. Ensimmäinen haaste on onnistua läpäisemään peli, ja sen jälkeen haasteena on keksiä ratkaisu, jossa siirtojen määrä on mahdollisimman pieni. Kuinka lyhyen ratkaisun onnistut muodostamaan?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lyhimmän mahdollisen ratkaisun etsiminen käsin on hyvin vaikeaa, mutta tässäkin voi käyttää apuna ohjelmointia. Kurssilla "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Tietorakenteet ja algoritmit"}]},{"type":"text","value":" tutustutaan tekniikoihin, joiden avulla voidaan löytää automaattisesti lyhin mahdollinen ratkaisu peliin."}]}],"data":{"quirksMode":false}},"html":"

Peli on jo hyvässä vaiheessa, joten nyt voimme alkaa viimeistellä pelin toteutusta. Lisäämme peliin laskurin, joka näyttää siirtojen määrän, mahdollisuuden aloittaa uusi peli ja sulkea peli näppäinkomennoilla sekä ilmoituksen, kun pelaaja onnistuu läpäisemään pelin.

\n

Siirtolaskuri

\n

Siirtolaskuri näyttää pelin ikkunan alalaidassa, montako siirtoa pelaaja on tehnyt tähän mennessä. Tämän avulla voi yrittää etsiä ratkaisua, jossa on mahdollisimman vähän siirtoja.

\n

Laskurin tekeminen vaatii joitakin muutoksia koodiin. Muutetaan ensin konstruktoria niin, että ikkunassa on tilaa laskurille ja käytettävissä on fontti tekstin piirtämistä varten:

\n
    def __init__(self):\n        ...\n        self.naytto = pygame.display.set_mode((nayton_leveys, nayton_korkeus + self.skaala))\n\n        self.fontti = pygame.font.SysFont(\"Arial\", 24)\n        ...
\n

Siirtolaskuri nollataan pelin alussa ja jokainen siirto kasvattaa sitä yhdellä:

\n
    def uusi_peli(self):\n        ...\n        self.siirrot = 0
\n
    def liiku(self, liike_y, liike_x):\n        ...\n        self.siirrot += 1\n
\n

Lisäksi näytön päivityksen yhteydessä näytetään siirtojen määrä laskurin avulla:

\n
    def piirra_naytto(self):\n        ...\n        teksti = self.fontti.render(\"Siirrot: \" + str(self.siirrot), True, (255, 0, 0))\n        self.naytto.blit(teksti, (25, self.korkeus * self.skaala + 10))\n        ...
\n

Uusi peli ja pelin sulkeminen

\n

Lisätään peliin seuraavaksi näppäinkomennot, joiden avulla pelaaja voi aloittaa uuden pelin painamalla F2 sekä sulkea pelin painamalla Esc. Molemmat toiminnot on helppo toteuttaa:

\n
    def tutki_tapahtumat(self):\n        ...\n                if tapahtuma.key == pygame.K_F2:\n                    self.uusi_peli()\n                if tapahtuma.key == pygame.K_ESCAPE:\n                    exit()\n        ...
\n

Lisäksi piirretään ikkunan alalaitaan pelaajalle tiedoksi, että pelissä on tällaiset toiminnot:

\n
    def piirra_naytto(self):\n        ...\n        teksti = self.fontti.render(\"F2 = uusi peli\", True, (255, 0, 0))\n        self.naytto.blit(teksti, (200, self.korkeus * self.skaala + 10))\n\n        teksti = self.fontti.render(\"Esc = sulje peli\", True, (255, 0, 0))\n        self.naytto.blit(teksti, (400, self.korkeus * self.skaala + 10))\n        ...
\n

Pelin läpäiseminen

\n

Pelaaja läpäisee pelin, kun jokainen laatikko on jossain kohderuudussa. Tämä voidaan tarkastaa seuraavalla metodilla:

\n
    def peli_lapi(self):\n        for y in range(self.korkeus):\n            for x in range(self.leveys):\n                if self.kartta[y][x] in [2, 6]:\n                    return False\n        return True
\n

Metodi käy läpi kaikki ruudut ja jos jossain ruudussa on luku 2 (tyhjä kohderuutu) tai 6 (robotti kohderuudussa), peli ei ole vielä läpäisty ja metodi palauttaa False. Jos mitään tällaista ruutua ei ole ruudukossa, peli kuitenkin on läpäisty ja metodi palauttaa True.

\n

Jos pelaaja läpäisee pelin, metodi piirra_naytto näyttää asiaan kuuluvan viestin:

\n
    def piirra_naytto(self):\n        ...\n        if self.peli_lapi():\n            teksti = self.fontti.render(\"Onnittelut, läpäisit pelin!\", True, (255, 0, 0))\n            teksti_x = self.skaala * self.leveys / 2 - teksti.get_width() / 2\n            teksti_y = self.skaala * self.korkeus / 2 - teksti.get_height() / 2\n            pygame.draw.rect(self.naytto, (0, 0, 0), (teksti_x, teksti_y, teksti.get_width(), teksti.get_height()))\n            self.naytto.blit(teksti, (teksti_x, teksti_y))\n        ...
\n

Lisäksi metodin liiku alkua muutetaan niin, että liikkuminen ei ole enää mahdollista, kun pelaaja on läpäissyt pelin:

\n
    def liiku(self, liike_y, liike_x):\n        if self.peli_lapi():\n            return\n        ...
\n

Tässä tilanteessa kuitenkin pelaaja näkee edelleen ruudukon ja lopullisen pelitilanteen.

\n

Vinkki testauksen

\n

Pelin kehityksen aikana tulee helposti tarve tarkastaa, mitä tapahtuu jossain vaiheessa myöhemmin pelissä. Esimerkiksi tässä pelissä tällainen tapahtuma on pelin läpäiseminen ja siitä tuleva ilmoitus.

\n

Tällaisen tapahtuman testaaminen voi olla hankalaa, jos esimerkiksi pitää aina läpäistä koko peli ennen kuin tapahtuman näkee. Kuitenkin pelin ohjelmoija voi helposti tehdä koodiin väliaikaisia muutoksia, jotka helpottavat testausta. Esimerkiksi pelin läpäisyä voi testata muuttamalla koodia näin:

\n
    def peli_lapi(self):\n        return True
\n

Nyt metodi palauttaa aina True eli peli on läpäisty heti pelin alkaessa. Tämän avulla voi mukavasti varmistaa, että pelin lopussa tuleva ilmoitus näyttää oikealta eikä pelaaja pysty enää siirtymään ruudukossa. Sitten kun pelin päättyminen toimii oikein, metodin voi jälleen palauttaa ennalleen.

\n

Peli GitHubiin

\n

Peli on nyt valmis ja voit hakea pelin lopullisen koodin ja kuvat GitHubista:

\n\n

GitHub on hyvä paikka omille ohjelmointiprojekteille: sen avulla projektin koodin ja muut tiedostot saa talteen Git-versionhallintaan ja projektin pystyy helposti jakamaan muille. GitHubia käytetään paljon myöhemmillä tietojenkäsittelytieteen kursseilla.

\n

Montako siirtoa tarvitaan?

\n

Vaikka pelin ruudukko on melko pieni, peli ei ole helppo. Ensimmäinen haaste on onnistua läpäisemään peli, ja sen jälkeen haasteena on keksiä ratkaisu, jossa siirtojen määrä on mahdollisimman pieni. Kuinka lyhyen ratkaisun onnistut muodostamaan?

\n

Lyhimmän mahdollisen ratkaisun etsiminen käsin on hyvin vaikeaa, mutta tässäkin voi käyttää apuna ohjelmointia. Kurssilla Tietorakenteet ja algoritmit tutustutaan tekniikoihin, joiden avulla voidaan löytää automaattisesti lyhin mahdollinen ratkaisu peliin.

","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-14/3-pelin-viimeistely.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-14/4-oma-peli/page-data.json b/page-data/osa-14/4-oma-peli/page-data.json index 09eb02dc7..02bc8c8cf 100644 --- a/page-data/osa-14/4-oma-peli/page-data.json +++ b/page-data/osa-14/4-oma-peli/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-14/4-oma-peli", - "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"h2","properties":{"id":"viikon-tehtava","style":"position:relative;"},"children":[{"type":"text","value":"Viikon tehtävä"},{"type":"element","tagName":"a","properties":{"href":"#viikon-tehtava","ariaLabel":"viikon tehtava permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän viikon tehtäväsi on tehdä oma pieni peli Pygamen avulla. Peliä varten tehtäväpohjassa on joukko kuvia, joita voit käyttää pelissä. Älä käytä muita kuvia, jotta muutkin pystyvät kokeilemaan peliä koodin perusteella."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Saat päättää pelin aiheen itse, ja pelin tulisi olla suunnilleen saman laajuinen kuin tämän viikon esimerkki. Pelin tulisi noudattaa seuraavia vaatimuksia:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Pelissä on hahmo, jota pelaaja pystyy liikuttamaan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Pelissä on kerättäviä asioita ja/tai vihollisia"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Pelaajalla on jokin selkeä tavoite"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Pelissä on laskuri, joka näyttää, miten pelaaminen sujuu"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Pelin koodi on jaettu sopivasti funktioihin tämän viikon esimerkin tyylisesti"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun peli on valmis, lähetä se vertaisarviointiin alla olevan lomakkeen avulla. Tämän jälkeen tutustu vielä kahden muun kurssilaisen peliin ja anna niille mielestäsi sopiva arvosana ja kirjoita lyhyt arvio peleistä. Ota arvioinnissa huomioon sekä pelin kiinnostavuus ja pelattavuus että koodin selkeys."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"pelin-lahettaminen","style":"position:relative;"},"children":[{"type":"text","value":"Pelin lähettäminen"},{"type":"element","tagName":"a","properties":{"href":"#pelin-lahettaminen","ariaLabel":"pelin lahettaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelin lähetys onnistuu lähettämällä oma ohjelmakoodi TMC Paste -ominaisuuden avulla palvelimelle ja liittämällä linkki palautuslomakkeeseen."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Klikkaa ensin TMC-painiketta (silmän oikealla puolella oleva painike). Tämä avaa valikon, josta löydät oikean ominaisuuden kirjoittamalla hakukenttään sanan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"send"}]},{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 626px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/6bf3f5cce371044c253dc34c755ee566/af590/tmc_paste_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 10.869565217391305%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAIAAADXZGvcAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAWElEQVQI12PQsfGwDYy38o208Aw1tPcwsHM3tPcwtPfQtXbVwY307b2U1bUZhHXs+c1D+I19hY09lUwc5Y0c5IzslUwdhTUt+NXMBNSxIEF1M1lDeylFNQBUlRfSchJdXQAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/6bf3f5cce371044c253dc34c755ee566/a0b58/tmc_paste_1.webp 230w","/static/6bf3f5cce371044c253dc34c755ee566/bc10c/tmc_paste_1.webp 460w","/static/6bf3f5cce371044c253dc34c755ee566/63b03/tmc_paste_1.webp 626w"],"sizes":"(max-width: 626px) 100vw, 626px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/6bf3f5cce371044c253dc34c755ee566/81c8e/tmc_paste_1.png 230w","/static/6bf3f5cce371044c253dc34c755ee566/08a84/tmc_paste_1.png 460w","/static/6bf3f5cce371044c253dc34c755ee566/af590/tmc_paste_1.png 626w"],"sizes":"(max-width: 626px) 100vw, 626px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/6bf3f5cce371044c253dc34c755ee566/af590/tmc_paste_1.png","alt":"tmc paste 1","title":"tmc paste 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun klikkaat valintaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Send Exercise to TMC Paste"}]},{"type":"text","value":", ruudun oikeaan alakulmaan putkahtaa tieto siitä, että ohjelmakoodi on lähetetty palvelimelle:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 463px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/8513d666220a4b7cb4b0fe987d121287/71ce0/tmc_paste_2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 26.521739130434778%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAA40lEQVQY02XKW3KEIBQEUPeRivLwKggCFy4wTh46TrKG/GQXs4asJFloasxnuk519Uc3nQ7KZevROJwOxidQpuXQyaGTYyugFcMBWK8Y6NGiDcTU3HAdqb68v+2X7bK9btu6Xvf96bxEjBHRe59SSjGlRJnIGtML7t1cIvbaNm0/aqVjooDR++BcQIz3Zy6ZckqZ8rFLrfXkneMTMkPdFDuNDUzhVAgxLsu5llJzrqVmIgAQQkgppRBS/EUKxvjnl7392Nv3w/rRtDCBsr0yoCzo+eg7Mej/eK9YeOb5yml/NPkXc5s2qFqAD9IAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8513d666220a4b7cb4b0fe987d121287/a0b58/tmc_paste_2.webp 230w","/static/8513d666220a4b7cb4b0fe987d121287/bc10c/tmc_paste_2.webp 460w","/static/8513d666220a4b7cb4b0fe987d121287/a7d21/tmc_paste_2.webp 463w"],"sizes":"(max-width: 463px) 100vw, 463px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8513d666220a4b7cb4b0fe987d121287/81c8e/tmc_paste_2.png 230w","/static/8513d666220a4b7cb4b0fe987d121287/08a84/tmc_paste_2.png 460w","/static/8513d666220a4b7cb4b0fe987d121287/71ce0/tmc_paste_2.png 463w"],"sizes":"(max-width: 463px) 100vw, 463px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/8513d666220a4b7cb4b0fe987d121287/71ce0/tmc_paste_2.png","alt":"tmc paste 2","title":"tmc paste 2","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Saat linkin kopioitua leikepöydälle klikkaamalla painiketta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Open URL"}]},{"type":"text","value":" ja valitsemalla aukeavasta ikkunasta valihtoehdon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Copy"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 463px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/9de4d62e51a1cf0025cc5500310d1edf/71ce0/tmc_paste_3.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 31.304347826086953%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABHUlEQVQY002Ly07CQBhG+8A+lQuXunGLISyUpAO4oUiAkrbQmfnn2s6FztRSA4nRLydfchYnqfKdrMsiP56KgjE2fMcYuj6GGG//j7v2IYbOex9jnEwmyWwLT0vpXFBtZ1zUJjY2qjYY17e2b13f2Nje6LUJXHXG9dfrMI5jmqbJ4/z88HLyPhDhhL5Q6YV2VFiuPIaWcINpQ7ipaUOFxdy1NgzDb+ycG8fRaCk5tEoqKSRnQIngjAGVQmgpgBJSny8XP973FzPGStBZXu8qWhDJOQcApZSUEgA4F0prxhgAUABCCMaYEGKtnU6nCRD8ecDPb+nrbJluq2N+QAiVZVmVxQItsmyDMc7W6/n7x2q5WiCEUoTSdLP52u/3P8PDR9k+xN7gAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/9de4d62e51a1cf0025cc5500310d1edf/a0b58/tmc_paste_3.webp 230w","/static/9de4d62e51a1cf0025cc5500310d1edf/bc10c/tmc_paste_3.webp 460w","/static/9de4d62e51a1cf0025cc5500310d1edf/a7d21/tmc_paste_3.webp 463w"],"sizes":"(max-width: 463px) 100vw, 463px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/9de4d62e51a1cf0025cc5500310d1edf/81c8e/tmc_paste_3.png 230w","/static/9de4d62e51a1cf0025cc5500310d1edf/08a84/tmc_paste_3.png 460w","/static/9de4d62e51a1cf0025cc5500310d1edf/71ce0/tmc_paste_3.png 463w"],"sizes":"(max-width: 463px) 100vw, 463px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/9de4d62e51a1cf0025cc5500310d1edf/71ce0/tmc_paste_3.png","alt":"tmc paste 3","title":"tmc paste 3","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä linkki sinun tulee liittää palautuslomakkeeseen."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"osan-14-arvioinnista","style":"position:relative;"},"children":[{"type":"text","value":"Osan 14 arvioinnista"},{"type":"element","tagName":"a","properties":{"href":"#osan-14-arvioinnista","ariaLabel":"osan 14 arvioinnista permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän viikon tavoitteena on saada aikaan toimiva peli. Koska osassa on vain yksi tehtävä, "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"myös yritys hyväksytään"}]},{"type":"text","value":". Voit siis palauttaa pelisi vaikka se ei toimisikaan haluamallasi tavalla."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos et saa peliä toimimaan, kirjoita ohjelmakoodin kommentteihin miten pelin (tai jonkin puuttuvan ominaisuuden) olisi tarkoitus toimia."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun arvioit (osittain tai kokonaan) toimimatonta peliä, pyri arviossasi mahdollisuuksien mukaan kertomaan mitä pelin valmiiksi saaminen olisi mielestäsi vaatinut."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"peli-ideoita","style":"position:relative;"},"children":[{"type":"text","value":"Peli-ideoita"},{"type":"element","tagName":"a","properties":{"href":"#peli-ideoita","ariaLabel":"peli ideoita permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit valita pelin aiheen vapaasti mutta tässä on joitakin ideoita. Pelin tekemisessä on hyötyä myös viikon 13 materiaalista."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"kerailypeli","style":"position:relative;"},"children":[{"type":"text","value":"Keräilypeli"},{"type":"element","tagName":"a","properties":{"href":"#kerailypeli","ariaLabel":"kerailypeli permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Pelaaja liikuttaa robottia nuolinäppäimillä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ruudulla on kolikko, joka robotin tulee kerätä. Kun robotti saa kolikon, se siirtyy uuteen paikkaan."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ruudulla liikkuu myös hirviöitä, joita robotin tulee väistellä."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"rahasade","style":"position:relative;"},"children":[{"type":"text","value":"Rahasade"},{"type":"element","tagName":"a","properties":{"href":"#rahasade","ariaLabel":"rahasade permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ruudun alareunassa on robotti, jota pelaaja voi liikuttaa vasemmalle tai oikealle"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Taivaalta sataa rahaa, jota robotin tulee kerätä."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Taivaalta sataa myös hirviöitä, joita robotin tulee väistellä."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"vertaisarviointi","style":"position:relative;"},"children":[{"type":"text","value":"Vertaisarviointi"},{"type":"element","tagName":"a","properties":{"href":"#vertaisarviointi","ariaLabel":"vertaisarviointi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Arvioi peliä esimerkiksi seuraavien kriteerien mukaan:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Miltä peli näyttää?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Onko peli "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"pelattava"}]},{"type":"text","value":", ts. onko sen pelaaminen hauskaa ja sujuvaa?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Onko peli-idea kiinnostava?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Miten hyvin peliohjelma on kirjoitettu? Onko pelissä hyödynnetty tarvittavissa kohdin järkevästi funktioita ja luokkia?"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hyvään arvioon kuuluu yleensä se, että löydät ohjelmasta sekä hyviä puolia että jotain kehitettävää."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"loppukysely","style":"position:relative;"},"children":[{"type":"text","value":"Loppukysely"},{"type":"element","tagName":"a","properties":{"href":"#loppukysely","ariaLabel":"loppukysely permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa ensin osion loppukyselyyn..."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"...ja sitten vielä koko kurssin loppukyselyyn:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96"},"children":[]}]}],"data":{"quirksMode":false}},"html":"

Viikon tehtävä

\n

Tämän viikon tehtäväsi on tehdä oma pieni peli Pygamen avulla. Peliä varten tehtäväpohjassa on joukko kuvia, joita voit käyttää pelissä. Älä käytä muita kuvia, jotta muutkin pystyvät kokeilemaan peliä koodin perusteella.

\n

Saat päättää pelin aiheen itse, ja pelin tulisi olla suunnilleen saman laajuinen kuin tämän viikon esimerkki. Pelin tulisi noudattaa seuraavia vaatimuksia:

\n
    \n
  • Pelissä on hahmo, jota pelaaja pystyy liikuttamaan
  • \n
  • Pelissä on kerättäviä asioita ja/tai vihollisia
  • \n
  • Pelaajalla on jokin selkeä tavoite
  • \n
  • Pelissä on laskuri, joka näyttää, miten pelaaminen sujuu
  • \n
  • Pelin koodi on jaettu sopivasti funktioihin tämän viikon esimerkin tyylisesti
  • \n
\n

Kun peli on valmis, lähetä se vertaisarviointiin alla olevan lomakkeen avulla. Tämän jälkeen tutustu vielä kahden muun kurssilaisen peliin ja anna niille mielestäsi sopiva arvosana ja kirjoita lyhyt arvio peleistä. Ota arvioinnissa huomioon sekä pelin kiinnostavuus ja pelattavuus että koodin selkeys.

\n

Pelin lähettäminen

\n

Pelin lähetys onnistuu lähettämällä oma ohjelmakoodi TMC Paste -ominaisuuden avulla palvelimelle ja liittämällä linkki palautuslomakkeeseen.

\n

Klikkaa ensin TMC-painiketta (silmän oikealla puolella oleva painike). Tämä avaa valikon, josta löydät oikean ominaisuuden kirjoittamalla hakukenttään sanan send:

\n\n \n \n \n \n \n \"tmc\n \n \n \n

Kun klikkaat valintaa Send Exercise to TMC Paste, ruudun oikeaan alakulmaan putkahtaa tieto siitä, että ohjelmakoodi on lähetetty palvelimelle:

\n\n \n \n \n \n \n \"tmc\n \n \n \n

Tämä linkki sinun tulee liittää palautuslomakkeeseen.

\n

Osan 14 arvioinnista

\n

Tämän viikon tavoitteena on saada aikaan toimiva peli. Koska osassa on vain yksi tehtävä, myös yritys hyväksytään. Voit siis palauttaa pelisi vaikka se ei toimisikaan haluamallasi tavalla.

\n

Jos et saa peliä toimimaan, kirjoita ohjelmakoodin kommentteihin miten pelin (tai jonkin puuttuvan ominaisuuden) olisi tarkoitus toimia.

\n

Kun arvioit (osittain tai kokonaan) toimimatonta peliä, pyri arviossasi mahdollisuuksien mukaan kertomaan mitä pelin valmiiksi saaminen olisi mielestäsi vaatinut.

\n

Peli-ideoita

\n

Voit valita pelin aiheen vapaasti mutta tässä on joitakin ideoita. Pelin tekemisessä on hyötyä myös viikon 13 materiaalista.

\n

Keräilypeli

\n
    \n
  • Pelaaja liikuttaa robottia nuolinäppäimillä
  • \n
  • Ruudulla on kolikko, joka robotin tulee kerätä. Kun robotti saa kolikon, se siirtyy uuteen paikkaan.
  • \n
  • Ruudulla liikkuu myös hirviöitä, joita robotin tulee väistellä.
  • \n
\n

Rahasade

\n
    \n
  • Ruudun alareunassa on robotti, jota pelaaja voi liikuttaa vasemmalle tai oikealle
  • \n
  • Taivaalta sataa rahaa, jota robotin tulee kerätä.
  • \n
  • Taivaalta sataa myös hirviöitä, joita robotin tulee väistellä.
  • \n
\n

Vertaisarviointi

\n

Arvioi peliä esimerkiksi seuraavien kriteerien mukaan:

\n
    \n
  • Miltä peli näyttää?
  • \n
  • Onko peli pelattava, ts. onko sen pelaaminen hauskaa ja sujuvaa?
  • \n
  • Onko peli-idea kiinnostava?
  • \n
  • Miten hyvin peliohjelma on kirjoitettu? Onko pelissä hyödynnetty tarvittavissa kohdin järkevästi funktioita ja luokkia?
  • \n
\n

Hyvään arvioon kuuluu yleensä se, että löydät ohjelmasta sekä hyviä puolia että jotain kehitettävää.

\n
\n

Loppukysely

\n

Vastaa ensin osion loppukyselyyn...

\n
\n

...ja sitten vielä koko kurssin loppukyselyyn:

\n
","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-14/4-oma-peli.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"h2","properties":{"id":"viikon-tehtava","style":"position:relative;"},"children":[{"type":"text","value":"Viikon tehtävä"},{"type":"element","tagName":"a","properties":{"href":"#viikon-tehtava","ariaLabel":"viikon tehtava permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän viikon tehtäväsi on tehdä oma pieni peli Pygamen avulla. Peliä varten tehtäväpohjassa on joukko kuvia, joita voit käyttää pelissä. Älä käytä muita kuvia, jotta muutkin pystyvät kokeilemaan peliä koodin perusteella."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Saat päättää pelin aiheen itse, ja pelin tulisi olla suunnilleen saman laajuinen kuin tämän viikon esimerkki. Pelin tulisi noudattaa seuraavia vaatimuksia:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Pelissä on hahmo, jota pelaaja pystyy liikuttamaan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Pelissä on kerättäviä asioita ja/tai vihollisia"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Pelaajalla on jokin selkeä tavoite"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Pelissä on laskuri, joka näyttää, miten pelaaminen sujuu"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Pelin koodi on jaettu sopivasti funktioihin tämän viikon esimerkin tyylisesti"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun peli on valmis, lähetä se vertaisarviointiin alla olevan lomakkeen avulla. Tämän jälkeen tutustu vielä kahden muun kurssilaisen peliin ja anna niille mielestäsi sopiva arvosana ja kirjoita lyhyt arvio peleistä. Ota arvioinnissa huomioon sekä pelin kiinnostavuus ja pelattavuus että koodin selkeys."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"pelin-lahettaminen","style":"position:relative;"},"children":[{"type":"text","value":"Pelin lähettäminen"},{"type":"element","tagName":"a","properties":{"href":"#pelin-lahettaminen","ariaLabel":"pelin lahettaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelin lähetys onnistuu lähettämällä oma ohjelmakoodi TMC Paste -ominaisuuden avulla palvelimelle ja liittämällä linkki palautuslomakkeeseen."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Klikkaa ensin TMC-painiketta (silmän oikealla puolella oleva painike). Tämä avaa valikon, josta löydät oikean ominaisuuden kirjoittamalla hakukenttään sanan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"send"}]},{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 626px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/6bf3f5cce371044c253dc34c755ee566/af590/tmc_paste_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 10.869565217391305%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAIAAADXZGvcAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAWElEQVQI12PQsfGwDYy38o208Aw1tPcwsHM3tPcwtPfQtXbVwY307b2U1bUZhHXs+c1D+I19hY09lUwc5Y0c5IzslUwdhTUt+NXMBNSxIEF1M1lDeylFNQBUlRfSchJdXQAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/6bf3f5cce371044c253dc34c755ee566/a0b58/tmc_paste_1.webp 230w","/static/6bf3f5cce371044c253dc34c755ee566/bc10c/tmc_paste_1.webp 460w","/static/6bf3f5cce371044c253dc34c755ee566/63b03/tmc_paste_1.webp 626w"],"sizes":"(max-width: 626px) 100vw, 626px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/6bf3f5cce371044c253dc34c755ee566/81c8e/tmc_paste_1.png 230w","/static/6bf3f5cce371044c253dc34c755ee566/08a84/tmc_paste_1.png 460w","/static/6bf3f5cce371044c253dc34c755ee566/af590/tmc_paste_1.png 626w"],"sizes":"(max-width: 626px) 100vw, 626px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/6bf3f5cce371044c253dc34c755ee566/af590/tmc_paste_1.png","alt":"tmc paste 1","title":"tmc paste 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun klikkaat valintaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Send Exercise to TMC Paste"}]},{"type":"text","value":", ruudun oikeaan alakulmaan putkahtaa tieto siitä, että ohjelmakoodi on lähetetty palvelimelle:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 463px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/8513d666220a4b7cb4b0fe987d121287/71ce0/tmc_paste_2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 26.521739130434778%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAA40lEQVQY02XKW3KEIBQEUPeRivLwKggCFy4wTh46TrKG/GQXs4asJFloasxnuk519Uc3nQ7KZevROJwOxidQpuXQyaGTYyugFcMBWK8Y6NGiDcTU3HAdqb68v+2X7bK9btu6Xvf96bxEjBHRe59SSjGlRJnIGtML7t1cIvbaNm0/aqVjooDR++BcQIz3Zy6ZckqZ8rFLrfXkneMTMkPdFDuNDUzhVAgxLsu5llJzrqVmIgAQQkgppRBS/EUKxvjnl7392Nv3w/rRtDCBsr0yoCzo+eg7Mej/eK9YeOb5yml/NPkXc5s2qFqAD9IAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8513d666220a4b7cb4b0fe987d121287/a0b58/tmc_paste_2.webp 230w","/static/8513d666220a4b7cb4b0fe987d121287/bc10c/tmc_paste_2.webp 460w","/static/8513d666220a4b7cb4b0fe987d121287/a7d21/tmc_paste_2.webp 463w"],"sizes":"(max-width: 463px) 100vw, 463px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8513d666220a4b7cb4b0fe987d121287/81c8e/tmc_paste_2.png 230w","/static/8513d666220a4b7cb4b0fe987d121287/08a84/tmc_paste_2.png 460w","/static/8513d666220a4b7cb4b0fe987d121287/71ce0/tmc_paste_2.png 463w"],"sizes":"(max-width: 463px) 100vw, 463px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/8513d666220a4b7cb4b0fe987d121287/71ce0/tmc_paste_2.png","alt":"tmc paste 2","title":"tmc paste 2","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Saat linkin kopioitua leikepöydälle klikkaamalla painiketta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Open URL"}]},{"type":"text","value":" ja valitsemalla aukeavasta ikkunasta valihtoehdon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Copy"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 463px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/9de4d62e51a1cf0025cc5500310d1edf/71ce0/tmc_paste_3.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 31.304347826086953%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABHUlEQVQY002Ly07CQBhG+8A+lQuXunGLISyUpAO4oUiAkrbQmfnn2s6FztRSA4nRLydfchYnqfKdrMsiP56KgjE2fMcYuj6GGG//j7v2IYbOex9jnEwmyWwLT0vpXFBtZ1zUJjY2qjYY17e2b13f2Nje6LUJXHXG9dfrMI5jmqbJ4/z88HLyPhDhhL5Q6YV2VFiuPIaWcINpQ7ipaUOFxdy1NgzDb+ycG8fRaCk5tEoqKSRnQIngjAGVQmgpgBJSny8XP973FzPGStBZXu8qWhDJOQcApZSUEgA4F0prxhgAUABCCMaYEGKtnU6nCRD8ecDPb+nrbJluq2N+QAiVZVmVxQItsmyDMc7W6/n7x2q5WiCEUoTSdLP52u/3P8PDR9k+xN7gAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/9de4d62e51a1cf0025cc5500310d1edf/a0b58/tmc_paste_3.webp 230w","/static/9de4d62e51a1cf0025cc5500310d1edf/bc10c/tmc_paste_3.webp 460w","/static/9de4d62e51a1cf0025cc5500310d1edf/a7d21/tmc_paste_3.webp 463w"],"sizes":"(max-width: 463px) 100vw, 463px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/9de4d62e51a1cf0025cc5500310d1edf/81c8e/tmc_paste_3.png 230w","/static/9de4d62e51a1cf0025cc5500310d1edf/08a84/tmc_paste_3.png 460w","/static/9de4d62e51a1cf0025cc5500310d1edf/71ce0/tmc_paste_3.png 463w"],"sizes":"(max-width: 463px) 100vw, 463px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/9de4d62e51a1cf0025cc5500310d1edf/71ce0/tmc_paste_3.png","alt":"tmc paste 3","title":"tmc paste 3","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä linkki sinun tulee liittää palautuslomakkeeseen."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"osan-14-arvioinnista","style":"position:relative;"},"children":[{"type":"text","value":"Osan 14 arvioinnista"},{"type":"element","tagName":"a","properties":{"href":"#osan-14-arvioinnista","ariaLabel":"osan 14 arvioinnista permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän viikon tavoitteena on saada aikaan toimiva peli. Koska osassa on vain yksi tehtävä, "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"myös yritys hyväksytään"}]},{"type":"text","value":". Voit siis palauttaa pelisi vaikka se ei toimisikaan haluamallasi tavalla."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos et saa peliä toimimaan, kirjoita ohjelmakoodin kommentteihin miten pelin (tai jonkin puuttuvan ominaisuuden) olisi tarkoitus toimia."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun arvioit (osittain tai kokonaan) toimimatonta peliä, pyri arviossasi mahdollisuuksien mukaan kertomaan mitä pelin valmiiksi saaminen olisi mielestäsi vaatinut."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"peli-ideoita","style":"position:relative;"},"children":[{"type":"text","value":"Peli-ideoita"},{"type":"element","tagName":"a","properties":{"href":"#peli-ideoita","ariaLabel":"peli ideoita permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit valita pelin aiheen vapaasti mutta tässä on joitakin ideoita. Pelin tekemisessä on hyötyä myös viikon 13 materiaalista."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"kerailypeli","style":"position:relative;"},"children":[{"type":"text","value":"Keräilypeli"},{"type":"element","tagName":"a","properties":{"href":"#kerailypeli","ariaLabel":"kerailypeli permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Pelaaja liikuttaa robottia nuolinäppäimillä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ruudulla on kolikko, joka robotin tulee kerätä. Kun robotti saa kolikon, se siirtyy uuteen paikkaan."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ruudulla liikkuu myös hirviöitä, joita robotin tulee väistellä."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"rahasade","style":"position:relative;"},"children":[{"type":"text","value":"Rahasade"},{"type":"element","tagName":"a","properties":{"href":"#rahasade","ariaLabel":"rahasade permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ruudun alareunassa on robotti, jota pelaaja voi liikuttaa vasemmalle tai oikealle"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Taivaalta sataa rahaa, jota robotin tulee kerätä."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Taivaalta sataa myös hirviöitä, joita robotin tulee väistellä."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"vertaisarviointi","style":"position:relative;"},"children":[{"type":"text","value":"Vertaisarviointi"},{"type":"element","tagName":"a","properties":{"href":"#vertaisarviointi","ariaLabel":"vertaisarviointi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Arvioi peliä esimerkiksi seuraavien kriteerien mukaan:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Miltä peli näyttää?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Onko peli "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"pelattava"}]},{"type":"text","value":", ts. onko sen pelaaminen hauskaa ja sujuvaa?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Onko peli-idea kiinnostava?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Miten hyvin peliohjelma on kirjoitettu? Onko pelissä hyödynnetty tarvittavissa kohdin järkevästi funktioita ja luokkia?"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hyvään arvioon kuuluu yleensä se, että löydät ohjelmasta sekä hyviä puolia että jotain kehitettävää."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"loppukysely","style":"position:relative;"},"children":[{"type":"text","value":"Loppukysely"},{"type":"element","tagName":"a","properties":{"href":"#loppukysely","ariaLabel":"loppukysely permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa ensin osion loppukyselyyn..."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"...ja sitten vielä koko kurssin loppukyselyyn:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96"},"children":[]}]}],"data":{"quirksMode":false}},"html":"

Viikon tehtävä

\n

Tämän viikon tehtäväsi on tehdä oma pieni peli Pygamen avulla. Peliä varten tehtäväpohjassa on joukko kuvia, joita voit käyttää pelissä. Älä käytä muita kuvia, jotta muutkin pystyvät kokeilemaan peliä koodin perusteella.

\n

Saat päättää pelin aiheen itse, ja pelin tulisi olla suunnilleen saman laajuinen kuin tämän viikon esimerkki. Pelin tulisi noudattaa seuraavia vaatimuksia:

\n
    \n
  • Pelissä on hahmo, jota pelaaja pystyy liikuttamaan
  • \n
  • Pelissä on kerättäviä asioita ja/tai vihollisia
  • \n
  • Pelaajalla on jokin selkeä tavoite
  • \n
  • Pelissä on laskuri, joka näyttää, miten pelaaminen sujuu
  • \n
  • Pelin koodi on jaettu sopivasti funktioihin tämän viikon esimerkin tyylisesti
  • \n
\n

Kun peli on valmis, lähetä se vertaisarviointiin alla olevan lomakkeen avulla. Tämän jälkeen tutustu vielä kahden muun kurssilaisen peliin ja anna niille mielestäsi sopiva arvosana ja kirjoita lyhyt arvio peleistä. Ota arvioinnissa huomioon sekä pelin kiinnostavuus ja pelattavuus että koodin selkeys.

\n

Pelin lähettäminen

\n

Pelin lähetys onnistuu lähettämällä oma ohjelmakoodi TMC Paste -ominaisuuden avulla palvelimelle ja liittämällä linkki palautuslomakkeeseen.

\n

Klikkaa ensin TMC-painiketta (silmän oikealla puolella oleva painike). Tämä avaa valikon, josta löydät oikean ominaisuuden kirjoittamalla hakukenttään sanan send:

\n\n \n \n \n \n \n \"tmc\n \n \n \n

Kun klikkaat valintaa Send Exercise to TMC Paste, ruudun oikeaan alakulmaan putkahtaa tieto siitä, että ohjelmakoodi on lähetetty palvelimelle:

\n\n \n \n \n \n \n \"tmc\n \n \n \n

Tämä linkki sinun tulee liittää palautuslomakkeeseen.

\n

Osan 14 arvioinnista

\n

Tämän viikon tavoitteena on saada aikaan toimiva peli. Koska osassa on vain yksi tehtävä, myös yritys hyväksytään. Voit siis palauttaa pelisi vaikka se ei toimisikaan haluamallasi tavalla.

\n

Jos et saa peliä toimimaan, kirjoita ohjelmakoodin kommentteihin miten pelin (tai jonkin puuttuvan ominaisuuden) olisi tarkoitus toimia.

\n

Kun arvioit (osittain tai kokonaan) toimimatonta peliä, pyri arviossasi mahdollisuuksien mukaan kertomaan mitä pelin valmiiksi saaminen olisi mielestäsi vaatinut.

\n

Peli-ideoita

\n

Voit valita pelin aiheen vapaasti mutta tässä on joitakin ideoita. Pelin tekemisessä on hyötyä myös viikon 13 materiaalista.

\n

Keräilypeli

\n
    \n
  • Pelaaja liikuttaa robottia nuolinäppäimillä
  • \n
  • Ruudulla on kolikko, joka robotin tulee kerätä. Kun robotti saa kolikon, se siirtyy uuteen paikkaan.
  • \n
  • Ruudulla liikkuu myös hirviöitä, joita robotin tulee väistellä.
  • \n
\n

Rahasade

\n
    \n
  • Ruudun alareunassa on robotti, jota pelaaja voi liikuttaa vasemmalle tai oikealle
  • \n
  • Taivaalta sataa rahaa, jota robotin tulee kerätä.
  • \n
  • Taivaalta sataa myös hirviöitä, joita robotin tulee väistellä.
  • \n
\n

Vertaisarviointi

\n

Arvioi peliä esimerkiksi seuraavien kriteerien mukaan:

\n
    \n
  • Miltä peli näyttää?
  • \n
  • Onko peli pelattava, ts. onko sen pelaaminen hauskaa ja sujuvaa?
  • \n
  • Onko peli-idea kiinnostava?
  • \n
  • Miten hyvin peliohjelma on kirjoitettu? Onko pelissä hyödynnetty tarvittavissa kohdin järkevästi funktioita ja luokkia?
  • \n
\n

Hyvään arvioon kuuluu yleensä se, että löydät ohjelmasta sekä hyviä puolia että jotain kehitettävää.

\n
\n

Loppukysely

\n

Vastaa ensin osion loppukyselyyn...

\n
\n

...ja sitten vielä koko kurssin loppukyselyyn:

\n
","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-14/4-oma-peli.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-14/page-data.json b/page-data/osa-14/page-data.json index ff87addaa..d05dc638d 100644 --- a/page-data/osa-14/page-data.json +++ b/page-data/osa-14/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-part-overview-template-js", "path": "/osa-14", - "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-14","title":"Osa 14"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-14/index.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-14","title":"Osa 14"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-14/index.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-2/1-ohjelmoinnin-termeja/page-data.json b/page-data/osa-2/1-ohjelmoinnin-termeja/page-data.json index c153d54e9..601bd2c77 100644 --- a/page-data/osa-2/1-ohjelmoinnin-termeja/page-data.json +++ b/page-data/osa-2/1-ohjelmoinnin-termeja/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-2/1-ohjelmoinnin-termeja", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tunnet keskeistä ohjelmoinnin termistöä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät lauseen ja lausekkeen eron"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat selvittää lausekkeen arvon tyypin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Opit etsimään virheitä debuggauksen avulla"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Emme vielä kurssin ensimmäisessä osassa kiinnittäneet kovin tarkasti huomiota ohjelmoinnin terminologiaan. Nyt on hyvä hetki tutustua joihinkin käsitteisiin."}]},{"type":"element","tagName":"h2","properties":{"id":"lause","style":"position:relative;"},"children":[{"type":"text","value":"Lause"},{"type":"element","tagName":"a","properties":{"href":"#lause","ariaLabel":"lause permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Lause"}]},{"type":"text","value":" (engl. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"statement"}]},{"type":"text","value":") tarkoittaa ohjelman osaa, joka suorittaa jonkin toiminnon. Usein lause viittaa yksittäiseen komentoon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print(\"Moi!\")"}]},{"type":"text","value":" on lause, joka tulostaa rivin tekstiä,\nja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku = 2"}]},{"type":"text","value":" on lause, joka asettaa muuttujalle arvon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lause voi olla myös monimutkaisempi, ja sen sisällä voi olla muita lauseita.\nEsimerkiksi seuraava ehtolause muodostuu kolmesta rivistä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tapauksessa ehtolauseen sisällä on kaksi lausetta."}]},{"type":"element","tagName":"h2","properties":{"id":"lohko","style":"position:relative;"},"children":[{"type":"text","value":"Lohko"},{"type":"element","tagName":"a","properties":{"href":"#lohko","ariaLabel":"lohko permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Lohko"}]},{"type":"text","value":" (engl. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"block"}]},{"type":"text","value":") on joukko peräkkäin sijoitettuja lauseita, jotka ovat samalla tasolla ohjelman rakenteessa. Esimerkiksi ehtolauseessa lohkossa ovat lauseet, jotka suoritetaan ehdon ollessa tosi."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"17"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ehtolauseessa oleva lohko alkaa"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olet täysi-ikäinen!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nyt vuoden vanhempi...\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# lohko loppuu"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tämä on eri lohkossa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa lohko ilmaistaan sisentämällä lohkon koodi eli lauseet samalle tasolle."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kannattaa huomata, että Python-ohjelman \"päälohkon\" on oltava sisennetty tiedoston vasempaan reunaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tämä ohjelma ei toimi sillä koodia ei ole sisennetty vasempaan reunaan"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hei maailma\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"huono ohjelma...\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"lauseke","style":"position:relative;"},"children":[{"type":"text","value":"Lauseke"},{"type":"element","tagName":"a","properties":{"href":"#lauseke","ariaLabel":"lauseke permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Lauseke"}]},{"type":"text","value":" (engl. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"expression"}]},{"type":"text","value":") on koodin osa, jolla on jokin tyyppi. Ohjelman suorituksen aikana lauseke saa arvon, jota voidaan käyttää ohjelmassa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan muutamaa esimerkkiä lausekkeista:"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{},"children":[{"type":"text","value":"Lauseke"}]},{"type":"element","tagName":"th","properties":{},"children":[{"type":"text","value":"Arvo"}]},{"type":"element","tagName":"th","properties":{},"children":[{"type":"text","value":"Tyyppi"}]},{"type":"element","tagName":"th","properties":{},"children":[{"type":"text","value":"Tyyppi Pythonissa"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"2 + 4 + 3"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"9"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"kokonaisluku"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"int"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"abc\" + \"de\""}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"abcde\""}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"merkkijono"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"str"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"11 / 2"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"5.5"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"liukuluku"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"float"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"2 * 5 > 9"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"totuusarvo"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"bool"}]}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska lausekkeella on arvo, voi sen sijoittaa muuttujaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muuttuja x saa arvoksi lausekkeen 1 + 2 arvon"}]},{"type":"text","value":"\nx "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yksinkertaisesta lausekkeesta saa muodostettua monimutkaisempia lausekkeita esim. laskuoperaattorien avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muuttuja y saa arvoksi lausekkeen '3 kertaa x plus x toiseen' arvon"}]},{"type":"text","value":"\ny "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"funktio","style":"position:relative;"},"children":[{"type":"text","value":"Funktio"},{"type":"element","tagName":"a","properties":{"href":"#funktio","ariaLabel":"funktio permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Funktio"}]},{"type":"text","value":" (engl. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"function"}]},{"type":"text","value":") suorittaa jonkin toiminnon. Funktiolla voi olla yksi tai useampi "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"parametri"}]},{"type":"text","value":" (engl. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"parameter"}]},{"type":"text","value":"), jotka ilmaisevat, mitä funktion tulee tehdä tarkalleen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio suoritetaan, kun sitä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kutsutaan"}]},{"type":"text","value":" eli koodissa on funktion nimi ja funktiolle annettavat parametrit suluissa. Esimerkiksi seuraava koodi kutsuu "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-funktiota parametrilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"tämä on parametri\""}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tämä on parametri\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Myös käyttäjältä syötteitä lukeva "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"input"}]},{"type":"text","value":" on funktio. Parametrina funktio saa käyttäjälle näytettävän viestin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kerro nimesi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tapauksessa funktio "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"palauttaa"}]},{"type":"text","value":" arvon, mikä tarkoittaa, että funktion kutsukohtaan ilmestyy arvo funktion suorituksen jälkeen. Funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"input"}]},{"type":"text","value":" palauttama arvo on käyttäjän syöttämä teksti merkkijonona. Funktion palauttama arvo sijoitetaan usein muuttujan arvoksi, jotta arvoa voidaan hyödyntää ohjelmassa."}]},{"type":"element","tagName":"h2","properties":{"id":"tyyppi","style":"position:relative;"},"children":[{"type":"text","value":"Tyyppi"},{"type":"element","tagName":"a","properties":{"href":"#tyyppi","ariaLabel":"tyyppi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Tyyppi"}]},{"type":"text","value":" (engl. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"type"}]},{"type":"text","value":") tarkoittaa, millainen jokin koodissa esiintyvä arvo on. Esimerkiksi seuraavassa koodissa muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":" tyyppi on merkkijono ja muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulos"}]},{"type":"text","value":" tyyppi on kokonaisluku:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna\""}]},{"type":"text","value":"\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" kertoo annetun lausekkeen tyypin. Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"syntaksi","style":"position:relative;"},"children":[{"type":"text","value":"Syntaksi"},{"type":"element","tagName":"a","properties":{"href":"#syntaksi","ariaLabel":"syntaksi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Syntaksi"}]},{"type":"text","value":" (engl. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"syntax"}]},{"type":"text","value":") määrittää, miten ohjelman koodi tulee kirjoittaa. Jokaisella ohjelmointikielellä on omanlainen syntaksinsa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi Python-kielen syntaksiin kuuluu, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":"-lauseen aloitusrivin lopussa on kaksoispiste ja ehtoon kuuluva koodi on sisennetty:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos ohjelmointikielen syntaksia ei noudateta, seurauksena on virheilmoitus:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":" File \"testi.py\", line 1\n if nimi == \"Anna\"\n ^\nSyntaxError: invalid syntax\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"debuggaaminen","style":"position:relative;"},"children":[{"type":"text","value":"Debuggaaminen"},{"type":"element","tagName":"a","properties":{"href":"#debuggaaminen","ariaLabel":"debuggaaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun ohjelman syntaksi on kunnossa mutta ohjelma ei toimi halutulla tavalla, ohjelmassa on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"bugi"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bugit ilmenevät eri tavoin. Jotkin bugit aiheuttavat suoritusaikaisen virheen. Esim. ohjelma"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\ny "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" y\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" jaettuna "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"aiheuttaa seuraavan virheen:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"ZeroDivisionError: integer division or modulo by zero on line 3\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ongelma on siis siinä, että nollalla jakaminen ei ole sallittua ja se keskeyttää ohjelman suorituksen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Suoritusaikaiseen virheeseen johtavat bugit ovat usein helpohkoja korjata, sillä virheen aiheuttava rivi selviää virheilmoituksesta. Tosin virheen varsinainen syy eli bugi on usein muualla kuin virheilmoituksen aiheuttaneessa rivissä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joskus bugi taas ilmenee siten, että koodin tuottama tulos on virheellinen. Tälläisten bugien havaitseminen ja niiden syyn paikallistaminen voi olla haastavaa. Kurssin tehtävissä testit paljastavat usein juuri tämän kategorian bugeja. Ennen kuin ongelma päästään korjaamaan, on bugi paikallistettava."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodarijargonissa bugien syiden selvittämistä kutsutaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"debuggaamiseksi"}]},{"type":"text","value":". Debuggaaminen on äärimmäisen keskeinen taito, ja ammatikseen ohjelmoivat käyttävät usein enemmän aikaa debuggaamiseen kuin varsinaiseen ohjelmointiin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yksinkertainen mutta tehokas debuggauskeino on lisätä ohjelmaan debug-tulostuksia eli "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komentoja, joiden avulla varmistetaan, että koodissa tapahtuu ohjelmoijan olettamia asioita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on ratkaisuyritys yhteen "},{"type":"element","tagName":"a","properties":{"href":"/osa-1/5-ehtorakenne"},"children":[{"type":"text","value":"edellisen osan"}]},{"type":"text","value":" tehtävään:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tuntipalkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tuntipalkka: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntunnit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Työtunnit: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npaiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Viikonpäivä: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npalkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tuntipalkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" tunnit\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" paiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"sunnnuntai\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n palkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Palkka "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"palkka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" euroa\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma ei näytä toimivan oikein ja testien suoritus kertoo seuraavaa:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"FAIL: PalkkaTest: test_sunnuntai_1\n\nSyötteellä 23.0, 12, sunnuntai oikeaa palkkaa 552.0 ei löydy tulosteestasi Palkka 276.0 euroa\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ensimmäinen askel debuggaamisessa on useimmiten kokeilla ohjelmaa ongelmallisella syötteellä. Kokeilu varmistaa, että tulos ei ole haluttu:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Palkka 276.0 euroa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Debugattaessa ohjelman toimintaa kokeillaan usein. Voikin olla hyödyllisä \"kovakoodata\" ongelman aiheuttavat syötteet suoraan koodiin sen sijaan, että ne kysyttäisiin joka kerta käyttäjältä. Tämä onnistuu esimerkiksi muuttamalla koodia tilapäisesti seuraavalla tavalla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tuntipalkka = float(input(\"Tuntipalkka: \"))"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tunnit = int(input(\"Työtunnit: \"))"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# paiva = input(\"Viikonpäivä: \")"}]},{"type":"text","value":"\ntuntipalkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"23.0"}]},{"type":"text","value":"\ntunnit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"text","value":"\npaiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"sunnuntai\""}]},{"type":"text","value":"\n\npalkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tuntipalkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" tunnit\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" paiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"sunnnuntai\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n palkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Palkka "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"palkka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" euroa\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava askel on lisäillä koodiin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"debug-tulostuksia"}]},{"type":"text","value":". Koska nimenomaan sunnuntain palkka lasketaan väärin, laitetaan sen hoitavaan osaan tulostukset korotusta ennen ja sen jälkeen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]},{"type":"text","value":"\n\npalkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tuntipalkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" tunnit\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" paiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"sunnnuntai\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"palkka alussa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" palkka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n palkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"palkka kasvatuksen jälkeen:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" palkka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Palkka "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"palkka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" euroa\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun ohjelma nyt suoritetaan, ei debug-tulostuksia jostain syystä näy ollenkaan. Vaikuttaa siltä, että ohjelman suoritus ei edes mene if-haaraan. Komennon ehdossa täytyy siis olla jokin ongelma. Myös ehdon arvo voidaan tulostaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]},{"type":"text","value":"\n\npalkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tuntipalkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" tunnit\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ehto:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"sunnnuntai\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" paiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"sunnnuntai\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"palkka alussa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" palkka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n palkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"palkka kasvatuksen jälkeen:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" palkka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Palkka "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"palkka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" euroa\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ja tosiaan, kun koodi suoritetaan, ehdon arvo on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":" eli koodi hyppää if-lohkon ohi:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"ehto: False\nPalkka 276.0 euroa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vian täytyy siis olla if-komennon ehdossa, ja kun sitä katsotaan tarkemmin, huomataan, että "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"sunnuntai"}]},{"type":"text","value":" on vahingossa kirjoitettu väärin. Korjataan typo:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]},{"type":"text","value":"\n\npalkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tuntipalkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" tunnit\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ehto:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"sunnuntai\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" paiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"sunnuntai\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"palkka alussa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" palkka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n palkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"palkka kasvatuksen jälkeen:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" palkka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Palkka "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"palkka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" euroa\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodin suoritus aiheuttaa nyt seuraavan tulostuksen:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"ehto: True\npalkka alussa: 276.0\npalkka kasvatuksen jälkeen: 276.0\nPalkka 276.0 euroa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tuntipalkka = 23.0"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tunnit = 12"}]},{"type":"text","value":", vaikuttaa muuttujassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"palkka"}]},{"type":"text","value":" olevan oikea arvo aluksi, mutta kasvatuskomento ei kuitenkaan kasvata muuttujan arvoa. Komento on siis mitä ilmeisimmin virheellinen. Ja toden totta, komento"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"palkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"ainoastaan laskee tuplapalkan mutta ei tee tulokselle mitään. Korjataan komento muotoon, joka tallentaa korotetun palkan muuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"palkka"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"palkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun ohjelma suoritetaan nyt, huomataan että lopputuloskin on oikea:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"ehto: True\npalkka alussa: 276.0\npalkka kasvatuksen jälkeen: 552.0\nPalkka 552.0 euroa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun ohjelma on kunnossa, tulee debuggaustulosteet ja muu debuggauksen takia kirjoitettu ylimääräinen koodi poistaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki oli yksinkertainen ja näin lyhyessä ohjelmassa oleva bugi selviäisi varmasti myös koodia lukemalla. Monesti kuitenkin debug-tulostuksilla pääsee huomattavasti nopeammin jyvälle siitä, missä vika piilee. Tulostamalla voidaan usein varmistua siitä, mitkä osat ohjelmasta toimivat \"varmuudella\" oikein, ja bugien jäljitys voidaan nopeasti kohdistaa niihin koodiriveihin, joissa ongelma todennäköisesti piileskelee."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Debuggaukseen on olemassa muitakin keinoja kuin debug-tulostusten tekeminen. Palaamme asiaan myöhemmin kurssilla. Sinun kannattaa tästä lähtien kurssilla käyttää debug-tulostamista virheiden etsimiseen. Ohjelmoinnin ammattilaiset eivät selviä työstään ilman debug-tulostuksia, joten on vaikea kuvitella, ettei aloittelijoidenkin kannattaisi laajentaa työkalupakkiaan tältä osin."}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Korjaa virheet","tmcname":"osa02-01_korjaa_virheet","height":"400px"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa ohjelmassa on useita "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"syntaksivirheitä"}]},{"type":"text","value":". Korjaa ohjelma siten, että syntaksi on kunnossa ja se toimii alla olevien esimerkkien mukaisesti."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku oli suurempi kuin sata\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"\"Nyt luvun arvo on pienentynyt sadalla"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arvo on nyt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" taitaa olla onnenlukuni!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"\"Hyvää päivänjatkoa!"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"13"}]},{"type":"text","value":"\n13 taitaa olla onnenlukuni!\nHyvää päivänjatkoa!"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"101"}]},{"type":"text","value":"\nLuku oli suurempi kuin sata\nNyt luvun arvo on pienentynyt sadalla\nArvo on nyt 1\n1 taitaa olla onnenlukuni!\nHyvää päivänjatkoa!"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Merkkien määrä","tmcname":"osa02-02_merkkien_maara"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"len"}]},{"type":"text","value":" voidaan laskea (muun muassa) merkkijonon pituus. Funktio palauttaa merkkijonossa olevien merkkien määrän."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkejä funktion toiminnasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"abcd\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"moikka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsana2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"heipparallaa\""}]},{"type":"text","value":"\npituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntyhja_merkkijono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":"\npituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tyhja_merkkijono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4\n6\n12\n0"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka lukee käyttäjältä sanan ja tulostaa sanan merkkien määrän, mikäli niitä on enemmän kuin yksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuorituksia:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna sana: hei\nSanassa hei on 3 kirjainta\nKiitos!"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna sana: banaani\nSanassa banaani on 7 kirjainta\nKiitos!"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna sana: b\nKiitos!"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Tyyppimuunnos","tmcname":"osa02-03_tyyppimuunnos"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa voidaan usein muuntaa jokin arvo tyypistä toiseen. Esimerkiksi liukuluku voidaan muuntaa kokonaisluvuksi funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"int"}]},{"type":"text","value":" avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\nlampo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna lämpötila: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lämpötila on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lampo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"...eli pyöreästi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lampo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lämpötila: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5.15"}]},{"type":"text","value":"\nLämpötila on 5.15\n...eli pyöreästi 5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että funktio ei pyöristä arvoa matematiikasta tutulla tavalla, vaan pyöristää luvun alaspäin (kyse on siis ns. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"lattiafunktiosta"}]},{"type":"text","value":"):"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lämpötila: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"8.99"}]},{"type":"text","value":"\nLämpötila on 8.99\n...eli pyöreästi 8"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee int-funktiota hyödyntäen ohjelma, joka kysyy käyttäjältä desimaaliluvun ja tulostaa erikseen luvun kokonaisosan ja desimaaliosan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huom! Voit olettaa, että annettu desimaaliluku on suurempi kuin nolla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1.34"}]},{"type":"text","value":"\nKokonaisosa: 1\nDesimaaliosa: 0.34"}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tunnet keskeistä ohjelmoinnin termistöä
  • \n
  • Tiedät lauseen ja lausekkeen eron
  • \n
  • Osaat selvittää lausekkeen arvon tyypin
  • \n
  • Opit etsimään virheitä debuggauksen avulla
  • \n

Emme vielä kurssin ensimmäisessä osassa kiinnittäneet kovin tarkasti huomiota ohjelmoinnin terminologiaan. Nyt on hyvä hetki tutustua joihinkin käsitteisiin.

Lause

Lause (engl. statement) tarkoittaa ohjelman osaa, joka suorittaa jonkin toiminnon. Usein lause viittaa yksittäiseen komentoon.

Esimerkiksi print(\"Moi!\") on lause, joka tulostaa rivin tekstiä,\nja luku = 2 on lause, joka asettaa muuttujalle arvon.

Lause voi olla myös monimutkaisempi, ja sen sisällä voi olla muita lauseita.\nEsimerkiksi seuraava ehtolause muodostuu kolmesta rivistä:

if nimi == \"Anna\":\n    print(\"Moi!\")\n    luku = 2

Tässä tapauksessa ehtolauseen sisällä on kaksi lausetta.

Lohko

Lohko (engl. block) on joukko peräkkäin sijoitettuja lauseita, jotka ovat samalla tasolla ohjelman rakenteessa. Esimerkiksi ehtolauseessa lohkossa ovat lauseet, jotka suoritetaan ehdon ollessa tosi.

if ika > 17:\n    # ehtolauseessa oleva lohko alkaa\n    print(\"Olet täysi-ikäinen!\")\n    ika = ika + 1\n    print(\"nyt vuoden vanhempi...\")\n    # lohko loppuu\n\nprint(\"tämä on eri lohkossa\")

Pythonissa lohko ilmaistaan sisentämällä lohkon koodi eli lauseet samalle tasolle.

Kannattaa huomata, että Python-ohjelman \"päälohkon\" on oltava sisennetty tiedoston vasempaan reunaan:

# tämä ohjelma ei toimi sillä koodia ei ole sisennetty vasempaan reunaan\n  print(\"hei maailma\")\n  print(\"huono ohjelma...\")

Lauseke

Lauseke (engl. expression) on koodin osa, jolla on jokin tyyppi. Ohjelman suorituksen aikana lauseke saa arvon, jota voidaan käyttää ohjelmassa.

Tarkastellaan muutamaa esimerkkiä lausekkeista:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LausekeArvoTyyppiTyyppi Pythonissa
2 + 4 + 39kokonaislukuint
\"abc\" + \"de\"\"abcde\"merkkijonostr
11 / 25.5liukulukufloat
2 * 5 > 9Truetotuusarvobool

Koska lausekkeella on arvo, voi sen sijoittaa muuttujaan:

# muuttuja x saa arvoksi lausekkeen 1 + 2 arvon\nx = 1 + 2

Yksinkertaisesta lausekkeesta saa muodostettua monimutkaisempia lausekkeita esim. laskuoperaattorien avulla:

# muuttuja y saa arvoksi lausekkeen '3 kertaa x plus x toiseen' arvon\ny = 3 * x + x**2

Funktio

Funktio (engl. function) suorittaa jonkin toiminnon. Funktiolla voi olla yksi tai useampi parametri (engl. parameter), jotka ilmaisevat, mitä funktion tulee tehdä tarkalleen.

Funktio suoritetaan, kun sitä kutsutaan eli koodissa on funktion nimi ja funktiolle annettavat parametrit suluissa. Esimerkiksi seuraava koodi kutsuu print-funktiota parametrilla \"tämä on parametri\":

print(\"tämä on parametri\")

Myös käyttäjältä syötteitä lukeva input on funktio. Parametrina funktio saa käyttäjälle näytettävän viestin:

nimi = input(\"Kerro nimesi: \")

Tässä tapauksessa funktio palauttaa arvon, mikä tarkoittaa, että funktion kutsukohtaan ilmestyy arvo funktion suorituksen jälkeen. Funktion input palauttama arvo on käyttäjän syöttämä teksti merkkijonona. Funktion palauttama arvo sijoitetaan usein muuttujan arvoksi, jotta arvoa voidaan hyödyntää ohjelmassa.

Tyyppi

Tyyppi (engl. type) tarkoittaa, millainen jokin koodissa esiintyvä arvo on. Esimerkiksi seuraavassa koodissa muuttujan nimi tyyppi on merkkijono ja muuttujan tulos tyyppi on kokonaisluku:

nimi = \"Anna\"\ntulos = 100

Funktio type kertoo annetun lausekkeen tyypin. Esimerkiksi:

print(type(\"Anna\"))\nprint(type(100))

<class 'str'>\n<class 'int'>

Syntaksi

Syntaksi (engl. syntax) määrittää, miten ohjelman koodi tulee kirjoittaa. Jokaisella ohjelmointikielellä on omanlainen syntaksinsa.

Esimerkiksi Python-kielen syntaksiin kuuluu, että if-lauseen aloitusrivin lopussa on kaksoispiste ja ehtoon kuuluva koodi on sisennetty:

if nimi == \"Anna\":\n    print(\"Moi!\")

Jos ohjelmointikielen syntaksia ei noudateta, seurauksena on virheilmoitus:

if nimi == \"Anna\"\n    print(\"Moi!\")
\n  File \"testi.py\", line 1\n    if nimi == \"Anna\"\n                    ^\nSyntaxError: invalid syntax\n

Debuggaaminen

Kun ohjelman syntaksi on kunnossa mutta ohjelma ei toimi halutulla tavalla, ohjelmassa on bugi.

Bugit ilmenevät eri tavoin. Jotkin bugit aiheuttavat suoritusaikaisen virheen. Esim. ohjelma

x = 10\ny = 0\ntulos = x / y\n\nprint(f\"{x} jaettuna {y} on {tulos}\")

aiheuttaa seuraavan virheen:

\nZeroDivisionError: integer division or modulo by zero on line 3\n

Ongelma on siis siinä, että nollalla jakaminen ei ole sallittua ja se keskeyttää ohjelman suorituksen.

Suoritusaikaiseen virheeseen johtavat bugit ovat usein helpohkoja korjata, sillä virheen aiheuttava rivi selviää virheilmoituksesta. Tosin virheen varsinainen syy eli bugi on usein muualla kuin virheilmoituksen aiheuttaneessa rivissä.

Joskus bugi taas ilmenee siten, että koodin tuottama tulos on virheellinen. Tälläisten bugien havaitseminen ja niiden syyn paikallistaminen voi olla haastavaa. Kurssin tehtävissä testit paljastavat usein juuri tämän kategorian bugeja. Ennen kuin ongelma päästään korjaamaan, on bugi paikallistettava.

Koodarijargonissa bugien syiden selvittämistä kutsutaan debuggaamiseksi. Debuggaaminen on äärimmäisen keskeinen taito, ja ammatikseen ohjelmoivat käyttävät usein enemmän aikaa debuggaamiseen kuin varsinaiseen ohjelmointiin.

Yksinkertainen mutta tehokas debuggauskeino on lisätä ohjelmaan debug-tulostuksia eli print-komentoja, joiden avulla varmistetaan, että koodissa tapahtuu ohjelmoijan olettamia asioita.

Seuraavassa on ratkaisuyritys yhteen edellisen osan tehtävään:

tuntipalkka = float(input(\"Tuntipalkka: \"))\ntunnit = int(input(\"Työtunnit: \"))\npaiva = input(\"Viikonpäivä: \")\n\npalkka = tuntipalkka * tunnit\nif paiva == \"sunnnuntai\":\n    palkka * 2\n\nprint(f\"Palkka {palkka} euroa\")

Ohjelma ei näytä toimivan oikein ja testien suoritus kertoo seuraavaa:

\nFAIL: PalkkaTest: test_sunnuntai_1\n\nSyötteellä 23.0, 12, sunnuntai oikeaa palkkaa 552.0 ei löydy tulosteestasi Palkka 276.0 euroa\n

Ensimmäinen askel debuggaamisessa on useimmiten kokeilla ohjelmaa ongelmallisella syötteellä. Kokeilu varmistaa, että tulos ei ole haluttu:

Palkka 276.0 euroa

Debugattaessa ohjelman toimintaa kokeillaan usein. Voikin olla hyödyllisä \"kovakoodata\" ongelman aiheuttavat syötteet suoraan koodiin sen sijaan, että ne kysyttäisiin joka kerta käyttäjältä. Tämä onnistuu esimerkiksi muuttamalla koodia tilapäisesti seuraavalla tavalla:

# tuntipalkka = float(input(\"Tuntipalkka: \"))\n# tunnit = int(input(\"Työtunnit: \"))\n# paiva = input(\"Viikonpäivä: \")\ntuntipalkka = 23.0\ntunnit = 12\npaiva = \"sunnuntai\"\n\npalkka = tuntipalkka * tunnit\nif paiva == \"sunnnuntai\":\n    palkka * 2\n\nprint(f\"Palkka {palkka} euroa\")

Seuraava askel on lisäillä koodiin debug-tulostuksia. Koska nimenomaan sunnuntain palkka lasketaan väärin, laitetaan sen hoitavaan osaan tulostukset korotusta ennen ja sen jälkeen:

# ...\n\npalkka = tuntipalkka * tunnit\nif paiva == \"sunnnuntai\":\n    print(\"palkka alussa:\", palkka)\n    palkka * 2\n    print(\"palkka kasvatuksen jälkeen:\", palkka)\n\nprint(f\"Palkka {palkka} euroa\")

Kun ohjelma nyt suoritetaan, ei debug-tulostuksia jostain syystä näy ollenkaan. Vaikuttaa siltä, että ohjelman suoritus ei edes mene if-haaraan. Komennon ehdossa täytyy siis olla jokin ongelma. Myös ehdon arvo voidaan tulostaa:

# ...\n\npalkka = tuntipalkka * tunnit\nprint(\"ehto:\", paiva==\"sunnnuntai\")\nif paiva == \"sunnnuntai\":\n    print(\"palkka alussa:\", palkka)\n    palkka * 2\n    print(\"palkka kasvatuksen jälkeen:\", palkka)\n\nprint(f\"Palkka {palkka} euroa\")

Ja tosiaan, kun koodi suoritetaan, ehdon arvo on False eli koodi hyppää if-lohkon ohi:

ehto: False\nPalkka 276.0 euroa

Vian täytyy siis olla if-komennon ehdossa, ja kun sitä katsotaan tarkemmin, huomataan, että sunnuntai on vahingossa kirjoitettu väärin. Korjataan typo:

# ...\n\npalkka = tuntipalkka * tunnit\nprint(\"ehto:\", paiva==\"sunnuntai\")\nif paiva == \"sunnuntai\":\n    print(\"palkka alussa:\", palkka)\n    palkka * 2\n    print(\"palkka kasvatuksen jälkeen:\", palkka)\n\nprint(f\"Palkka {palkka} euroa\")

Koodin suoritus aiheuttaa nyt seuraavan tulostuksen:

ehto: True\npalkka alussa: 276.0\npalkka kasvatuksen jälkeen: 276.0\nPalkka 276.0 euroa

Koska tuntipalkka = 23.0 ja tunnit = 12, vaikuttaa muuttujassa palkka olevan oikea arvo aluksi, mutta kasvatuskomento ei kuitenkaan kasvata muuttujan arvoa. Komento on siis mitä ilmeisimmin virheellinen. Ja toden totta, komento

palkka * 2

ainoastaan laskee tuplapalkan mutta ei tee tulokselle mitään. Korjataan komento muotoon, joka tallentaa korotetun palkan muuttujaan palkka:

palkka *= 2

Kun ohjelma suoritetaan nyt, huomataan että lopputuloskin on oikea:

ehto: True\npalkka alussa: 276.0\npalkka kasvatuksen jälkeen: 552.0\nPalkka 552.0 euroa

Kun ohjelma on kunnossa, tulee debuggaustulosteet ja muu debuggauksen takia kirjoitettu ylimääräinen koodi poistaa.

Esimerkki oli yksinkertainen ja näin lyhyessä ohjelmassa oleva bugi selviäisi varmasti myös koodia lukemalla. Monesti kuitenkin debug-tulostuksilla pääsee huomattavasti nopeammin jyvälle siitä, missä vika piilee. Tulostamalla voidaan usein varmistua siitä, mitkä osat ohjelmasta toimivat \"varmuudella\" oikein, ja bugien jäljitys voidaan nopeasti kohdistaa niihin koodiriveihin, joissa ongelma todennäköisesti piileskelee.

Debuggaukseen on olemassa muitakin keinoja kuin debug-tulostusten tekeminen. Palaamme asiaan myöhemmin kurssilla. Sinun kannattaa tästä lähtien kurssilla käyttää debug-tulostamista virheiden etsimiseen. Ohjelmoinnin ammattilaiset eivät selviä työstään ilman debug-tulostuksia, joten on vaikea kuvitella, ettei aloittelijoidenkin kannattaisi laajentaa työkalupakkiaan tältä osin.

Seuraavassa ohjelmassa on useita syntaksivirheitä. Korjaa ohjelma siten, että syntaksi on kunnossa ja se toimii alla olevien esimerkkien mukaisesti.

  luku = input(\"Anna luku: \")\n  if luku>100\n    print(\"Luku oli suurempi kuin sata\")\n    luku - 100\n    print(\"Nyt luvun arvo on pienentynyt sadalla)\n     print(\"Arvo on nyt\"+ luku)\n print(luku + \" taitaa olla onnenlukuni!\")\n print(\"Hyvää päivänjatkoa!)

Anna luku: 13\n13 taitaa olla onnenlukuni!\nHyvää päivänjatkoa!

Anna luku: 101\nLuku oli suurempi kuin sata\nNyt luvun arvo on pienentynyt sadalla\nArvo on nyt 1\n1 taitaa olla onnenlukuni!\nHyvää päivänjatkoa!

Funktiolla len voidaan laskea (muun muassa) merkkijonon pituus. Funktio palauttaa merkkijonossa olevien merkkien määrän.

Esimerkkejä funktion toiminnasta:

sana = \"abcd\"\nprint(len(sana))\n\nprint(len(\"moikka\"))\n\nsana2 = \"heipparallaa\"\npituus = len(sana2)\nprint(pituus)\n\ntyhja_merkkijono = \"\"\npituus = len(tyhja_merkkijono)\nprint(pituus)

4\n6\n12\n0

Tee ohjelma, joka lukee käyttäjältä sanan ja tulostaa sanan merkkien määrän, mikäli niitä on enemmän kuin yksi.

Esimerkkisuorituksia:

Anna sana: hei\nSanassa hei on 3 kirjainta\nKiitos!

Anna sana: banaani\nSanassa banaani on 7 kirjainta\nKiitos!

Anna sana: b\nKiitos!

Pythonissa voidaan usein muuntaa jokin arvo tyypistä toiseen. Esimerkiksi liukuluku voidaan muuntaa kokonaisluvuksi funktion int avulla:

\nlampo = float(input(\"Anna lämpötila: \"))\n\nprint(\"Lämpötila on\", lampo)\n\nprint(\"...eli pyöreästi\", int(lampo))\n

Anna lämpötila: 5.15\nLämpötila on 5.15\n...eli pyöreästi 5

Huomaa, että funktio ei pyöristä arvoa matematiikasta tutulla tavalla, vaan pyöristää luvun alaspäin (kyse on siis ns. lattiafunktiosta):

Anna lämpötila: 8.99\nLämpötila on 8.99\n...eli pyöreästi 8

Tee int-funktiota hyödyntäen ohjelma, joka kysyy käyttäjältä desimaaliluvun ja tulostaa erikseen luvun kokonaisosan ja desimaaliosan.

Huom! Voit olettaa, että annettu desimaaliluku on suurempi kuin nolla.

Esimerkiksi

Anna luku: 1.34\nKokonaisosa: 1\nDesimaaliosa: 0.34

","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-2/1-ohjelmoinnin-termeja.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tunnet keskeistä ohjelmoinnin termistöä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät lauseen ja lausekkeen eron"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat selvittää lausekkeen arvon tyypin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Opit etsimään virheitä debuggauksen avulla"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Emme vielä kurssin ensimmäisessä osassa kiinnittäneet kovin tarkasti huomiota ohjelmoinnin terminologiaan. Nyt on hyvä hetki tutustua joihinkin käsitteisiin."}]},{"type":"element","tagName":"h2","properties":{"id":"lause","style":"position:relative;"},"children":[{"type":"text","value":"Lause"},{"type":"element","tagName":"a","properties":{"href":"#lause","ariaLabel":"lause permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Lause"}]},{"type":"text","value":" (engl. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"statement"}]},{"type":"text","value":") tarkoittaa ohjelman osaa, joka suorittaa jonkin toiminnon. Usein lause viittaa yksittäiseen komentoon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print(\"Moi!\")"}]},{"type":"text","value":" on lause, joka tulostaa rivin tekstiä,\nja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku = 2"}]},{"type":"text","value":" on lause, joka asettaa muuttujalle arvon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lause voi olla myös monimutkaisempi, ja sen sisällä voi olla muita lauseita.\nEsimerkiksi seuraava ehtolause muodostuu kolmesta rivistä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tapauksessa ehtolauseen sisällä on kaksi lausetta."}]},{"type":"element","tagName":"h2","properties":{"id":"lohko","style":"position:relative;"},"children":[{"type":"text","value":"Lohko"},{"type":"element","tagName":"a","properties":{"href":"#lohko","ariaLabel":"lohko permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Lohko"}]},{"type":"text","value":" (engl. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"block"}]},{"type":"text","value":") on joukko peräkkäin sijoitettuja lauseita, jotka ovat samalla tasolla ohjelman rakenteessa. Esimerkiksi ehtolauseessa lohkossa ovat lauseet, jotka suoritetaan ehdon ollessa tosi."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"17"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ehtolauseessa oleva lohko alkaa"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olet täysi-ikäinen!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nyt vuoden vanhempi...\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# lohko loppuu"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tämä on eri lohkossa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa lohko ilmaistaan sisentämällä lohkon koodi eli lauseet samalle tasolle."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kannattaa huomata, että Python-ohjelman \"päälohkon\" on oltava sisennetty tiedoston vasempaan reunaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tämä ohjelma ei toimi sillä koodia ei ole sisennetty vasempaan reunaan"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hei maailma\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"huono ohjelma...\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"lauseke","style":"position:relative;"},"children":[{"type":"text","value":"Lauseke"},{"type":"element","tagName":"a","properties":{"href":"#lauseke","ariaLabel":"lauseke permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Lauseke"}]},{"type":"text","value":" (engl. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"expression"}]},{"type":"text","value":") on koodin osa, jolla on jokin tyyppi. Ohjelman suorituksen aikana lauseke saa arvon, jota voidaan käyttää ohjelmassa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan muutamaa esimerkkiä lausekkeista:"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{},"children":[{"type":"text","value":"Lauseke"}]},{"type":"element","tagName":"th","properties":{},"children":[{"type":"text","value":"Arvo"}]},{"type":"element","tagName":"th","properties":{},"children":[{"type":"text","value":"Tyyppi"}]},{"type":"element","tagName":"th","properties":{},"children":[{"type":"text","value":"Tyyppi Pythonissa"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"2 + 4 + 3"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"9"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"kokonaisluku"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"int"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"abc\" + \"de\""}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"abcde\""}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"merkkijono"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"str"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"11 / 2"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"5.5"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"liukuluku"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"float"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"2 * 5 > 9"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"text","value":"totuusarvo"}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"bool"}]}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska lausekkeella on arvo, voi sen sijoittaa muuttujaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muuttuja x saa arvoksi lausekkeen 1 + 2 arvon"}]},{"type":"text","value":"\nx "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yksinkertaisesta lausekkeesta saa muodostettua monimutkaisempia lausekkeita esim. laskuoperaattorien avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muuttuja y saa arvoksi lausekkeen '3 kertaa x plus x toiseen' arvon"}]},{"type":"text","value":"\ny "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"funktio","style":"position:relative;"},"children":[{"type":"text","value":"Funktio"},{"type":"element","tagName":"a","properties":{"href":"#funktio","ariaLabel":"funktio permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Funktio"}]},{"type":"text","value":" (engl. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"function"}]},{"type":"text","value":") suorittaa jonkin toiminnon. Funktiolla voi olla yksi tai useampi "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"parametri"}]},{"type":"text","value":" (engl. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"parameter"}]},{"type":"text","value":"), jotka ilmaisevat, mitä funktion tulee tehdä tarkalleen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio suoritetaan, kun sitä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kutsutaan"}]},{"type":"text","value":" eli koodissa on funktion nimi ja funktiolle annettavat parametrit suluissa. Esimerkiksi seuraava koodi kutsuu "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-funktiota parametrilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"tämä on parametri\""}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tämä on parametri\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Myös käyttäjältä syötteitä lukeva "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"input"}]},{"type":"text","value":" on funktio. Parametrina funktio saa käyttäjälle näytettävän viestin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kerro nimesi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tapauksessa funktio "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"palauttaa"}]},{"type":"text","value":" arvon, mikä tarkoittaa, että funktion kutsukohtaan ilmestyy arvo funktion suorituksen jälkeen. Funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"input"}]},{"type":"text","value":" palauttama arvo on käyttäjän syöttämä teksti merkkijonona. Funktion palauttama arvo sijoitetaan usein muuttujan arvoksi, jotta arvoa voidaan hyödyntää ohjelmassa."}]},{"type":"element","tagName":"h2","properties":{"id":"tyyppi","style":"position:relative;"},"children":[{"type":"text","value":"Tyyppi"},{"type":"element","tagName":"a","properties":{"href":"#tyyppi","ariaLabel":"tyyppi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Tyyppi"}]},{"type":"text","value":" (engl. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"type"}]},{"type":"text","value":") tarkoittaa, millainen jokin koodissa esiintyvä arvo on. Esimerkiksi seuraavassa koodissa muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":" tyyppi on merkkijono ja muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulos"}]},{"type":"text","value":" tyyppi on kokonaisluku:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna\""}]},{"type":"text","value":"\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"type"}]},{"type":"text","value":" kertoo annetun lausekkeen tyypin. Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"type"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"syntaksi","style":"position:relative;"},"children":[{"type":"text","value":"Syntaksi"},{"type":"element","tagName":"a","properties":{"href":"#syntaksi","ariaLabel":"syntaksi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Syntaksi"}]},{"type":"text","value":" (engl. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"syntax"}]},{"type":"text","value":") määrittää, miten ohjelman koodi tulee kirjoittaa. Jokaisella ohjelmointikielellä on omanlainen syntaksinsa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi Python-kielen syntaksiin kuuluu, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":"-lauseen aloitusrivin lopussa on kaksoispiste ja ehtoon kuuluva koodi on sisennetty:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos ohjelmointikielen syntaksia ei noudateta, seurauksena on virheilmoitus:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":" File \"testi.py\", line 1\n if nimi == \"Anna\"\n ^\nSyntaxError: invalid syntax\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"debuggaaminen","style":"position:relative;"},"children":[{"type":"text","value":"Debuggaaminen"},{"type":"element","tagName":"a","properties":{"href":"#debuggaaminen","ariaLabel":"debuggaaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun ohjelman syntaksi on kunnossa mutta ohjelma ei toimi halutulla tavalla, ohjelmassa on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"bugi"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bugit ilmenevät eri tavoin. Jotkin bugit aiheuttavat suoritusaikaisen virheen. Esim. ohjelma"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\ny "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" y\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" jaettuna "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"aiheuttaa seuraavan virheen:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"ZeroDivisionError: integer division or modulo by zero on line 3\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ongelma on siis siinä, että nollalla jakaminen ei ole sallittua ja se keskeyttää ohjelman suorituksen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Suoritusaikaiseen virheeseen johtavat bugit ovat usein helpohkoja korjata, sillä virheen aiheuttava rivi selviää virheilmoituksesta. Tosin virheen varsinainen syy eli bugi on usein muualla kuin virheilmoituksen aiheuttaneessa rivissä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joskus bugi taas ilmenee siten, että koodin tuottama tulos on virheellinen. Tälläisten bugien havaitseminen ja niiden syyn paikallistaminen voi olla haastavaa. Kurssin tehtävissä testit paljastavat usein juuri tämän kategorian bugeja. Ennen kuin ongelma päästään korjaamaan, on bugi paikallistettava."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodarijargonissa bugien syiden selvittämistä kutsutaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"debuggaamiseksi"}]},{"type":"text","value":". Debuggaaminen on äärimmäisen keskeinen taito, ja ammatikseen ohjelmoivat käyttävät usein enemmän aikaa debuggaamiseen kuin varsinaiseen ohjelmointiin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yksinkertainen mutta tehokas debuggauskeino on lisätä ohjelmaan debug-tulostuksia eli "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komentoja, joiden avulla varmistetaan, että koodissa tapahtuu ohjelmoijan olettamia asioita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on ratkaisuyritys yhteen "},{"type":"element","tagName":"a","properties":{"href":"/osa-1/5-ehtorakenne"},"children":[{"type":"text","value":"edellisen osan"}]},{"type":"text","value":" tehtävään:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tuntipalkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tuntipalkka: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntunnit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Työtunnit: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npaiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Viikonpäivä: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npalkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tuntipalkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" tunnit\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" paiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"sunnnuntai\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n palkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Palkka "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"palkka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" euroa\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma ei näytä toimivan oikein ja testien suoritus kertoo seuraavaa:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"FAIL: PalkkaTest: test_sunnuntai_1\n\nSyötteellä 23.0, 12, sunnuntai oikeaa palkkaa 552.0 ei löydy tulosteestasi Palkka 276.0 euroa\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ensimmäinen askel debuggaamisessa on useimmiten kokeilla ohjelmaa ongelmallisella syötteellä. Kokeilu varmistaa, että tulos ei ole haluttu:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Palkka 276.0 euroa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Debugattaessa ohjelman toimintaa kokeillaan usein. Voikin olla hyödyllisä \"kovakoodata\" ongelman aiheuttavat syötteet suoraan koodiin sen sijaan, että ne kysyttäisiin joka kerta käyttäjältä. Tämä onnistuu esimerkiksi muuttamalla koodia tilapäisesti seuraavalla tavalla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tuntipalkka = float(input(\"Tuntipalkka: \"))"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tunnit = int(input(\"Työtunnit: \"))"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# paiva = input(\"Viikonpäivä: \")"}]},{"type":"text","value":"\ntuntipalkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"23.0"}]},{"type":"text","value":"\ntunnit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"text","value":"\npaiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"sunnuntai\""}]},{"type":"text","value":"\n\npalkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tuntipalkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" tunnit\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" paiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"sunnnuntai\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n palkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Palkka "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"palkka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" euroa\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava askel on lisäillä koodiin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"debug-tulostuksia"}]},{"type":"text","value":". Koska nimenomaan sunnuntain palkka lasketaan väärin, laitetaan sen hoitavaan osaan tulostukset korotusta ennen ja sen jälkeen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]},{"type":"text","value":"\n\npalkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tuntipalkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" tunnit\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" paiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"sunnnuntai\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"palkka alussa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" palkka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n palkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"palkka kasvatuksen jälkeen:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" palkka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Palkka "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"palkka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" euroa\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun ohjelma nyt suoritetaan, ei debug-tulostuksia jostain syystä näy ollenkaan. Vaikuttaa siltä, että ohjelman suoritus ei edes mene if-haaraan. Komennon ehdossa täytyy siis olla jokin ongelma. Myös ehdon arvo voidaan tulostaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]},{"type":"text","value":"\n\npalkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tuntipalkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" tunnit\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ehto:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"sunnnuntai\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" paiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"sunnnuntai\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"palkka alussa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" palkka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n palkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"palkka kasvatuksen jälkeen:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" palkka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Palkka "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"palkka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" euroa\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ja tosiaan, kun koodi suoritetaan, ehdon arvo on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":" eli koodi hyppää if-lohkon ohi:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"ehto: False\nPalkka 276.0 euroa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vian täytyy siis olla if-komennon ehdossa, ja kun sitä katsotaan tarkemmin, huomataan, että "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"sunnuntai"}]},{"type":"text","value":" on vahingossa kirjoitettu väärin. Korjataan typo:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]},{"type":"text","value":"\n\npalkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tuntipalkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" tunnit\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ehto:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"sunnuntai\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" paiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"sunnuntai\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"palkka alussa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" palkka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n palkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"palkka kasvatuksen jälkeen:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" palkka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Palkka "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"palkka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" euroa\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodin suoritus aiheuttaa nyt seuraavan tulostuksen:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"ehto: True\npalkka alussa: 276.0\npalkka kasvatuksen jälkeen: 276.0\nPalkka 276.0 euroa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tuntipalkka = 23.0"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tunnit = 12"}]},{"type":"text","value":", vaikuttaa muuttujassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"palkka"}]},{"type":"text","value":" olevan oikea arvo aluksi, mutta kasvatuskomento ei kuitenkaan kasvata muuttujan arvoa. Komento on siis mitä ilmeisimmin virheellinen. Ja toden totta, komento"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"palkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"ainoastaan laskee tuplapalkan mutta ei tee tulokselle mitään. Korjataan komento muotoon, joka tallentaa korotetun palkan muuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"palkka"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"palkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun ohjelma suoritetaan nyt, huomataan että lopputuloskin on oikea:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"ehto: True\npalkka alussa: 276.0\npalkka kasvatuksen jälkeen: 552.0\nPalkka 552.0 euroa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun ohjelma on kunnossa, tulee debuggaustulosteet ja muu debuggauksen takia kirjoitettu ylimääräinen koodi poistaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki oli yksinkertainen ja näin lyhyessä ohjelmassa oleva bugi selviäisi varmasti myös koodia lukemalla. Monesti kuitenkin debug-tulostuksilla pääsee huomattavasti nopeammin jyvälle siitä, missä vika piilee. Tulostamalla voidaan usein varmistua siitä, mitkä osat ohjelmasta toimivat \"varmuudella\" oikein, ja bugien jäljitys voidaan nopeasti kohdistaa niihin koodiriveihin, joissa ongelma todennäköisesti piileskelee."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Debuggaukseen on olemassa muitakin keinoja kuin debug-tulostusten tekeminen. Palaamme asiaan myöhemmin kurssilla. Sinun kannattaa tästä lähtien kurssilla käyttää debug-tulostamista virheiden etsimiseen. Ohjelmoinnin ammattilaiset eivät selviä työstään ilman debug-tulostuksia, joten on vaikea kuvitella, ettei aloittelijoidenkin kannattaisi laajentaa työkalupakkiaan tältä osin."}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Korjaa virheet","tmcname":"osa02-01_korjaa_virheet","height":"400px"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa ohjelmassa on useita "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"syntaksivirheitä"}]},{"type":"text","value":". Korjaa ohjelma siten, että syntaksi on kunnossa ja se toimii alla olevien esimerkkien mukaisesti."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku oli suurempi kuin sata\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"\"Nyt luvun arvo on pienentynyt sadalla"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arvo on nyt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" taitaa olla onnenlukuni!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"\"Hyvää päivänjatkoa!"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"13"}]},{"type":"text","value":"\n13 taitaa olla onnenlukuni!\nHyvää päivänjatkoa!"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"101"}]},{"type":"text","value":"\nLuku oli suurempi kuin sata\nNyt luvun arvo on pienentynyt sadalla\nArvo on nyt 1\n1 taitaa olla onnenlukuni!\nHyvää päivänjatkoa!"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Merkkien määrä","tmcname":"osa02-02_merkkien_maara"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"len"}]},{"type":"text","value":" voidaan laskea (muun muassa) merkkijonon pituus. Funktio palauttaa merkkijonossa olevien merkkien määrän."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkejä funktion toiminnasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"abcd\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"moikka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsana2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"heipparallaa\""}]},{"type":"text","value":"\npituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntyhja_merkkijono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":"\npituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tyhja_merkkijono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4\n6\n12\n0"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka lukee käyttäjältä sanan ja tulostaa sanan merkkien määrän, mikäli niitä on enemmän kuin yksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuorituksia:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna sana: hei\nSanassa hei on 3 kirjainta\nKiitos!"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna sana: banaani\nSanassa banaani on 7 kirjainta\nKiitos!"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna sana: b\nKiitos!"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Tyyppimuunnos","tmcname":"osa02-03_tyyppimuunnos"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa voidaan usein muuntaa jokin arvo tyypistä toiseen. Esimerkiksi liukuluku voidaan muuntaa kokonaisluvuksi funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"int"}]},{"type":"text","value":" avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\nlampo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna lämpötila: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lämpötila on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lampo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"...eli pyöreästi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lampo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lämpötila: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5.15"}]},{"type":"text","value":"\nLämpötila on 5.15\n...eli pyöreästi 5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että funktio ei pyöristä arvoa matematiikasta tutulla tavalla, vaan pyöristää luvun alaspäin (kyse on siis ns. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"lattiafunktiosta"}]},{"type":"text","value":"):"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lämpötila: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"8.99"}]},{"type":"text","value":"\nLämpötila on 8.99\n...eli pyöreästi 8"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee int-funktiota hyödyntäen ohjelma, joka kysyy käyttäjältä desimaaliluvun ja tulostaa erikseen luvun kokonaisosan ja desimaaliosan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huom! Voit olettaa, että annettu desimaaliluku on suurempi kuin nolla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1.34"}]},{"type":"text","value":"\nKokonaisosa: 1\nDesimaaliosa: 0.34"}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tunnet keskeistä ohjelmoinnin termistöä
  • \n
  • Tiedät lauseen ja lausekkeen eron
  • \n
  • Osaat selvittää lausekkeen arvon tyypin
  • \n
  • Opit etsimään virheitä debuggauksen avulla
  • \n

Emme vielä kurssin ensimmäisessä osassa kiinnittäneet kovin tarkasti huomiota ohjelmoinnin terminologiaan. Nyt on hyvä hetki tutustua joihinkin käsitteisiin.

Lause

Lause (engl. statement) tarkoittaa ohjelman osaa, joka suorittaa jonkin toiminnon. Usein lause viittaa yksittäiseen komentoon.

Esimerkiksi print(\"Moi!\") on lause, joka tulostaa rivin tekstiä,\nja luku = 2 on lause, joka asettaa muuttujalle arvon.

Lause voi olla myös monimutkaisempi, ja sen sisällä voi olla muita lauseita.\nEsimerkiksi seuraava ehtolause muodostuu kolmesta rivistä:

if nimi == \"Anna\":\n    print(\"Moi!\")\n    luku = 2

Tässä tapauksessa ehtolauseen sisällä on kaksi lausetta.

Lohko

Lohko (engl. block) on joukko peräkkäin sijoitettuja lauseita, jotka ovat samalla tasolla ohjelman rakenteessa. Esimerkiksi ehtolauseessa lohkossa ovat lauseet, jotka suoritetaan ehdon ollessa tosi.

if ika > 17:\n    # ehtolauseessa oleva lohko alkaa\n    print(\"Olet täysi-ikäinen!\")\n    ika = ika + 1\n    print(\"nyt vuoden vanhempi...\")\n    # lohko loppuu\n\nprint(\"tämä on eri lohkossa\")

Pythonissa lohko ilmaistaan sisentämällä lohkon koodi eli lauseet samalle tasolle.

Kannattaa huomata, että Python-ohjelman \"päälohkon\" on oltava sisennetty tiedoston vasempaan reunaan:

# tämä ohjelma ei toimi sillä koodia ei ole sisennetty vasempaan reunaan\n  print(\"hei maailma\")\n  print(\"huono ohjelma...\")

Lauseke

Lauseke (engl. expression) on koodin osa, jolla on jokin tyyppi. Ohjelman suorituksen aikana lauseke saa arvon, jota voidaan käyttää ohjelmassa.

Tarkastellaan muutamaa esimerkkiä lausekkeista:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LausekeArvoTyyppiTyyppi Pythonissa
2 + 4 + 39kokonaislukuint
\"abc\" + \"de\"\"abcde\"merkkijonostr
11 / 25.5liukulukufloat
2 * 5 > 9Truetotuusarvobool

Koska lausekkeella on arvo, voi sen sijoittaa muuttujaan:

# muuttuja x saa arvoksi lausekkeen 1 + 2 arvon\nx = 1 + 2

Yksinkertaisesta lausekkeesta saa muodostettua monimutkaisempia lausekkeita esim. laskuoperaattorien avulla:

# muuttuja y saa arvoksi lausekkeen '3 kertaa x plus x toiseen' arvon\ny = 3 * x + x**2

Funktio

Funktio (engl. function) suorittaa jonkin toiminnon. Funktiolla voi olla yksi tai useampi parametri (engl. parameter), jotka ilmaisevat, mitä funktion tulee tehdä tarkalleen.

Funktio suoritetaan, kun sitä kutsutaan eli koodissa on funktion nimi ja funktiolle annettavat parametrit suluissa. Esimerkiksi seuraava koodi kutsuu print-funktiota parametrilla \"tämä on parametri\":

print(\"tämä on parametri\")

Myös käyttäjältä syötteitä lukeva input on funktio. Parametrina funktio saa käyttäjälle näytettävän viestin:

nimi = input(\"Kerro nimesi: \")

Tässä tapauksessa funktio palauttaa arvon, mikä tarkoittaa, että funktion kutsukohtaan ilmestyy arvo funktion suorituksen jälkeen. Funktion input palauttama arvo on käyttäjän syöttämä teksti merkkijonona. Funktion palauttama arvo sijoitetaan usein muuttujan arvoksi, jotta arvoa voidaan hyödyntää ohjelmassa.

Tyyppi

Tyyppi (engl. type) tarkoittaa, millainen jokin koodissa esiintyvä arvo on. Esimerkiksi seuraavassa koodissa muuttujan nimi tyyppi on merkkijono ja muuttujan tulos tyyppi on kokonaisluku:

nimi = \"Anna\"\ntulos = 100

Funktio type kertoo annetun lausekkeen tyypin. Esimerkiksi:

print(type(\"Anna\"))\nprint(type(100))

<class 'str'>\n<class 'int'>

Syntaksi

Syntaksi (engl. syntax) määrittää, miten ohjelman koodi tulee kirjoittaa. Jokaisella ohjelmointikielellä on omanlainen syntaksinsa.

Esimerkiksi Python-kielen syntaksiin kuuluu, että if-lauseen aloitusrivin lopussa on kaksoispiste ja ehtoon kuuluva koodi on sisennetty:

if nimi == \"Anna\":\n    print(\"Moi!\")

Jos ohjelmointikielen syntaksia ei noudateta, seurauksena on virheilmoitus:

if nimi == \"Anna\"\n    print(\"Moi!\")
\n  File \"testi.py\", line 1\n    if nimi == \"Anna\"\n                    ^\nSyntaxError: invalid syntax\n

Debuggaaminen

Kun ohjelman syntaksi on kunnossa mutta ohjelma ei toimi halutulla tavalla, ohjelmassa on bugi.

Bugit ilmenevät eri tavoin. Jotkin bugit aiheuttavat suoritusaikaisen virheen. Esim. ohjelma

x = 10\ny = 0\ntulos = x / y\n\nprint(f\"{x} jaettuna {y} on {tulos}\")

aiheuttaa seuraavan virheen:

\nZeroDivisionError: integer division or modulo by zero on line 3\n

Ongelma on siis siinä, että nollalla jakaminen ei ole sallittua ja se keskeyttää ohjelman suorituksen.

Suoritusaikaiseen virheeseen johtavat bugit ovat usein helpohkoja korjata, sillä virheen aiheuttava rivi selviää virheilmoituksesta. Tosin virheen varsinainen syy eli bugi on usein muualla kuin virheilmoituksen aiheuttaneessa rivissä.

Joskus bugi taas ilmenee siten, että koodin tuottama tulos on virheellinen. Tälläisten bugien havaitseminen ja niiden syyn paikallistaminen voi olla haastavaa. Kurssin tehtävissä testit paljastavat usein juuri tämän kategorian bugeja. Ennen kuin ongelma päästään korjaamaan, on bugi paikallistettava.

Koodarijargonissa bugien syiden selvittämistä kutsutaan debuggaamiseksi. Debuggaaminen on äärimmäisen keskeinen taito, ja ammatikseen ohjelmoivat käyttävät usein enemmän aikaa debuggaamiseen kuin varsinaiseen ohjelmointiin.

Yksinkertainen mutta tehokas debuggauskeino on lisätä ohjelmaan debug-tulostuksia eli print-komentoja, joiden avulla varmistetaan, että koodissa tapahtuu ohjelmoijan olettamia asioita.

Seuraavassa on ratkaisuyritys yhteen edellisen osan tehtävään:

tuntipalkka = float(input(\"Tuntipalkka: \"))\ntunnit = int(input(\"Työtunnit: \"))\npaiva = input(\"Viikonpäivä: \")\n\npalkka = tuntipalkka * tunnit\nif paiva == \"sunnnuntai\":\n    palkka * 2\n\nprint(f\"Palkka {palkka} euroa\")

Ohjelma ei näytä toimivan oikein ja testien suoritus kertoo seuraavaa:

\nFAIL: PalkkaTest: test_sunnuntai_1\n\nSyötteellä 23.0, 12, sunnuntai oikeaa palkkaa 552.0 ei löydy tulosteestasi Palkka 276.0 euroa\n

Ensimmäinen askel debuggaamisessa on useimmiten kokeilla ohjelmaa ongelmallisella syötteellä. Kokeilu varmistaa, että tulos ei ole haluttu:

Palkka 276.0 euroa

Debugattaessa ohjelman toimintaa kokeillaan usein. Voikin olla hyödyllisä \"kovakoodata\" ongelman aiheuttavat syötteet suoraan koodiin sen sijaan, että ne kysyttäisiin joka kerta käyttäjältä. Tämä onnistuu esimerkiksi muuttamalla koodia tilapäisesti seuraavalla tavalla:

# tuntipalkka = float(input(\"Tuntipalkka: \"))\n# tunnit = int(input(\"Työtunnit: \"))\n# paiva = input(\"Viikonpäivä: \")\ntuntipalkka = 23.0\ntunnit = 12\npaiva = \"sunnuntai\"\n\npalkka = tuntipalkka * tunnit\nif paiva == \"sunnnuntai\":\n    palkka * 2\n\nprint(f\"Palkka {palkka} euroa\")

Seuraava askel on lisäillä koodiin debug-tulostuksia. Koska nimenomaan sunnuntain palkka lasketaan väärin, laitetaan sen hoitavaan osaan tulostukset korotusta ennen ja sen jälkeen:

# ...\n\npalkka = tuntipalkka * tunnit\nif paiva == \"sunnnuntai\":\n    print(\"palkka alussa:\", palkka)\n    palkka * 2\n    print(\"palkka kasvatuksen jälkeen:\", palkka)\n\nprint(f\"Palkka {palkka} euroa\")

Kun ohjelma nyt suoritetaan, ei debug-tulostuksia jostain syystä näy ollenkaan. Vaikuttaa siltä, että ohjelman suoritus ei edes mene if-haaraan. Komennon ehdossa täytyy siis olla jokin ongelma. Myös ehdon arvo voidaan tulostaa:

# ...\n\npalkka = tuntipalkka * tunnit\nprint(\"ehto:\", paiva==\"sunnnuntai\")\nif paiva == \"sunnnuntai\":\n    print(\"palkka alussa:\", palkka)\n    palkka * 2\n    print(\"palkka kasvatuksen jälkeen:\", palkka)\n\nprint(f\"Palkka {palkka} euroa\")

Ja tosiaan, kun koodi suoritetaan, ehdon arvo on False eli koodi hyppää if-lohkon ohi:

ehto: False\nPalkka 276.0 euroa

Vian täytyy siis olla if-komennon ehdossa, ja kun sitä katsotaan tarkemmin, huomataan, että sunnuntai on vahingossa kirjoitettu väärin. Korjataan typo:

# ...\n\npalkka = tuntipalkka * tunnit\nprint(\"ehto:\", paiva==\"sunnuntai\")\nif paiva == \"sunnuntai\":\n    print(\"palkka alussa:\", palkka)\n    palkka * 2\n    print(\"palkka kasvatuksen jälkeen:\", palkka)\n\nprint(f\"Palkka {palkka} euroa\")

Koodin suoritus aiheuttaa nyt seuraavan tulostuksen:

ehto: True\npalkka alussa: 276.0\npalkka kasvatuksen jälkeen: 276.0\nPalkka 276.0 euroa

Koska tuntipalkka = 23.0 ja tunnit = 12, vaikuttaa muuttujassa palkka olevan oikea arvo aluksi, mutta kasvatuskomento ei kuitenkaan kasvata muuttujan arvoa. Komento on siis mitä ilmeisimmin virheellinen. Ja toden totta, komento

palkka * 2

ainoastaan laskee tuplapalkan mutta ei tee tulokselle mitään. Korjataan komento muotoon, joka tallentaa korotetun palkan muuttujaan palkka:

palkka *= 2

Kun ohjelma suoritetaan nyt, huomataan että lopputuloskin on oikea:

ehto: True\npalkka alussa: 276.0\npalkka kasvatuksen jälkeen: 552.0\nPalkka 552.0 euroa

Kun ohjelma on kunnossa, tulee debuggaustulosteet ja muu debuggauksen takia kirjoitettu ylimääräinen koodi poistaa.

Esimerkki oli yksinkertainen ja näin lyhyessä ohjelmassa oleva bugi selviäisi varmasti myös koodia lukemalla. Monesti kuitenkin debug-tulostuksilla pääsee huomattavasti nopeammin jyvälle siitä, missä vika piilee. Tulostamalla voidaan usein varmistua siitä, mitkä osat ohjelmasta toimivat \"varmuudella\" oikein, ja bugien jäljitys voidaan nopeasti kohdistaa niihin koodiriveihin, joissa ongelma todennäköisesti piileskelee.

Debuggaukseen on olemassa muitakin keinoja kuin debug-tulostusten tekeminen. Palaamme asiaan myöhemmin kurssilla. Sinun kannattaa tästä lähtien kurssilla käyttää debug-tulostamista virheiden etsimiseen. Ohjelmoinnin ammattilaiset eivät selviä työstään ilman debug-tulostuksia, joten on vaikea kuvitella, ettei aloittelijoidenkin kannattaisi laajentaa työkalupakkiaan tältä osin.

Seuraavassa ohjelmassa on useita syntaksivirheitä. Korjaa ohjelma siten, että syntaksi on kunnossa ja se toimii alla olevien esimerkkien mukaisesti.

  luku = input(\"Anna luku: \")\n  if luku>100\n    print(\"Luku oli suurempi kuin sata\")\n    luku - 100\n    print(\"Nyt luvun arvo on pienentynyt sadalla)\n     print(\"Arvo on nyt\"+ luku)\n print(luku + \" taitaa olla onnenlukuni!\")\n print(\"Hyvää päivänjatkoa!)

Anna luku: 13\n13 taitaa olla onnenlukuni!\nHyvää päivänjatkoa!

Anna luku: 101\nLuku oli suurempi kuin sata\nNyt luvun arvo on pienentynyt sadalla\nArvo on nyt 1\n1 taitaa olla onnenlukuni!\nHyvää päivänjatkoa!

Funktiolla len voidaan laskea (muun muassa) merkkijonon pituus. Funktio palauttaa merkkijonossa olevien merkkien määrän.

Esimerkkejä funktion toiminnasta:

sana = \"abcd\"\nprint(len(sana))\n\nprint(len(\"moikka\"))\n\nsana2 = \"heipparallaa\"\npituus = len(sana2)\nprint(pituus)\n\ntyhja_merkkijono = \"\"\npituus = len(tyhja_merkkijono)\nprint(pituus)

4\n6\n12\n0

Tee ohjelma, joka lukee käyttäjältä sanan ja tulostaa sanan merkkien määrän, mikäli niitä on enemmän kuin yksi.

Esimerkkisuorituksia:

Anna sana: hei\nSanassa hei on 3 kirjainta\nKiitos!

Anna sana: banaani\nSanassa banaani on 7 kirjainta\nKiitos!

Anna sana: b\nKiitos!

Pythonissa voidaan usein muuntaa jokin arvo tyypistä toiseen. Esimerkiksi liukuluku voidaan muuntaa kokonaisluvuksi funktion int avulla:

\nlampo = float(input(\"Anna lämpötila: \"))\n\nprint(\"Lämpötila on\", lampo)\n\nprint(\"...eli pyöreästi\", int(lampo))\n

Anna lämpötila: 5.15\nLämpötila on 5.15\n...eli pyöreästi 5

Huomaa, että funktio ei pyöristä arvoa matematiikasta tutulla tavalla, vaan pyöristää luvun alaspäin (kyse on siis ns. lattiafunktiosta):

Anna lämpötila: 8.99\nLämpötila on 8.99\n...eli pyöreästi 8

Tee int-funktiota hyödyntäen ohjelma, joka kysyy käyttäjältä desimaaliluvun ja tulostaa erikseen luvun kokonaisosan ja desimaaliosan.

Huom! Voit olettaa, että annettu desimaaliluku on suurempi kuin nolla.

Esimerkiksi

Anna luku: 1.34\nKokonaisosa: 1\nDesimaaliosa: 0.34

","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-2/1-ohjelmoinnin-termeja.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-2/2-else-elif/page-data.json b/page-data/osa-2/2-else-elif/page-data.json index f654e787b..ac8c8ff9a 100644 --- a/page-data/osa-2/2-else-elif/page-data.json +++ b/page-data/osa-2/2-else-elif/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-2/2-else-elif", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat luoda vaihtoehtoisia haaroja toistolauseisiin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ymmärrät "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":"-, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":"- ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"else"}]},{"type":"text","value":"-lauseiden merkityksen ehtolauseessa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat soveltaa jakojäännöstä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"%"}]},{"type":"text","value":" ehdoissa"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan ohjelmaa, joka tulostaa tiedon siitä, onko käyttäjän syöte negatiivinen vai positiivinen tai nolla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on negatiivinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on positiivinen tai nolla\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma on hiukan kömpelö. Jokaisen mahdollisen syötteen kohdalla halutaan suorittaa vain toinen lohkoista, koska aina pätee joko "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku < 0"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku >= 0"}]},{"type":"text","value":". Ensimmäinen vertailu sisältää tavallaan kaiken olennaisen: jos tulos on tosi, luku on negatiivinen, ja jos se on epätosi, luku on positiivinen tai nolla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toisen vertailun sijasta onkin usein näppärämpää luoda vaihtoehtoinen haara, joka suoritetaan, "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"jos ehto on epätosi"}]},{"type":"text","value":". Tätä tarkoitusta varten käytetään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"else"}]},{"type":"text","value":"-lausetta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellinen esimerkki kirjoitettuna uudestaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on negatiivinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on positiivinen tai nolla\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun käytetään if-else-rakennetta, suoritetaan vaihtoehtoisista lohkoista aina jompikumpi. Seuraava kuva havainnollistaa asiaa:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 400px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/35830d6bd78153ffe23d80092b0482cb/e17e5/2_2_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 148.2608695652174%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOUlEQVRIx5WWx67CQAxF+f9PYsUWgdjQRS+i997n6VjPaHAmlJGskIlzfT3Xdki4//V4PJ5XNbvPOhwO7n6/v+z5KxEHaMF1b7Vauev1Ggz+Amgj2t9632q13PF4DAbEIgxvt5tbr9cRIBap5nI5N5lMXNyKAJ5OJzedTiPnNhwOXa1Wk2fdbldssViIvxpkIoDn81kclZGeG6mWy2XX6XRcpVIR8MFg4ObzuVsul8J6PB6HGSqgFWi/38uLBLhcLs6e/2w2+wxoBSqVSi8Z6DOUF0ArfRxDGG02G5dKpVyz2RQ/P9jPgDiTMgcPOKn7aT8Brew4hQA5ePYbjYaorgr7JYVPot1uu0wm4/L5vCsWi67X64lyIYa73U5egiU+PiDsqYAEm9xst1u5YlYUFsUOCM8wUgZYF8oXCoVoyrYOORs1Wq7f70tQWwHPlEOiaMqj0Ug6g3S1gGES6nEC4vu2Dv2eRSxNmRcBtoAfCxtAbT9ASFmLGba2Uwj4tpcB9MsGUDqFAq/X69LbBOFehQoyhLoFBIz6w9ijWxgY+FMhGMcSAeQslCEgus8LBFKhfHGC8zA0pe1c5EowbbmvJravnAVk0XrUYWiiv/1IKUM/Zdhls1mZ1lo2NmCkU3wnZchCSUzbk2d2hMUCqgMjHVYIkU6n5T6ZTMr4p4y+ArRfQP0AUXdMG8ApHRT/GjD0r4CCpxP4+gH29Rm++1uiY8ofW7Eqf2Kq12q1KqnHfcR+BiRl+1fEZ/gH+rYob4TljzUAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/35830d6bd78153ffe23d80092b0482cb/a0b58/2_2_1.webp 230w","/static/35830d6bd78153ffe23d80092b0482cb/7f61c/2_2_1.webp 400w"],"sizes":"(max-width: 400px) 100vw, 400px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/35830d6bd78153ffe23d80092b0482cb/81c8e/2_2_1.png 230w","/static/35830d6bd78153ffe23d80092b0482cb/e17e5/2_2_1.png 400w"],"sizes":"(max-width: 400px) 100vw, 400px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/35830d6bd78153ffe23d80092b0482cb/e17e5/2_2_1.png","alt":"2 2 1","title":"2 2 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että else-haaraa ei voi olla olemassa ilman edeltävää if-haaraa. Koko if-else-rakenne lohkoineen muodostaa yhden "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ehtolauseen"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava esimerkki tutkii, onko käyttäjän syöttämä luku parillinen vai ei. Parillisuuden selvittämiseen käytetään jakojäännösoperaattoria "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"%"}]},{"type":"text","value":". Jakojäännöksellä on kätevä testata luvun parillisuutta: jos luvun jakojäännös kahdella on nolla, luku on parillinen, ja muuten pariton."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on parillinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on pariton\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nLuku on pariton"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kolmas esimerkki, jossa vertaillaan merkkijonojen samuutta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"oikea "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kissa\""}]},{"type":"text","value":"\nsalasana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna salasana: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" salasana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" oikea"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tervetuloa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pääsy kielletty\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kaksi esimerkkisuoritusta eri syötteillä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna salasana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kissa"}]},{"type":"text","value":"\nTervetuloa"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna salasana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"apina"}]},{"type":"text","value":"\nPääsy kielletty"}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Täysi-ikäisyys","tmcname":"osa02-04_taysi_ikaisyys","height":"400px"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjän ikää ja kertoo, onko tämä täysi-ikäinen (eli 18-vuotias tai vanhempi)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostuksia:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuinka vanha olet? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"12"}]},{"type":"text","value":"\nEt ole täysi-ikäinen!"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuinka vanha olet? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"32"}]},{"type":"text","value":"\nOlet täysi-ikäinen!"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"vaihtoehtoiset-haarat-elif-lauseella","style":"position:relative;"},"children":[{"type":"text","value":"Vaihtoehtoiset haarat elif-lauseella"},{"type":"element","tagName":"a","properties":{"href":"#vaihtoehtoiset-haarat-elif-lauseella","ariaLabel":"vaihtoehtoiset haarat elif lauseella permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Usein vaihtoehtoja on kuitenkin enemmän kuin kaksi. Esimerkiksi jalkapallo-ottelun lopputulosta käsitellessä olisi hyvä varautua kolmeen vaihtoehtoiseen lopputulokseen kotijoukkueen kannalta: voitto, häviö tai tasapeli."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ehtolausetta voidaan laajentaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":"-haaralla. Se on lyhenne sanoista \"else if\", ja tarkoittaa nimensä mukaisesti vaihtoehtoa alkuperäiselle ehdolle."}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 498px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/22229d7c746f99d073f0131c022eae85/79e1b/2_2_2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 168.69565217391306%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAiCAYAAABfqvm9AAAACXBIWXMAAAsTAAALEwEAmpwYAAACPklEQVRIx52W167CMBBE8/8/h3gB0RG99958dSwNWhwngWvJ4Ky949maJM4593q9nP5j6/D5fr+7y+USPZdYhay1vYQB2G63+9jXTEKG1+s1k6HGcDh0g8HAxcYH4PP5dMvlMnoz43g8eqBer+fndDp1h8PBMz6fz+7xeKQBN5uNy/Ire5VKxXW73feEwH6/9y5YrVZpwPV6XWgyirLEDnRzAbOYwrJarb51kEu3EDAEZR/TmaztOWSFJltmOH273brRaOSDwRod5eZisfjeh5KhxBkAWQuQoLRarWKTkWkiIz0Iynw+d7fb7eOsN9kysYC6FUX5y/ovBJN/E0XIRkoDH0nxm/GOcii0DFWKXIbjuWQ2m/mJH7mQScDIzYQSqtfr3qEAxBgCRgDG47Erl8uu2Wz6841Gw+djv9/3ulRMwo/8Qk3GAMVMnYYzsFELSzUHmxYxQMxRjav0YBxtX/YhKygwtIDtdttPW3oCz8zD0IdqqEpsJkzD8iwEhB3JTD4qeemJijYXcOZrhvgPmUwkGMhJGRjCnPW/TT6dTu+Gyh7sfwYMg2IHF/wMiNliCDvkTNb/Zqjo8h5hLVBeXLmANhVsLcMEoE6n8xug9ZUF1EAZOecwOerDrHeIBbTVBEuaQ2FQwneIGob25GNMZU/5GGUYNgkxlL8wj0+QWq3mSqWSb1u0L1pXqlLyQC1rFClBAkcwWJNSqVrOAwtlRJvym0wmH/79yuSw10mOz2JfGLkmhxdYQBjGGiwm/wESm2QC2G3IagAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/22229d7c746f99d073f0131c022eae85/a0b58/2_2_2.webp 230w","/static/22229d7c746f99d073f0131c022eae85/bc10c/2_2_2.webp 460w","/static/22229d7c746f99d073f0131c022eae85/71ce1/2_2_2.webp 498w"],"sizes":"(max-width: 498px) 100vw, 498px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/22229d7c746f99d073f0131c022eae85/81c8e/2_2_2.png 230w","/static/22229d7c746f99d073f0131c022eae85/08a84/2_2_2.png 460w","/static/22229d7c746f99d073f0131c022eae85/79e1b/2_2_2.png 498w"],"sizes":"(max-width: 498px) 100vw, 498px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/22229d7c746f99d073f0131c022eae85/79e1b/2_2_2.png","alt":"2 2 2","title":"2 2 2","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkiä, jossa selvitetään ottelun voittaja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"maalit_koti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kotijoukkueen maalimäärä: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmaalit_vieras "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vierasjoukkueen maalimäärä: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" maalit_koti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" maalit_vieras"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kotijoukkue voitti!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" maalit_vieras "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" maalit_koti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vierasjoukkue voitti!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tasapeli!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kolme esimerkkitulosta eri syötteillä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kotijoukkueen maalimäärä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nVierasjoukkueen maalimäärä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nKotijoukkue voitti!"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kotijoukkueen maalimäärä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nVierasjoukkueen maalimäärä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"6"}]},{"type":"text","value":"\nVierasjoukkue voitti!"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kotijoukkueen maalimäärä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nVierasjoukkueen maalimäärä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nTasapeli!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkissä ehtolauseessa on siis kolme vaihtoehtoista haaraa, joista suoritetaan aina yksi. Ehtolauseessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":"-haaroja voi olla useampia, eikä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"else"}]},{"type":"text","value":"-haara ole pakollinen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Joulukalenteri\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npvm "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikä päivä nyt on? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" pvm "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"24.12.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nyt on jouluaatto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" pvm "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"25.12.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nyt on joulupäivä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" pvm "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"26.12.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nyt on tapaninpäivä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kiitos ja hei.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joulukalenteri\nMikä päivä nyt on? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"25.12."}]},{"type":"text","value":"\nNyt on joulupäivä\nKiitos ja hei."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että ehtolauseessa ei edellisessä esimerkissä ole ollenkaan else-haaraa. Jos käyttäjä syöttää jonkin sellaisen päivämäärän, joka ei täytä ehtoa jossain "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":"- tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":"-lauseessa, ohjelmassa ei suoriteta mitään ehtolauseen kolmesta lohkosta."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joulukalenteri\nMikä päivä nyt on? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1.1."}]},{"type":"text","value":"\nKiitos ja hei."}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":" Suurempi tai yhtäsuuri","tmcname":"osa02-05_suurempi_tai_yhtasuuri","height":"400px"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä kaksi kokonaislukua ja tulostaa niistä suuremman. Jos luvut ovat yhtä suuret, ohjelma huomaa myös tämän."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostuksia:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna ensimmäinen luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nAnna toinen luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nSuurempi luku: 5"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna ensimmäinen luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nAnna toinen luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"8"}]},{"type":"text","value":"\nSuurempi luku: 8"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna ensimmäinen luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nAnna toinen luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nLuvut ovat yhtä suuret!"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Vanhempi","tmcname":"osa02-06_vanhempi","height":"550px"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy kahden henkilön nimen ja iän ja tulostaa vanhemman henkilön nimen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisyötteitä"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Henkilö 1:\nNimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Teppo"}]},{"type":"text","value":"\nIkä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"26"}]},{"type":"text","value":"\nHenkilö 2:\nNimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Tiina"}]},{"type":"text","value":"\nIkä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"27"}]},{"type":"text","value":"\nVanhempi on Tiina"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Henkilö 1:\nNimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Antti"}]},{"type":"text","value":"\nIkä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nHenkilö 2:\nNimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Venla"}]},{"type":"text","value":"\nIkä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nAntti ja Venla ovat yhtä vanhoja"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Aakkosjärjestyksessä viimeinen","tmcname":"osa02-07_aakkkosjarjestyksessa_viimeinen","height":"500px"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lukujen lisäksi Python osaa vertailla myös merkkijonojen suuruusjärjestystä. Merkkijono a on pienempi kuin merkkijono b, jos merkkijono a tulee aakkosjärjestyksessä ennen jonoa b.\nHuomaa kuitenkin, että tämä pätee varmasti vain kun"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"vertaillaan samankokoisia kirjaimia (eli ISOJA tai pieniä kirjaimia) keskenään ja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"vertailtavissa sanoissa on vain englannin kielestä tuttuja kirjaimia (eli a-z tai A-Z)."}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä kahta sanaa. Ohjelma tulostaa sanoista sen, joka on aakkosjärjestyksessä jälkimmäinen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa, että sanat on syötetty kokonaan pienillä kirjaimilla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuorituksia eri syötteillä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna 1. sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"auto"}]},{"type":"text","value":"\nAnna 2. sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"mopo"}]},{"type":"text","value":"\nmopo on aakkosjärjestyksessä viimeinen."}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna 1. sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"zorro"}]},{"type":"text","value":"\nAnna 2. sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"batman"}]},{"type":"text","value":"\nzorro on aakkosjärjestyksessä viimeinen."}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna 1. sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"python"}]},{"type":"text","value":"\nAnna 2. sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"python"}]},{"type":"text","value":"\nAnnoit saman sanan kahdesti."}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat luoda vaihtoehtoisia haaroja toistolauseisiin
  • \n
  • Ymmärrät if-, elif- ja else-lauseiden merkityksen ehtolauseessa
  • \n
  • Osaat soveltaa jakojäännöstä % ehdoissa
  • \n

Tarkastellaan ohjelmaa, joka tulostaa tiedon siitä, onko käyttäjän syöte negatiivinen vai positiivinen tai nolla:

luku = int(input(\"Anna luku: \"))\n\nif luku < 0:\n    print(\"Luku on negatiivinen\")\n\nif luku >= 0:\n    print(\"Luku on positiivinen tai nolla\")

Ohjelma on hiukan kömpelö. Jokaisen mahdollisen syötteen kohdalla halutaan suorittaa vain toinen lohkoista, koska aina pätee joko luku < 0 tai luku >= 0. Ensimmäinen vertailu sisältää tavallaan kaiken olennaisen: jos tulos on tosi, luku on negatiivinen, ja jos se on epätosi, luku on positiivinen tai nolla.

Toisen vertailun sijasta onkin usein näppärämpää luoda vaihtoehtoinen haara, joka suoritetaan, jos ehto on epätosi. Tätä tarkoitusta varten käytetään else-lausetta.

Edellinen esimerkki kirjoitettuna uudestaan:

luku = int(input(\"Anna luku: \"))\n\nif luku < 0:\n    print(\"Luku on negatiivinen\")\nelse:\n    print(\"Luku on positiivinen tai nolla\")

Kun käytetään if-else-rakennetta, suoritetaan vaihtoehtoisista lohkoista aina jompikumpi. Seuraava kuva havainnollistaa asiaa:

\n \n \n \n \n \n \"2\n \n \n

Tarkastellaan esimerkkiä, jossa selvitetään ottelun voittaja:

maalit_koti = int(input(\"Kotijoukkueen maalimäärä: \"))\nmaalit_vieras = int(input(\"Vierasjoukkueen maalimäärä: \"))\n\nif maalit_koti > maalit_vieras:\n    print(\"Kotijoukkue voitti!\")\nelif maalit_vieras > maalit_koti:\n    print(\"Vierasjoukkue voitti!\")\nelse:\n    print(\"Tasapeli!\")

Kolme esimerkkitulosta eri syötteillä:

Kotijoukkueen maalimäärä: 4\nVierasjoukkueen maalimäärä: 2\nKotijoukkue voitti!

Kotijoukkueen maalimäärä: 0\nVierasjoukkueen maalimäärä: 6\nVierasjoukkue voitti!

Kotijoukkueen maalimäärä: 3\nVierasjoukkueen maalimäärä: 3\nTasapeli!

Esimerkissä ehtolauseessa on siis kolme vaihtoehtoista haaraa, joista suoritetaan aina yksi. Ehtolauseessa elif-haaroja voi olla useampia, eikä else-haara ole pakollinen.

Esimerkiksi:

print(\"Joulukalenteri\")\npvm = input(\"Mikä päivä nyt on? \")\n\nif pvm == \"24.12.\":\n    print(\"Nyt on jouluaatto\")\nelif pvm == \"25.12.\":\n    print(\"Nyt on joulupäivä\")\nelif pvm == \"26.12.\":\n    print(\"Nyt on tapaninpäivä\")\n\nprint(\"Kiitos ja hei.\")

Joulukalenteri\nMikä päivä nyt on? 25.12.\nNyt on joulupäivä\nKiitos ja hei.

Huomaa, että ehtolauseessa ei edellisessä esimerkissä ole ollenkaan else-haaraa. Jos käyttäjä syöttää jonkin sellaisen päivämäärän, joka ei täytä ehtoa jossain if- tai elif-lauseessa, ohjelmassa ei suoriteta mitään ehtolauseen kolmesta lohkosta.

Joulukalenteri\nMikä päivä nyt on? 1.1.\nKiitos ja hei.

Tee ohjelma, joka kysyy käyttäjältä kaksi kokonaislukua ja tulostaa niistä suuremman. Jos luvut ovat yhtä suuret, ohjelma huomaa myös tämän.

Esimerkkitulostuksia:

Anna ensimmäinen luku: 5\nAnna toinen luku: 3\nSuurempi luku: 5

Anna ensimmäinen luku: 5\nAnna toinen luku: 8\nSuurempi luku: 8

Anna ensimmäinen luku: 5\nAnna toinen luku: 5\nLuvut ovat yhtä suuret!

Tee ohjelma, joka kysyy kahden henkilön nimen ja iän ja tulostaa vanhemman henkilön nimen.

Esimerkkisyötteitä

Henkilö 1:\nNimi: Teppo\nIkä: 26\nHenkilö 2:\nNimi: Tiina\nIkä: 27\nVanhempi on Tiina

Henkilö 1:\nNimi: Antti\nIkä: 1\nHenkilö 2:\nNimi: Venla\nIkä: 1\nAntti ja Venla ovat yhtä vanhoja

Lukujen lisäksi Python osaa vertailla myös merkkijonojen suuruusjärjestystä. Merkkijono a on pienempi kuin merkkijono b, jos merkkijono a tulee aakkosjärjestyksessä ennen jonoa b.\nHuomaa kuitenkin, että tämä pätee varmasti vain kun

    \n
  • vertaillaan samankokoisia kirjaimia (eli ISOJA tai pieniä kirjaimia) keskenään ja
  • \n
  • vertailtavissa sanoissa on vain englannin kielestä tuttuja kirjaimia (eli a-z tai A-Z).
  • \n

Tee ohjelma, joka kysyy käyttäjältä kahta sanaa. Ohjelma tulostaa sanoista sen, joka on aakkosjärjestyksessä jälkimmäinen.

Voit olettaa, että sanat on syötetty kokonaan pienillä kirjaimilla.

Esimerkkisuorituksia eri syötteillä:

Anna 1. sana: auto\nAnna 2. sana: mopo\nmopo on aakkosjärjestyksessä viimeinen.

Anna 1. sana: zorro\nAnna 2. sana: batman\nzorro on aakkosjärjestyksessä viimeinen.

Anna 1. sana: python\nAnna 2. sana: python\nAnnoit saman sanan kahdesti.

","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-2/2-else-elif.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat luoda vaihtoehtoisia haaroja toistolauseisiin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ymmärrät "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":"-, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":"- ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"else"}]},{"type":"text","value":"-lauseiden merkityksen ehtolauseessa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat soveltaa jakojäännöstä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"%"}]},{"type":"text","value":" ehdoissa"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan ohjelmaa, joka tulostaa tiedon siitä, onko käyttäjän syöte negatiivinen vai positiivinen tai nolla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on negatiivinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on positiivinen tai nolla\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma on hiukan kömpelö. Jokaisen mahdollisen syötteen kohdalla halutaan suorittaa vain toinen lohkoista, koska aina pätee joko "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku < 0"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku >= 0"}]},{"type":"text","value":". Ensimmäinen vertailu sisältää tavallaan kaiken olennaisen: jos tulos on tosi, luku on negatiivinen, ja jos se on epätosi, luku on positiivinen tai nolla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toisen vertailun sijasta onkin usein näppärämpää luoda vaihtoehtoinen haara, joka suoritetaan, "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"jos ehto on epätosi"}]},{"type":"text","value":". Tätä tarkoitusta varten käytetään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"else"}]},{"type":"text","value":"-lausetta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellinen esimerkki kirjoitettuna uudestaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on negatiivinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on positiivinen tai nolla\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun käytetään if-else-rakennetta, suoritetaan vaihtoehtoisista lohkoista aina jompikumpi. Seuraava kuva havainnollistaa asiaa:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 400px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/35830d6bd78153ffe23d80092b0482cb/e17e5/2_2_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 148.2608695652174%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOUlEQVRIx5WWx67CQAxF+f9PYsUWgdjQRS+i997n6VjPaHAmlJGskIlzfT3Xdki4//V4PJ5XNbvPOhwO7n6/v+z5KxEHaMF1b7Vauev1Ggz+Amgj2t9632q13PF4DAbEIgxvt5tbr9cRIBap5nI5N5lMXNyKAJ5OJzedTiPnNhwOXa1Wk2fdbldssViIvxpkIoDn81kclZGeG6mWy2XX6XRcpVIR8MFg4ObzuVsul8J6PB6HGSqgFWi/38uLBLhcLs6e/2w2+wxoBSqVSi8Z6DOUF0ArfRxDGG02G5dKpVyz2RQ/P9jPgDiTMgcPOKn7aT8Brew4hQA5ePYbjYaorgr7JYVPot1uu0wm4/L5vCsWi67X64lyIYa73U5egiU+PiDsqYAEm9xst1u5YlYUFsUOCM8wUgZYF8oXCoVoyrYOORs1Wq7f70tQWwHPlEOiaMqj0Ug6g3S1gGES6nEC4vu2Dv2eRSxNmRcBtoAfCxtAbT9ASFmLGba2Uwj4tpcB9MsGUDqFAq/X69LbBOFehQoyhLoFBIz6w9ijWxgY+FMhGMcSAeQslCEgus8LBFKhfHGC8zA0pe1c5EowbbmvJravnAVk0XrUYWiiv/1IKUM/Zdhls1mZ1lo2NmCkU3wnZchCSUzbk2d2hMUCqgMjHVYIkU6n5T6ZTMr4p4y+ArRfQP0AUXdMG8ApHRT/GjD0r4CCpxP4+gH29Rm++1uiY8ofW7Eqf2Kq12q1KqnHfcR+BiRl+1fEZ/gH+rYob4TljzUAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/35830d6bd78153ffe23d80092b0482cb/a0b58/2_2_1.webp 230w","/static/35830d6bd78153ffe23d80092b0482cb/7f61c/2_2_1.webp 400w"],"sizes":"(max-width: 400px) 100vw, 400px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/35830d6bd78153ffe23d80092b0482cb/81c8e/2_2_1.png 230w","/static/35830d6bd78153ffe23d80092b0482cb/e17e5/2_2_1.png 400w"],"sizes":"(max-width: 400px) 100vw, 400px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/35830d6bd78153ffe23d80092b0482cb/e17e5/2_2_1.png","alt":"2 2 1","title":"2 2 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että else-haaraa ei voi olla olemassa ilman edeltävää if-haaraa. Koko if-else-rakenne lohkoineen muodostaa yhden "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ehtolauseen"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava esimerkki tutkii, onko käyttäjän syöttämä luku parillinen vai ei. Parillisuuden selvittämiseen käytetään jakojäännösoperaattoria "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"%"}]},{"type":"text","value":". Jakojäännöksellä on kätevä testata luvun parillisuutta: jos luvun jakojäännös kahdella on nolla, luku on parillinen, ja muuten pariton."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on parillinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on pariton\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nLuku on pariton"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kolmas esimerkki, jossa vertaillaan merkkijonojen samuutta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"oikea "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kissa\""}]},{"type":"text","value":"\nsalasana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna salasana: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" salasana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" oikea"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tervetuloa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pääsy kielletty\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kaksi esimerkkisuoritusta eri syötteillä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna salasana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kissa"}]},{"type":"text","value":"\nTervetuloa"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna salasana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"apina"}]},{"type":"text","value":"\nPääsy kielletty"}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Täysi-ikäisyys","tmcname":"osa02-04_taysi_ikaisyys","height":"400px"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjän ikää ja kertoo, onko tämä täysi-ikäinen (eli 18-vuotias tai vanhempi)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostuksia:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuinka vanha olet? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"12"}]},{"type":"text","value":"\nEt ole täysi-ikäinen!"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuinka vanha olet? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"32"}]},{"type":"text","value":"\nOlet täysi-ikäinen!"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"vaihtoehtoiset-haarat-elif-lauseella","style":"position:relative;"},"children":[{"type":"text","value":"Vaihtoehtoiset haarat elif-lauseella"},{"type":"element","tagName":"a","properties":{"href":"#vaihtoehtoiset-haarat-elif-lauseella","ariaLabel":"vaihtoehtoiset haarat elif lauseella permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Usein vaihtoehtoja on kuitenkin enemmän kuin kaksi. Esimerkiksi jalkapallo-ottelun lopputulosta käsitellessä olisi hyvä varautua kolmeen vaihtoehtoiseen lopputulokseen kotijoukkueen kannalta: voitto, häviö tai tasapeli."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ehtolausetta voidaan laajentaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":"-haaralla. Se on lyhenne sanoista \"else if\", ja tarkoittaa nimensä mukaisesti vaihtoehtoa alkuperäiselle ehdolle."}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 498px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/22229d7c746f99d073f0131c022eae85/79e1b/2_2_2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 168.69565217391306%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAiCAYAAABfqvm9AAAACXBIWXMAAAsTAAALEwEAmpwYAAACPklEQVRIx52W167CMBBE8/8/h3gB0RG99958dSwNWhwngWvJ4Ky949maJM4593q9nP5j6/D5fr+7y+USPZdYhay1vYQB2G63+9jXTEKG1+s1k6HGcDh0g8HAxcYH4PP5dMvlMnoz43g8eqBer+fndDp1h8PBMz6fz+7xeKQBN5uNy/Ire5VKxXW73feEwH6/9y5YrVZpwPV6XWgyirLEDnRzAbOYwrJarb51kEu3EDAEZR/TmaztOWSFJltmOH273brRaOSDwRod5eZisfjeh5KhxBkAWQuQoLRarWKTkWkiIz0Iynw+d7fb7eOsN9kysYC6FUX5y/ovBJN/E0XIRkoDH0nxm/GOcii0DFWKXIbjuWQ2m/mJH7mQScDIzYQSqtfr3qEAxBgCRgDG47Erl8uu2Wz6841Gw+djv9/3ulRMwo/8Qk3GAMVMnYYzsFELSzUHmxYxQMxRjav0YBxtX/YhKygwtIDtdttPW3oCz8zD0IdqqEpsJkzD8iwEhB3JTD4qeemJijYXcOZrhvgPmUwkGMhJGRjCnPW/TT6dTu+Gyh7sfwYMg2IHF/wMiNliCDvkTNb/Zqjo8h5hLVBeXLmANhVsLcMEoE6n8xug9ZUF1EAZOecwOerDrHeIBbTVBEuaQ2FQwneIGob25GNMZU/5GGUYNgkxlL8wj0+QWq3mSqWSb1u0L1pXqlLyQC1rFClBAkcwWJNSqVrOAwtlRJvym0wmH/79yuSw10mOz2JfGLkmhxdYQBjGGiwm/wESm2QC2G3IagAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/22229d7c746f99d073f0131c022eae85/a0b58/2_2_2.webp 230w","/static/22229d7c746f99d073f0131c022eae85/bc10c/2_2_2.webp 460w","/static/22229d7c746f99d073f0131c022eae85/71ce1/2_2_2.webp 498w"],"sizes":"(max-width: 498px) 100vw, 498px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/22229d7c746f99d073f0131c022eae85/81c8e/2_2_2.png 230w","/static/22229d7c746f99d073f0131c022eae85/08a84/2_2_2.png 460w","/static/22229d7c746f99d073f0131c022eae85/79e1b/2_2_2.png 498w"],"sizes":"(max-width: 498px) 100vw, 498px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/22229d7c746f99d073f0131c022eae85/79e1b/2_2_2.png","alt":"2 2 2","title":"2 2 2","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkiä, jossa selvitetään ottelun voittaja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"maalit_koti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kotijoukkueen maalimäärä: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmaalit_vieras "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vierasjoukkueen maalimäärä: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" maalit_koti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" maalit_vieras"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kotijoukkue voitti!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" maalit_vieras "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" maalit_koti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vierasjoukkue voitti!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tasapeli!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kolme esimerkkitulosta eri syötteillä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kotijoukkueen maalimäärä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nVierasjoukkueen maalimäärä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nKotijoukkue voitti!"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kotijoukkueen maalimäärä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nVierasjoukkueen maalimäärä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"6"}]},{"type":"text","value":"\nVierasjoukkue voitti!"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kotijoukkueen maalimäärä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nVierasjoukkueen maalimäärä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nTasapeli!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkissä ehtolauseessa on siis kolme vaihtoehtoista haaraa, joista suoritetaan aina yksi. Ehtolauseessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":"-haaroja voi olla useampia, eikä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"else"}]},{"type":"text","value":"-haara ole pakollinen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Joulukalenteri\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npvm "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikä päivä nyt on? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" pvm "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"24.12.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nyt on jouluaatto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" pvm "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"25.12.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nyt on joulupäivä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" pvm "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"26.12.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nyt on tapaninpäivä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kiitos ja hei.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joulukalenteri\nMikä päivä nyt on? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"25.12."}]},{"type":"text","value":"\nNyt on joulupäivä\nKiitos ja hei."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että ehtolauseessa ei edellisessä esimerkissä ole ollenkaan else-haaraa. Jos käyttäjä syöttää jonkin sellaisen päivämäärän, joka ei täytä ehtoa jossain "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":"- tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":"-lauseessa, ohjelmassa ei suoriteta mitään ehtolauseen kolmesta lohkosta."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joulukalenteri\nMikä päivä nyt on? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1.1."}]},{"type":"text","value":"\nKiitos ja hei."}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":" Suurempi tai yhtäsuuri","tmcname":"osa02-05_suurempi_tai_yhtasuuri","height":"400px"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä kaksi kokonaislukua ja tulostaa niistä suuremman. Jos luvut ovat yhtä suuret, ohjelma huomaa myös tämän."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostuksia:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna ensimmäinen luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nAnna toinen luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nSuurempi luku: 5"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna ensimmäinen luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nAnna toinen luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"8"}]},{"type":"text","value":"\nSuurempi luku: 8"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna ensimmäinen luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nAnna toinen luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nLuvut ovat yhtä suuret!"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Vanhempi","tmcname":"osa02-06_vanhempi","height":"550px"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy kahden henkilön nimen ja iän ja tulostaa vanhemman henkilön nimen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisyötteitä"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Henkilö 1:\nNimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Teppo"}]},{"type":"text","value":"\nIkä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"26"}]},{"type":"text","value":"\nHenkilö 2:\nNimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Tiina"}]},{"type":"text","value":"\nIkä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"27"}]},{"type":"text","value":"\nVanhempi on Tiina"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Henkilö 1:\nNimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Antti"}]},{"type":"text","value":"\nIkä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nHenkilö 2:\nNimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Venla"}]},{"type":"text","value":"\nIkä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nAntti ja Venla ovat yhtä vanhoja"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Aakkosjärjestyksessä viimeinen","tmcname":"osa02-07_aakkkosjarjestyksessa_viimeinen","height":"500px"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lukujen lisäksi Python osaa vertailla myös merkkijonojen suuruusjärjestystä. Merkkijono a on pienempi kuin merkkijono b, jos merkkijono a tulee aakkosjärjestyksessä ennen jonoa b.\nHuomaa kuitenkin, että tämä pätee varmasti vain kun"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"vertaillaan samankokoisia kirjaimia (eli ISOJA tai pieniä kirjaimia) keskenään ja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"vertailtavissa sanoissa on vain englannin kielestä tuttuja kirjaimia (eli a-z tai A-Z)."}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä kahta sanaa. Ohjelma tulostaa sanoista sen, joka on aakkosjärjestyksessä jälkimmäinen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa, että sanat on syötetty kokonaan pienillä kirjaimilla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuorituksia eri syötteillä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna 1. sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"auto"}]},{"type":"text","value":"\nAnna 2. sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"mopo"}]},{"type":"text","value":"\nmopo on aakkosjärjestyksessä viimeinen."}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna 1. sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"zorro"}]},{"type":"text","value":"\nAnna 2. sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"batman"}]},{"type":"text","value":"\nzorro on aakkosjärjestyksessä viimeinen."}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna 1. sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"python"}]},{"type":"text","value":"\nAnna 2. sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"python"}]},{"type":"text","value":"\nAnnoit saman sanan kahdesti."}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat luoda vaihtoehtoisia haaroja toistolauseisiin
  • \n
  • Ymmärrät if-, elif- ja else-lauseiden merkityksen ehtolauseessa
  • \n
  • Osaat soveltaa jakojäännöstä % ehdoissa
  • \n

Tarkastellaan ohjelmaa, joka tulostaa tiedon siitä, onko käyttäjän syöte negatiivinen vai positiivinen tai nolla:

luku = int(input(\"Anna luku: \"))\n\nif luku < 0:\n    print(\"Luku on negatiivinen\")\n\nif luku >= 0:\n    print(\"Luku on positiivinen tai nolla\")

Ohjelma on hiukan kömpelö. Jokaisen mahdollisen syötteen kohdalla halutaan suorittaa vain toinen lohkoista, koska aina pätee joko luku < 0 tai luku >= 0. Ensimmäinen vertailu sisältää tavallaan kaiken olennaisen: jos tulos on tosi, luku on negatiivinen, ja jos se on epätosi, luku on positiivinen tai nolla.

Toisen vertailun sijasta onkin usein näppärämpää luoda vaihtoehtoinen haara, joka suoritetaan, jos ehto on epätosi. Tätä tarkoitusta varten käytetään else-lausetta.

Edellinen esimerkki kirjoitettuna uudestaan:

luku = int(input(\"Anna luku: \"))\n\nif luku < 0:\n    print(\"Luku on negatiivinen\")\nelse:\n    print(\"Luku on positiivinen tai nolla\")

Kun käytetään if-else-rakennetta, suoritetaan vaihtoehtoisista lohkoista aina jompikumpi. Seuraava kuva havainnollistaa asiaa:

\n \n \n \n \n \n \"2\n \n \n

Tarkastellaan esimerkkiä, jossa selvitetään ottelun voittaja:

maalit_koti = int(input(\"Kotijoukkueen maalimäärä: \"))\nmaalit_vieras = int(input(\"Vierasjoukkueen maalimäärä: \"))\n\nif maalit_koti > maalit_vieras:\n    print(\"Kotijoukkue voitti!\")\nelif maalit_vieras > maalit_koti:\n    print(\"Vierasjoukkue voitti!\")\nelse:\n    print(\"Tasapeli!\")

Kolme esimerkkitulosta eri syötteillä:

Kotijoukkueen maalimäärä: 4\nVierasjoukkueen maalimäärä: 2\nKotijoukkue voitti!

Kotijoukkueen maalimäärä: 0\nVierasjoukkueen maalimäärä: 6\nVierasjoukkue voitti!

Kotijoukkueen maalimäärä: 3\nVierasjoukkueen maalimäärä: 3\nTasapeli!

Esimerkissä ehtolauseessa on siis kolme vaihtoehtoista haaraa, joista suoritetaan aina yksi. Ehtolauseessa elif-haaroja voi olla useampia, eikä else-haara ole pakollinen.

Esimerkiksi:

print(\"Joulukalenteri\")\npvm = input(\"Mikä päivä nyt on? \")\n\nif pvm == \"24.12.\":\n    print(\"Nyt on jouluaatto\")\nelif pvm == \"25.12.\":\n    print(\"Nyt on joulupäivä\")\nelif pvm == \"26.12.\":\n    print(\"Nyt on tapaninpäivä\")\n\nprint(\"Kiitos ja hei.\")

Joulukalenteri\nMikä päivä nyt on? 25.12.\nNyt on joulupäivä\nKiitos ja hei.

Huomaa, että ehtolauseessa ei edellisessä esimerkissä ole ollenkaan else-haaraa. Jos käyttäjä syöttää jonkin sellaisen päivämäärän, joka ei täytä ehtoa jossain if- tai elif-lauseessa, ohjelmassa ei suoriteta mitään ehtolauseen kolmesta lohkosta.

Joulukalenteri\nMikä päivä nyt on? 1.1.\nKiitos ja hei.

Tee ohjelma, joka kysyy käyttäjältä kaksi kokonaislukua ja tulostaa niistä suuremman. Jos luvut ovat yhtä suuret, ohjelma huomaa myös tämän.

Esimerkkitulostuksia:

Anna ensimmäinen luku: 5\nAnna toinen luku: 3\nSuurempi luku: 5

Anna ensimmäinen luku: 5\nAnna toinen luku: 8\nSuurempi luku: 8

Anna ensimmäinen luku: 5\nAnna toinen luku: 5\nLuvut ovat yhtä suuret!

Tee ohjelma, joka kysyy kahden henkilön nimen ja iän ja tulostaa vanhemman henkilön nimen.

Esimerkkisyötteitä

Henkilö 1:\nNimi: Teppo\nIkä: 26\nHenkilö 2:\nNimi: Tiina\nIkä: 27\nVanhempi on Tiina

Henkilö 1:\nNimi: Antti\nIkä: 1\nHenkilö 2:\nNimi: Venla\nIkä: 1\nAntti ja Venla ovat yhtä vanhoja

Lukujen lisäksi Python osaa vertailla myös merkkijonojen suuruusjärjestystä. Merkkijono a on pienempi kuin merkkijono b, jos merkkijono a tulee aakkosjärjestyksessä ennen jonoa b.\nHuomaa kuitenkin, että tämä pätee varmasti vain kun

    \n
  • vertaillaan samankokoisia kirjaimia (eli ISOJA tai pieniä kirjaimia) keskenään ja
  • \n
  • vertailtavissa sanoissa on vain englannin kielestä tuttuja kirjaimia (eli a-z tai A-Z).
  • \n

Tee ohjelma, joka kysyy käyttäjältä kahta sanaa. Ohjelma tulostaa sanoista sen, joka on aakkosjärjestyksessä jälkimmäinen.

Voit olettaa, että sanat on syötetty kokonaan pienillä kirjaimilla.

Esimerkkisuorituksia eri syötteillä:

Anna 1. sana: auto\nAnna 2. sana: mopo\nmopo on aakkosjärjestyksessä viimeinen.

Anna 1. sana: zorro\nAnna 2. sana: batman\nzorro on aakkosjärjestyksessä viimeinen.

Anna 1. sana: python\nAnna 2. sana: python\nAnnoit saman sanan kahdesti.

","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-2/2-else-elif.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git "a/page-data/osa-2/3-ehtojen-yhdist\303\244minen/page-data.json" "b/page-data/osa-2/3-ehtojen-yhdist\303\244minen/page-data.json" index 8063f7a65..904a3447a 100644 --- "a/page-data/osa-2/3-ehtojen-yhdist\303\244minen/page-data.json" +++ "b/page-data/osa-2/3-ehtojen-yhdist\303\244minen/page-data.json" @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-2/3-ehtojen-yhdistäminen", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":"-, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"or"}]},{"type":"text","value":"- ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":"-operaattoreita ehdoissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat kirjoittaa sisäkkäisiä ehtolauseita"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"loogiset-operaattorit","style":"position:relative;"},"children":[{"type":"text","value":"Loogiset operaattorit"},{"type":"element","tagName":"a","properties":{"href":"#loogiset-operaattorit","ariaLabel":"loogiset operaattorit permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ehtojen yhdistämisessä voidaan käyttää loogisia operaattoreita "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"or"}]},{"type":"text","value":".\nOperaattori "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" vaatii, että useampi ehto pätee samaan aikaan,\nja operaattori "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"or"}]},{"type":"text","value":" vaatii, että yksi tai useampi ehdoista pätee."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi ehto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku >= 5 and luku <= 8"}]},{"type":"text","value":" vaatii,\nettä luku on samaan aikaan ainakin 5 ja enintään 8.\nToisin sanoen luvun tulee olla välillä 5..8."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on välillä 5..8\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ehto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku < 5 or luku > 8"}]},{"type":"text","value":" puolestaan vaatii,\nettä luku on alle 5 tai yli 8.\nToisin sanoen luku ei saa olla välillä 5..8."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"or"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku ei ole välillä 5..8\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava taulukko näyttää operaattoreiden toiminnan eri tilanteissa:"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"a"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"b"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"a and b"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"a or b"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"False"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"False"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"False"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"False"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"False"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"False"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"True"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"False"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"False"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"True"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"True"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme käyttää ehdoissa myös operaattoria "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":", joka muuttaa totuusarvon\nkäänteiseksi:"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"a"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"not a"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"False"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"False"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"True"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi voisimme toteuttaa äskeisen koodin myös näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku ei ole välillä 5..8\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Ehtojen ketjuttaminen"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ehto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x >= a and x <= b"}]},{"type":"text","value":" on tavallinen tapa testata,\nonko luku "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":" välillä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":".."},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":".\nTällainen ehto toimii samalla tavalla eri ohjelmointikielissä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python-kielen erikoisuutena on, että myös lyhyempi ehto\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a <= x <= b"}]},{"type":"text","value":" toimii, eli ehtoja on mahdollista ketjuttaa.\nTällaisia ehtoja käytetään kuitenkin melko harvoin,\nehkä tottumuksesta muihin ohjelmointikieliin."}]}]},{"type":"element","tagName":"h2","properties":{"id":"lisaa-ehtoja","style":"position:relative;"},"children":[{"type":"text","value":"Lisää ehtoja"},{"type":"element","tagName":"a","properties":{"href":"#lisaa-ehtoja","ariaLabel":"lisaa ehtoja permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma kysyy käyttäjältä neljä lukua ja selvittää sitten\nluvuista suurimman ehtojen avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"n1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku 1: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nn2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku 2: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nn3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku 3: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nn4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku 4: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" n1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" n2 "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" n1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" n3 "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" n1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" n4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n suurin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" n1\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" n2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" n3 "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" n2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" n4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n suurin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" n2\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" n3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" n4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n suurin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" n3\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n suurin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" n4\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\" "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"suurin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" on suurin luku.\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku 1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nAnna luku 2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nAnna luku 3: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nAnna luku 4: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n4 on suurin luku."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkissä ensimmäinen ehto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"n1 > n2 and n1 > n3 and n1 > n4"}]},{"type":"text","value":" on tosi vain, mikäli kaikki kolme ehtoa ovat tosia."}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Iän tarkistus","tmcname":"osa02-08_ian_tarkistus"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjän ikää. Jos ikä ei ole uskottava (se on alle 5 tai mahdoton luku iälle), antaa ohjelma siihen liittyvän kommentin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vinkki: tarkastele esimerkkisuorituksia löytääksesi oikean vastineen eri vaihtoehdoille."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostuksia:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kerro ikäsi? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"13"}]},{"type":"text","value":"\nOk, olet siis 13-vuotias"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kerro ikäsi? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nEn usko, että osaat kirjoittaa..."}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kerro ikäsi? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-4"}]},{"type":"text","value":"\nTaitaa olla virhe"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Veljenpojat","tmcname":"osa02-09_veljenpojat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjän nimeä. Jos nimeksi syötetään Tupu, Hupu tai Lupu, ohjelma tunnistaa käyttäjän Aku Ankan veljenpojaksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos nimeksi annetaan Mortti tai Vertti, ohjelma vastaavasti tunnistaa käyttäjän Mikki Hiiren veljenpojaksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostuksia:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Mortti"}]},{"type":"text","value":"\nOlet luultavasti Mikki Hiiren veljenpoika."}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Hupu"}]},{"type":"text","value":"\nOlet luultavasti Aku Ankan veljenpoika."}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Keijo"}]},{"type":"text","value":"\nEt ole kenenkään tuntemani hahmon veljenpoika."}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Arvosana ja pisteet","tmcname":"osa02-10_arvosana_ja_pisteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Alla oleva taulukko kuvaa erään kurssin arvosanan muodostumista. Tee ohjelma, joka ilmoittaa kurssiarvosanan annetun taulukon mukaisesti."}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"pistemäärä"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"arvosana"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"< 0"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"mahdotonta!"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"0-49"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"hylätty"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"50-59"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"1"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"60-69"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"2"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"70-79"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"3"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"80-89"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"4"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"90-100"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"5"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"> 100"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"mahdotonta!"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostuksia:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna pisteet [0-100]: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"37"}]},{"type":"text","value":"\nArvosana: hylätty"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna pisteet [0-100]: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"76"}]},{"type":"text","value":"\nArvosana: 3"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna pisteet [0-100]: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-3"}]},{"type":"text","value":"\nArvosana: mahdotonta!"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"FizzBuzz","tmcname":"osa02-11_fizzbuzz"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma kysyy käyttäjältä lukua. Jos luku on jaollinen kolmella, tulostetaan Fizz. Jos luku on jaollinen viidellä, tulostetaan Buzz. Jos luku on jaollinen sekä kolmella, että viidellä, tulostetaan FizzBuzz"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostuksia:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"9"}]},{"type":"text","value":"\nFizz"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"7"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"20"}]},{"type":"text","value":"\nBuzz"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"45"}]},{"type":"text","value":"\nFizzBuzz"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"sisakkaiset-ehtolauseet","style":"position:relative;"},"children":[{"type":"text","value":"Sisäkkäiset ehtolauseet"},{"type":"element","tagName":"a","properties":{"href":"#sisakkaiset-ehtolauseet","ariaLabel":"sisakkaiset ehtolauseet permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ehtolauseita voidaan kirjoittaa toistensa sisään. Esimerkiksi seuraava ohjelma tunnistaa positiivisista luvuista parittomat ja parilliset:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on parillinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on pariton\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on negatiivinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostus kolmella eri syötteellä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nLuku on pariton"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"18"}]},{"type":"text","value":"\nLuku on parillinen"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-4"}]},{"type":"text","value":"\nLuku on negatiivinen"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sisäkkäisiä ehtolauseita käytettäessä on tärkeää muistaa oikeat sisennykset. Esimerkiksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"else"}]},{"type":"text","value":"-haara yhdistetään oikeaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":"-lauseeseen juuri saman sisennyksen perusteella."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että monissa tapauksissa voidaan käyttää joko sisäkkäisiä ehtolauseita tai loogisia operaattoreita. Seuraava esimerkki on toiminnallisesti sama kuin edellinen esimerkki, eli se tulostaa tiedon siitä, onko positiivinen kokonaisluku parillinen vai pariton."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on parillinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"!="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on pariton\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on negatiivinen.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tilanteesta riippuu, kumpaa tapaa kannattaa käyttää. Tässä esimerkissä ensimmäinen vaihtoehto tuntuu useimpien mielestä paremmalta."}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Karkausvuosi","tmcname":"osa02-12_karkausvuosi"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vuosi on karkausvuosi, jos se on jaollinen 4:llä. Kuitenkin jos vuosi on jaollinen 100:lla, se on karkausvuosi vain silloin, kun se on jaollinen myös 400:lla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka lukee käyttäjältä vuosiluvun, ja tarkistaa, onko vuosi karkausvuosi."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna vuosi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2011"}]},{"type":"text","value":"\nVuosi ei ole karkausvuosi."}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna vuosi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2020"}]},{"type":"text","value":"\nVuosi on karkausvuosi."}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna vuosi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1800"}]},{"type":"text","value":"\nVuosi ei ole karkausvuosi."}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Aakkosjärjestyksessä keskimmäinen","tmcname":"osa02-13_aakkosjarjestyksessa_keskimmainen"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä kolme kirjainta. Ohjelma tulostaa kirjaimista aakkosjärjestyksessä keskimmäisen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa, että kirjaimet ovat joko kaikki isoja tai kaikki pieniä kirjaimia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuorituksia:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna 1. kirjain: x\nAnna 2. kirjain: c\nAnna 3. kirjain: p\nKeskimmäinen kirjain on p"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna 1. kirjain: C\nAnna 2. kirjain: B\nAnna 3. kirjain: A\nKeskimmäinen kirjain on B"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Lahjaverolaskuri","tmcname":"osa02-14_lahjaverolaskuri","height":"500px"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://www.vero.fi/henkiloasiakkaat/omaisuus/lahja/","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Verottajan mukaan"}]},{"type":"text","value":" lahja tarkoittaa sitä, että omaisuus siirtyy toiselle henkilölle ilman korvausta. Lahjasta pitää maksaa lahjaveroa, jos samalta lahjanantajalta saatujen lahjojen arvo on kolmen vuoden aikana 5 000 euroa tai enemmän."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun lahja tulee lähimmiltä sukulaisilta, lahjaveron määrä määräytyy seuraavan taulukon "},{"type":"element","tagName":"a","properties":{"href":"https://www.vero.fi/henkiloasiakkaat/omaisuus/lahja/lahjaverolaskuri/","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"mukaan"}]},{"type":"text","value":":"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Lahja"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Vero alarajalla"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Veroprosentti ylimenevästä"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"5 000 — 25 000"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"8"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"25 000 — 55 000"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"1 700"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"10"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"55 000 — 200 000"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"4 700"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"12"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"200 000 — 1 000 000"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"22 100"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"15"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"1 000 000 —"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"142 100"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"17"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi 6000 euron lahjasta tulee maksaa veroa 180 euroa (100 + (6000-5000) * 0.08) ja 75000 euron lahjasta tulee maksaa veroa 7100 euroa (4700 + (75000-55000) * 0.12)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka laskee lahjaveron lähimpien sukulaisten antamalle lahjalle. Alla on muutama esimerkki ohjelman toiminnasta."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lahjan suuruus? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3500"}]},{"type":"text","value":"\nEi veroa!"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lahjan suuruus? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5000"}]},{"type":"text","value":"\nVero: 100.0 euroa"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lahjan suuruus? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"27500"}]},{"type":"text","value":"\nVero: 1950.0 euroa"}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat käyttää and-, or- ja not-operaattoreita ehdoissa
  • \n
  • Osaat kirjoittaa sisäkkäisiä ehtolauseita
  • \n

Loogiset operaattorit

Ehtojen yhdistämisessä voidaan käyttää loogisia operaattoreita and ja or.\nOperaattori and vaatii, että useampi ehto pätee samaan aikaan,\nja operaattori or vaatii, että yksi tai useampi ehdoista pätee.

Esimerkiksi ehto luku >= 5 and luku <= 8 vaatii,\nettä luku on samaan aikaan ainakin 5 ja enintään 8.\nToisin sanoen luvun tulee olla välillä 5..8.

luku = int(input(\"Anna luku: \"))\nif luku >= 5 and luku <= 8:\n    print(\"Luku on välillä 5..8\")

Ehto luku < 5 or luku > 8 puolestaan vaatii,\nettä luku on alle 5 tai yli 8.\nToisin sanoen luku ei saa olla välillä 5..8.

luku = int(input(\"Anna luku: \"))\nif luku < 5 or luku > 8:\n    print(\"Luku ei ole välillä 5..8\")

Seuraava taulukko näyttää operaattoreiden toiminnan eri tilanteissa:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
aba and ba or b
FalseFalseFalseFalse
TrueFalseFalseTrue
FalseTrueFalseTrue
TrueTrueTrueTrue

Voimme käyttää ehdoissa myös operaattoria not, joka muuttaa totuusarvon\nkäänteiseksi:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
anot a
TrueFalse
FalseTrue

Esimerkiksi voisimme toteuttaa äskeisen koodin myös näin:

luku = int(input(\"Anna luku: \"))\nif not (luku >= 5 and luku <= 8):\n    print(\"Luku ei ole välillä 5..8\")

Ehto x >= a and x <= b on tavallinen tapa testata,\nonko luku x välillä a..b.\nTällainen ehto toimii samalla tavalla eri ohjelmointikielissä.

Python-kielen erikoisuutena on, että myös lyhyempi ehto\na <= x <= b toimii, eli ehtoja on mahdollista ketjuttaa.\nTällaisia ehtoja käytetään kuitenkin melko harvoin,\nehkä tottumuksesta muihin ohjelmointikieliin.

Lisää ehtoja

Seuraava ohjelma kysyy käyttäjältä neljä lukua ja selvittää sitten\nluvuista suurimman ehtojen avulla:

n1 = int(input(\"Anna luku 1: \"))\nn2 = int(input(\"Anna luku 2: \"))\nn3 = int(input(\"Anna luku 3: \"))\nn4 = int(input(\"Anna luku 4: \"))\n\nif n1 > n2 and n1 > n3 and n1 > n4:\n    suurin = n1\nelif n2 > n3 and n2 > n4:\n    suurin = n2\nelif n3 > n4:\n    suurin = n3\nelse:\n    suurin = n4\n\nprint(f\" {suurin} on suurin luku.\")

Anna luku 1: 2\nAnna luku 2: 4\nAnna luku 3: 1\nAnna luku 4: 1\n4 on suurin luku.

Esimerkissä ensimmäinen ehto n1 > n2 and n1 > n3 and n1 > n4 on tosi vain, mikäli kaikki kolme ehtoa ovat tosia.

Tee ohjelma, joka kysyy käyttäjän ikää. Jos ikä ei ole uskottava (se on alle 5 tai mahdoton luku iälle), antaa ohjelma siihen liittyvän kommentin.

Vinkki: tarkastele esimerkkisuorituksia löytääksesi oikean vastineen eri vaihtoehdoille.

Esimerkkitulostuksia:

Kerro ikäsi? 13\nOk, olet siis 13-vuotias

Kerro ikäsi? 2\nEn usko, että osaat kirjoittaa...

Kerro ikäsi? -4\nTaitaa olla virhe

Tee ohjelma, joka kysyy käyttäjän nimeä. Jos nimeksi syötetään Tupu, Hupu tai Lupu, ohjelma tunnistaa käyttäjän Aku Ankan veljenpojaksi.

Jos nimeksi annetaan Mortti tai Vertti, ohjelma vastaavasti tunnistaa käyttäjän Mikki Hiiren veljenpojaksi.

Esimerkkitulostuksia:

Anna nimesi: Mortti\nOlet luultavasti Mikki Hiiren veljenpoika.

Anna nimesi: Hupu\nOlet luultavasti Aku Ankan veljenpoika.

Anna nimesi: Keijo\nEt ole kenenkään tuntemani hahmon veljenpoika.

Alla oleva taulukko kuvaa erään kurssin arvosanan muodostumista. Tee ohjelma, joka ilmoittaa kurssiarvosanan annetun taulukon mukaisesti.

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
pistemääräarvosana
< 0mahdotonta!
0-49hylätty
50-591
60-692
70-793
80-894
90-1005
> 100mahdotonta!

Esimerkkitulostuksia:

Anna pisteet [0-100]: 37\nArvosana: hylätty

Anna pisteet [0-100]: 76\nArvosana: 3

Anna pisteet [0-100]: -3\nArvosana: mahdotonta!

Ohjelma kysyy käyttäjältä lukua. Jos luku on jaollinen kolmella, tulostetaan Fizz. Jos luku on jaollinen viidellä, tulostetaan Buzz. Jos luku on jaollinen sekä kolmella, että viidellä, tulostetaan FizzBuzz

Esimerkkitulostuksia:

Luku: 9\nFizz

Luku: 7

Luku: 20\nBuzz

Luku: 45\nFizzBuzz

Sisäkkäiset ehtolauseet

Ehtolauseita voidaan kirjoittaa toistensa sisään. Esimerkiksi seuraava ohjelma tunnistaa positiivisista luvuista parittomat ja parilliset:

luku = int(input(\"Anna luku: \"))\n\nif luku > 0:\n    if luku % 2 == 0:\n        print(\"Luku on parillinen\")\n    else:\n        print(\"Luku on pariton\")\nelse:\n    print(\"Luku on negatiivinen\")

Esimerkkitulostus kolmella eri syötteellä:

Anna luku: 3\nLuku on pariton

Anna luku: 18\nLuku on parillinen

Anna luku: -4\nLuku on negatiivinen

Sisäkkäisiä ehtolauseita käytettäessä on tärkeää muistaa oikeat sisennykset. Esimerkiksi else-haara yhdistetään oikeaan if-lauseeseen juuri saman sisennyksen perusteella.

Huomaa, että monissa tapauksissa voidaan käyttää joko sisäkkäisiä ehtolauseita tai loogisia operaattoreita. Seuraava esimerkki on toiminnallisesti sama kuin edellinen esimerkki, eli se tulostaa tiedon siitä, onko positiivinen kokonaisluku parillinen vai pariton.

luku = int(input(\"Anna luku: \"))\n\nif luku > 0 and luku % 2 == 0:\n    print(\"Luku on parillinen\")\nelif luku > 0 and luku % 2 != 0:\n    print(\"Luku on pariton\")\nelse:\n    print(\"Luku on negatiivinen.\")

Tilanteesta riippuu, kumpaa tapaa kannattaa käyttää. Tässä esimerkissä ensimmäinen vaihtoehto tuntuu useimpien mielestä paremmalta.

Vuosi on karkausvuosi, jos se on jaollinen 4:llä. Kuitenkin jos vuosi on jaollinen 100:lla, se on karkausvuosi vain silloin, kun se on jaollinen myös 400:lla.

Tee ohjelma, joka lukee käyttäjältä vuosiluvun, ja tarkistaa, onko vuosi karkausvuosi.

Anna vuosi: 2011\nVuosi ei ole karkausvuosi.

Anna vuosi: 2020\nVuosi on karkausvuosi.

Anna vuosi: 1800\nVuosi ei ole karkausvuosi.

Tee ohjelma, joka kysyy käyttäjältä kolme kirjainta. Ohjelma tulostaa kirjaimista aakkosjärjestyksessä keskimmäisen.

Voit olettaa, että kirjaimet ovat joko kaikki isoja tai kaikki pieniä kirjaimia.

Esimerkkisuorituksia:

Anna 1. kirjain: x\nAnna 2. kirjain: c\nAnna 3. kirjain: p\nKeskimmäinen kirjain on p

Anna 1. kirjain: C\nAnna 2. kirjain: B\nAnna 3. kirjain: A\nKeskimmäinen kirjain on B

Verottajan mukaan lahja tarkoittaa sitä, että omaisuus siirtyy toiselle henkilölle ilman korvausta. Lahjasta pitää maksaa lahjaveroa, jos samalta lahjanantajalta saatujen lahjojen arvo on kolmen vuoden aikana 5 000 euroa tai enemmän.

Kun lahja tulee lähimmiltä sukulaisilta, lahjaveron määrä määräytyy seuraavan taulukon mukaan:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LahjaVero alarajallaVeroprosentti ylimenevästä
5 000 — 25 0001008
25 000 — 55 0001 70010
55 000 — 200 0004 70012
200 000 — 1 000 00022 10015
1 000 000 —142 10017

Esimerkiksi 6000 euron lahjasta tulee maksaa veroa 180 euroa (100 + (6000-5000) * 0.08) ja 75000 euron lahjasta tulee maksaa veroa 7100 euroa (4700 + (75000-55000) * 0.12).

Tee ohjelma, joka laskee lahjaveron lähimpien sukulaisten antamalle lahjalle. Alla on muutama esimerkki ohjelman toiminnasta.

Lahjan suuruus? 3500\nEi veroa!

Lahjan suuruus? 5000\nVero: 100.0 euroa

Lahjan suuruus? 27500\nVero: 1950.0 euroa

","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-2/3-ehtojen-yhdistaminen.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":"-, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"or"}]},{"type":"text","value":"- ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":"-operaattoreita ehdoissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat kirjoittaa sisäkkäisiä ehtolauseita"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"loogiset-operaattorit","style":"position:relative;"},"children":[{"type":"text","value":"Loogiset operaattorit"},{"type":"element","tagName":"a","properties":{"href":"#loogiset-operaattorit","ariaLabel":"loogiset operaattorit permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ehtojen yhdistämisessä voidaan käyttää loogisia operaattoreita "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"or"}]},{"type":"text","value":".\nOperaattori "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" vaatii, että useampi ehto pätee samaan aikaan,\nja operaattori "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"or"}]},{"type":"text","value":" vaatii, että yksi tai useampi ehdoista pätee."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi ehto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku >= 5 and luku <= 8"}]},{"type":"text","value":" vaatii,\nettä luku on samaan aikaan ainakin 5 ja enintään 8.\nToisin sanoen luvun tulee olla välillä 5..8."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on välillä 5..8\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ehto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku < 5 or luku > 8"}]},{"type":"text","value":" puolestaan vaatii,\nettä luku on alle 5 tai yli 8.\nToisin sanoen luku ei saa olla välillä 5..8."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"or"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku ei ole välillä 5..8\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava taulukko näyttää operaattoreiden toiminnan eri tilanteissa:"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"a"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"b"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"a and b"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"a or b"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"False"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"False"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"False"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"False"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"False"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"False"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"True"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"False"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"False"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"True"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"True"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme käyttää ehdoissa myös operaattoria "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":", joka muuttaa totuusarvon\nkäänteiseksi:"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"a"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"not a"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"False"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"False"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"True"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi voisimme toteuttaa äskeisen koodin myös näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku ei ole välillä 5..8\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Ehtojen ketjuttaminen"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ehto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x >= a and x <= b"}]},{"type":"text","value":" on tavallinen tapa testata,\nonko luku "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":" välillä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":".."},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":".\nTällainen ehto toimii samalla tavalla eri ohjelmointikielissä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python-kielen erikoisuutena on, että myös lyhyempi ehto\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a <= x <= b"}]},{"type":"text","value":" toimii, eli ehtoja on mahdollista ketjuttaa.\nTällaisia ehtoja käytetään kuitenkin melko harvoin,\nehkä tottumuksesta muihin ohjelmointikieliin."}]}]},{"type":"element","tagName":"h2","properties":{"id":"lisaa-ehtoja","style":"position:relative;"},"children":[{"type":"text","value":"Lisää ehtoja"},{"type":"element","tagName":"a","properties":{"href":"#lisaa-ehtoja","ariaLabel":"lisaa ehtoja permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma kysyy käyttäjältä neljä lukua ja selvittää sitten\nluvuista suurimman ehtojen avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"n1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku 1: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nn2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku 2: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nn3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku 3: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nn4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku 4: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" n1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" n2 "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" n1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" n3 "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" n1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" n4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n suurin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" n1\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" n2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" n3 "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" n2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" n4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n suurin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" n2\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" n3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" n4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n suurin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" n3\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n suurin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" n4\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\" "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"suurin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" on suurin luku.\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku 1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nAnna luku 2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nAnna luku 3: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nAnna luku 4: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n4 on suurin luku."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkissä ensimmäinen ehto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"n1 > n2 and n1 > n3 and n1 > n4"}]},{"type":"text","value":" on tosi vain, mikäli kaikki kolme ehtoa ovat tosia."}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Iän tarkistus","tmcname":"osa02-08_ian_tarkistus"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjän ikää. Jos ikä ei ole uskottava (se on alle 5 tai mahdoton luku iälle), antaa ohjelma siihen liittyvän kommentin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vinkki: tarkastele esimerkkisuorituksia löytääksesi oikean vastineen eri vaihtoehdoille."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostuksia:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kerro ikäsi? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"13"}]},{"type":"text","value":"\nOk, olet siis 13-vuotias"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kerro ikäsi? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nEn usko, että osaat kirjoittaa..."}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kerro ikäsi? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-4"}]},{"type":"text","value":"\nTaitaa olla virhe"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Veljenpojat","tmcname":"osa02-09_veljenpojat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjän nimeä. Jos nimeksi syötetään Tupu, Hupu tai Lupu, ohjelma tunnistaa käyttäjän Aku Ankan veljenpojaksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos nimeksi annetaan Mortti tai Vertti, ohjelma vastaavasti tunnistaa käyttäjän Mikki Hiiren veljenpojaksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostuksia:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Mortti"}]},{"type":"text","value":"\nOlet luultavasti Mikki Hiiren veljenpoika."}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Hupu"}]},{"type":"text","value":"\nOlet luultavasti Aku Ankan veljenpoika."}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Keijo"}]},{"type":"text","value":"\nEt ole kenenkään tuntemani hahmon veljenpoika."}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Arvosana ja pisteet","tmcname":"osa02-10_arvosana_ja_pisteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Alla oleva taulukko kuvaa erään kurssin arvosanan muodostumista. Tee ohjelma, joka ilmoittaa kurssiarvosanan annetun taulukon mukaisesti."}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"pistemäärä"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"arvosana"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"< 0"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"mahdotonta!"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"0-49"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"hylätty"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"50-59"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"1"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"60-69"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"2"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"70-79"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"3"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"80-89"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"4"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"90-100"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"5"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"> 100"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"mahdotonta!"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostuksia:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna pisteet [0-100]: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"37"}]},{"type":"text","value":"\nArvosana: hylätty"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna pisteet [0-100]: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"76"}]},{"type":"text","value":"\nArvosana: 3"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna pisteet [0-100]: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-3"}]},{"type":"text","value":"\nArvosana: mahdotonta!"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"FizzBuzz","tmcname":"osa02-11_fizzbuzz"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma kysyy käyttäjältä lukua. Jos luku on jaollinen kolmella, tulostetaan Fizz. Jos luku on jaollinen viidellä, tulostetaan Buzz. Jos luku on jaollinen sekä kolmella, että viidellä, tulostetaan FizzBuzz"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostuksia:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"9"}]},{"type":"text","value":"\nFizz"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"7"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"20"}]},{"type":"text","value":"\nBuzz"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"45"}]},{"type":"text","value":"\nFizzBuzz"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"sisakkaiset-ehtolauseet","style":"position:relative;"},"children":[{"type":"text","value":"Sisäkkäiset ehtolauseet"},{"type":"element","tagName":"a","properties":{"href":"#sisakkaiset-ehtolauseet","ariaLabel":"sisakkaiset ehtolauseet permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ehtolauseita voidaan kirjoittaa toistensa sisään. Esimerkiksi seuraava ohjelma tunnistaa positiivisista luvuista parittomat ja parilliset:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on parillinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on pariton\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on negatiivinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostus kolmella eri syötteellä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nLuku on pariton"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"18"}]},{"type":"text","value":"\nLuku on parillinen"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-4"}]},{"type":"text","value":"\nLuku on negatiivinen"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sisäkkäisiä ehtolauseita käytettäessä on tärkeää muistaa oikeat sisennykset. Esimerkiksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"else"}]},{"type":"text","value":"-haara yhdistetään oikeaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":"-lauseeseen juuri saman sisennyksen perusteella."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että monissa tapauksissa voidaan käyttää joko sisäkkäisiä ehtolauseita tai loogisia operaattoreita. Seuraava esimerkki on toiminnallisesti sama kuin edellinen esimerkki, eli se tulostaa tiedon siitä, onko positiivinen kokonaisluku parillinen vai pariton."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on parillinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"!="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on pariton\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luku on negatiivinen.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tilanteesta riippuu, kumpaa tapaa kannattaa käyttää. Tässä esimerkissä ensimmäinen vaihtoehto tuntuu useimpien mielestä paremmalta."}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Karkausvuosi","tmcname":"osa02-12_karkausvuosi"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vuosi on karkausvuosi, jos se on jaollinen 4:llä. Kuitenkin jos vuosi on jaollinen 100:lla, se on karkausvuosi vain silloin, kun se on jaollinen myös 400:lla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka lukee käyttäjältä vuosiluvun, ja tarkistaa, onko vuosi karkausvuosi."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna vuosi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2011"}]},{"type":"text","value":"\nVuosi ei ole karkausvuosi."}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna vuosi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2020"}]},{"type":"text","value":"\nVuosi on karkausvuosi."}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna vuosi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1800"}]},{"type":"text","value":"\nVuosi ei ole karkausvuosi."}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Aakkosjärjestyksessä keskimmäinen","tmcname":"osa02-13_aakkosjarjestyksessa_keskimmainen"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä kolme kirjainta. Ohjelma tulostaa kirjaimista aakkosjärjestyksessä keskimmäisen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa, että kirjaimet ovat joko kaikki isoja tai kaikki pieniä kirjaimia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuorituksia:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna 1. kirjain: x\nAnna 2. kirjain: c\nAnna 3. kirjain: p\nKeskimmäinen kirjain on p"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna 1. kirjain: C\nAnna 2. kirjain: B\nAnna 3. kirjain: A\nKeskimmäinen kirjain on B"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Lahjaverolaskuri","tmcname":"osa02-14_lahjaverolaskuri","height":"500px"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://www.vero.fi/henkiloasiakkaat/omaisuus/lahja/","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Verottajan mukaan"}]},{"type":"text","value":" lahja tarkoittaa sitä, että omaisuus siirtyy toiselle henkilölle ilman korvausta. Lahjasta pitää maksaa lahjaveroa, jos samalta lahjanantajalta saatujen lahjojen arvo on kolmen vuoden aikana 5 000 euroa tai enemmän."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun lahja tulee lähimmiltä sukulaisilta, lahjaveron määrä määräytyy seuraavan taulukon "},{"type":"element","tagName":"a","properties":{"href":"https://www.vero.fi/henkiloasiakkaat/omaisuus/lahja/lahjaverolaskuri/","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"mukaan"}]},{"type":"text","value":":"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Lahja"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Vero alarajalla"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Veroprosentti ylimenevästä"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"5 000 — 25 000"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"8"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"25 000 — 55 000"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"1 700"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"10"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"55 000 — 200 000"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"4 700"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"12"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"200 000 — 1 000 000"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"22 100"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"15"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"1 000 000 —"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"142 100"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"17"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi 6000 euron lahjasta tulee maksaa veroa 180 euroa (100 + (6000-5000) * 0.08) ja 75000 euron lahjasta tulee maksaa veroa 7100 euroa (4700 + (75000-55000) * 0.12)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka laskee lahjaveron lähimpien sukulaisten antamalle lahjalle. Alla on muutama esimerkki ohjelman toiminnasta."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lahjan suuruus? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3500"}]},{"type":"text","value":"\nEi veroa!"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lahjan suuruus? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5000"}]},{"type":"text","value":"\nVero: 100.0 euroa"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lahjan suuruus? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"27500"}]},{"type":"text","value":"\nVero: 1950.0 euroa"}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat käyttää and-, or- ja not-operaattoreita ehdoissa
  • \n
  • Osaat kirjoittaa sisäkkäisiä ehtolauseita
  • \n

Loogiset operaattorit

Ehtojen yhdistämisessä voidaan käyttää loogisia operaattoreita and ja or.\nOperaattori and vaatii, että useampi ehto pätee samaan aikaan,\nja operaattori or vaatii, että yksi tai useampi ehdoista pätee.

Esimerkiksi ehto luku >= 5 and luku <= 8 vaatii,\nettä luku on samaan aikaan ainakin 5 ja enintään 8.\nToisin sanoen luvun tulee olla välillä 5..8.

luku = int(input(\"Anna luku: \"))\nif luku >= 5 and luku <= 8:\n    print(\"Luku on välillä 5..8\")

Ehto luku < 5 or luku > 8 puolestaan vaatii,\nettä luku on alle 5 tai yli 8.\nToisin sanoen luku ei saa olla välillä 5..8.

luku = int(input(\"Anna luku: \"))\nif luku < 5 or luku > 8:\n    print(\"Luku ei ole välillä 5..8\")

Seuraava taulukko näyttää operaattoreiden toiminnan eri tilanteissa:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
aba and ba or b
FalseFalseFalseFalse
TrueFalseFalseTrue
FalseTrueFalseTrue
TrueTrueTrueTrue

Voimme käyttää ehdoissa myös operaattoria not, joka muuttaa totuusarvon\nkäänteiseksi:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
anot a
TrueFalse
FalseTrue

Esimerkiksi voisimme toteuttaa äskeisen koodin myös näin:

luku = int(input(\"Anna luku: \"))\nif not (luku >= 5 and luku <= 8):\n    print(\"Luku ei ole välillä 5..8\")

Ehto x >= a and x <= b on tavallinen tapa testata,\nonko luku x välillä a..b.\nTällainen ehto toimii samalla tavalla eri ohjelmointikielissä.

Python-kielen erikoisuutena on, että myös lyhyempi ehto\na <= x <= b toimii, eli ehtoja on mahdollista ketjuttaa.\nTällaisia ehtoja käytetään kuitenkin melko harvoin,\nehkä tottumuksesta muihin ohjelmointikieliin.

Lisää ehtoja

Seuraava ohjelma kysyy käyttäjältä neljä lukua ja selvittää sitten\nluvuista suurimman ehtojen avulla:

n1 = int(input(\"Anna luku 1: \"))\nn2 = int(input(\"Anna luku 2: \"))\nn3 = int(input(\"Anna luku 3: \"))\nn4 = int(input(\"Anna luku 4: \"))\n\nif n1 > n2 and n1 > n3 and n1 > n4:\n    suurin = n1\nelif n2 > n3 and n2 > n4:\n    suurin = n2\nelif n3 > n4:\n    suurin = n3\nelse:\n    suurin = n4\n\nprint(f\" {suurin} on suurin luku.\")

Anna luku 1: 2\nAnna luku 2: 4\nAnna luku 3: 1\nAnna luku 4: 1\n4 on suurin luku.

Esimerkissä ensimmäinen ehto n1 > n2 and n1 > n3 and n1 > n4 on tosi vain, mikäli kaikki kolme ehtoa ovat tosia.

Tee ohjelma, joka kysyy käyttäjän ikää. Jos ikä ei ole uskottava (se on alle 5 tai mahdoton luku iälle), antaa ohjelma siihen liittyvän kommentin.

Vinkki: tarkastele esimerkkisuorituksia löytääksesi oikean vastineen eri vaihtoehdoille.

Esimerkkitulostuksia:

Kerro ikäsi? 13\nOk, olet siis 13-vuotias

Kerro ikäsi? 2\nEn usko, että osaat kirjoittaa...

Kerro ikäsi? -4\nTaitaa olla virhe

Tee ohjelma, joka kysyy käyttäjän nimeä. Jos nimeksi syötetään Tupu, Hupu tai Lupu, ohjelma tunnistaa käyttäjän Aku Ankan veljenpojaksi.

Jos nimeksi annetaan Mortti tai Vertti, ohjelma vastaavasti tunnistaa käyttäjän Mikki Hiiren veljenpojaksi.

Esimerkkitulostuksia:

Anna nimesi: Mortti\nOlet luultavasti Mikki Hiiren veljenpoika.

Anna nimesi: Hupu\nOlet luultavasti Aku Ankan veljenpoika.

Anna nimesi: Keijo\nEt ole kenenkään tuntemani hahmon veljenpoika.

Alla oleva taulukko kuvaa erään kurssin arvosanan muodostumista. Tee ohjelma, joka ilmoittaa kurssiarvosanan annetun taulukon mukaisesti.

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
pistemääräarvosana
< 0mahdotonta!
0-49hylätty
50-591
60-692
70-793
80-894
90-1005
> 100mahdotonta!

Esimerkkitulostuksia:

Anna pisteet [0-100]: 37\nArvosana: hylätty

Anna pisteet [0-100]: 76\nArvosana: 3

Anna pisteet [0-100]: -3\nArvosana: mahdotonta!

Ohjelma kysyy käyttäjältä lukua. Jos luku on jaollinen kolmella, tulostetaan Fizz. Jos luku on jaollinen viidellä, tulostetaan Buzz. Jos luku on jaollinen sekä kolmella, että viidellä, tulostetaan FizzBuzz

Esimerkkitulostuksia:

Luku: 9\nFizz

Luku: 7

Luku: 20\nBuzz

Luku: 45\nFizzBuzz

Sisäkkäiset ehtolauseet

Ehtolauseita voidaan kirjoittaa toistensa sisään. Esimerkiksi seuraava ohjelma tunnistaa positiivisista luvuista parittomat ja parilliset:

luku = int(input(\"Anna luku: \"))\n\nif luku > 0:\n    if luku % 2 == 0:\n        print(\"Luku on parillinen\")\n    else:\n        print(\"Luku on pariton\")\nelse:\n    print(\"Luku on negatiivinen\")

Esimerkkitulostus kolmella eri syötteellä:

Anna luku: 3\nLuku on pariton

Anna luku: 18\nLuku on parillinen

Anna luku: -4\nLuku on negatiivinen

Sisäkkäisiä ehtolauseita käytettäessä on tärkeää muistaa oikeat sisennykset. Esimerkiksi else-haara yhdistetään oikeaan if-lauseeseen juuri saman sisennyksen perusteella.

Huomaa, että monissa tapauksissa voidaan käyttää joko sisäkkäisiä ehtolauseita tai loogisia operaattoreita. Seuraava esimerkki on toiminnallisesti sama kuin edellinen esimerkki, eli se tulostaa tiedon siitä, onko positiivinen kokonaisluku parillinen vai pariton.

luku = int(input(\"Anna luku: \"))\n\nif luku > 0 and luku % 2 == 0:\n    print(\"Luku on parillinen\")\nelif luku > 0 and luku % 2 != 0:\n    print(\"Luku on pariton\")\nelse:\n    print(\"Luku on negatiivinen.\")

Tilanteesta riippuu, kumpaa tapaa kannattaa käyttää. Tässä esimerkissä ensimmäinen vaihtoehto tuntuu useimpien mielestä paremmalta.

Vuosi on karkausvuosi, jos se on jaollinen 4:llä. Kuitenkin jos vuosi on jaollinen 100:lla, se on karkausvuosi vain silloin, kun se on jaollinen myös 400:lla.

Tee ohjelma, joka lukee käyttäjältä vuosiluvun, ja tarkistaa, onko vuosi karkausvuosi.

Anna vuosi: 2011\nVuosi ei ole karkausvuosi.

Anna vuosi: 2020\nVuosi on karkausvuosi.

Anna vuosi: 1800\nVuosi ei ole karkausvuosi.

Tee ohjelma, joka kysyy käyttäjältä kolme kirjainta. Ohjelma tulostaa kirjaimista aakkosjärjestyksessä keskimmäisen.

Voit olettaa, että kirjaimet ovat joko kaikki isoja tai kaikki pieniä kirjaimia.

Esimerkkisuorituksia:

Anna 1. kirjain: x\nAnna 2. kirjain: c\nAnna 3. kirjain: p\nKeskimmäinen kirjain on p

Anna 1. kirjain: C\nAnna 2. kirjain: B\nAnna 3. kirjain: A\nKeskimmäinen kirjain on B

Verottajan mukaan lahja tarkoittaa sitä, että omaisuus siirtyy toiselle henkilölle ilman korvausta. Lahjasta pitää maksaa lahjaveroa, jos samalta lahjanantajalta saatujen lahjojen arvo on kolmen vuoden aikana 5 000 euroa tai enemmän.

Kun lahja tulee lähimmiltä sukulaisilta, lahjaveron määrä määräytyy seuraavan taulukon mukaan:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LahjaVero alarajallaVeroprosentti ylimenevästä
5 000 — 25 0001008
25 000 — 55 0001 70010
55 000 — 200 0004 70012
200 000 — 1 000 00022 10015
1 000 000 —142 10017

Esimerkiksi 6000 euron lahjasta tulee maksaa veroa 180 euroa (100 + (6000-5000) * 0.08) ja 75000 euron lahjasta tulee maksaa veroa 7100 euroa (4700 + (75000-55000) * 0.12).

Tee ohjelma, joka laskee lahjaveron lähimpien sukulaisten antamalle lahjalle. Alla on muutama esimerkki ohjelman toiminnasta.

Lahjan suuruus? 3500\nEi veroa!

Lahjan suuruus? 5000\nVero: 100.0 euroa

Lahjan suuruus? 27500\nVero: 1950.0 euroa

","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-2/3-ehtojen-yhdistaminen.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-2/4-yksinkertainen-silmukka/page-data.json b/page-data/osa-2/4-yksinkertainen-silmukka/page-data.json index 7a9750663..dbc8d058e 100644 --- a/page-data/osa-2/4-yksinkertainen-silmukka/page-data.json +++ b/page-data/osa-2/4-yksinkertainen-silmukka/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-2/4-yksinkertainen-silmukka", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä silmukka tarkoittaa ohjelmoinnissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"while True"}]},{"type":"text","value":" -silmukkaa osana ohjelmaasi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten toisto voidaan katkaista "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"-komennolla"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Silmukka eli toistolause on ehtolauseen lisäksi keskeinen ohjausrakenne ohjelmoinnissa. Aloitetaan toistamiseen tutustuminen tarkastelemalla Pythonin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":"-silmukkaa yksinkertaisten esimerkkien kautta. Ensi viikolla tutustutaan sitten monipuolisemmin sen mahdollisuuksiin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Periaatteessa silmukka muistuttaa ehtolausetta. Ideana kuitenkin on, että sen avulla voidaan toistaa samaa koodia useamman kerran."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkiä, jossa ohjelma laskee käyttäjän syöttämien lukujen neliöitä, kunnes käyttäjä syöttää luvun -1:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku, -1 lopettaa: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kiitos ja moi!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman esimerkkisuoritus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n4\nAnna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\n16\nAnna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n100\nAnna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-1"}]},{"type":"text","value":"\nKiitos ja moi!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten esimerkistä huomataan, ohjelma kysyy "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":"-lauseen ansiosta käyttäjältä useita lukuja. Sitten kun käyttäjän syöte on -1, suoritetaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"-komento, jolloin suoritus hyppää ensimmäiselle lohkon jälkeiselle riville."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Silmukoita käytettäessä on oltava tarkkana, että ei jouduta tilanteeseen, missä silmukan suoritus ei koskaan lopu. Muutetaan edellistä esimerkkiä seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku, -1 lopettaa: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kiitos ja moi!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt siis lukua kysytään "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"silmukan ulkopuolella"}]},{"type":"text","value":". Jos käyttäjä antaa minkä tahansa muun luvun kuin -1:n, ei silmukasta tulla koskaan pois, eli syntyy "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ikuinen silmukka"}]},{"type":"text","value":". Tällöin silmukassa olevaa lohkoa suoritetaan ikuisesti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n4\n4\n4\n4\n4\n4\n4\n4\n(jatkuu ikuisesti...)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa esimerkkinä ohjelma, joka antaa käyttäjän jatkaa eteenpäin vasta sen jälkeen, kun käyttäjä on syöttänyt oikean PIN-koodin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"1234"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n koodi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna PIN-koodi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" koodi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1234\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Väärin... yritä uudelleen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"PIN-koodi oikein!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0000"}]},{"type":"text","value":"\nVäärin... yritä uudelleen\nAnna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"9999"}]},{"type":"text","value":"\nVäärin... yritä uudelleen\nAnna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1234"}]},{"type":"text","value":"\nPIN-koodi oikein!"}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Jatketaanko","tmcname":"osa02-15_jatketaanko"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita edellä olevaa toistolause-esimerkkiä mukaillen ohjelma, joka tulostaa viestin \"moi\" ja kysyy käyttäjältä \"Jatketaanko?\" kunnes käyttäjä syöttää merkkijonon \"ei\". Tämän jälkeen tulostetaan merkkijono \"ei sitten\" ja suoritus päättyy."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostus"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"moi\nJatketaanko? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kyllä"}]},{"type":"text","value":"\nmoi\nJatketaanko? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"yes"}]},{"type":"text","value":"\nmoi\nJatketaanko? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"jawohl"}]},{"type":"text","value":"\nmoi\nJatketaanko? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":"\nei sitten"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Syötteen rajaus","tmcname":"osa02-16_syotteen_rajaus"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita ohjelma, joka kysyy käyttäjältä lukuja. Mikäli luku on negatiivinen (eli pienempi kuin nolla), käyttäjälle tulostetaan viesti \"Epäkelpo luku\" ja käyttäjältä kysytään uutta lukua. Jos taas luku on nolla, lukujen lukeminen lopetetaan ja ohjelma poistuu toistolauseesta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mikäli luku on positiivinen, ohjelma tulostaa luvun neliöjuuren käyttäen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sqrt"}]},{"type":"text","value":"-funktiota, joka on tuotu ohjelmaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":"-lauseella. Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tämä pitää olla ohjelman alussa, jotta sqrt toimii"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" math "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" sqrt\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sqrt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3.0"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki ohjelman suorituksesta:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Syötä luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"16"}]},{"type":"text","value":"\n4.0\nSyötä luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\n2.0\nSyötä luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-3"}]},{"type":"text","value":"\nEpäkelpo luku\nSyötä luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n1.0\nSyötä luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nLopetetaan..."}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Lähtölaskenta","tmcname":"osa02-17_lahtolaskenta"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa olevan ohjelman"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lähtölaskenta!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nyt!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"olisi tarkoitus toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lähtölaskenta!\n5\n4\n3\n2\n1\nNyt!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Korjaa ohjelmassa oleva ongelma."}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Salasana uudelleen","tmcname":"osa02-18_salasana_uudelleen"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä salasanaa ja tämän jälkeen pyytää toistamaan salasanan niin kauan, kunnes käyttäjä syöttää ensimmäisenä annetun salasanan uudelleen."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Salasana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"sekred"}]},{"type":"text","value":"\nToista salasana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"salainen"}]},{"type":"text","value":"\nEi ollut sama!\nToista salasana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"enmuistaenää123"}]},{"type":"text","value":"\nEi ollut sama!\nToista salasana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"sekred"}]},{"type":"text","value":"\nKäyttäjätunnus luotu!"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"silmukka-ja-apumuuttujat","style":"position:relative;"},"children":[{"type":"text","value":"Silmukka ja apumuuttujat"},{"type":"element","tagName":"a","properties":{"href":"#silmukka-ja-apumuuttujat","ariaLabel":"silmukka ja apumuuttujat permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehdään vielä PIN-koodin tarkastavasta ohjelmasta monimutkaisempi versio, joka antaa käyttäjälle vain kolme mahdollisuutta yrittää PIN-koodin syöttämistä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma käyttää nyt kahta apumuuttujaa. Muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"yritykset"}]},{"type":"text","value":" pitää kirjaa siitä, montako kertaa käyttäjä on syöttänyt koodin. Muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"onnistui"}]},{"type":"text","value":" saa arvokseen joko "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":" riippuen siitä, onnistuuko kirjautuminen."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna PIN-koodi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1234\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n onnistui "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n onnistui "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tänne tullaan jos väärin JA ei ole jo kolmea yritystä"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Väärin... yritä uudelleen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" onnistui"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"PIN-koodi oikein!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Liian monta yritystä...\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0000"}]},{"type":"text","value":"\nVäärin... yritä uudelleen\nAnna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1234"}]},{"type":"text","value":"\nPIN-koodi oikein!"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0000"}]},{"type":"text","value":"\nVäärin... yritä uudelleen\nAnna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"9999"}]},{"type":"text","value":"\nVäärin... yritä uudelleen\nAnna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4321"}]},{"type":"text","value":"\nLiian monta yritystä..."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Silmukasta tullaan siis ulos, jos käyttäjä syöttää oikean PIN-koodin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tai"}]},{"type":"text","value":" jos yrityksiä tehdään liian monta. Silmukan jälkeinen if-lause tarkastaa muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"onnistui"}]},{"type":"text","value":" arvon perusteella, onko kirjautuminen onnistunut vai ei."}]},{"type":"element","tagName":"h2","properties":{"id":"debug-tulostus-silmukassa","style":"position:relative;"},"children":[{"type":"text","value":"Debug-tulostus silmukassa"},{"type":"element","tagName":"a","properties":{"href":"#debug-tulostus-silmukassa","ariaLabel":"debug tulostus silmukassa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun ohjelma sisältää silmukoita, kasvavat mahdolliset bugienkin lähteet uudelle tasolle, ja tämän osan "},{"type":"element","tagName":"a","properties":{"href":"/osa-2/1-ohjelmoinnin-termeja"},"children":[{"type":"text","value":"ensimmäisessä luvussa"}]},{"type":"text","value":" mainittujen debug-tulostusten tekeminen muuttuu entistäkin tärkeämmäksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkiä, jossa edellinen ohjelma on koodattu hieman väärin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna PIN-koodi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n onnistui "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1234\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n onnistui "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Väärin... yritä uudelleen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" onnistui"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"PIN-koodi oikein!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Liian monta yritystä...\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma toimii kummallisesti: se antaa yrittää PIN-koodia kolmesti mutta valittaa, että yrityksiä on liian monta, vaikka lopussa syötettiin oikea koodi:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0000"}]},{"type":"text","value":"\nVäärin... yritä uudelleen\nAnna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"9999"}]},{"type":"text","value":"\nVäärin... yritä uudelleen\nAnna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1234"}]},{"type":"text","value":"\nLiian monta yritystä..."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bugin syy selviää lisäämällä sopivia debug-tulostuksia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"whilen lohko alkaa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna PIN-koodi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"yritykset:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" yritykset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ehto1:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n onnistui "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tunnus:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tunnus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ehto2:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1234\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1234\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n onnistui "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Väärin... yritä uudelleen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"whilen lohko alkaa:\nAnna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2233"}]},{"type":"text","value":"\nyritykset: 1\nehto1: False\ntunnus: 2233\nehto2: False\nVäärin... yritä uudelleen\nwhilen lohko alkaa:\nAnna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4545"}]},{"type":"text","value":"\nyritykset: 2\nehto1: False\ntunnus: 4545\nehto2: False\nVäärin... yritä uudelleen\nwhilen lohko alkaa:\nAnna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1234"}]},{"type":"text","value":"\nyritykset: 3\nehto1: True\nLiian monta yritystä..."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostuksista huomataan, että kolmannella silmukan kierroksella ensimmäisen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":"-komennon ehto on tosi ja silmukasta poistutaan, ennen kuin ehditään tarkastaa, oliko juuri syötetty salasana oikein:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ...."}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tämä lohko on liian aikaisin"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n onnistui "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tänne ei päästä enää kolmannella yrityksellä..."}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1234\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n onnistui "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"PIN ja yritysten määrä","tmcname":"osa02-19_pin_ja_yritysten_maara"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee sovellus, joka kysyy käyttäjältä PIN-koodia niin kauan, kunnes käyttäjä antaa oikean PIN-koodin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"4321"}]},{"type":"text","value":". Ohjelma kertoo yritysten lukumäärän:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3245"}]},{"type":"text","value":"\nVäärin\nPIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1234"}]},{"type":"text","value":"\nVäärin\nPIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0000"}]},{"type":"text","value":"\nVäärin\nPIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4321"}]},{"type":"text","value":"\nOikein, tarvitsit 4 yritystä"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostus on hieman erilainen jos PIN-koodi on oikea heti ensimmäisellä yrityksellä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4321"}]},{"type":"text","value":"\nOikein, tarvitsit vain yhden yrityksen!"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Seuraava karkausvuosi","tmcname":"osa02-20_seuraava_karkausvuosi"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kyselee käyttäjältä vuosilukua ja kertoo, milloin on seuraava karkausvuosi."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vuosi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2019"}]},{"type":"text","value":"\nVuotta 2019 seuraava karkausvuosi on 2020"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos käyttäjän syöttämä vuosi on karkausvuosi (kuten 2020), ohjelma ei kerro tätä vuotta vaan sitä seuraavan karkausvuoden:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vuosi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2020"}]},{"type":"text","value":"\nVuotta 2020 seuraava karkausvuosi on 2024"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"merkkijonon-kokoaminen-plus-operaattorilla","style":"position:relative;"},"children":[{"type":"text","value":"Merkkijonon kokoaminen plus-operaattorilla"},{"type":"element","tagName":"a","properties":{"href":"#merkkijonon-kokoaminen-plus-operaattorilla","ariaLabel":"merkkijonon kokoaminen plus operaattorilla permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"PIN-koodin tarkastavassa esimerkissä käytimme apumuuttujaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"yritykset"}]},{"type":"text","value":" pitämään kirjaa siitä, montako kertaa PIN-koodi on syötetty:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna PIN-koodi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttuja saa arvon nolla silmukan ulkopuolella, ja jokainen silmukan suoritus kasvattaa sen arvoa yhdellä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaava idea toimii myös merkkijonoille. Voisimme laajentaa ohjelmaa siten, että se kokoaa yhteen merkkijonoon kaikki käyttäjän syöttämät PIN-koodit:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tunnukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":"\nyritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna PIN-koodi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n tunnukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\", \""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Apumuuttuja saa aluksi arvokseen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tyhjän merkkijonon"}]},{"type":"text","value":" eli merkkijonon, jossa ei ole yhtään merkkiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tunnukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Silmukan sisällä merkkijonoa kasvatetaan lisäämällä siihen aina silmukassa syötetty tunnus ja pilkku:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna PIN-koodi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tunnukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\", \""}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos käyttäjä syöttäisi tunnukset "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"1111 2222 1234"}]},{"type":"text","value":" olisi muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tunnukset"}]},{"type":"text","value":" arvo lopulta"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1111, 2222, 1234,"}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Tarina","tmcname":"osa02-21_tarina"},"children":[{"type":"element","tagName":"h3","properties":{"id":"osa-1","style":"position:relative;"},"children":[{"type":"text","value":"Osa 1"},{"type":"element","tagName":"a","properties":{"href":"#osa-1","ariaLabel":"osa 1 permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka pyytää käyttäjää syöttämään sanoja. Kun käyttäjä syöttää sanan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"loppu"}]},{"type":"text","value":", ohjelma tulostaa sanoista muodostuneen tarinan ja suoritus päättyy."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Olipa"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kerran"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pieni"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"talo"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"preerialla"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"loppu"}]},{"type":"text","value":"\nOlipa kerran pieni talo preerialla"}]}]},{"type":"element","tagName":"h3","properties":{"id":"osa-2","style":"position:relative;"},"children":[{"type":"text","value":"Osa 2"},{"type":"element","tagName":"a","properties":{"href":"#osa-2","ariaLabel":"osa 2 permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muokkaa edellisen tehtävän ohjelmaa niin, että sanojen syöttäminen päättyy, jos käyttäjä syöttää sanan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"loppu"}]},{"type":"text","value":" tai käyttäjä syöttää saman sanan kaksi kertaa peräkkäin."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Alussa"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"oli"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"suo"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kuokka"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ja"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Jussi"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Jussi"}]},{"type":"text","value":"\nAlussa oli suo kuokka ja Jussi"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Lukujen käsittelyä","tmcname":"osa02-22_lukujen_kasittelya"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka pyytää käyttäjää syöttämään kokonaislukuja. Ohjelma pyytää lukuja niin kauan kunnes käyttäjä syöttää nollan."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Syötä kokonaislukuja, 0 lopettaa:\nLuku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nLuku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"22"}]},{"type":"text","value":"\nLuku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"9"}]},{"type":"text","value":"\nLuku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-2"}]},{"type":"text","value":"\nLuku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]}]}]},{"type":"element","tagName":"h3","properties":{"id":"osa-1-lukumaara","style":"position:relative;"},"children":[{"type":"text","value":"Osa 1: lukumäärä"},{"type":"element","tagName":"a","properties":{"href":"#osa-1-lukumaara","ariaLabel":"osa 1 lukumaara permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Syötteiden lukemisen jälkeen ohjelman tulee tulostaa syötettyjen lukujen lukumäärä. Syötteen loppumisesta kertovaa nollaa ei tule ottaa huomioon lukumäärässä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarvitset tässä uuden muuttujan, jonka avulla pidät kirjaa luettujen lukujen määrästä."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"... lukujen kysely\nLukuja yhteensä 4"}]}]},{"type":"element","tagName":"h3","properties":{"id":"osa-2-summa","style":"position:relative;"},"children":[{"type":"text","value":"Osa 2: summa"},{"type":"element","tagName":"a","properties":{"href":"#osa-2-summa","ariaLabel":"osa 2 summa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajenna ohjelmaa siten, että se tulostaa syötettyjen lukujen summa. Syötteen loppumisesta kertovaa nollaa ei tule ottaa huomioon summan laskemisessa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostus laajenee seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"... lukujen kysely\nLukuja yhteensä 4\nLukujen summa 34"}]}]},{"type":"element","tagName":"h3","properties":{"id":"osa-3-keskiarvo","style":"position:relative;"},"children":[{"type":"text","value":"Osa 3: keskiarvo"},{"type":"element","tagName":"a","properties":{"href":"#osa-3-keskiarvo","ariaLabel":"osa 3 keskiarvo permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajenna ohjelmaa siten, että se tulostaa syötettyjen lukujen keskiarvon. Syötteen loppumisesta kertovaa nollaa ei tule ottaa huomioon keskiarvon laskemisessa. Voit olettaa, että käyttäjä syöttää aina vähintään yhden luvun."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"... lukujen kysely\nLukuja yhteensä 4\nLukujen summa 34\nLukujen keskiarvo 8.5"}]}]},{"type":"element","tagName":"h4","properties":{"id":"osa-4-positiiviset-ja-negatiiviset","style":"position:relative;"},"children":[{"type":"text","value":"Osa 4: positiiviset ja negatiiviset"},{"type":"element","tagName":"a","properties":{"href":"#osa-4-positiiviset-ja-negatiiviset","ariaLabel":"osa 4 positiiviset ja negatiiviset permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajenna ohjelmaa siten, että se tulostaa positiivisten ja negatiivisten lukujen lukumäärät"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"... lukujen kysely\nLukuja yhteensä 4\nLukujen summa 34\nLukujen keskiarvo 8.5\nPositiivisia 3\nNegatiivisia 1"}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e"},"children":[]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa lopuksi koko toista osaa koskevaan loppukyselyyn:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, mitä silmukka tarkoittaa ohjelmoinnissa
  • \n
  • Osaat käyttää while True -silmukkaa osana ohjelmaasi
  • \n
  • Tiedät, miten toisto voidaan katkaista break-komennolla
  • \n

Silmukka eli toistolause on ehtolauseen lisäksi keskeinen ohjausrakenne ohjelmoinnissa. Aloitetaan toistamiseen tutustuminen tarkastelemalla Pythonin while-silmukkaa yksinkertaisten esimerkkien kautta. Ensi viikolla tutustutaan sitten monipuolisemmin sen mahdollisuuksiin.

Periaatteessa silmukka muistuttaa ehtolausetta. Ideana kuitenkin on, että sen avulla voidaan toistaa samaa koodia useamman kerran.

Tarkastellaan esimerkkiä, jossa ohjelma laskee käyttäjän syöttämien lukujen neliöitä, kunnes käyttäjä syöttää luvun -1:

while True:\n    luku = int(input(\"Anna luku, -1 lopettaa: \"))\n\n    if luku == -1:\n        break\n\n    print(luku ** 2)\n\nprint(\"Kiitos ja moi!\")

Ohjelman esimerkkisuoritus:

Anna luku, -1 lopettaa: 2\n4\nAnna luku, -1 lopettaa: 4\n16\nAnna luku, -1 lopettaa: 10\n100\nAnna luku, -1 lopettaa: -1\nKiitos ja moi!

Kuten esimerkistä huomataan, ohjelma kysyy while-lauseen ansiosta käyttäjältä useita lukuja. Sitten kun käyttäjän syöte on -1, suoritetaan break-komento, jolloin suoritus hyppää ensimmäiselle lohkon jälkeiselle riville.

Silmukoita käytettäessä on oltava tarkkana, että ei jouduta tilanteeseen, missä silmukan suoritus ei koskaan lopu. Muutetaan edellistä esimerkkiä seuraavasti

luku = int(input(\"Anna luku, -1 lopettaa: \"))\nwhile True:\n    if luku == -1:\n        break\n\n    print(luku ** 2)\n\nprint(\"Kiitos ja moi!\")

Nyt siis lukua kysytään silmukan ulkopuolella. Jos käyttäjä antaa minkä tahansa muun luvun kuin -1:n, ei silmukasta tulla koskaan pois, eli syntyy ikuinen silmukka. Tällöin silmukassa olevaa lohkoa suoritetaan ikuisesti:

Anna luku, -1 lopettaa: 2\n4\n4\n4\n4\n4\n4\n4\n4\n(jatkuu ikuisesti...)

Seuraavassa esimerkkinä ohjelma, joka antaa käyttäjän jatkaa eteenpäin vasta sen jälkeen, kun käyttäjä on syöttänyt oikean PIN-koodin 1234:

while True:\n    koodi = input(\"Anna PIN-koodi: \")\n    if koodi == \"1234\":\n        break\n    print(\"Väärin... yritä uudelleen\")\n\nprint(\"PIN-koodi oikein!\")

Anna PIN-koodi: 0000\nVäärin... yritä uudelleen\nAnna PIN-koodi: 9999\nVäärin... yritä uudelleen\nAnna PIN-koodi: 1234\nPIN-koodi oikein!

Kirjoita edellä olevaa toistolause-esimerkkiä mukaillen ohjelma, joka tulostaa viestin \"moi\" ja kysyy käyttäjältä \"Jatketaanko?\" kunnes käyttäjä syöttää merkkijonon \"ei\". Tämän jälkeen tulostetaan merkkijono \"ei sitten\" ja suoritus päättyy.

Esimerkkitulostus

moi\nJatketaanko? kyllä\nmoi\nJatketaanko? yes\nmoi\nJatketaanko? jawohl\nmoi\nJatketaanko? ei\nei sitten

Kirjoita ohjelma, joka kysyy käyttäjältä lukuja. Mikäli luku on negatiivinen (eli pienempi kuin nolla), käyttäjälle tulostetaan viesti \"Epäkelpo luku\" ja käyttäjältä kysytään uutta lukua. Jos taas luku on nolla, lukujen lukeminen lopetetaan ja ohjelma poistuu toistolauseesta.

Mikäli luku on positiivinen, ohjelma tulostaa luvun neliöjuuren käyttäen sqrt-funktiota, joka on tuotu ohjelmaan import-lauseella. Esimerkki funktion käytöstä:

# Tämä pitää olla ohjelman alussa, jotta sqrt toimii\nfrom math import sqrt\n\nprint(sqrt(9))

3.0

Esimerkki ohjelman suorituksesta:

Syötä luku: 16\n4.0\nSyötä luku: 4\n2.0\nSyötä luku: -3\nEpäkelpo luku\nSyötä luku: 1\n1.0\nSyötä luku: 0\nLopetetaan...

Tehtäväpohjassa olevan ohjelman

luku = 5\nprint(\"Lähtölaskenta!\")\nwhile True:\n  print(luku)\n  luku = luku - 1\n  if luku > 0:\n    break\n\nprint(\"Nyt!\")

olisi tarkoitus toimia seuraavasti:

Lähtölaskenta!\n5\n4\n3\n2\n1\nNyt!

Korjaa ohjelmassa oleva ongelma.

Tee ohjelma, joka kysyy käyttäjältä salasanaa ja tämän jälkeen pyytää toistamaan salasanan niin kauan, kunnes käyttäjä syöttää ensimmäisenä annetun salasanan uudelleen.

Salasana: sekred\nToista salasana: salainen\nEi ollut sama!\nToista salasana: enmuistaenää123\nEi ollut sama!\nToista salasana: sekred\nKäyttäjätunnus luotu!

Silmukka ja apumuuttujat

Tehdään vielä PIN-koodin tarkastavasta ohjelmasta monimutkaisempi versio, joka antaa käyttäjälle vain kolme mahdollisuutta yrittää PIN-koodin syöttämistä.

Ohjelma käyttää nyt kahta apumuuttujaa. Muuttuja yritykset pitää kirjaa siitä, montako kertaa käyttäjä on syöttänyt koodin. Muuttuja onnistui saa arvokseen joko True tai False riippuen siitä, onnistuuko kirjautuminen.

yritykset = 0\n\nwhile True:\n    tunnus = input(\"Anna PIN-koodi: \")\n    yritykset += 1\n\n    if tunnus == \"1234\":\n        onnistui = True\n        break\n\n    if yritykset == 3:\n        onnistui = False\n        break\n\n    # tänne tullaan jos väärin JA ei ole jo kolmea yritystä\n    print(\"Väärin... yritä uudelleen\")\n\nif onnistui:\n    print(\"PIN-koodi oikein!\")\nelse:\n    print(\"Liian monta yritystä...\")

Anna PIN-koodi: 0000\nVäärin... yritä uudelleen\nAnna PIN-koodi: 1234\nPIN-koodi oikein!

Anna PIN-koodi: 0000\nVäärin... yritä uudelleen\nAnna PIN-koodi: 9999\nVäärin... yritä uudelleen\nAnna PIN-koodi: 4321\nLiian monta yritystä...

Silmukasta tullaan siis ulos, jos käyttäjä syöttää oikean PIN-koodin tai jos yrityksiä tehdään liian monta. Silmukan jälkeinen if-lause tarkastaa muuttujan onnistui arvon perusteella, onko kirjautuminen onnistunut vai ei.

Debug-tulostus silmukassa

Kun ohjelma sisältää silmukoita, kasvavat mahdolliset bugienkin lähteet uudelle tasolle, ja tämän osan ensimmäisessä luvussa mainittujen debug-tulostusten tekeminen muuttuu entistäkin tärkeämmäksi.

Tarkastellaan esimerkkiä, jossa edellinen ohjelma on koodattu hieman väärin:

yritykset = 0\n\nwhile True:\n    tunnus = input(\"Anna PIN-koodi: \")\n    yritykset += 1\n\n    if yritykset == 3:\n        onnistui = False\n        break\n\n    if tunnus == \"1234\":\n        onnistui = True\n        break\n\n    print(\"Väärin... yritä uudelleen\")\n\nif onnistui:\n    print(\"PIN-koodi oikein!\")\nelse:\n    print(\"Liian monta yritystä...\")

Ohjelma toimii kummallisesti: se antaa yrittää PIN-koodia kolmesti mutta valittaa, että yrityksiä on liian monta, vaikka lopussa syötettiin oikea koodi:

Anna PIN-koodi: 0000\nVäärin... yritä uudelleen\nAnna PIN-koodi: 9999\nVäärin... yritä uudelleen\nAnna PIN-koodi: 1234\nLiian monta yritystä...

Bugin syy selviää lisäämällä sopivia debug-tulostuksia:

while True:\n    print(\"whilen lohko alkaa:\")\n    tunnus = input(\"Anna PIN-koodi: \")\n    yritykset += 1\n\n    print(\"yritykset:\", yritykset)\n    print(\"ehto1:\", yritykset == 3)\n    if yritykset == 3:\n        onnistui = False\n        break\n\n    print(\"tunnus:\", tunnus)\n    print(\"ehto2:\", tunnus == \"1234\")\n    if tunnus == \"1234\":\n        onnistui = True\n        break\n\n    print(\"Väärin... yritä uudelleen\")

whilen lohko alkaa:\nAnna PIN-koodi: 2233\nyritykset: 1\nehto1: False\ntunnus: 2233\nehto2: False\nVäärin... yritä uudelleen\nwhilen lohko alkaa:\nAnna PIN-koodi: 4545\nyritykset: 2\nehto1: False\ntunnus: 4545\nehto2: False\nVäärin... yritä uudelleen\nwhilen lohko alkaa:\nAnna PIN-koodi: 1234\nyritykset: 3\nehto1: True\nLiian monta yritystä...

Tulostuksista huomataan, että kolmannella silmukan kierroksella ensimmäisen if-komennon ehto on tosi ja silmukasta poistutaan, ennen kuin ehditään tarkastaa, oliko juuri syötetty salasana oikein:

  while True:\n    # ....\n\n    # tämä lohko on liian aikaisin\n    if yritykset == 3:\n        onnistui = False\n        break\n\n    # tänne ei päästä enää kolmannella yrityksellä...\n    if tunnus == \"1234\":\n        onnistui = True\n        break

Tee sovellus, joka kysyy käyttäjältä PIN-koodia niin kauan, kunnes käyttäjä antaa oikean PIN-koodin 4321. Ohjelma kertoo yritysten lukumäärän:

PIN-koodi: 3245\nVäärin\nPIN-koodi: 1234\nVäärin\nPIN-koodi: 0000\nVäärin\nPIN-koodi: 4321\nOikein, tarvitsit 4 yritystä

Tulostus on hieman erilainen jos PIN-koodi on oikea heti ensimmäisellä yrityksellä:

PIN-koodi: 4321\nOikein, tarvitsit vain yhden yrityksen!

Tee ohjelma, joka kyselee käyttäjältä vuosilukua ja kertoo, milloin on seuraava karkausvuosi.

Vuosi: 2019\nVuotta 2019 seuraava karkausvuosi on 2020

Jos käyttäjän syöttämä vuosi on karkausvuosi (kuten 2020), ohjelma ei kerro tätä vuotta vaan sitä seuraavan karkausvuoden:

Vuosi: 2020\nVuotta 2020 seuraava karkausvuosi on 2024

Merkkijonon kokoaminen plus-operaattorilla

PIN-koodin tarkastavassa esimerkissä käytimme apumuuttujaa yritykset pitämään kirjaa siitä, montako kertaa PIN-koodi on syötetty:

yritykset = 0\n\nwhile True:\n    tunnus = input(\"Anna PIN-koodi: \")\n    yritykset += 1\n    # ...

Muuttuja saa arvon nolla silmukan ulkopuolella, ja jokainen silmukan suoritus kasvattaa sen arvoa yhdellä.

Vastaava idea toimii myös merkkijonoille. Voisimme laajentaa ohjelmaa siten, että se kokoaa yhteen merkkijonoon kaikki käyttäjän syöttämät PIN-koodit:

tunnukset = \"\"\nyritykset = 0\n\nwhile True:\n    tunnus = input(\"Anna PIN-koodi: \")\n    yritykset += 1\n    tunnukset += tunnus + \", \"\n    # ...

Apumuuttuja saa aluksi arvokseen tyhjän merkkijonon eli merkkijonon, jossa ei ole yhtään merkkiä:

tunnukset = \"\"

Silmukan sisällä merkkijonoa kasvatetaan lisäämällä siihen aina silmukassa syötetty tunnus ja pilkku:

    tunnus = input(\"Anna PIN-koodi: \")\n    tunnukset += tunnus + \", \"

Jos käyttäjä syöttäisi tunnukset 1111 2222 1234 olisi muuttujan tunnukset arvo lopulta

1111, 2222, 1234,

Osa 1

Tee ohjelma, joka pyytää käyttäjää syöttämään sanoja. Kun käyttäjä syöttää sanan loppu, ohjelma tulostaa sanoista muodostuneen tarinan ja suoritus päättyy.

Anna sana: Olipa\nAnna sana: kerran\nAnna sana: pieni\nAnna sana: talo\nAnna sana: preerialla\nAnna sana: loppu\nOlipa kerran pieni talo preerialla

Osa 2

Muokkaa edellisen tehtävän ohjelmaa niin, että sanojen syöttäminen päättyy, jos käyttäjä syöttää sanan loppu tai käyttäjä syöttää saman sanan kaksi kertaa peräkkäin.

Anna sana: Alussa\nAnna sana: oli\nAnna sana: suo\nAnna sana: kuokka\nAnna sana: ja\nAnna sana: Jussi\nAnna sana: Jussi\nAlussa oli suo kuokka ja Jussi

Tee ohjelma, joka pyytää käyttäjää syöttämään kokonaislukuja. Ohjelma pyytää lukuja niin kauan kunnes käyttäjä syöttää nollan.

Syötä kokonaislukuja, 0 lopettaa:\nLuku: 5\nLuku: 22\nLuku: 9\nLuku: -2\nLuku: 0

Osa 1: lukumäärä

Syötteiden lukemisen jälkeen ohjelman tulee tulostaa syötettyjen lukujen lukumäärä. Syötteen loppumisesta kertovaa nollaa ei tule ottaa huomioon lukumäärässä.

Tarvitset tässä uuden muuttujan, jonka avulla pidät kirjaa luettujen lukujen määrästä.

... lukujen kysely\nLukuja yhteensä 4

Osa 2: summa

Laajenna ohjelmaa siten, että se tulostaa syötettyjen lukujen summa. Syötteen loppumisesta kertovaa nollaa ei tule ottaa huomioon summan laskemisessa.

Ohjelman tulostus laajenee seuraavasti:

... lukujen kysely\nLukuja yhteensä 4\nLukujen summa 34

Osa 3: keskiarvo

Laajenna ohjelmaa siten, että se tulostaa syötettyjen lukujen keskiarvon. Syötteen loppumisesta kertovaa nollaa ei tule ottaa huomioon keskiarvon laskemisessa. Voit olettaa, että käyttäjä syöttää aina vähintään yhden luvun.

... lukujen kysely\nLukuja yhteensä 4\nLukujen summa 34\nLukujen keskiarvo 8.5

Osa 4: positiiviset ja negatiiviset

Laajenna ohjelmaa siten, että se tulostaa positiivisten ja negatiivisten lukujen lukumäärät

... lukujen kysely\nLukuja yhteensä 4\nLukujen summa 34\nLukujen keskiarvo 8.5\nPositiivisia 3\nNegatiivisia 1

Vastaa lopuksi koko toista osaa koskevaan loppukyselyyn:

","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-2/4-yksinkertainen-silmukka.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä silmukka tarkoittaa ohjelmoinnissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"while True"}]},{"type":"text","value":" -silmukkaa osana ohjelmaasi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten toisto voidaan katkaista "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"-komennolla"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Silmukka eli toistolause on ehtolauseen lisäksi keskeinen ohjausrakenne ohjelmoinnissa. Aloitetaan toistamiseen tutustuminen tarkastelemalla Pythonin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":"-silmukkaa yksinkertaisten esimerkkien kautta. Ensi viikolla tutustutaan sitten monipuolisemmin sen mahdollisuuksiin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Periaatteessa silmukka muistuttaa ehtolausetta. Ideana kuitenkin on, että sen avulla voidaan toistaa samaa koodia useamman kerran."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkiä, jossa ohjelma laskee käyttäjän syöttämien lukujen neliöitä, kunnes käyttäjä syöttää luvun -1:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku, -1 lopettaa: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kiitos ja moi!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman esimerkkisuoritus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n4\nAnna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\n16\nAnna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n100\nAnna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-1"}]},{"type":"text","value":"\nKiitos ja moi!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten esimerkistä huomataan, ohjelma kysyy "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":"-lauseen ansiosta käyttäjältä useita lukuja. Sitten kun käyttäjän syöte on -1, suoritetaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"-komento, jolloin suoritus hyppää ensimmäiselle lohkon jälkeiselle riville."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Silmukoita käytettäessä on oltava tarkkana, että ei jouduta tilanteeseen, missä silmukan suoritus ei koskaan lopu. Muutetaan edellistä esimerkkiä seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku, -1 lopettaa: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kiitos ja moi!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt siis lukua kysytään "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"silmukan ulkopuolella"}]},{"type":"text","value":". Jos käyttäjä antaa minkä tahansa muun luvun kuin -1:n, ei silmukasta tulla koskaan pois, eli syntyy "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ikuinen silmukka"}]},{"type":"text","value":". Tällöin silmukassa olevaa lohkoa suoritetaan ikuisesti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n4\n4\n4\n4\n4\n4\n4\n4\n(jatkuu ikuisesti...)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa esimerkkinä ohjelma, joka antaa käyttäjän jatkaa eteenpäin vasta sen jälkeen, kun käyttäjä on syöttänyt oikean PIN-koodin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"1234"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n koodi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna PIN-koodi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" koodi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1234\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Väärin... yritä uudelleen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"PIN-koodi oikein!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0000"}]},{"type":"text","value":"\nVäärin... yritä uudelleen\nAnna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"9999"}]},{"type":"text","value":"\nVäärin... yritä uudelleen\nAnna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1234"}]},{"type":"text","value":"\nPIN-koodi oikein!"}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Jatketaanko","tmcname":"osa02-15_jatketaanko"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita edellä olevaa toistolause-esimerkkiä mukaillen ohjelma, joka tulostaa viestin \"moi\" ja kysyy käyttäjältä \"Jatketaanko?\" kunnes käyttäjä syöttää merkkijonon \"ei\". Tämän jälkeen tulostetaan merkkijono \"ei sitten\" ja suoritus päättyy."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostus"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"moi\nJatketaanko? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kyllä"}]},{"type":"text","value":"\nmoi\nJatketaanko? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"yes"}]},{"type":"text","value":"\nmoi\nJatketaanko? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"jawohl"}]},{"type":"text","value":"\nmoi\nJatketaanko? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":"\nei sitten"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Syötteen rajaus","tmcname":"osa02-16_syotteen_rajaus"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita ohjelma, joka kysyy käyttäjältä lukuja. Mikäli luku on negatiivinen (eli pienempi kuin nolla), käyttäjälle tulostetaan viesti \"Epäkelpo luku\" ja käyttäjältä kysytään uutta lukua. Jos taas luku on nolla, lukujen lukeminen lopetetaan ja ohjelma poistuu toistolauseesta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mikäli luku on positiivinen, ohjelma tulostaa luvun neliöjuuren käyttäen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sqrt"}]},{"type":"text","value":"-funktiota, joka on tuotu ohjelmaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":"-lauseella. Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tämä pitää olla ohjelman alussa, jotta sqrt toimii"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" math "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" sqrt\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sqrt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3.0"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki ohjelman suorituksesta:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Syötä luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"16"}]},{"type":"text","value":"\n4.0\nSyötä luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\n2.0\nSyötä luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-3"}]},{"type":"text","value":"\nEpäkelpo luku\nSyötä luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n1.0\nSyötä luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nLopetetaan..."}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Lähtölaskenta","tmcname":"osa02-17_lahtolaskenta"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa olevan ohjelman"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lähtölaskenta!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nyt!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"olisi tarkoitus toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lähtölaskenta!\n5\n4\n3\n2\n1\nNyt!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Korjaa ohjelmassa oleva ongelma."}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Salasana uudelleen","tmcname":"osa02-18_salasana_uudelleen"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä salasanaa ja tämän jälkeen pyytää toistamaan salasanan niin kauan, kunnes käyttäjä syöttää ensimmäisenä annetun salasanan uudelleen."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Salasana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"sekred"}]},{"type":"text","value":"\nToista salasana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"salainen"}]},{"type":"text","value":"\nEi ollut sama!\nToista salasana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"enmuistaenää123"}]},{"type":"text","value":"\nEi ollut sama!\nToista salasana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"sekred"}]},{"type":"text","value":"\nKäyttäjätunnus luotu!"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"silmukka-ja-apumuuttujat","style":"position:relative;"},"children":[{"type":"text","value":"Silmukka ja apumuuttujat"},{"type":"element","tagName":"a","properties":{"href":"#silmukka-ja-apumuuttujat","ariaLabel":"silmukka ja apumuuttujat permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehdään vielä PIN-koodin tarkastavasta ohjelmasta monimutkaisempi versio, joka antaa käyttäjälle vain kolme mahdollisuutta yrittää PIN-koodin syöttämistä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma käyttää nyt kahta apumuuttujaa. Muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"yritykset"}]},{"type":"text","value":" pitää kirjaa siitä, montako kertaa käyttäjä on syöttänyt koodin. Muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"onnistui"}]},{"type":"text","value":" saa arvokseen joko "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":" riippuen siitä, onnistuuko kirjautuminen."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna PIN-koodi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1234\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n onnistui "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n onnistui "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tänne tullaan jos väärin JA ei ole jo kolmea yritystä"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Väärin... yritä uudelleen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" onnistui"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"PIN-koodi oikein!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Liian monta yritystä...\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0000"}]},{"type":"text","value":"\nVäärin... yritä uudelleen\nAnna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1234"}]},{"type":"text","value":"\nPIN-koodi oikein!"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0000"}]},{"type":"text","value":"\nVäärin... yritä uudelleen\nAnna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"9999"}]},{"type":"text","value":"\nVäärin... yritä uudelleen\nAnna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4321"}]},{"type":"text","value":"\nLiian monta yritystä..."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Silmukasta tullaan siis ulos, jos käyttäjä syöttää oikean PIN-koodin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tai"}]},{"type":"text","value":" jos yrityksiä tehdään liian monta. Silmukan jälkeinen if-lause tarkastaa muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"onnistui"}]},{"type":"text","value":" arvon perusteella, onko kirjautuminen onnistunut vai ei."}]},{"type":"element","tagName":"h2","properties":{"id":"debug-tulostus-silmukassa","style":"position:relative;"},"children":[{"type":"text","value":"Debug-tulostus silmukassa"},{"type":"element","tagName":"a","properties":{"href":"#debug-tulostus-silmukassa","ariaLabel":"debug tulostus silmukassa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun ohjelma sisältää silmukoita, kasvavat mahdolliset bugienkin lähteet uudelle tasolle, ja tämän osan "},{"type":"element","tagName":"a","properties":{"href":"/osa-2/1-ohjelmoinnin-termeja"},"children":[{"type":"text","value":"ensimmäisessä luvussa"}]},{"type":"text","value":" mainittujen debug-tulostusten tekeminen muuttuu entistäkin tärkeämmäksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkiä, jossa edellinen ohjelma on koodattu hieman väärin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna PIN-koodi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n onnistui "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1234\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n onnistui "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Väärin... yritä uudelleen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" onnistui"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"PIN-koodi oikein!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Liian monta yritystä...\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma toimii kummallisesti: se antaa yrittää PIN-koodia kolmesti mutta valittaa, että yrityksiä on liian monta, vaikka lopussa syötettiin oikea koodi:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0000"}]},{"type":"text","value":"\nVäärin... yritä uudelleen\nAnna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"9999"}]},{"type":"text","value":"\nVäärin... yritä uudelleen\nAnna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1234"}]},{"type":"text","value":"\nLiian monta yritystä..."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bugin syy selviää lisäämällä sopivia debug-tulostuksia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"whilen lohko alkaa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna PIN-koodi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"yritykset:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" yritykset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ehto1:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n onnistui "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tunnus:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tunnus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ehto2:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1234\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1234\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n onnistui "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Väärin... yritä uudelleen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"whilen lohko alkaa:\nAnna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2233"}]},{"type":"text","value":"\nyritykset: 1\nehto1: False\ntunnus: 2233\nehto2: False\nVäärin... yritä uudelleen\nwhilen lohko alkaa:\nAnna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4545"}]},{"type":"text","value":"\nyritykset: 2\nehto1: False\ntunnus: 4545\nehto2: False\nVäärin... yritä uudelleen\nwhilen lohko alkaa:\nAnna PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1234"}]},{"type":"text","value":"\nyritykset: 3\nehto1: True\nLiian monta yritystä..."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostuksista huomataan, että kolmannella silmukan kierroksella ensimmäisen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":"-komennon ehto on tosi ja silmukasta poistutaan, ennen kuin ehditään tarkastaa, oliko juuri syötetty salasana oikein:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ...."}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tämä lohko on liian aikaisin"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n onnistui "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tänne ei päästä enää kolmannella yrityksellä..."}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1234\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n onnistui "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"PIN ja yritysten määrä","tmcname":"osa02-19_pin_ja_yritysten_maara"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee sovellus, joka kysyy käyttäjältä PIN-koodia niin kauan, kunnes käyttäjä antaa oikean PIN-koodin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"4321"}]},{"type":"text","value":". Ohjelma kertoo yritysten lukumäärän:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3245"}]},{"type":"text","value":"\nVäärin\nPIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1234"}]},{"type":"text","value":"\nVäärin\nPIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0000"}]},{"type":"text","value":"\nVäärin\nPIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4321"}]},{"type":"text","value":"\nOikein, tarvitsit 4 yritystä"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostus on hieman erilainen jos PIN-koodi on oikea heti ensimmäisellä yrityksellä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"PIN-koodi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4321"}]},{"type":"text","value":"\nOikein, tarvitsit vain yhden yrityksen!"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Seuraava karkausvuosi","tmcname":"osa02-20_seuraava_karkausvuosi"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kyselee käyttäjältä vuosilukua ja kertoo, milloin on seuraava karkausvuosi."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vuosi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2019"}]},{"type":"text","value":"\nVuotta 2019 seuraava karkausvuosi on 2020"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos käyttäjän syöttämä vuosi on karkausvuosi (kuten 2020), ohjelma ei kerro tätä vuotta vaan sitä seuraavan karkausvuoden:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vuosi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2020"}]},{"type":"text","value":"\nVuotta 2020 seuraava karkausvuosi on 2024"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"merkkijonon-kokoaminen-plus-operaattorilla","style":"position:relative;"},"children":[{"type":"text","value":"Merkkijonon kokoaminen plus-operaattorilla"},{"type":"element","tagName":"a","properties":{"href":"#merkkijonon-kokoaminen-plus-operaattorilla","ariaLabel":"merkkijonon kokoaminen plus operaattorilla permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"PIN-koodin tarkastavassa esimerkissä käytimme apumuuttujaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"yritykset"}]},{"type":"text","value":" pitämään kirjaa siitä, montako kertaa PIN-koodi on syötetty:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna PIN-koodi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttuja saa arvon nolla silmukan ulkopuolella, ja jokainen silmukan suoritus kasvattaa sen arvoa yhdellä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaava idea toimii myös merkkijonoille. Voisimme laajentaa ohjelmaa siten, että se kokoaa yhteen merkkijonoon kaikki käyttäjän syöttämät PIN-koodit:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tunnukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":"\nyritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna PIN-koodi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n yritykset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n tunnukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\", \""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Apumuuttuja saa aluksi arvokseen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tyhjän merkkijonon"}]},{"type":"text","value":" eli merkkijonon, jossa ei ole yhtään merkkiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tunnukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Silmukan sisällä merkkijonoa kasvatetaan lisäämällä siihen aina silmukassa syötetty tunnus ja pilkku:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":" tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna PIN-koodi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tunnukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" tunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\", \""}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos käyttäjä syöttäisi tunnukset "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"1111 2222 1234"}]},{"type":"text","value":" olisi muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tunnukset"}]},{"type":"text","value":" arvo lopulta"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1111, 2222, 1234,"}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Tarina","tmcname":"osa02-21_tarina"},"children":[{"type":"element","tagName":"h3","properties":{"id":"osa-1","style":"position:relative;"},"children":[{"type":"text","value":"Osa 1"},{"type":"element","tagName":"a","properties":{"href":"#osa-1","ariaLabel":"osa 1 permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka pyytää käyttäjää syöttämään sanoja. Kun käyttäjä syöttää sanan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"loppu"}]},{"type":"text","value":", ohjelma tulostaa sanoista muodostuneen tarinan ja suoritus päättyy."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Olipa"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kerran"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pieni"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"talo"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"preerialla"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"loppu"}]},{"type":"text","value":"\nOlipa kerran pieni talo preerialla"}]}]},{"type":"element","tagName":"h3","properties":{"id":"osa-2","style":"position:relative;"},"children":[{"type":"text","value":"Osa 2"},{"type":"element","tagName":"a","properties":{"href":"#osa-2","ariaLabel":"osa 2 permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muokkaa edellisen tehtävän ohjelmaa niin, että sanojen syöttäminen päättyy, jos käyttäjä syöttää sanan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"loppu"}]},{"type":"text","value":" tai käyttäjä syöttää saman sanan kaksi kertaa peräkkäin."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Alussa"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"oli"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"suo"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kuokka"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ja"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Jussi"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Jussi"}]},{"type":"text","value":"\nAlussa oli suo kuokka ja Jussi"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Lukujen käsittelyä","tmcname":"osa02-22_lukujen_kasittelya"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka pyytää käyttäjää syöttämään kokonaislukuja. Ohjelma pyytää lukuja niin kauan kunnes käyttäjä syöttää nollan."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Syötä kokonaislukuja, 0 lopettaa:\nLuku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nLuku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"22"}]},{"type":"text","value":"\nLuku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"9"}]},{"type":"text","value":"\nLuku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-2"}]},{"type":"text","value":"\nLuku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]}]}]},{"type":"element","tagName":"h3","properties":{"id":"osa-1-lukumaara","style":"position:relative;"},"children":[{"type":"text","value":"Osa 1: lukumäärä"},{"type":"element","tagName":"a","properties":{"href":"#osa-1-lukumaara","ariaLabel":"osa 1 lukumaara permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Syötteiden lukemisen jälkeen ohjelman tulee tulostaa syötettyjen lukujen lukumäärä. Syötteen loppumisesta kertovaa nollaa ei tule ottaa huomioon lukumäärässä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarvitset tässä uuden muuttujan, jonka avulla pidät kirjaa luettujen lukujen määrästä."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"... lukujen kysely\nLukuja yhteensä 4"}]}]},{"type":"element","tagName":"h3","properties":{"id":"osa-2-summa","style":"position:relative;"},"children":[{"type":"text","value":"Osa 2: summa"},{"type":"element","tagName":"a","properties":{"href":"#osa-2-summa","ariaLabel":"osa 2 summa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajenna ohjelmaa siten, että se tulostaa syötettyjen lukujen summa. Syötteen loppumisesta kertovaa nollaa ei tule ottaa huomioon summan laskemisessa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostus laajenee seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"... lukujen kysely\nLukuja yhteensä 4\nLukujen summa 34"}]}]},{"type":"element","tagName":"h3","properties":{"id":"osa-3-keskiarvo","style":"position:relative;"},"children":[{"type":"text","value":"Osa 3: keskiarvo"},{"type":"element","tagName":"a","properties":{"href":"#osa-3-keskiarvo","ariaLabel":"osa 3 keskiarvo permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajenna ohjelmaa siten, että se tulostaa syötettyjen lukujen keskiarvon. Syötteen loppumisesta kertovaa nollaa ei tule ottaa huomioon keskiarvon laskemisessa. Voit olettaa, että käyttäjä syöttää aina vähintään yhden luvun."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"... lukujen kysely\nLukuja yhteensä 4\nLukujen summa 34\nLukujen keskiarvo 8.5"}]}]},{"type":"element","tagName":"h4","properties":{"id":"osa-4-positiiviset-ja-negatiiviset","style":"position:relative;"},"children":[{"type":"text","value":"Osa 4: positiiviset ja negatiiviset"},{"type":"element","tagName":"a","properties":{"href":"#osa-4-positiiviset-ja-negatiiviset","ariaLabel":"osa 4 positiiviset ja negatiiviset permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajenna ohjelmaa siten, että se tulostaa positiivisten ja negatiivisten lukujen lukumäärät"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"... lukujen kysely\nLukuja yhteensä 4\nLukujen summa 34\nLukujen keskiarvo 8.5\nPositiivisia 3\nNegatiivisia 1"}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e"},"children":[]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa lopuksi koko toista osaa koskevaan loppukyselyyn:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, mitä silmukka tarkoittaa ohjelmoinnissa
  • \n
  • Osaat käyttää while True -silmukkaa osana ohjelmaasi
  • \n
  • Tiedät, miten toisto voidaan katkaista break-komennolla
  • \n

Silmukka eli toistolause on ehtolauseen lisäksi keskeinen ohjausrakenne ohjelmoinnissa. Aloitetaan toistamiseen tutustuminen tarkastelemalla Pythonin while-silmukkaa yksinkertaisten esimerkkien kautta. Ensi viikolla tutustutaan sitten monipuolisemmin sen mahdollisuuksiin.

Periaatteessa silmukka muistuttaa ehtolausetta. Ideana kuitenkin on, että sen avulla voidaan toistaa samaa koodia useamman kerran.

Tarkastellaan esimerkkiä, jossa ohjelma laskee käyttäjän syöttämien lukujen neliöitä, kunnes käyttäjä syöttää luvun -1:

while True:\n    luku = int(input(\"Anna luku, -1 lopettaa: \"))\n\n    if luku == -1:\n        break\n\n    print(luku ** 2)\n\nprint(\"Kiitos ja moi!\")

Ohjelman esimerkkisuoritus:

Anna luku, -1 lopettaa: 2\n4\nAnna luku, -1 lopettaa: 4\n16\nAnna luku, -1 lopettaa: 10\n100\nAnna luku, -1 lopettaa: -1\nKiitos ja moi!

Kuten esimerkistä huomataan, ohjelma kysyy while-lauseen ansiosta käyttäjältä useita lukuja. Sitten kun käyttäjän syöte on -1, suoritetaan break-komento, jolloin suoritus hyppää ensimmäiselle lohkon jälkeiselle riville.

Silmukoita käytettäessä on oltava tarkkana, että ei jouduta tilanteeseen, missä silmukan suoritus ei koskaan lopu. Muutetaan edellistä esimerkkiä seuraavasti

luku = int(input(\"Anna luku, -1 lopettaa: \"))\nwhile True:\n    if luku == -1:\n        break\n\n    print(luku ** 2)\n\nprint(\"Kiitos ja moi!\")

Nyt siis lukua kysytään silmukan ulkopuolella. Jos käyttäjä antaa minkä tahansa muun luvun kuin -1:n, ei silmukasta tulla koskaan pois, eli syntyy ikuinen silmukka. Tällöin silmukassa olevaa lohkoa suoritetaan ikuisesti:

Anna luku, -1 lopettaa: 2\n4\n4\n4\n4\n4\n4\n4\n4\n(jatkuu ikuisesti...)

Seuraavassa esimerkkinä ohjelma, joka antaa käyttäjän jatkaa eteenpäin vasta sen jälkeen, kun käyttäjä on syöttänyt oikean PIN-koodin 1234:

while True:\n    koodi = input(\"Anna PIN-koodi: \")\n    if koodi == \"1234\":\n        break\n    print(\"Väärin... yritä uudelleen\")\n\nprint(\"PIN-koodi oikein!\")

Anna PIN-koodi: 0000\nVäärin... yritä uudelleen\nAnna PIN-koodi: 9999\nVäärin... yritä uudelleen\nAnna PIN-koodi: 1234\nPIN-koodi oikein!

Kirjoita edellä olevaa toistolause-esimerkkiä mukaillen ohjelma, joka tulostaa viestin \"moi\" ja kysyy käyttäjältä \"Jatketaanko?\" kunnes käyttäjä syöttää merkkijonon \"ei\". Tämän jälkeen tulostetaan merkkijono \"ei sitten\" ja suoritus päättyy.

Esimerkkitulostus

moi\nJatketaanko? kyllä\nmoi\nJatketaanko? yes\nmoi\nJatketaanko? jawohl\nmoi\nJatketaanko? ei\nei sitten

Kirjoita ohjelma, joka kysyy käyttäjältä lukuja. Mikäli luku on negatiivinen (eli pienempi kuin nolla), käyttäjälle tulostetaan viesti \"Epäkelpo luku\" ja käyttäjältä kysytään uutta lukua. Jos taas luku on nolla, lukujen lukeminen lopetetaan ja ohjelma poistuu toistolauseesta.

Mikäli luku on positiivinen, ohjelma tulostaa luvun neliöjuuren käyttäen sqrt-funktiota, joka on tuotu ohjelmaan import-lauseella. Esimerkki funktion käytöstä:

# Tämä pitää olla ohjelman alussa, jotta sqrt toimii\nfrom math import sqrt\n\nprint(sqrt(9))

3.0

Esimerkki ohjelman suorituksesta:

Syötä luku: 16\n4.0\nSyötä luku: 4\n2.0\nSyötä luku: -3\nEpäkelpo luku\nSyötä luku: 1\n1.0\nSyötä luku: 0\nLopetetaan...

Tehtäväpohjassa olevan ohjelman

luku = 5\nprint(\"Lähtölaskenta!\")\nwhile True:\n  print(luku)\n  luku = luku - 1\n  if luku > 0:\n    break\n\nprint(\"Nyt!\")

olisi tarkoitus toimia seuraavasti:

Lähtölaskenta!\n5\n4\n3\n2\n1\nNyt!

Korjaa ohjelmassa oleva ongelma.

Tee ohjelma, joka kysyy käyttäjältä salasanaa ja tämän jälkeen pyytää toistamaan salasanan niin kauan, kunnes käyttäjä syöttää ensimmäisenä annetun salasanan uudelleen.

Salasana: sekred\nToista salasana: salainen\nEi ollut sama!\nToista salasana: enmuistaenää123\nEi ollut sama!\nToista salasana: sekred\nKäyttäjätunnus luotu!

Silmukka ja apumuuttujat

Tehdään vielä PIN-koodin tarkastavasta ohjelmasta monimutkaisempi versio, joka antaa käyttäjälle vain kolme mahdollisuutta yrittää PIN-koodin syöttämistä.

Ohjelma käyttää nyt kahta apumuuttujaa. Muuttuja yritykset pitää kirjaa siitä, montako kertaa käyttäjä on syöttänyt koodin. Muuttuja onnistui saa arvokseen joko True tai False riippuen siitä, onnistuuko kirjautuminen.

yritykset = 0\n\nwhile True:\n    tunnus = input(\"Anna PIN-koodi: \")\n    yritykset += 1\n\n    if tunnus == \"1234\":\n        onnistui = True\n        break\n\n    if yritykset == 3:\n        onnistui = False\n        break\n\n    # tänne tullaan jos väärin JA ei ole jo kolmea yritystä\n    print(\"Väärin... yritä uudelleen\")\n\nif onnistui:\n    print(\"PIN-koodi oikein!\")\nelse:\n    print(\"Liian monta yritystä...\")

Anna PIN-koodi: 0000\nVäärin... yritä uudelleen\nAnna PIN-koodi: 1234\nPIN-koodi oikein!

Anna PIN-koodi: 0000\nVäärin... yritä uudelleen\nAnna PIN-koodi: 9999\nVäärin... yritä uudelleen\nAnna PIN-koodi: 4321\nLiian monta yritystä...

Silmukasta tullaan siis ulos, jos käyttäjä syöttää oikean PIN-koodin tai jos yrityksiä tehdään liian monta. Silmukan jälkeinen if-lause tarkastaa muuttujan onnistui arvon perusteella, onko kirjautuminen onnistunut vai ei.

Debug-tulostus silmukassa

Kun ohjelma sisältää silmukoita, kasvavat mahdolliset bugienkin lähteet uudelle tasolle, ja tämän osan ensimmäisessä luvussa mainittujen debug-tulostusten tekeminen muuttuu entistäkin tärkeämmäksi.

Tarkastellaan esimerkkiä, jossa edellinen ohjelma on koodattu hieman väärin:

yritykset = 0\n\nwhile True:\n    tunnus = input(\"Anna PIN-koodi: \")\n    yritykset += 1\n\n    if yritykset == 3:\n        onnistui = False\n        break\n\n    if tunnus == \"1234\":\n        onnistui = True\n        break\n\n    print(\"Väärin... yritä uudelleen\")\n\nif onnistui:\n    print(\"PIN-koodi oikein!\")\nelse:\n    print(\"Liian monta yritystä...\")

Ohjelma toimii kummallisesti: se antaa yrittää PIN-koodia kolmesti mutta valittaa, että yrityksiä on liian monta, vaikka lopussa syötettiin oikea koodi:

Anna PIN-koodi: 0000\nVäärin... yritä uudelleen\nAnna PIN-koodi: 9999\nVäärin... yritä uudelleen\nAnna PIN-koodi: 1234\nLiian monta yritystä...

Bugin syy selviää lisäämällä sopivia debug-tulostuksia:

while True:\n    print(\"whilen lohko alkaa:\")\n    tunnus = input(\"Anna PIN-koodi: \")\n    yritykset += 1\n\n    print(\"yritykset:\", yritykset)\n    print(\"ehto1:\", yritykset == 3)\n    if yritykset == 3:\n        onnistui = False\n        break\n\n    print(\"tunnus:\", tunnus)\n    print(\"ehto2:\", tunnus == \"1234\")\n    if tunnus == \"1234\":\n        onnistui = True\n        break\n\n    print(\"Väärin... yritä uudelleen\")

whilen lohko alkaa:\nAnna PIN-koodi: 2233\nyritykset: 1\nehto1: False\ntunnus: 2233\nehto2: False\nVäärin... yritä uudelleen\nwhilen lohko alkaa:\nAnna PIN-koodi: 4545\nyritykset: 2\nehto1: False\ntunnus: 4545\nehto2: False\nVäärin... yritä uudelleen\nwhilen lohko alkaa:\nAnna PIN-koodi: 1234\nyritykset: 3\nehto1: True\nLiian monta yritystä...

Tulostuksista huomataan, että kolmannella silmukan kierroksella ensimmäisen if-komennon ehto on tosi ja silmukasta poistutaan, ennen kuin ehditään tarkastaa, oliko juuri syötetty salasana oikein:

  while True:\n    # ....\n\n    # tämä lohko on liian aikaisin\n    if yritykset == 3:\n        onnistui = False\n        break\n\n    # tänne ei päästä enää kolmannella yrityksellä...\n    if tunnus == \"1234\":\n        onnistui = True\n        break

Tee sovellus, joka kysyy käyttäjältä PIN-koodia niin kauan, kunnes käyttäjä antaa oikean PIN-koodin 4321. Ohjelma kertoo yritysten lukumäärän:

PIN-koodi: 3245\nVäärin\nPIN-koodi: 1234\nVäärin\nPIN-koodi: 0000\nVäärin\nPIN-koodi: 4321\nOikein, tarvitsit 4 yritystä

Tulostus on hieman erilainen jos PIN-koodi on oikea heti ensimmäisellä yrityksellä:

PIN-koodi: 4321\nOikein, tarvitsit vain yhden yrityksen!

Tee ohjelma, joka kyselee käyttäjältä vuosilukua ja kertoo, milloin on seuraava karkausvuosi.

Vuosi: 2019\nVuotta 2019 seuraava karkausvuosi on 2020

Jos käyttäjän syöttämä vuosi on karkausvuosi (kuten 2020), ohjelma ei kerro tätä vuotta vaan sitä seuraavan karkausvuoden:

Vuosi: 2020\nVuotta 2020 seuraava karkausvuosi on 2024

Merkkijonon kokoaminen plus-operaattorilla

PIN-koodin tarkastavassa esimerkissä käytimme apumuuttujaa yritykset pitämään kirjaa siitä, montako kertaa PIN-koodi on syötetty:

yritykset = 0\n\nwhile True:\n    tunnus = input(\"Anna PIN-koodi: \")\n    yritykset += 1\n    # ...

Muuttuja saa arvon nolla silmukan ulkopuolella, ja jokainen silmukan suoritus kasvattaa sen arvoa yhdellä.

Vastaava idea toimii myös merkkijonoille. Voisimme laajentaa ohjelmaa siten, että se kokoaa yhteen merkkijonoon kaikki käyttäjän syöttämät PIN-koodit:

tunnukset = \"\"\nyritykset = 0\n\nwhile True:\n    tunnus = input(\"Anna PIN-koodi: \")\n    yritykset += 1\n    tunnukset += tunnus + \", \"\n    # ...

Apumuuttuja saa aluksi arvokseen tyhjän merkkijonon eli merkkijonon, jossa ei ole yhtään merkkiä:

tunnukset = \"\"

Silmukan sisällä merkkijonoa kasvatetaan lisäämällä siihen aina silmukassa syötetty tunnus ja pilkku:

    tunnus = input(\"Anna PIN-koodi: \")\n    tunnukset += tunnus + \", \"

Jos käyttäjä syöttäisi tunnukset 1111 2222 1234 olisi muuttujan tunnukset arvo lopulta

1111, 2222, 1234,

Osa 1

Tee ohjelma, joka pyytää käyttäjää syöttämään sanoja. Kun käyttäjä syöttää sanan loppu, ohjelma tulostaa sanoista muodostuneen tarinan ja suoritus päättyy.

Anna sana: Olipa\nAnna sana: kerran\nAnna sana: pieni\nAnna sana: talo\nAnna sana: preerialla\nAnna sana: loppu\nOlipa kerran pieni talo preerialla

Osa 2

Muokkaa edellisen tehtävän ohjelmaa niin, että sanojen syöttäminen päättyy, jos käyttäjä syöttää sanan loppu tai käyttäjä syöttää saman sanan kaksi kertaa peräkkäin.

Anna sana: Alussa\nAnna sana: oli\nAnna sana: suo\nAnna sana: kuokka\nAnna sana: ja\nAnna sana: Jussi\nAnna sana: Jussi\nAlussa oli suo kuokka ja Jussi

Tee ohjelma, joka pyytää käyttäjää syöttämään kokonaislukuja. Ohjelma pyytää lukuja niin kauan kunnes käyttäjä syöttää nollan.

Syötä kokonaislukuja, 0 lopettaa:\nLuku: 5\nLuku: 22\nLuku: 9\nLuku: -2\nLuku: 0

Osa 1: lukumäärä

Syötteiden lukemisen jälkeen ohjelman tulee tulostaa syötettyjen lukujen lukumäärä. Syötteen loppumisesta kertovaa nollaa ei tule ottaa huomioon lukumäärässä.

Tarvitset tässä uuden muuttujan, jonka avulla pidät kirjaa luettujen lukujen määrästä.

... lukujen kysely\nLukuja yhteensä 4

Osa 2: summa

Laajenna ohjelmaa siten, että se tulostaa syötettyjen lukujen summa. Syötteen loppumisesta kertovaa nollaa ei tule ottaa huomioon summan laskemisessa.

Ohjelman tulostus laajenee seuraavasti:

... lukujen kysely\nLukuja yhteensä 4\nLukujen summa 34

Osa 3: keskiarvo

Laajenna ohjelmaa siten, että se tulostaa syötettyjen lukujen keskiarvon. Syötteen loppumisesta kertovaa nollaa ei tule ottaa huomioon keskiarvon laskemisessa. Voit olettaa, että käyttäjä syöttää aina vähintään yhden luvun.

... lukujen kysely\nLukuja yhteensä 4\nLukujen summa 34\nLukujen keskiarvo 8.5

Osa 4: positiiviset ja negatiiviset

Laajenna ohjelmaa siten, että se tulostaa positiivisten ja negatiivisten lukujen lukumäärät

... lukujen kysely\nLukuja yhteensä 4\nLukujen summa 34\nLukujen keskiarvo 8.5\nPositiivisia 3\nNegatiivisia 1

Vastaa lopuksi koko toista osaa koskevaan loppukyselyyn:

","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-2/4-yksinkertainen-silmukka.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-2/page-data.json b/page-data/osa-2/page-data.json index 31704692a..6fb6c9182 100644 --- a/page-data/osa-2/page-data.json +++ b/page-data/osa-2/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-part-overview-template-js", "path": "/osa-2", - "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-2","title":"Osa 2"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-2/index.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-2","title":"Osa 2"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-2/index.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-3/1-ehdot-silmukoissa/page-data.json b/page-data/osa-3/1-ehdot-silmukoissa/page-data.json index 5f38e6f32..d4ee81742 100644 --- a/page-data/osa-3/1-ehdot-silmukoissa/page-data.json +++ b/page-data/osa-3/1-ehdot-silmukoissa/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-3/1-ehdot-silmukoissa", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat tehdä while-silmukan, jonka alkurivillä on ehto"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mikä merkitys alustuksella, ehdolla ja muutoksella on silmukassa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää erilaisia ehtoja silmukoissa"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"osallistu-tutkimukseen---vastaa-kyselyyn","style":"position:relative;"},"children":[{"type":"text","value":"Osallistu tutkimukseen - vastaa kyselyyn"},{"type":"element","tagName":"a","properties":{"href":"#osallistu-tutkimukseen---vastaa-kyselyyn","ariaLabel":"osallistu tutkimukseen vastaa kyselyyn permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Alla olevan linkin takaa löytyy Hannu Pesosen väitöskirjatutkimukseen liittyvä kysely. Kurssin suorittaminen ei edellytä kyselyyn vastaamista, mutta yliopistoissa tutkimus on luonnollisesti tärkeässä osassa myös opetuksen kehittämisessä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos sinulta siis löytyy hetki aikaa, niin "},{"type":"element","tagName":"a","properties":{"href":"https://link.webropolsurveys.com/S/EB89556E704FA59B","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"vastaa kyselyyn"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kyselyyn ei ole pakko antaa henkilötietoja (esimerkiksi nimeä), vaikka niitä ensimmäisellä sivulla kysytäänkin."}]},{"type":"comment","value":"vastaava teksti löytyy osioista 3-1, 5-1 ja 6-1, tsekkaa kaikki jos muokkaat tätä"},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Kurssin tehtävien tekemisestä"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmointitaidon kehittyminen edellyttää vahvaa rutiinia ja myös omaa soveltavaa oivaltamista. Tämän takia kurssilla on paljon tehtäviä. Osa tehtävistä on kohtuullisen suoraviivaisesti materiaalia hyödyntäviä ja osa taas aivan tarkoituksella haastavampia soveltavia tehtäviä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ei kannata huolestua, vaikka osa kurssin tehtävistä tuntuisikin ensiyrittämällä liian vaikealta. Kaikkia tehtäviä ei ole pakko tehdä, kuten "},{"type":"element","tagName":"a","properties":{"href":"/arvostelu-ja-kokeet"},"children":[{"type":"text","value":"arvosteluperusteet"}]},{"type":"text","value":" toteavat, "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kurssin läpipääsyyn vaaditaan vähintään 25 % jokaisen osan ohjelmointitehtävien pisteistä."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Kurssin osien tehtävät eivät etene vaikeusjärjestyksessä."}]},{"type":"text","value":" Jokaisessa aliosassa esitellään yleensä muutama uusi konsepti, joita harjoitellaan sekä helpommilla että soveltavimmilla tehtävillä. "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Jos törmäät liian haastavan tuntuiseen tehtävään, hyppää seuraavaan"}]},{"type":"text","value":". Voit palata vaikeimpiin tehtäviin osan lopuksi, jos aikaa vielä jää."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lohdutuksen sanana todettakoon, että tällä viikolla mahdottomalta vaikuttava tehtävä näyttää melko varmasti neljän viikon päästä melko helpolta."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellisen osan lopussa opimme käyttämään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"while True"}]},{"type":"text","value":" -silmukkaa koodin toistamiseen. Tässä tapauksessa silmukan ehtona on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", joka on aina tosi. Esimerkiksi"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulosta lukuja kunnes muuttujan a arvo on 5"}]},{"type":"text","value":"\na "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1\n2\n3\n4"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Silmukan toimintaa voidaan monipuolistaa käyttämällä ehtoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":"-määrittelyssä. Yleisemmin voimme siis käyttää silmukkaa näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"ehtolauseke"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"lohko"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ideana on, että silmukka vuorotellen tarkastaa ehdon ja suorittaa lohkossa olevan koodin, jos ehto on tosi. Sitten kun ehto on epätosi, ohjelman suoritus jatkuu silmukan jälkeiseltä riviltä."}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 417px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/424da59634e40bf73e0e8f025df3bf97/f27fb/3_1_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 103.04347826086956%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAYAAABG1c6oAAAACXBIWXMAAAsTAAALEwEAmpwYAAABtUlEQVQ4y42Vya7CMAxF+//fhdgghFjAgklQxCTmqcz46VhyZdLCi6WqSRpfX187aSIR9n6/9f14PORyueRrtu4tCZ38Rhvb/Hq9yn6/L+wvBQw/eofX66XjLMuk3+8XgvmnwPB8PsvxeCyNvl6vpdFoKNNvVgDcbrcKajYajWQ8HstwOJRutyvL5VLfrG02G9WU/bBXhkbV0trtdrnwrDWbTZnNZpKmqQwGAwXqdDoynU6VMfvRlTnMk5CyB7zdbnn69s0cQzscDuqXEJWn1+tpOkS1lO/3u6xWqw+ner2ey0MGNjYiCRFJCa3QBAAPSAAMpuyp1Wq6B8289gCyVkgZPXzKxhD2zK19KJ6xxE6nkzb+z6I8n09lD+h8PpfFYiGtVkuD+gbHly6YTCblbROmgwFqxUAS5PENTvWRrwCIk2nojx0pAUpAdDVw/11Tjjl6GDKQJo5Um4L9LMqvywFDQwoDQ7QMi8Jc2yb26oIdBalUKgperVYVGC2RgDVYRwPiSMVxhA1jY+gbPBoQjWDEQ+plnfBxfcWAkpI/2+FdGM3QNgPWbrfjb+z/GHL0TLtv/5Q/PCdoDvdVsp0AAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/424da59634e40bf73e0e8f025df3bf97/a0b58/3_1_1.webp 230w","/static/424da59634e40bf73e0e8f025df3bf97/b6b2f/3_1_1.webp 417w"],"sizes":"(max-width: 417px) 100vw, 417px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/424da59634e40bf73e0e8f025df3bf97/81c8e/3_1_1.png 230w","/static/424da59634e40bf73e0e8f025df3bf97/f27fb/3_1_1.png 417w"],"sizes":"(max-width: 417px) 100vw, 417px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/424da59634e40bf73e0e8f025df3bf97/f27fb/3_1_1.png","alt":"3 1 1","title":"3 1 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraavassa silmukassa ehtona on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku < 10"}]},{"type":"text","value":" eli silmukan koodi suoritetaan, jos luku on alle 10."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suoritus valmis.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostus voi olla seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\n4\n5\n6\n7\n8\n9\nSuoritus valmis."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska ehto tarkastetaan aina ennen silmukan koodin suoritusta, on mahdollista, ettei koodia suoriteta kertaakaan. Esimerkiksi:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"12"}]},{"type":"text","value":"\nSuoritus valmis."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska 12 ei ole pienempi kuin 10, ohjelma ei tulosta yhtään lukua."}]},{"type":"element","tagName":"h2","properties":{"id":"alustus-testaus-ja-muutos","style":"position:relative;"},"children":[{"type":"text","value":"Alustus, testaus ja muutos"},{"type":"element","tagName":"a","properties":{"href":"#alustus-testaus-ja-muutos","ariaLabel":"alustus testaus ja muutos permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Monessa silmukassa on kolme osaa: alustus, ehto ja muutos."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Alustus"}]},{"type":"text","value":" tarkoittaa silmukassa käytettävän muuttujan tai muuttujien alkuarvojen antamista. Tämä vaihe tehdään ennen silmukkaa. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Ehto"}]},{"type":"text","value":" kirjoitetaan silmukan alkuun, ja se määrittelee, kuinka kauan silmukkaa suoritetaan. Joka kierroksella tapahtuva "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"muutos"}]},{"type":"text","value":" vie silmukan askeleen lähemmäs sen loppumista. Esimerkiksi:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 508px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/773a3863d322b19f5fceeae0dc3638e2/2fd48/3_1_2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 60%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAAB00lEQVQoz41T24riUBDM//+WqLDz4ouIL4IziTH3k5z7LTV064jswrANxTkdku6uqk4RQoS2Ds4HKG3hfMT/RggBzjnknPlujEExzzM+v0oYq9FNNca5xWI6LHrErFtoN/Ppg+WPDocDmqZB3/e4Xq+M7XaL0+mEZVlQhOC5C7AiZY+QLHzUiMkjRIOYHOfrmnmS+/0Oay2896jrGmVZ4ng84nK5YBxHFN4HSG2glMEiNbS2MMZDzBLOBWjjYOwjD/FfOdZ1fd1TSiiMsRimGYtUGMXjnBeJfpjQDROkMlxsEgtCTM8ijwJKKaZJp5SSUYzS4iYM+kmgvtewSkM2I9JT6P1+j7Ks0LYd2rZldF3HOhJNIQQ2mw1TZ1PyuiLmjJgSj0wU1pxfVEgv0u6H3jvIGMLtduNGrOEPd6ktxCKZrtLmRd04/+vqvDdjDSlxIaEaJZppwdfXJ3cioehl0ogcjTGyBO+gqchpWp2qqnja4tEloawqeOcwDgP6YUB2AclH/Pn44FUZ6PmTIoE0JN2o4G63w/l85qYF6edjQsyJdy9mj5QjYgqc/xb0UxAbcpfM4Qkn7dAsFkLNEPoOoRpIO0KaAYMsYZzkzn8b8r5/7/ENzfOeAgtI+uQAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/773a3863d322b19f5fceeae0dc3638e2/a0b58/3_1_2.webp 230w","/static/773a3863d322b19f5fceeae0dc3638e2/bc10c/3_1_2.webp 460w","/static/773a3863d322b19f5fceeae0dc3638e2/7b066/3_1_2.webp 508w"],"sizes":"(max-width: 508px) 100vw, 508px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/773a3863d322b19f5fceeae0dc3638e2/81c8e/3_1_2.png 230w","/static/773a3863d322b19f5fceeae0dc3638e2/08a84/3_1_2.png 460w","/static/773a3863d322b19f5fceeae0dc3638e2/2fd48/3_1_2.png 508w"],"sizes":"(max-width: 508px) 100vw, 508px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/773a3863d322b19f5fceeae0dc3638e2/2fd48/3_1_2.png","alt":"3 1 2","title":"3 1 2","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos jokin kolmesta osasta puuttuu, silmukka ei toimi oikein. Yksi tyypillinen virhe on muutoksen unohtaminen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suoritus valmis.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku"}]},{"type":"text","value":" arvo ei koskaan muutu, jää ohjelma suoritettaessa ikuiseen silmukkaan eli toistaa samaa koodia, kunnes käyttäjä katkaisee ohjelman suorituksen (esimerkiksi painamalla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Control"}]},{"type":"text","value":" + "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"C"}]},{"type":"text","value":"):"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1\n1\n1\n1\n1\n(tämä jatkuu ikuisesti...)"}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Tulosta luvut","tmcname":"osa03-00_tulosta_luvut"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita ohjelma, joka tulostaa silmukassa luvut kahdesta kolmeenkymmeneen kahden luvun välein. Jokainen luku tulostetaan omalle rivilleen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulosteen alku näytää siis tältä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"text","value":"\n2\n4\n6\n8\njne...\n"}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Lähtölaskenta","tmcname":"osa03-01_lahtolaskenta"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Korjaa tehtäväpohjassa oleva ohjelma"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Valmiina?\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nyt!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"siten että se toimii seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Valmiina?\nAnna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\n5\n4\n3\n2\n1\nNyt!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Älä tällä kertaa käytä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"while True"}]},{"type":"text","value":" -silmukkaa!"}]}]},{"type":"element","tagName":"h2","properties":{"id":"ehdoista-tarkemmin","style":"position:relative;"},"children":[{"type":"text","value":"Ehdoista tarkemmin"},{"type":"element","tagName":"a","properties":{"href":"#ehdoista-tarkemmin","ariaLabel":"ehdoista tarkemmin permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Silmukan ehtona voidaan käyttää mitä tahansa ehtolauseketta. Esimerkiksi seuraava ohjelma tulostaa lukuja kolmen välein niin kauan kuin luku on pienempi kuin 100 eikä se ole jaollinen 5:llä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"!="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kaksi esimerkkitulostusta eri syötteillä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"28"}]},{"type":"text","value":"\n28\n31\n34\n37"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"96"}]},{"type":"text","value":"\n96\n99"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luvun 28 kohdalla silmukka päättyy lukuun 37, koska seuraava luku 40 on jaollinen 5:llä. Luvun 96 kohdalla silmukka päättyy lukuun 99, koska seuraava luku 102 ei ole alle 100."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Silmukan ehtoa kirjoittaessa on tärkeä varmistua siitä, että silmukan suoritus päättyy. Esimerkiksi seuraava ohjelma on joko päättyvä tai ei-päättyvä riippuen alkuarvosta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"!="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos syötteenä on parillinen luku, joka on enintään 10, silmukan suoritus päättyy:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\n4\n6\n8"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muissa tapauksissa silmukka on kuitenkin ikuinen, koska muuttuja ei koskaan saavuta arvoa 10. Tällaisia syötteitä ovat esimerkiksi 3 ja 12."}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Luvut","tmcname":"osa03-02_luvut"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka tulostaa kaikki käyttäjän antamaa lukua pienemmät luvut alkaen luvusta yksi."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mihin asti: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\n1\n2\n3\n4"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Älä käytä tässä tehtävässä while-komennon ehtona arvoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"!"}]}]},{"type":"element","tagName":"h2","properties":{"id":"lisaa-debuggauksesta","style":"position:relative;"},"children":[{"type":"text","value":"Lisää debuggauksesta"},{"type":"element","tagName":"a","properties":{"href":"#lisaa-debuggauksesta","ariaLabel":"lisaa debuggauksesta permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hieman haastavampaa ohjelmaa, esim. seuraavaksi vuorossa olevaa tehtävää "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Kahden potenssit"}]},{"type":"text","value":", koodatessa voitaisiin lähteä liikkeelle seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"asti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mihin asti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" asti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# koodia"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä on aloitettu syötteen lukemisesta, minkä jälkeen ruvetaan miettimään silmukan lopetusehtoa sekä silmukan toimintaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Todennäköisesti ohjelma ei ensimmäisillä kokeilukerroilla toimi halutulla tavalla ja koodia on testailtava kymmeniä tai jopa satoja kertoja ennen kuin se alkaa toimia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska koodi lukee syötteitä käyttäjältä, sen toiminnan kokeileminen on hidasta ja vaivalloista, koska jokaisella testauskerralla on ohjelmalle annettava näppäimistöltä käsin sen haluamat syötteet."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yksi tapa toimia on \"kovakoodata\" syöte aluksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kovakoodataan syötteen arvo aluksi"}]},{"type":"text","value":"\nasti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# int(input(\"Mihin asti\"))"}]},{"type":"text","value":"\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" asti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# koodia"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun ohjelma toimii yhdellä syötteellä, sitä on helppo kokeilla muilla kovakoodatuilla syötteillä ja lopulta lukemalla syöte käyttäjältä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaava kikka toimii myös kurssien tehtäviin liittyvien testien ongelmatilanteita selvitellessä. Jos testi kertoo, että ohjelmasi toimii väärin, kun syöte on vaikkapa 42, niin kovakoodataan se syötteeksi bugin etsinnän ajaksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# testi ilmoitti että koodi toimii väärin kun syöte on 42"}]},{"type":"text","value":"\nasti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"42"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# int(input(\"Mihin asti\"))"}]},{"type":"text","value":"\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" asti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# koodia"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kurssin "},{"type":"element","tagName":"a","properties":{"href":"/osa-2"},"children":[{"type":"text","value":"edellisessä osassa"}]},{"type":"text","value":" oli jo pariinkin otteeseen puhetta tulostuskomennon avulla tapahtuvasta debuggaamisesta. Kurssin aikana vastaan tulevat ohjelmat muuttuvat koko ajan haastavammiksi ja debuggauksen tarve tulee kasvamaan entisestään. Esimerkiksi silmukoiden lopetusehtojen saaminen toimimaan kaikissa tapauksissa voi olla haastavaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostuskomentoihin perustuva debuggaus kannattaa ottaa omaan työkalupakkiin viimeistään nyt. Kertaa tarvittaessa edellisen osan "},{"type":"element","tagName":"a","properties":{"href":"/osa-2/1-ohjelmoinnin-termeja"},"children":[{"type":"text","value":"ensimmäisessä "}]},{"type":"text","value":" ja "},{"type":"element","tagName":"a","properties":{"href":"/osa-2/4-yksinkertainen-silmukka"},"children":[{"type":"text","value":"neljännessä"}]},{"type":"text","value":" luvussa olleet debuggausohjeet."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostamisen lisäksi on olemassa muitakin debuggaukseen sopivia työkaluja. Eräs tälläinen on sivuston "},{"type":"element","tagName":"a","properties":{"href":"http://www.pythontutor.com/","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Python Tutor"}]},{"type":"text","value":" tarjoama "},{"type":"element","tagName":"a","properties":{"href":"http://www.pythontutor.com/visualize.html#mode=edit","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"visualisointityökalu"}]},{"type":"text","value":", jonka avulla oman ohjelman koodia on mahdollista suorittaa komento komennolta havainnoiden samalla, mitä arvoja ohjelman muuttujat saavat."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa kuvassa Python Tutorilla visualisoidaan "},{"type":"element","tagName":"a","properties":{"href":"/osa-2/4-yksinkertainen-silmukka"},"children":[{"type":"text","value":"edellisen osan"}]},{"type":"text","value":" debuggausmateriaalissa olevan hieman rikkinäisen koodin toimintaa:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/d0cc22babf6824495497d96f07b56664/95fa1/3_1_0.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 69.1304347826087%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAABYlAAAWJQFJUiTwAAABYUlEQVQoz42S3VLcMAxG8/4v15vOMFN6AdklIRv/xIkVSbYlM8Sww7alcCbjKx99kpVOVetBBHwaLn6JIqIHtVZVned5mqZ2Lsuy77scqGqnqoi4huD86gPAnkTetHaez+e+78dxGMcRAFqSqopIV2sFAGstQBQpOTEzIWIppV26ttZoseWgy4lFxFo7jqO1LoSAuMcYc85N45Q4F2s982vhEMK1UCdMrdLpdHLOxRhb5pVfD88/7h5/nxyyXMd5lw8z5+ycI6J930spH7vtR/vzvn94ski53tKVUkQkpTQMw7Zt3vuPyX/P/KfcOKZFVSUiACCiZrbF/VsWEUT03htjAIA5AQAiMrO+82myiGzbdrlcvHNh8d6/Pngzv25bVUspKXHYYJoX4wLR//Z8Izvn2uqK1JRVbm9+1XbJxGystda0b57nEEJbYfuHP08ODM4Ha2Zj+r6fpmldVyL6TvIL8JgySYPZRccAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/d0cc22babf6824495497d96f07b56664/a0b58/3_1_0.webp 230w","/static/d0cc22babf6824495497d96f07b56664/bc10c/3_1_0.webp 460w","/static/d0cc22babf6824495497d96f07b56664/966d8/3_1_0.webp 920w","/static/d0cc22babf6824495497d96f07b56664/445df/3_1_0.webp 1380w","/static/d0cc22babf6824495497d96f07b56664/a8768/3_1_0.webp 1816w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/d0cc22babf6824495497d96f07b56664/81c8e/3_1_0.png 230w","/static/d0cc22babf6824495497d96f07b56664/08a84/3_1_0.png 460w","/static/d0cc22babf6824495497d96f07b56664/c0255/3_1_0.png 920w","/static/d0cc22babf6824495497d96f07b56664/b1001/3_1_0.png 1380w","/static/d0cc22babf6824495497d96f07b56664/95fa1/3_1_0.png 1816w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/d0cc22babf6824495497d96f07b56664/c0255/3_1_0.png","alt":"3 1 0","title":"3 1 0","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Punainen nuoli kertoo, missä kohtaa ohjelman suoritus on menossa. Visualisaattori näyttää, mitä ohjelma on tulostanut ruudulle ja mitkä ovat ohjelman muuttujien arvot kullakin suorituksen hetkellä. Koodin suoritus etenee komento komennolta painiketta "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Next>"}]},{"type":"text","value":" painellessa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Visualisaattorin käyttö on erittäin helppoa, koska riittää että tarkasteltava koodi kopioidaan "},{"type":"element","tagName":"a","properties":{"href":"http://www.pythontutor.com/visualize.html#mode=edit","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"koodi-ikkunaan"}]},{"type":"text","value":". Huomaa, että visualisaattori ei saalli ääkkösten käyttämistä muuttujien eikä funktioiden nimissä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kokeneemmat ohjelmoijat tuskin käyttävät visualisaattoria koskaan, mutta aloittelijalle se voi olla oiva apuväline. Ohjelmointi ei nimittäin voi perustua tuuriin tai sattumaan. Ohjelmoijan on koko ajan tiedettävä tarkalleen, mitä muuttujien arvot ohjelman suorituksen aikana ovat. Jos muuttujien arvot eivät vastaakaan ohjelmoijan olettamaa, on tuloksena mitä suurimmalla todennäköisyydellä bugi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Visualisaattori ja debuggaustulostukset ovat erinomainen väline siihen, että ohjelmoija voi omin silmin varmistaa, että ohjelma todellakin toimii kuten sen olettaa toimivan."}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Kahden potenssit","tmcname":"osa03-03_kahden_potenssit"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka tulostaa ensin luvun 1 ja sen jälkeen kerta toisensa jälkeen aina kaksi kertaa suuremman luvun. Ohjelma siis tulostaa luvun kaksi potensseja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suoritus päättyy, kun on tulostettu luku, joka on korkeintaan käyttäjän syötteen suuruinen. Yhtään käyttäjän syötettä suurempaa lukua ei siis tulosteta!"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mihin asti: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"8"}]},{"type":"text","value":"\n1\n2\n4\n8"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mihin asti: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"20"}]},{"type":"text","value":"\n1\n2\n4\n8\n16"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mihin asti: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"100"}]},{"type":"text","value":"\n1\n2\n4\n8\n16\n32\n64"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Älä käytä tässä tehtävässä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":"-komennon ehtona arvoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Miten kahden potenssit lasketaan?"}]},{"type":"text","value":" Ensimmäinen kahden potenssi on luku 1. Seuraava saadaan kertomalla 1 luvulla 2, eli se on 2. Sitä seuraava saadaan taas kertomalla edellinen kahden potenssi kahdella, eli kyseessä on 2 * 2 eli 4, ja seuraava saadaan kertomalla kahdella 4 * 2 eli kyseessä on 8, jne..."}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Luvun n potenssit","tmcname":"osa03-04_luvun_n_potenssit"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuta edellistä ohjelmaa siten, että käyttäjä saa määrätä kertoimen (edellisessä ohjelmassa kerroin oli aina 2), eli sen, minkä luvun potensseja ohjelma tulostaa."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mihin asti: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"27"}]},{"type":"text","value":"\nMikä kerroin: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n1\n3\n9\n27"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mihin asti: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1234567"}]},{"type":"text","value":"\nMikä kerroin: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n1\n10\n100\n1000\n10000\n100000\n1000000"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Älä käytä tässä tehtävässä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":"-komennon ehtona arvoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"!"}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Peräkkäisten summa, versio 1","tmcname":"osa03-04a_perakkaisten_summa_helpompi"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka laskee peräkkäisten lukujen summaa 1 + 2 + 3 + ... kunnes sen arvo on vähintään käyttäjän syöttämä luku. Ohjelma toimii seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mihin asti: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n3"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mihin asti: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n10"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mihin asti: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"18"}]},{"type":"text","value":"\n21"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa, että käyttäjän antama luku on 2 tai suurempi."}]}]},{"type":"element","tagName":"h2","properties":{"id":"merkkijonon-rakentaminen-paloista","style":"position:relative;"},"children":[{"type":"text","value":"Merkkijonon rakentaminen paloista"},{"type":"element","tagName":"a","properties":{"href":"#merkkijonon-rakentaminen-paloista","ariaLabel":"merkkijonon rakentaminen paloista permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jo kurssin "},{"type":"element","tagName":"a","properties":{"href":"/osa-1/2-tietoa-kayttajalta"},"children":[{"type":"text","value":"ensimetreillä"}]},{"type":"text","value":" opimme, että merkkijono on mahdollista \"rakentaa\" useammasta pienemmästä merkkijonosta +-operaattorin avulla. Esimerkiksi"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"suo\""}]},{"type":"text","value":"\nsanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\", kuokka\""}]},{"type":"text","value":"\nsanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" ja python\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"suo, kuokka ja python"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että edellinen on mahdollista kirjoittaa hieman tiiviimmin operaattorin += avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"suo\""}]},{"type":"text","value":"\nsanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\", kuokka\""}]},{"type":"text","value":"\nsanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" ja python\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yhdistettävä merkkijonon pätkä voi olla myös f-merkkijono. Tämä saattaa olla kätevää, jos rakennettavaan merkkijonoon lisätään muuttujissa olevia arvoja. Voimme siis tehdä esim. seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kurssi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"text","value":"\narvosana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\n\nlausunto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olet saanut \""}]},{"type":"text","value":"\nlausunto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"kurssilta "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"kurssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" \""}]}]},{"type":"text","value":"\nlausunto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"arvosanan "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"arvosana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lausunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olet saanut kurssilta Ohjelmoinnin perusteet arvosanan 4"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellisessä tehtävässä laskettiin lukujen summaa kasvattamalla sen arvoa silmukan sisällä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Täsmälleen samalla idealla on mahdollista rakentaa myös merkkijonoa siten, että siihen lisätään yksi osa kerrallaan silmukassa..."}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Peräkkäisten summa, versio 2","tmcname":"osa03-05_perakkaisten_summa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee edellisestä ohjelmasta hieman kehittyneempi versio, joka tulostaa lopputuloksen lisäksi myös sen miten kyseinen summa lasketaan:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mihin asti: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nLaskettiin 1 + 2 = 3"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mihin asti: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\nLaskettiin 1 + 2 + 3 + 4 = 10"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mihin asti: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"18"}]},{"type":"text","value":"\nLaskettiin 1 + 2 + 3 + 4 + 5 + 6 = 21"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa, että käyttäjän antama luku on 2 tai suurempi."}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat tehdä while-silmukan, jonka alkurivillä on ehto
  • \n
  • Tiedät, mikä merkitys alustuksella, ehdolla ja muutoksella on silmukassa
  • \n
  • Osaat käyttää erilaisia ehtoja silmukoissa
  • \n

Osallistu tutkimukseen - vastaa kyselyyn

Alla olevan linkin takaa löytyy Hannu Pesosen väitöskirjatutkimukseen liittyvä kysely. Kurssin suorittaminen ei edellytä kyselyyn vastaamista, mutta yliopistoissa tutkimus on luonnollisesti tärkeässä osassa myös opetuksen kehittämisessä.

Jos sinulta siis löytyy hetki aikaa, niin vastaa kyselyyn.

Kyselyyn ei ole pakko antaa henkilötietoja (esimerkiksi nimeä), vaikka niitä ensimmäisellä sivulla kysytäänkin.

Ohjelmointitaidon kehittyminen edellyttää vahvaa rutiinia ja myös omaa soveltavaa oivaltamista. Tämän takia kurssilla on paljon tehtäviä. Osa tehtävistä on kohtuullisen suoraviivaisesti materiaalia hyödyntäviä ja osa taas aivan tarkoituksella haastavampia soveltavia tehtäviä.

Ei kannata huolestua, vaikka osa kurssin tehtävistä tuntuisikin ensiyrittämällä liian vaikealta. Kaikkia tehtäviä ei ole pakko tehdä, kuten arvosteluperusteet toteavat, kurssin läpipääsyyn vaaditaan vähintään 25 % jokaisen osan ohjelmointitehtävien pisteistä.

Kurssin osien tehtävät eivät etene vaikeusjärjestyksessä. Jokaisessa aliosassa esitellään yleensä muutama uusi konsepti, joita harjoitellaan sekä helpommilla että soveltavimmilla tehtävillä. Jos törmäät liian haastavan tuntuiseen tehtävään, hyppää seuraavaan. Voit palata vaikeimpiin tehtäviin osan lopuksi, jos aikaa vielä jää.

Lohdutuksen sanana todettakoon, että tällä viikolla mahdottomalta vaikuttava tehtävä näyttää melko varmasti neljän viikon päästä melko helpolta.

Edellisen osan lopussa opimme käyttämään while True -silmukkaa koodin toistamiseen. Tässä tapauksessa silmukan ehtona on True, joka on aina tosi. Esimerkiksi

# Tulosta lukuja kunnes muuttujan a arvo on 5\na = 1\nwhile True:\n    print(a)\n    a += 1\n    if a == 5:\n        break

1\n2\n3\n4

Silmukan toimintaa voidaan monipuolistaa käyttämällä ehtoa while-määrittelyssä. Yleisemmin voimme siis käyttää silmukkaa näin:

while <ehtolauseke>:\n    <lohko>

Ideana on, että silmukka vuorotellen tarkastaa ehdon ja suorittaa lohkossa olevan koodin, jos ehto on tosi. Sitten kun ehto on epätosi, ohjelman suoritus jatkuu silmukan jälkeiseltä riviltä.

\n \n

Tämän osion jälkeen

    \n
  • Osaat tehdä while-silmukan, jonka alkurivillä on ehto
  • \n
  • Tiedät, mikä merkitys alustuksella, ehdolla ja muutoksella on silmukassa
  • \n
  • Osaat käyttää erilaisia ehtoja silmukoissa
  • \n

Osallistu tutkimukseen - vastaa kyselyyn

Alla olevan linkin takaa löytyy Hannu Pesosen väitöskirjatutkimukseen liittyvä kysely. Kurssin suorittaminen ei edellytä kyselyyn vastaamista, mutta yliopistoissa tutkimus on luonnollisesti tärkeässä osassa myös opetuksen kehittämisessä.

Jos sinulta siis löytyy hetki aikaa, niin vastaa kyselyyn.

Kyselyyn ei ole pakko antaa henkilötietoja (esimerkiksi nimeä), vaikka niitä ensimmäisellä sivulla kysytäänkin.

Ohjelmointitaidon kehittyminen edellyttää vahvaa rutiinia ja myös omaa soveltavaa oivaltamista. Tämän takia kurssilla on paljon tehtäviä. Osa tehtävistä on kohtuullisen suoraviivaisesti materiaalia hyödyntäviä ja osa taas aivan tarkoituksella haastavampia soveltavia tehtäviä.

Ei kannata huolestua, vaikka osa kurssin tehtävistä tuntuisikin ensiyrittämällä liian vaikealta. Kaikkia tehtäviä ei ole pakko tehdä, kuten arvosteluperusteet toteavat, kurssin läpipääsyyn vaaditaan vähintään 25 % jokaisen osan ohjelmointitehtävien pisteistä.

Kurssin osien tehtävät eivät etene vaikeusjärjestyksessä. Jokaisessa aliosassa esitellään yleensä muutama uusi konsepti, joita harjoitellaan sekä helpommilla että soveltavimmilla tehtävillä. Jos törmäät liian haastavan tuntuiseen tehtävään, hyppää seuraavaan. Voit palata vaikeimpiin tehtäviin osan lopuksi, jos aikaa vielä jää.

Lohdutuksen sanana todettakoon, että tällä viikolla mahdottomalta vaikuttava tehtävä näyttää melko varmasti neljän viikon päästä melko helpolta.

Edellisen osan lopussa opimme käyttämään while True -silmukkaa koodin toistamiseen. Tässä tapauksessa silmukan ehtona on True, joka on aina tosi. Esimerkiksi

# Tulosta lukuja kunnes muuttujan a arvo on 5\na = 1\nwhile True:\n    print(a)\n    a += 1\n    if a == 5:\n        break

1\n2\n3\n4

Silmukan toimintaa voidaan monipuolistaa käyttämällä ehtoa while-määrittelyssä. Yleisemmin voimme siis käyttää silmukkaa näin:

while <ehtolauseke>:\n    <lohko>

Ideana on, että silmukka vuorotellen tarkastaa ehdon ja suorittaa lohkossa olevan koodin, jos ehto on tosi. Sitten kun ehto on epätosi, ohjelman suoritus jatkuu silmukan jälkeiseltä riviltä.

\n \n "}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ensimmäinen merkki: \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Merkkijono on tyhjä eli ensimmäistä merkkiä ei ole\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä koodissa tyhjä syöte (käyttäjä painaa ainoastaan Enter) aiheuttaisi virheen, ellei koodari olisi lisännyt tarkastusta tilanteen varalta."}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Lopusta alkuun","tmcname":"osa03-05c_lopusta_alkuun"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita ohjelma, joka kysyy käyttäjältä merkkijonon ja tulostaa sitten merkkijonon merkit allekkain käänteisessä järjestyksessä lopusta alkuun."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuoritus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"heippa"}]},{"type":"text","value":"\na\np\np\ni\ne\nh"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Toinen ja toiseksi viimeinen","tmcname":"osa03-06_toinen_ja_toiseksi_viimeinen"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä sanan ja kertoo, ovatko sen toinen ja toiseksi viimeinen merkki samoja."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"python"}]},{"type":"text","value":"\nToinen ja toiseksi viimeinen kirjain eroavat"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pascal"}]},{"type":"text","value":"\nToinen ja toiseksi viimeinen kirjain on a"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Risuaitaviiva","tmcname":"osa03-09_risuaitaviiva"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka piirtää käyttäjän määräämän levyisen risuaitaviivan."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Leveys: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"###\n"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Leveys: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"8"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"########\n"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Risuaitasuorakulmio","tmcname":"osa03-10_risuaitanelio"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajenna edellistä niin, että käyttäjä syöttää myös piirrettävien rivien määrän"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Leveys: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\nKorkeus: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n##########\n##########\n##########"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Alleviivaus","tmcname":"osa03-11_alleviivaus"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka pyytää käyttäjältä merkkijonoja ja tulostaa kunkin merkkijonon oheisen esimerkin mukaisesti alleviivattuna. Ohjelman suoritus päättyy, kun käyttäjä syöttää tyhjän merkkijonon, eli merkkijonon jonka pituus on 0."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Moi kaikki!"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Moi kaikki!\n-----------\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Tämä on testijono"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Tämä on testijono\n-----------------\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"a"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"a\n-\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono:"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Tasaus oikeaan","tmcname":"osa03-12_tasaus_oikeaan"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä merkkijonon ja tulostaa sen niin, että tulostetuksi tulee tasan 20 merkkiä. Jos merkkijono on lyhyempi, alkuun tulee tarvittava määrä tähtiä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa, että syötetyssä merkkijonossa on enintään 20 merkkiä."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"python"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"**************python\n"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pitkämerkkijono"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"*****pitkämerkkijono\n"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tosipitkämerkkijono"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"*tosipitkämerkkijono\n"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Sanalaatikko","tmcname":"osa03-13_sanalaatikko"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä sanaa ja tulostaa sanan tähtiraameihin, joissa sana on keskellä. Raamien leveys on 30 merkkiä, ja voit olettaa, että sana mahtuu raameihin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huom! Jos sanan pituus on pariton, voit tulostaa sanan kumpaan tahansa mahdollisista keskikohdista."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"koe"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"******************************\n* koe *\n******************************\n"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"python"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"******************************\n* python *\n******************************\n"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"osajonot","style":"position:relative;"},"children":[{"type":"text","value":"Osajonot"},{"type":"element","tagName":"a","properties":{"href":"#osajonot","ariaLabel":"osajonot permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkkijonon "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"osajono"}]},{"type":"text","value":" muodostuu peräkkäisistä merkeistä, jotka ovat merkkijonon osana. Esimerkiksi merkkijonon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"esimerkki"}]},{"type":"text","value":" osajonoja ovat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"esi"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"imer"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"merkki"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme erottaa halutussa kohdassa olevan osajonon syntaksilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[a:b]"}]},{"type":"text","value":", mikä tarkoittaa, että osajono alkaa kohdasta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":" ja päättyy juuri ennen kohtaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":". Voimme ajatella alku- ja loppukohdan merkkien vasemmalle puolelle piirretyiksi viivoiksi alla olevan kuvan mukaisesti:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 436px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/49c600ef1e17a304f10d29a288a47467/8574c/3_2_3.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 33.04347826086957%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsTAAALEwEAmpwYAAABNklEQVQoz42R3W7CMAxG+/4vtAuYxIaAq0mTENJumCgM2ib9SdOWlqTtmRI2xi4mzZLjWIpP7M+BEIKiKLDW0jQNu92OOI4Jw5AkSfzdvfm2cRzdcY1f+XiXB6fTyRdprcmyzHue5x4mkoTj8YgUgqapfxX/5YFSykMc0IFcl65bYwzG9iQiRcgM24/8x4Ku625J3/fejbWMwwDnE7QhnEPG6h2jtz7aastwllg7YMzl+rkxDMNAsF6vKcvSA123blQXq1LTHlfow4T28Ei7n6L2E/roiWL3QBtvkNLJ8yOR4wT3YjuQW0CapuhS08kX+nzFOXrmksy5pEtsuqTPl5TxBqUqpBQ3mNtFcL8tp5+D1nVNVVUY9YrJFuThlDqaoT5mXNIFnZyjxBu6aihLhZTSjxxFEZ/CpxdM7lQktAAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/49c600ef1e17a304f10d29a288a47467/a0b58/3_2_3.webp 230w","/static/49c600ef1e17a304f10d29a288a47467/bfa8c/3_2_3.webp 436w"],"sizes":"(max-width: 436px) 100vw, 436px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/49c600ef1e17a304f10d29a288a47467/81c8e/3_2_3.png 230w","/static/49c600ef1e17a304f10d29a288a47467/8574c/3_2_3.png 436w"],"sizes":"(max-width: 436px) 100vw, 436px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/49c600ef1e17a304f10d29a288a47467/8574c/3_2_3.png","alt":"3 2 3","title":"3 2 3","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava esimerkki esittelee osajonojen hakemista:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"saippuakauppias\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# jos alkukohta puuttuu, se on oletuksena 0"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# jos loppukohta puuttuu, se on oletuksena merkkijonon pituus"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"sai\npuakau\nsai\npuakauppias"}]}]},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Puoliavoimet välit"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkkijonojen käsittelyssä väli "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[a:b]"}]},{"type":"text","value":" on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"puoliavoin"}]},{"type":"text","value":" eli alkukohta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":"\nkuuluu väliin mutta loppukohta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":" ei kuulu väliin. Miksi näin?"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tähän ei ole syvällistä syytä, vaan kyseessä on käytäntö, joka esiintyy\nmonessa ohjelmointikielessä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yksi etu tästä on, että osajonon pituus saadaan helposti laskettua kaavalla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b-a"}]},{"type":"text","value":".\nToisaalta täytyy aina muistaa, että kohdassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":" oleva merkki\nei tule mukaan osajonoon."}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Osajonot 1","tmcname":"osa03-07_osajonot1"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä merkkijonon ja tulostaa sitten kaikki sen ensimmäisestä merkistä alkavat osajonot pituusjärjestyksessä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"testi"}]},{"type":"text","value":"\nt\nte\ntes\ntest\ntesti"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Osajonot 2","tmcname":"osa03-08_osajonot2"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä merkkijonon ja tulostaa sitten kaikki sen viimeiseen merkkiin päättyvät osajonot pituusjärjestyksessä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"testi"}]},{"type":"text","value":"\ni\nti\nsti\nesti\ntesti"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"osajonon-etsiminen","style":"position:relative;"},"children":[{"type":"text","value":"Osajonon etsiminen"},{"type":"element","tagName":"a","properties":{"href":"#osajonon-etsiminen","ariaLabel":"osajonon etsiminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme tutkia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":"-operaattorin avulla, onko merkkijonossa tiettyä osajonoa.\nLauseke "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a in b"}]},{"type":"text","value":" on tosi, jos merkkijonossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":" on osajono "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"testi\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"t\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"x\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"est\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ets\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\nFalse\nTrue\nFalse"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma antaa käyttäjän etsiä merkkijonon osajonoja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"saippuakauppias\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mitä etsit? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" osa "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Löytyi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ei löytynyt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mitä etsit? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kaup"}]},{"type":"text","value":"\nLöytyi\nMitä etsit? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"abc"}]},{"type":"text","value":"\nEi löytynyt\nMitä etsit? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ippu"}]},{"type":"text","value":"\nLöytyi\n..."}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Löytyvätkö vokaalit","tmcname":"osa03-13b_loytyvatko_vokaalit"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä merkkijonon ja tulostaa sitten tiedon löytyvätkö vokaalit a, e ja o merkkijonosta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa, että merkkijono on syötetty kokonaan pienillä kirjaimilla. Katso mallia esimerkkitulostuksesta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"heippa sulle"}]},{"type":"text","value":"\na löytyy\ne löytyy\no ei löydy"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"moi"}]},{"type":"text","value":"\na ei löydy\ne ei löydy\no löytyy"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Operaattori "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" palauttaa tiedon osajonon esiintymisestä, muttei tietoa siitä, "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"mistä"}]},{"type":"text","value":" se löytyy. Tätä varten löytyy Pythonin merkkijonojen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"metodi"}]},{"type":"text","value":" "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"find"}]},{"type":"text","value":", joka saa parametrikseen etsittävän osajonon ja palauttaa joko ensimmäisen indeksin, josta osajono löytyy, tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"-1"}]},{"type":"text","value":", jos osajonoa ei löydy merkkijonosta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodia käytetään seuraavasti:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 227px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/5ce89dd815f6b20f038005e995598c4f/9b5be/3_2_4.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 62.11453744493392%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAAB00lEQVQoz3VTaW/iQAzN//835QNdFRSQEBINhxCkFWTJQdE2J4TcISF5KzuwBbYdybJn4tjvPc8IeFx13RiFVcVeURT8en5GTxQxHA7RbrcxGAzYNFW9/FazCdfg0Tjp0iNOEli2DdO24bguTNOE5Th85gfBXa5wV+CxaJoCYQgkCZBlQJ4DUQTEcRPTGX2jfRw3CK9Mqwu921VlGU5pivp8pgRURYEizxFTk7rG+XRqGIQhSmpOBU9FgclsBlXTsFFV9r83G4RRhO3HB3TDYP/2/o6lLOPTNKFpGtaKAsMwsFguWWN9u20ol1mGP7qOz90OnmWxObsd4uMRxyDAYb+H67qwLIt9EkWsl+26cDyPG5RliTAIbigTdLLjsdGG4H8jAS/6TpqRftd83wdIFkK43+8RpSn8C6Iky5DmOc5U8IfpB74P3/OQHA5IaRhVxagZYafTQeflhe9Xt9tFv9+H9PrKunw7eQDT2QxPrRZGkoTpdAoCdc1lykmSQNd1TCYTyLKMgqZZFP9dp9vbQPkEgrS9bSg0suRYrVaYz+fsvx5N/fCIvvY06fF4DNu27xoJFEiShF6vh9FoxM9qsVj8SJeQEzJRFDm/1WphvV7/o/wXf9aQyTTf/MkAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/5ce89dd815f6b20f038005e995598c4f/7d72c/3_2_4.webp 227w"],"sizes":"(max-width: 227px) 100vw, 227px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/5ce89dd815f6b20f038005e995598c4f/9b5be/3_2_4.png 227w"],"sizes":"(max-width: 227px) 100vw, 227px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/5ce89dd815f6b20f038005e995598c4f/9b5be/3_2_4.png","alt":"3 2 4","title":"3 2 4","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkejä metodin käyttämisestä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"testi\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"find"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"t\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"find"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"x\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"find"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"est\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"find"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ets\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"0\n-1\n1\n-1"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme myös laajentaa hakuohjelmaa näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"saippuakauppias\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mitä etsit? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kohta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"find"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" kohta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Löytyi kohdasta "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"kohta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ei löytynyt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mitä etsit? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kaup"}]},{"type":"text","value":"\nLöytyi kohdasta 7\nMitä etsit? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"abc"}]},{"type":"text","value":"\nEi löytynyt\nMitä etsit? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ippu"}]},{"type":"text","value":"\nLöytyi kohdasta 2\n..."}]}]},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Metodi"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkkijonon sisältä merkkijonoa etsivä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"find"}]},{"type":"text","value":" on siis "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"metodi"}]},{"type":"text","value":". Metodit ovat sukua jo meille tutuille asioille eli "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"funktioille"}]},{"type":"text","value":". Metodit ovatkin eräänlaisia funktioita, mutta niiden suorittama operaatio kohdistuu siihen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"olioon"}]},{"type":"text","value":", jonka kautta metodia kutsutaan, eli joka esiintyy metodikutsun alussa ennen metodin nimeä. Metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"find"}]},{"type":"text","value":" tapauksessa oliona on merkkijono, jonka osajonoa etsitään."}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Ensimmäisen osajonon haku","tmcname":"osa03-13c_osajonon_haku"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä merkkijonoa ja yksittäistä merkkiä. Ohjelma tulostaa merkkijonosta löytyvän ensimmäisen kolmen merkin pituisen osajonon, jonka alkukirjain on käyttäjän syöttämä merkki. Voit olettaa, että merkkijono on vähintään kolmen merkin pituinen."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"apinatalo"}]},{"type":"text","value":"\nMerkki: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"a"}]},{"type":"text","value":"\napi"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"banaani"}]},{"type":"text","value":"\nMerkki: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"n"}]},{"type":"text","value":"\nnaa"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tomaatti"}]},{"type":"text","value":"\nMerkki: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"x"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"python"}]},{"type":"text","value":"\nMerkki: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"n"}]}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Kaikkien osajonojen haku","tmcname":"osa03-14_osajonojen_haku"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee edellisestä ohjelmasta laajennettu versio, joka tulostaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kaikki merkkijonon sisältämät kolmen merkin pituiset osajonot"}]},{"type":"text","value":", joiden alkukirjain on käyttäjän syöttämä merkki. Voit olettaa, että merkkijono on vähintään kolmen merkin pituinen."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"apinatalo"}]},{"type":"text","value":"\nMerkki: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"a"}]},{"type":"text","value":"\napi\nata\nalo"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"banaani"}]},{"type":"text","value":"\nMerkki: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"n"}]},{"type":"text","value":"\nnaa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vihje"}]},{"type":"text","value":" seuraava esimerkki saattaa antaa jotain inspiraatiota eräästä tavasta miten tätä tehtävää voi lähestyä"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sana: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n sana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"apinatalo"}]},{"type":"text","value":"\napinatalo\ninatalo\natalo\nalo\no"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Toinen esiintymä","tmcname":"osa03-15_toinen_esiintyma"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka etsii merkkijonosta osajonon toisen esiintymän. Jos toista (tai edes ensimmäistä) esiintymää ei löydy, ohjelma tulostaa tästä tiedon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Määritellään tässä yhteydessä, että esiintymät "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"eivät"}]},{"type":"text","value":" voi mennä päällekkäin, merkkijonossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"aaaa"}]},{"type":"text","value":" osajonon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"aa"}]},{"type":"text","value":" toinen esiintymä löytyy siis indeksin 2 kohdalta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muutama esimerkkisuoritus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"abcabc"}]},{"type":"text","value":"\nAnna osajono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ab"}]},{"type":"text","value":"\nOsajonon toinen esiintymä on kohdassa 3."}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"saippuakauppias"}]},{"type":"text","value":"\nAnna osajono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"a"}]},{"type":"text","value":"\nOsajonon toinen esiintymä on kohdassa 6."}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"aybabtu"}]},{"type":"text","value":"\nAnna osajono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ba"}]},{"type":"text","value":"\nOsajono ei esiinny merkkijonossa kahdesti."}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat käyttää operaattoreita + ja * merkkijonojen kanssa
  • \n
  • Osaat laskea merkkijonon pituuden
  • \n
  • Tiedät, mitä tarkoittaa merkkijonon indeksointi
  • \n
  • Osaat etsiä osajonoja merkkijonosta
  • \n

Merkkijono-operaatiot

Merkkijonojen yhdistäminen tapahtuu +-operaattorin avulla:

alku = \"esi\"\nloppu = \"merkki\"\nsana = alku+loppu\nprint(sana)

esimerkki

Myös *-operaattoria voidaan käyttää merkkijonojen yhteydessä. Jos toinen operandi kertolaskussa on merkkijono ja toinen kokonaisluku, saadaan merkkijonoa monistettua annettu määrä. Esimerkiksi:

sana = \"apina\"\nprint(sana*3)

apinaapinaapina

Silmukan ja merkkijono-operaatioiden avulla voimme tehdä ohjelman, joka piirtää pyramidin:

n = 10 # pyramidin kerrosten määrä\nrivi = \"*\"\n\nwhile n > 0:\n    print(\" \" * n + rivi)\n    rivi += \"**\"\n    n -= 1

Ohjelman tulostus on seuraava:

          *\n         ***\n        *****\n       *******\n      *********\n     ***********\n    *************\n   ***************\n  *****************\n *******************

Silmukassa oleva print-komento tulostaa rivin, jonka alussa on n välilyöntiä ja sitten muuttujan rivi sisältö. Tämän jälkeen muuttujan rivi loppuun lisätään kaksi tähteä ja muuttujan n arvo vähenee yhdellä.

Kirjoita ohjelma, joka kysyy käyttäjältä merkkijonon ja määrän ja tulostaa sitten annettua merkkijonoa annetun määrän. Tulostuksen tulee tapahtua yhdelle riville yhteen pötköön.

Esimerkkisuoritus:

Anna merkkijono: heippa\nAnna määrä: 4\nheippaheippaheippaheippa

Merkkijonon pituus ja indeksointi

Funktio len palauttaa kokonaisluvun, joka on merkkijonon pituus merkkeinä. Esimerkiksi len(\"moi\") palauttaa 3, koska merkkijonossa moi on 3 merkkiä.

Seuraava ohjelma tulostaa käyttäjän syöttämän merkkijonon \"alleviivattuna\" monistamalla merkkiä - syötteen pituuden mukaisen määrän:

mjono = input(\"Anna merkkijono: \")\nprint(mjono)\nprint(\"-\"*len(mjono))

Anna merkkijono: Moi kaikki!

\nMoi kaikki!\n-----------\n

Pituuteen lasketaan mukaan kaikki merkkijonossa olevat merkit, mukaan lukien välilyönnit. Esimerkiksi merkkijonon moi moi pituus on 7.

Kirjoita ohjelma, joka kysyy käyttäjältä kaksi merkkijonoa ja tulostaa jonoista pidemmän (ts. sen, jossa on enemmän merkkejä). Jos jonot ovat yhtä pitkiä tulostetaan viesti \"Jonot ovat yhtä pitkät\"

Esimerkkisuorituksia:

Anna jono 1: moi\nAnna jono 2: heippa\nheippa on pidempi

Anna jono 1: moikkelis koikkelis\nAnna jono 2: heipparallaa\nmoikkelis koikkelis on pidempi

Anna jono 1: moi\nAnna jono 2: hei\nJonot ovat yhtä pitkät

Yksittäinen merkkijonon merkki voidaan hakea operaattorin [] avulla. Operaattori kirjoitetaan merkkijonon perään, ja hakasulkeiden väliin kirjoitetaan halutun merkin indeksi eli kohta merkkijonossa.

Huomaa, että merkkien indeksointi alkaa nollasta: ensimmäinen merkki on indeksin 0 kohdalla, toinen indeksin 1 kohdalla jne.

\n \n \n \n \n \n \"3\n \n \n

Tämän avulla aiempi ohjelma voidaan toteuttaa paremmin näin:

mjono = input(\"Anna merkkijono: \")\nprint(\"Ensimmäinen: \" + mjono[0])\nprint(\"Viimeinen: \" + mjono[-1])

Anna merkkijono: testi\nEnsimmäinen: t\nViimeinen: i

IndexError: string index out of range

Merkkijonon käsittelyssä tulee olla tarkkana indeksien kanssa. Jos viitataan merkkijonon ulkopuolelle, on seurauksena virheilmoitus IndexError: string index out of range:

mjono = input(\"Anna merkkijono: \")\nprint(\"Kymmenes merkki: \" + mjono[9])

Anna merkkijono: ohjelmoinnin perusteet\nKymmenes merkki: n

Anna merkkijono: python

Traceback (most recent call last):\nFile \"\", line 1, in \nIndexError: string index out of range

Joskus virhetilanne johtuu ohjelmointivirheestä. Esimerkiksi merkkijonon viimeistä merkkiä tarkasteltaessa on yleistä indeksoida vahingossa yhtä liian pitkälle:

mjono = input(\"Anna merkkijono: \")\nprint(\"Viimeinen merkki: \" + mjono[len(mjono)])

Koska merkkijonojen indeksit alkavat nollasta, niin viimeinen merkki on indeksissä len(mjono) - 1 eikä len(mjono).

On myös tilanteita, joissa ohjelman on syytä varautua siihen, että virheen lähde on käyttäjän antama syöte:

mjono = input(\"Anna merkkijono: \")\nif len(mjono) > 0:\n    print(\"Ensimmäinen merkki: \" + mjono[0])\nelse:\n    print(\"Merkkijono on tyhjä eli ensimmäistä merkkiä ei ole\")

Tässä koodissa tyhjä syöte (käyttäjä painaa ainoastaan Enter) aiheuttaisi virheen, ellei koodari olisi lisännyt tarkastusta tilanteen varalta.

Kirjoita ohjelma, joka kysyy käyttäjältä merkkijonon ja tulostaa sitten merkkijonon merkit allekkain käänteisessä järjestyksessä lopusta alkuun.

Esimerkkisuoritus:

Anna merkkijono: heippa\na\np\np\ni\ne\nh

Tee ohjelma, joka kysyy käyttäjältä sanan ja kertoo, ovatko sen toinen ja toiseksi viimeinen merkki samoja.

Anna sana: python\nToinen ja toiseksi viimeinen kirjain eroavat

Anna sana: pascal\nToinen ja toiseksi viimeinen kirjain on a

Tee ohjelma, joka piirtää käyttäjän määräämän levyisen risuaitaviivan.

Leveys: 3

\n###\n

Leveys: 8

\n########\n

Laajenna edellistä niin, että käyttäjä syöttää myös piirrettävien rivien määrän

Leveys: 10\nKorkeus: 3\n##########\n##########\n##########

Tee ohjelma, joka pyytää käyttäjältä merkkijonoja ja tulostaa kunkin merkkijonon oheisen esimerkin mukaisesti alleviivattuna. Ohjelman suoritus päättyy, kun käyttäjä syöttää tyhjän merkkijonon, eli merkkijonon jonka pituus on 0.

Anna merkkijono: Moi kaikki!

\nMoi kaikki!\n-----------\n

Anna merkkijono: Tämä on testijono

\nTämä on testijono\n-----------------\n

Anna merkkijono: a

\na\n-\n

Anna merkkijono:

Tee ohjelma, joka kysyy käyttäjältä merkkijonon ja tulostaa sen niin, että tulostetuksi tulee tasan 20 merkkiä. Jos merkkijono on lyhyempi, alkuun tulee tarvittava määrä tähtiä *.

Voit olettaa, että syötetyssä merkkijonossa on enintään 20 merkkiä.

Sana: python

\n**************python\n

Sana: pitkämerkkijono

\n*****pitkämerkkijono\n

Sana: tosipitkämerkkijono

\n*tosipitkämerkkijono\n

Tee ohjelma, joka kysyy käyttäjältä sanaa ja tulostaa sanan tähtiraameihin, joissa sana on keskellä. Raamien leveys on 30 merkkiä, ja voit olettaa, että sana mahtuu raameihin.

Huom! Jos sanan pituus on pariton, voit tulostaa sanan kumpaan tahansa mahdollisista keskikohdista.

Sana: koe

\n******************************\n*            koe             *\n******************************\n

Sana: python

\n******************************\n*           python           *\n******************************\n

Osajonot

Merkkijonon osajono muodostuu peräkkäisistä merkeistä, jotka ovat merkkijonon osana. Esimerkiksi merkkijonon esimerkki osajonoja ovat esi, imer ja merkki.

Voimme erottaa halutussa kohdassa olevan osajonon syntaksilla [a:b], mikä tarkoittaa, että osajono alkaa kohdasta a ja päättyy juuri ennen kohtaa b. Voimme ajatella alku- ja loppukohdan merkkien vasemmalle puolelle piirretyiksi viivoiksi alla olevan kuvan mukaisesti:

\n \n \n \n \n \n \"3\n \n \n

Seuraava esimerkki esittelee osajonojen hakemista:

mjono = \"saippuakauppias\"\n\nprint(mjono[0:3])\nprint(mjono[4:10])\n\n# jos alkukohta puuttuu, se on oletuksena 0\nprint(mjono[:3])\n\n# jos loppukohta puuttuu, se on oletuksena merkkijonon pituus\nprint(mjono[4:])

sai\npuakau\nsai\npuakauppias

Merkkijonojen käsittelyssä väli [a:b] on puoliavoin eli alkukohta a\nkuuluu väliin mutta loppukohta b ei kuulu väliin. Miksi näin?

Tähän ei ole syvällistä syytä, vaan kyseessä on käytäntö, joka esiintyy\nmonessa ohjelmointikielessä.

Yksi etu tästä on, että osajonon pituus saadaan helposti laskettua kaavalla b-a.\nToisaalta täytyy aina muistaa, että kohdassa b oleva merkki\nei tule mukaan osajonoon.

Tee ohjelma, joka kysyy käyttäjältä merkkijonon ja tulostaa sitten kaikki sen ensimmäisestä merkistä alkavat osajonot pituusjärjestyksessä.

Esimerkkitulostus:

Anna merkkijono: testi\nt\nte\ntes\ntest\ntesti

Tee ohjelma, joka kysyy käyttäjältä merkkijonon ja tulostaa sitten kaikki sen viimeiseen merkkiin päättyvät osajonot pituusjärjestyksessä.

Esimerkkitulostus:

Anna merkkijono: testi\ni\nti\nsti\nesti\ntesti

Osajonon etsiminen

Voimme tutkia in-operaattorin avulla, onko merkkijonossa tiettyä osajonoa.\nLauseke a in b on tosi, jos merkkijonossa b on osajono a.

Esimerkiksi

mjono = \"testi\"\n\nprint(\"t\" in mjono)\nprint(\"x\" in mjono)\nprint(\"est\" in mjono)\nprint(\"ets\" in mjono)

True\nFalse\nTrue\nFalse

Seuraava ohjelma antaa käyttäjän etsiä merkkijonon osajonoja:

mjono = \"saippuakauppias\"\n\nwhile True:\n    osa = input(\"Mitä etsit? \")\n    if osa in mjono:\n        print(\"Löytyi\")\n    else:\n        print(\"Ei löytynyt\")

Mitä etsit? kaup\nLöytyi\nMitä etsit? abc\nEi löytynyt\nMitä etsit? ippu\nLöytyi\n...

Tee ohjelma, joka kysyy käyttäjältä merkkijonon ja tulostaa sitten tiedon löytyvätkö vokaalit a, e ja o merkkijonosta.

Voit olettaa, että merkkijono on syötetty kokonaan pienillä kirjaimilla. Katso mallia esimerkkitulostuksesta.

Esimerkkitulostus:

Anna merkkijono: heippa sulle\na löytyy\ne löytyy\no ei löydy

Anna merkkijono: moi\na ei löydy\ne ei löydy\no löytyy

Operaattori in palauttaa tiedon osajonon esiintymisestä, muttei tietoa siitä, mistä se löytyy. Tätä varten löytyy Pythonin merkkijonojen metodi find, joka saa parametrikseen etsittävän osajonon ja palauttaa joko ensimmäisen indeksin, josta osajono löytyy, tai -1, jos osajonoa ei löydy merkkijonosta.

Metodia käytetään seuraavasti:

\n \n

Merkkijonon sisältä merkkijonoa etsivä find on siis metodi. Metodit ovat sukua jo meille tutuille asioille eli funktioille. Metodit ovatkin eräänlaisia funktioita, mutta niiden suorittama operaatio kohdistuu siihen olioon, jonka kautta metodia kutsutaan, eli joka esiintyy metodikutsun alussa ennen metodin nimeä. Metodin find tapauksessa oliona on merkkijono, jonka osajonoa etsitään.

Tee ohjelma, joka kysyy käyttäjältä merkkijonoa ja yksittäistä merkkiä. Ohjelma tulostaa merkkijonosta löytyvän ensimmäisen kolmen merkin pituisen osajonon, jonka alkukirjain on käyttäjän syöttämä merkki. Voit olettaa, että merkkijono on vähintään kolmen merkin pituinen.

Sana: apinatalo\nMerkki: a\napi

Sana: banaani\nMerkki: n\nnaa

Sana: tomaatti\nMerkki: x

Sana: python\nMerkki: n

Tee edellisestä ohjelmasta laajennettu versio, joka tulostaa kaikki merkkijonon sisältämät kolmen merkin pituiset osajonot, joiden alkukirjain on käyttäjän syöttämä merkki. Voit olettaa, että merkkijono on vähintään kolmen merkin pituinen.

Sana: apinatalo\nMerkki: a\napi\nata\nalo

Sana: banaani\nMerkki: n\nnaa

Vihje seuraava esimerkki saattaa antaa jotain inspiraatiota eräästä tavasta miten tätä tehtävää voi lähestyä

sana = input(\"Sana: \")\nwhile True:\n    if len(sana) == 0:\n        break\n    print(sana)\n    sana = sana[2:]

Sana: apinatalo\napinatalo\ninatalo\natalo\nalo\no

Tee ohjelma, joka etsii merkkijonosta osajonon toisen esiintymän. Jos toista (tai edes ensimmäistä) esiintymää ei löydy, ohjelma tulostaa tästä tiedon.

Määritellään tässä yhteydessä, että esiintymät eivät voi mennä päällekkäin, merkkijonossa aaaa osajonon aa toinen esiintymä löytyy siis indeksin 2 kohdalta.

Muutama esimerkkisuoritus:

Anna merkkijono: abcabc\nAnna osajono: ab\nOsajonon toinen esiintymä on kohdassa 3.

Anna merkkijono: saippuakauppias\nAnna osajono: a\nOsajonon toinen esiintymä on kohdassa 6.

Anna merkkijono: aybabtu\nAnna osajono: ba\nOsajono ei esiinny merkkijonossa kahdesti.

","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-3/2-merkkijonojen-kasittely.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää operaattoreita "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" merkkijonojen kanssa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat laskea merkkijonon pituuden"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä tarkoittaa merkkijonon indeksointi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat etsiä osajonoja merkkijonosta"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"merkkijono-operaatiot","style":"position:relative;"},"children":[{"type":"text","value":"Merkkijono-operaatiot"},{"type":"element","tagName":"a","properties":{"href":"#merkkijono-operaatiot","ariaLabel":"merkkijono operaatiot permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkkijonojen yhdistäminen tapahtuu "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"-operaattorin avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"alku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"esi\""}]},{"type":"text","value":"\nloppu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"merkki\""}]},{"type":"text","value":"\nsana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" alku"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"loppu\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"esimerkki"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Myös "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":"-operaattoria voidaan käyttää merkkijonojen yhteydessä. Jos toinen operandi kertolaskussa on merkkijono ja toinen kokonaisluku, saadaan merkkijonoa monistettua annettu määrä. Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"apina\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"apinaapinaapina"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Silmukan ja merkkijono-operaatioiden avulla voimme tehdä ohjelman, joka piirtää pyramidin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# pyramidin kerrosten määrä"}]},{"type":"text","value":"\nrivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"*\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"**\""}]},{"type":"text","value":"\n n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostus on seuraava:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"x"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-x"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-x"]},"children":[{"type":"text","value":" *\n ***\n *****\n *******\n *********\n ***********\n *************\n ***************\n *****************\n *******************"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Silmukassa oleva "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komento tulostaa rivin, jonka alussa on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"n"}]},{"type":"text","value":" välilyöntiä ja sitten muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rivi"}]},{"type":"text","value":" sisältö. Tämän jälkeen muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rivi"}]},{"type":"text","value":" loppuun lisätään kaksi tähteä ja muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"n"}]},{"type":"text","value":" arvo vähenee yhdellä."}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Monta jonoa","tmcname":"osa03-05a_monistetut_jonot"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita ohjelma, joka kysyy käyttäjältä merkkijonon ja määrän ja tulostaa sitten annettua merkkijonoa annetun määrän. Tulostuksen tulee tapahtua yhdelle riville yhteen pötköön."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuoritus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"heippa"}]},{"type":"text","value":"\nAnna määrä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nheippaheippaheippaheippa"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"merkkijonon-pituus-ja-indeksointi","style":"position:relative;"},"children":[{"type":"text","value":"Merkkijonon pituus ja indeksointi"},{"type":"element","tagName":"a","properties":{"href":"#merkkijonon-pituus-ja-indeksointi","ariaLabel":"merkkijonon pituus ja indeksointi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"len"}]},{"type":"text","value":" palauttaa kokonaisluvun, joka on merkkijonon pituus merkkeinä. Esimerkiksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"len(\"moi\")"}]},{"type":"text","value":" palauttaa 3, koska merkkijonossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"moi"}]},{"type":"text","value":" on 3 merkkiä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma tulostaa käyttäjän syöttämän merkkijonon \"alleviivattuna\" monistamalla merkkiä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" syötteen pituuden mukaisen määrän:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna merkkijono: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"-\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Moi kaikki!"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Moi kaikki!\n-----------\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pituuteen lasketaan mukaan kaikki merkkijonossa olevat merkit, mukaan lukien välilyönnit. Esimerkiksi merkkijonon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"moi moi"}]},{"type":"text","value":" pituus on 7."}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Pidempi jono","tmcname":"osa03-05b_pidempi_jono"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita ohjelma, joka kysyy käyttäjältä kaksi merkkijonoa ja tulostaa jonoista pidemmän (ts. sen, jossa on enemmän merkkejä). Jos jonot ovat yhtä pitkiä tulostetaan viesti \"Jonot ovat yhtä pitkät\""}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuorituksia:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna jono 1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"moi"}]},{"type":"text","value":"\nAnna jono 2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"heippa"}]},{"type":"text","value":"\nheippa on pidempi"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna jono 1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"moikkelis koikkelis"}]},{"type":"text","value":"\nAnna jono 2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"heipparallaa"}]},{"type":"text","value":"\nmoikkelis koikkelis on pidempi"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna jono 1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"moi"}]},{"type":"text","value":"\nAnna jono 2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"hei"}]},{"type":"text","value":"\nJonot ovat yhtä pitkät"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yksittäinen merkkijonon merkki voidaan hakea operaattorin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[]"}]},{"type":"text","value":" avulla. Operaattori kirjoitetaan merkkijonon perään, ja hakasulkeiden väliin kirjoitetaan halutun merkin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"indeksi"}]},{"type":"text","value":" eli kohta merkkijonossa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että merkkien indeksointi alkaa nollasta: ensimmäinen merkki on indeksin 0 kohdalla, toinen indeksin 1 kohdalla jne."}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 436px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/5fd25536ae63a100630f2df0e41f42a2/8574c/3_2_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 27.82608695652174%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAv0lEQVQY042QVw7DMAxDff/r5QrZ29mbxRPgoH9tAIK2RFJyXJ7nKstS0zRpXVc7p2lqyLJM9OM4tv7zPD/hEIJ933Vdl87z1DiO6vte3nvrwYj/+RxmwsK3bZtxCDiOwzgMhO/7Nh3DuaOhxwtdFEVKkuQNbNvWGmyGqes6Mw3DoHme7U6dF7AMdfSEVlUl970uwqZpVNe1GWBM1PifMIGAoKIoXgb4HeuDEEgQIjaEqREazPSXZXmHcw6DyPkAEHPQodT6lKAAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/5fd25536ae63a100630f2df0e41f42a2/a0b58/3_2_1.webp 230w","/static/5fd25536ae63a100630f2df0e41f42a2/bfa8c/3_2_1.webp 436w"],"sizes":"(max-width: 436px) 100vw, 436px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/5fd25536ae63a100630f2df0e41f42a2/81c8e/3_2_1.png 230w","/static/5fd25536ae63a100630f2df0e41f42a2/8574c/3_2_1.png 436w"],"sizes":"(max-width: 436px) 100vw, 436px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/5fd25536ae63a100630f2df0e41f42a2/8574c/3_2_1.png","alt":"3 2 1","title":"3 2 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\nmjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna merkkijono: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma tulostaa:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"apina"}]},{"type":"text","value":"\na\np\nn"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska merkkijonon ensimmäinen merkki on indeksin 0 kohdalla, on viimeinen merkki vastaavasti indeksin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"pituus"}]},{"type":"text","value":" – 1 kohdalla. Esimerkiksi seuraava ohjelma tulostaa merkkijonon ensimmäisen ja viimeisen merkin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna merkkijono: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ensimmäinen: \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Viimeinen: \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"testi"}]},{"type":"text","value":"\nEnsimmäinen: t\nViimeinen: i"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma puolestaan käy läpi kaikki merkkijonon merkit vasemmalta oikealle silmukan avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna merkkijono: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkohta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" kohta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"kohta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kohta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"testi"}]},{"type":"text","value":"\nt\ne\ns\nt\ni"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa merkkeihin voi viitata myös alkaen merkkijonon lopusta käyttämällä negatiivisia indeksejä. Merkkijonon viimeinen merkki on indeksin -1 kohdalla, toiseksi viimeinen indeksin -2 kohdalla jne. Onkin kätevämpi kirjoittaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"mjono[-1]"}]},{"type":"text","value":" kuin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"mjono[len(mjono) - 1]"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 436px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/8a3725dd40636e3419c7e27e82163b5a/8574c/3_2_2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 27.82608695652174%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAwUlEQVQY042RVw7DMAxDff/r5QrZ29lbxSPgoH+tAYKyJVFU4vI8t7IsbZomW9dVcZqmQpZlRj6OY+Wf5/kJRyHY992u67LzPG0cR/PeC+Rgiv85jmbEwiG+79uO49A9MO4ZuG2bOBiAMUEddxdFkSVJ8gr2fS9HdV3bPM82DIPEqqqSWNu2cg3zHragDnbfdmlAqGkaFcJsAPMt4a7rBAR4g4ui0MBlWcyxHgiCOAzTYFZClCbu5GnEHQOIYRzzUz7RE9BZcbNucQAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8a3725dd40636e3419c7e27e82163b5a/a0b58/3_2_2.webp 230w","/static/8a3725dd40636e3419c7e27e82163b5a/bfa8c/3_2_2.webp 436w"],"sizes":"(max-width: 436px) 100vw, 436px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8a3725dd40636e3419c7e27e82163b5a/81c8e/3_2_2.png 230w","/static/8a3725dd40636e3419c7e27e82163b5a/8574c/3_2_2.png 436w"],"sizes":"(max-width: 436px) 100vw, 436px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/8a3725dd40636e3419c7e27e82163b5a/8574c/3_2_2.png","alt":"3 2 2","title":"3 2 2","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän avulla aiempi ohjelma voidaan toteuttaa paremmin näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna merkkijono: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ensimmäinen: \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Viimeinen: \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"testi"}]},{"type":"text","value":"\nEnsimmäinen: t\nViimeinen: i"}]}]},{"type":"element","tagName":"h2","properties":{"id":"indexerror-string-index-out-of-range","style":"position:relative;"},"children":[{"type":"text","value":"IndexError: string index out of range"},{"type":"element","tagName":"a","properties":{"href":"#indexerror-string-index-out-of-range","ariaLabel":"indexerror string index out of range permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkkijonon käsittelyssä tulee olla tarkkana indeksien kanssa. Jos viitataan merkkijonon ulkopuolelle, on seurauksena virheilmoitus "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"IndexError: string index out of range"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna merkkijono: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kymmenes merkki: \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ohjelmoinnin perusteet"}]},{"type":"text","value":"\nKymmenes merkki: n"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"python"}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"text","value":"Traceback (most recent call last):\nFile \""},{"type":"element","tagName":"stdin","properties":{},"children":[{"type":"text","value":"\", line 1, in "},{"type":"element","tagName":"module","properties":{},"children":[{"type":"text","value":"\nIndexError: string index out of range"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joskus virhetilanne johtuu ohjelmointivirheestä. Esimerkiksi merkkijonon viimeistä merkkiä tarkasteltaessa on yleistä indeksoida vahingossa yhtä liian pitkälle:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna merkkijono: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Viimeinen merkki: \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska merkkijonojen indeksit alkavat nollasta, niin viimeinen merkki on indeksissä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"len(mjono) - 1"}]},{"type":"text","value":" eikä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"len(mjono)"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"On myös tilanteita, joissa ohjelman on syytä varautua siihen, että virheen lähde on käyttäjän antama syöte:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna merkkijono: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ensimmäinen merkki: \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Merkkijono on tyhjä eli ensimmäistä merkkiä ei ole\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä koodissa tyhjä syöte (käyttäjä painaa ainoastaan Enter) aiheuttaisi virheen, ellei koodari olisi lisännyt tarkastusta tilanteen varalta."}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Lopusta alkuun","tmcname":"osa03-05c_lopusta_alkuun"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita ohjelma, joka kysyy käyttäjältä merkkijonon ja tulostaa sitten merkkijonon merkit allekkain käänteisessä järjestyksessä lopusta alkuun."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuoritus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"heippa"}]},{"type":"text","value":"\na\np\np\ni\ne\nh"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Toinen ja toiseksi viimeinen","tmcname":"osa03-06_toinen_ja_toiseksi_viimeinen"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä sanan ja kertoo, ovatko sen toinen ja toiseksi viimeinen merkki samoja."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"python"}]},{"type":"text","value":"\nToinen ja toiseksi viimeinen kirjain eroavat"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pascal"}]},{"type":"text","value":"\nToinen ja toiseksi viimeinen kirjain on a"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Risuaitaviiva","tmcname":"osa03-09_risuaitaviiva"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka piirtää käyttäjän määräämän levyisen risuaitaviivan."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Leveys: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"###\n"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Leveys: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"8"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"########\n"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Risuaitasuorakulmio","tmcname":"osa03-10_risuaitanelio"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajenna edellistä niin, että käyttäjä syöttää myös piirrettävien rivien määrän"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Leveys: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\nKorkeus: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n##########\n##########\n##########"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Alleviivaus","tmcname":"osa03-11_alleviivaus"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka pyytää käyttäjältä merkkijonoja ja tulostaa kunkin merkkijonon oheisen esimerkin mukaisesti alleviivattuna. Ohjelman suoritus päättyy, kun käyttäjä syöttää tyhjän merkkijonon, eli merkkijonon jonka pituus on 0."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Moi kaikki!"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Moi kaikki!\n-----------\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Tämä on testijono"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Tämä on testijono\n-----------------\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"a"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"a\n-\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono:"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Tasaus oikeaan","tmcname":"osa03-12_tasaus_oikeaan"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä merkkijonon ja tulostaa sen niin, että tulostetuksi tulee tasan 20 merkkiä. Jos merkkijono on lyhyempi, alkuun tulee tarvittava määrä tähtiä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa, että syötetyssä merkkijonossa on enintään 20 merkkiä."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"python"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"**************python\n"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pitkämerkkijono"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"*****pitkämerkkijono\n"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tosipitkämerkkijono"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"*tosipitkämerkkijono\n"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Sanalaatikko","tmcname":"osa03-13_sanalaatikko"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä sanaa ja tulostaa sanan tähtiraameihin, joissa sana on keskellä. Raamien leveys on 30 merkkiä, ja voit olettaa, että sana mahtuu raameihin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huom! Jos sanan pituus on pariton, voit tulostaa sanan kumpaan tahansa mahdollisista keskikohdista."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"koe"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"******************************\n* koe *\n******************************\n"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"python"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"******************************\n* python *\n******************************\n"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"osajonot","style":"position:relative;"},"children":[{"type":"text","value":"Osajonot"},{"type":"element","tagName":"a","properties":{"href":"#osajonot","ariaLabel":"osajonot permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkkijonon "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"osajono"}]},{"type":"text","value":" muodostuu peräkkäisistä merkeistä, jotka ovat merkkijonon osana. Esimerkiksi merkkijonon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"esimerkki"}]},{"type":"text","value":" osajonoja ovat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"esi"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"imer"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"merkki"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme erottaa halutussa kohdassa olevan osajonon syntaksilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[a:b]"}]},{"type":"text","value":", mikä tarkoittaa, että osajono alkaa kohdasta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":" ja päättyy juuri ennen kohtaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":". Voimme ajatella alku- ja loppukohdan merkkien vasemmalle puolelle piirretyiksi viivoiksi alla olevan kuvan mukaisesti:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 436px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/49c600ef1e17a304f10d29a288a47467/8574c/3_2_3.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 33.04347826086957%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsTAAALEwEAmpwYAAABNklEQVQoz42R3W7CMAxG+/4vtAuYxIaAq0mTENJumCgM2ib9SdOWlqTtmRI2xi4mzZLjWIpP7M+BEIKiKLDW0jQNu92OOI4Jw5AkSfzdvfm2cRzdcY1f+XiXB6fTyRdprcmyzHue5x4mkoTj8YgUgqapfxX/5YFSykMc0IFcl65bYwzG9iQiRcgM24/8x4Ku625J3/fejbWMwwDnE7QhnEPG6h2jtz7aastwllg7YMzl+rkxDMNAsF6vKcvSA123blQXq1LTHlfow4T28Ei7n6L2E/roiWL3QBtvkNLJ8yOR4wT3YjuQW0CapuhS08kX+nzFOXrmksy5pEtsuqTPl5TxBqUqpBQ3mNtFcL8tp5+D1nVNVVUY9YrJFuThlDqaoT5mXNIFnZyjxBu6aihLhZTSjxxFEZ/CpxdM7lQktAAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/49c600ef1e17a304f10d29a288a47467/a0b58/3_2_3.webp 230w","/static/49c600ef1e17a304f10d29a288a47467/bfa8c/3_2_3.webp 436w"],"sizes":"(max-width: 436px) 100vw, 436px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/49c600ef1e17a304f10d29a288a47467/81c8e/3_2_3.png 230w","/static/49c600ef1e17a304f10d29a288a47467/8574c/3_2_3.png 436w"],"sizes":"(max-width: 436px) 100vw, 436px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/49c600ef1e17a304f10d29a288a47467/8574c/3_2_3.png","alt":"3 2 3","title":"3 2 3","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava esimerkki esittelee osajonojen hakemista:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"saippuakauppias\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# jos alkukohta puuttuu, se on oletuksena 0"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# jos loppukohta puuttuu, se on oletuksena merkkijonon pituus"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"sai\npuakau\nsai\npuakauppias"}]}]},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Puoliavoimet välit"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkkijonojen käsittelyssä väli "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[a:b]"}]},{"type":"text","value":" on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"puoliavoin"}]},{"type":"text","value":" eli alkukohta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":"\nkuuluu väliin mutta loppukohta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":" ei kuulu väliin. Miksi näin?"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tähän ei ole syvällistä syytä, vaan kyseessä on käytäntö, joka esiintyy\nmonessa ohjelmointikielessä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yksi etu tästä on, että osajonon pituus saadaan helposti laskettua kaavalla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b-a"}]},{"type":"text","value":".\nToisaalta täytyy aina muistaa, että kohdassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":" oleva merkki\nei tule mukaan osajonoon."}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Osajonot 1","tmcname":"osa03-07_osajonot1"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä merkkijonon ja tulostaa sitten kaikki sen ensimmäisestä merkistä alkavat osajonot pituusjärjestyksessä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"testi"}]},{"type":"text","value":"\nt\nte\ntes\ntest\ntesti"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Osajonot 2","tmcname":"osa03-08_osajonot2"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä merkkijonon ja tulostaa sitten kaikki sen viimeiseen merkkiin päättyvät osajonot pituusjärjestyksessä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"testi"}]},{"type":"text","value":"\ni\nti\nsti\nesti\ntesti"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"osajonon-etsiminen","style":"position:relative;"},"children":[{"type":"text","value":"Osajonon etsiminen"},{"type":"element","tagName":"a","properties":{"href":"#osajonon-etsiminen","ariaLabel":"osajonon etsiminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme tutkia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":"-operaattorin avulla, onko merkkijonossa tiettyä osajonoa.\nLauseke "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a in b"}]},{"type":"text","value":" on tosi, jos merkkijonossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":" on osajono "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"testi\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"t\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"x\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"est\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ets\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\nFalse\nTrue\nFalse"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma antaa käyttäjän etsiä merkkijonon osajonoja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"saippuakauppias\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mitä etsit? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" osa "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Löytyi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ei löytynyt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mitä etsit? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kaup"}]},{"type":"text","value":"\nLöytyi\nMitä etsit? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"abc"}]},{"type":"text","value":"\nEi löytynyt\nMitä etsit? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ippu"}]},{"type":"text","value":"\nLöytyi\n..."}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Löytyvätkö vokaalit","tmcname":"osa03-13b_loytyvatko_vokaalit"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä merkkijonon ja tulostaa sitten tiedon löytyvätkö vokaalit a, e ja o merkkijonosta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa, että merkkijono on syötetty kokonaan pienillä kirjaimilla. Katso mallia esimerkkitulostuksesta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkitulostus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"heippa sulle"}]},{"type":"text","value":"\na löytyy\ne löytyy\no ei löydy"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"moi"}]},{"type":"text","value":"\na ei löydy\ne ei löydy\no löytyy"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Operaattori "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" palauttaa tiedon osajonon esiintymisestä, muttei tietoa siitä, "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"mistä"}]},{"type":"text","value":" se löytyy. Tätä varten löytyy Pythonin merkkijonojen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"metodi"}]},{"type":"text","value":" "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"find"}]},{"type":"text","value":", joka saa parametrikseen etsittävän osajonon ja palauttaa joko ensimmäisen indeksin, josta osajono löytyy, tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"-1"}]},{"type":"text","value":", jos osajonoa ei löydy merkkijonosta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodia käytetään seuraavasti:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 227px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/5ce89dd815f6b20f038005e995598c4f/9b5be/3_2_4.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 62.11453744493392%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAAB00lEQVQoz3VTaW/iQAzN//835QNdFRSQEBINhxCkFWTJQdE2J4TcISF5KzuwBbYdybJn4tjvPc8IeFx13RiFVcVeURT8en5GTxQxHA7RbrcxGAzYNFW9/FazCdfg0Tjp0iNOEli2DdO24bguTNOE5Th85gfBXa5wV+CxaJoCYQgkCZBlQJ4DUQTEcRPTGX2jfRw3CK9Mqwu921VlGU5pivp8pgRURYEizxFTk7rG+XRqGIQhSmpOBU9FgclsBlXTsFFV9r83G4RRhO3HB3TDYP/2/o6lLOPTNKFpGtaKAsMwsFguWWN9u20ol1mGP7qOz90OnmWxObsd4uMRxyDAYb+H67qwLIt9EkWsl+26cDyPG5RliTAIbigTdLLjsdGG4H8jAS/6TpqRftd83wdIFkK43+8RpSn8C6Iky5DmOc5U8IfpB74P3/OQHA5IaRhVxagZYafTQeflhe9Xt9tFv9+H9PrKunw7eQDT2QxPrRZGkoTpdAoCdc1lykmSQNd1TCYTyLKMgqZZFP9dp9vbQPkEgrS9bSg0suRYrVaYz+fsvx5N/fCIvvY06fF4DNu27xoJFEiShF6vh9FoxM9qsVj8SJeQEzJRFDm/1WphvV7/o/wXf9aQyTTf/MkAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/5ce89dd815f6b20f038005e995598c4f/7d72c/3_2_4.webp 227w"],"sizes":"(max-width: 227px) 100vw, 227px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/5ce89dd815f6b20f038005e995598c4f/9b5be/3_2_4.png 227w"],"sizes":"(max-width: 227px) 100vw, 227px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/5ce89dd815f6b20f038005e995598c4f/9b5be/3_2_4.png","alt":"3 2 4","title":"3 2 4","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkejä metodin käyttämisestä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"testi\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"find"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"t\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"find"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"x\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"find"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"est\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"find"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ets\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"0\n-1\n1\n-1"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme myös laajentaa hakuohjelmaa näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"saippuakauppias\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mitä etsit? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kohta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"find"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" kohta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Löytyi kohdasta "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"kohta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ei löytynyt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mitä etsit? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kaup"}]},{"type":"text","value":"\nLöytyi kohdasta 7\nMitä etsit? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"abc"}]},{"type":"text","value":"\nEi löytynyt\nMitä etsit? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ippu"}]},{"type":"text","value":"\nLöytyi kohdasta 2\n..."}]}]},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Metodi"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkkijonon sisältä merkkijonoa etsivä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"find"}]},{"type":"text","value":" on siis "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"metodi"}]},{"type":"text","value":". Metodit ovat sukua jo meille tutuille asioille eli "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"funktioille"}]},{"type":"text","value":". Metodit ovatkin eräänlaisia funktioita, mutta niiden suorittama operaatio kohdistuu siihen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"olioon"}]},{"type":"text","value":", jonka kautta metodia kutsutaan, eli joka esiintyy metodikutsun alussa ennen metodin nimeä. Metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"find"}]},{"type":"text","value":" tapauksessa oliona on merkkijono, jonka osajonoa etsitään."}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Ensimmäisen osajonon haku","tmcname":"osa03-13c_osajonon_haku"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä merkkijonoa ja yksittäistä merkkiä. Ohjelma tulostaa merkkijonosta löytyvän ensimmäisen kolmen merkin pituisen osajonon, jonka alkukirjain on käyttäjän syöttämä merkki. Voit olettaa, että merkkijono on vähintään kolmen merkin pituinen."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"apinatalo"}]},{"type":"text","value":"\nMerkki: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"a"}]},{"type":"text","value":"\napi"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"banaani"}]},{"type":"text","value":"\nMerkki: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"n"}]},{"type":"text","value":"\nnaa"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tomaatti"}]},{"type":"text","value":"\nMerkki: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"x"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"python"}]},{"type":"text","value":"\nMerkki: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"n"}]}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Kaikkien osajonojen haku","tmcname":"osa03-14_osajonojen_haku"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee edellisestä ohjelmasta laajennettu versio, joka tulostaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kaikki merkkijonon sisältämät kolmen merkin pituiset osajonot"}]},{"type":"text","value":", joiden alkukirjain on käyttäjän syöttämä merkki. Voit olettaa, että merkkijono on vähintään kolmen merkin pituinen."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"apinatalo"}]},{"type":"text","value":"\nMerkki: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"a"}]},{"type":"text","value":"\napi\nata\nalo"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"banaani"}]},{"type":"text","value":"\nMerkki: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"n"}]},{"type":"text","value":"\nnaa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vihje"}]},{"type":"text","value":" seuraava esimerkki saattaa antaa jotain inspiraatiota eräästä tavasta miten tätä tehtävää voi lähestyä"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sana: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n sana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"apinatalo"}]},{"type":"text","value":"\napinatalo\ninatalo\natalo\nalo\no"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Toinen esiintymä","tmcname":"osa03-15_toinen_esiintyma"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka etsii merkkijonosta osajonon toisen esiintymän. Jos toista (tai edes ensimmäistä) esiintymää ei löydy, ohjelma tulostaa tästä tiedon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Määritellään tässä yhteydessä, että esiintymät "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"eivät"}]},{"type":"text","value":" voi mennä päällekkäin, merkkijonossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"aaaa"}]},{"type":"text","value":" osajonon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"aa"}]},{"type":"text","value":" toinen esiintymä löytyy siis indeksin 2 kohdalta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muutama esimerkkisuoritus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"abcabc"}]},{"type":"text","value":"\nAnna osajono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ab"}]},{"type":"text","value":"\nOsajonon toinen esiintymä on kohdassa 3."}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"saippuakauppias"}]},{"type":"text","value":"\nAnna osajono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"a"}]},{"type":"text","value":"\nOsajonon toinen esiintymä on kohdassa 6."}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"aybabtu"}]},{"type":"text","value":"\nAnna osajono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ba"}]},{"type":"text","value":"\nOsajono ei esiinny merkkijonossa kahdesti."}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat käyttää operaattoreita + ja * merkkijonojen kanssa
  • \n
  • Osaat laskea merkkijonon pituuden
  • \n
  • Tiedät, mitä tarkoittaa merkkijonon indeksointi
  • \n
  • Osaat etsiä osajonoja merkkijonosta
  • \n

Merkkijono-operaatiot

Merkkijonojen yhdistäminen tapahtuu +-operaattorin avulla:

alku = \"esi\"\nloppu = \"merkki\"\nsana = alku+loppu\nprint(sana)

esimerkki

Myös *-operaattoria voidaan käyttää merkkijonojen yhteydessä. Jos toinen operandi kertolaskussa on merkkijono ja toinen kokonaisluku, saadaan merkkijonoa monistettua annettu määrä. Esimerkiksi:

sana = \"apina\"\nprint(sana*3)

apinaapinaapina

Silmukan ja merkkijono-operaatioiden avulla voimme tehdä ohjelman, joka piirtää pyramidin:

n = 10 # pyramidin kerrosten määrä\nrivi = \"*\"\n\nwhile n > 0:\n    print(\" \" * n + rivi)\n    rivi += \"**\"\n    n -= 1

Ohjelman tulostus on seuraava:

          *\n         ***\n        *****\n       *******\n      *********\n     ***********\n    *************\n   ***************\n  *****************\n *******************

Silmukassa oleva print-komento tulostaa rivin, jonka alussa on n välilyöntiä ja sitten muuttujan rivi sisältö. Tämän jälkeen muuttujan rivi loppuun lisätään kaksi tähteä ja muuttujan n arvo vähenee yhdellä.

Kirjoita ohjelma, joka kysyy käyttäjältä merkkijonon ja määrän ja tulostaa sitten annettua merkkijonoa annetun määrän. Tulostuksen tulee tapahtua yhdelle riville yhteen pötköön.

Esimerkkisuoritus:

Anna merkkijono: heippa\nAnna määrä: 4\nheippaheippaheippaheippa

Merkkijonon pituus ja indeksointi

Funktio len palauttaa kokonaisluvun, joka on merkkijonon pituus merkkeinä. Esimerkiksi len(\"moi\") palauttaa 3, koska merkkijonossa moi on 3 merkkiä.

Seuraava ohjelma tulostaa käyttäjän syöttämän merkkijonon \"alleviivattuna\" monistamalla merkkiä - syötteen pituuden mukaisen määrän:

mjono = input(\"Anna merkkijono: \")\nprint(mjono)\nprint(\"-\"*len(mjono))

Anna merkkijono: Moi kaikki!

\nMoi kaikki!\n-----------\n

Pituuteen lasketaan mukaan kaikki merkkijonossa olevat merkit, mukaan lukien välilyönnit. Esimerkiksi merkkijonon moi moi pituus on 7.

Kirjoita ohjelma, joka kysyy käyttäjältä kaksi merkkijonoa ja tulostaa jonoista pidemmän (ts. sen, jossa on enemmän merkkejä). Jos jonot ovat yhtä pitkiä tulostetaan viesti \"Jonot ovat yhtä pitkät\"

Esimerkkisuorituksia:

Anna jono 1: moi\nAnna jono 2: heippa\nheippa on pidempi

Anna jono 1: moikkelis koikkelis\nAnna jono 2: heipparallaa\nmoikkelis koikkelis on pidempi

Anna jono 1: moi\nAnna jono 2: hei\nJonot ovat yhtä pitkät

Yksittäinen merkkijonon merkki voidaan hakea operaattorin [] avulla. Operaattori kirjoitetaan merkkijonon perään, ja hakasulkeiden väliin kirjoitetaan halutun merkin indeksi eli kohta merkkijonossa.

Huomaa, että merkkien indeksointi alkaa nollasta: ensimmäinen merkki on indeksin 0 kohdalla, toinen indeksin 1 kohdalla jne.

\n \n \n \n \n \n \"3\n \n \n

Tämän avulla aiempi ohjelma voidaan toteuttaa paremmin näin:

mjono = input(\"Anna merkkijono: \")\nprint(\"Ensimmäinen: \" + mjono[0])\nprint(\"Viimeinen: \" + mjono[-1])

Anna merkkijono: testi\nEnsimmäinen: t\nViimeinen: i

IndexError: string index out of range

Merkkijonon käsittelyssä tulee olla tarkkana indeksien kanssa. Jos viitataan merkkijonon ulkopuolelle, on seurauksena virheilmoitus IndexError: string index out of range:

mjono = input(\"Anna merkkijono: \")\nprint(\"Kymmenes merkki: \" + mjono[9])

Anna merkkijono: ohjelmoinnin perusteet\nKymmenes merkki: n

Anna merkkijono: python

Traceback (most recent call last):\nFile \"\", line 1, in \nIndexError: string index out of range

Joskus virhetilanne johtuu ohjelmointivirheestä. Esimerkiksi merkkijonon viimeistä merkkiä tarkasteltaessa on yleistä indeksoida vahingossa yhtä liian pitkälle:

mjono = input(\"Anna merkkijono: \")\nprint(\"Viimeinen merkki: \" + mjono[len(mjono)])

Koska merkkijonojen indeksit alkavat nollasta, niin viimeinen merkki on indeksissä len(mjono) - 1 eikä len(mjono).

On myös tilanteita, joissa ohjelman on syytä varautua siihen, että virheen lähde on käyttäjän antama syöte:

mjono = input(\"Anna merkkijono: \")\nif len(mjono) > 0:\n    print(\"Ensimmäinen merkki: \" + mjono[0])\nelse:\n    print(\"Merkkijono on tyhjä eli ensimmäistä merkkiä ei ole\")

Tässä koodissa tyhjä syöte (käyttäjä painaa ainoastaan Enter) aiheuttaisi virheen, ellei koodari olisi lisännyt tarkastusta tilanteen varalta.

Kirjoita ohjelma, joka kysyy käyttäjältä merkkijonon ja tulostaa sitten merkkijonon merkit allekkain käänteisessä järjestyksessä lopusta alkuun.

Esimerkkisuoritus:

Anna merkkijono: heippa\na\np\np\ni\ne\nh

Tee ohjelma, joka kysyy käyttäjältä sanan ja kertoo, ovatko sen toinen ja toiseksi viimeinen merkki samoja.

Anna sana: python\nToinen ja toiseksi viimeinen kirjain eroavat

Anna sana: pascal\nToinen ja toiseksi viimeinen kirjain on a

Tee ohjelma, joka piirtää käyttäjän määräämän levyisen risuaitaviivan.

Leveys: 3

\n###\n

Leveys: 8

\n########\n

Laajenna edellistä niin, että käyttäjä syöttää myös piirrettävien rivien määrän

Leveys: 10\nKorkeus: 3\n##########\n##########\n##########

Tee ohjelma, joka pyytää käyttäjältä merkkijonoja ja tulostaa kunkin merkkijonon oheisen esimerkin mukaisesti alleviivattuna. Ohjelman suoritus päättyy, kun käyttäjä syöttää tyhjän merkkijonon, eli merkkijonon jonka pituus on 0.

Anna merkkijono: Moi kaikki!

\nMoi kaikki!\n-----------\n

Anna merkkijono: Tämä on testijono

\nTämä on testijono\n-----------------\n

Anna merkkijono: a

\na\n-\n

Anna merkkijono:

Tee ohjelma, joka kysyy käyttäjältä merkkijonon ja tulostaa sen niin, että tulostetuksi tulee tasan 20 merkkiä. Jos merkkijono on lyhyempi, alkuun tulee tarvittava määrä tähtiä *.

Voit olettaa, että syötetyssä merkkijonossa on enintään 20 merkkiä.

Sana: python

\n**************python\n

Sana: pitkämerkkijono

\n*****pitkämerkkijono\n

Sana: tosipitkämerkkijono

\n*tosipitkämerkkijono\n

Tee ohjelma, joka kysyy käyttäjältä sanaa ja tulostaa sanan tähtiraameihin, joissa sana on keskellä. Raamien leveys on 30 merkkiä, ja voit olettaa, että sana mahtuu raameihin.

Huom! Jos sanan pituus on pariton, voit tulostaa sanan kumpaan tahansa mahdollisista keskikohdista.

Sana: koe

\n******************************\n*            koe             *\n******************************\n

Sana: python

\n******************************\n*           python           *\n******************************\n

Osajonot

Merkkijonon osajono muodostuu peräkkäisistä merkeistä, jotka ovat merkkijonon osana. Esimerkiksi merkkijonon esimerkki osajonoja ovat esi, imer ja merkki.

Voimme erottaa halutussa kohdassa olevan osajonon syntaksilla [a:b], mikä tarkoittaa, että osajono alkaa kohdasta a ja päättyy juuri ennen kohtaa b. Voimme ajatella alku- ja loppukohdan merkkien vasemmalle puolelle piirretyiksi viivoiksi alla olevan kuvan mukaisesti:

\n \n \n \n \n \n \"3\n \n \n

Seuraava esimerkki esittelee osajonojen hakemista:

mjono = \"saippuakauppias\"\n\nprint(mjono[0:3])\nprint(mjono[4:10])\n\n# jos alkukohta puuttuu, se on oletuksena 0\nprint(mjono[:3])\n\n# jos loppukohta puuttuu, se on oletuksena merkkijonon pituus\nprint(mjono[4:])

sai\npuakau\nsai\npuakauppias

Merkkijonojen käsittelyssä väli [a:b] on puoliavoin eli alkukohta a\nkuuluu väliin mutta loppukohta b ei kuulu väliin. Miksi näin?

Tähän ei ole syvällistä syytä, vaan kyseessä on käytäntö, joka esiintyy\nmonessa ohjelmointikielessä.

Yksi etu tästä on, että osajonon pituus saadaan helposti laskettua kaavalla b-a.\nToisaalta täytyy aina muistaa, että kohdassa b oleva merkki\nei tule mukaan osajonoon.

Tee ohjelma, joka kysyy käyttäjältä merkkijonon ja tulostaa sitten kaikki sen ensimmäisestä merkistä alkavat osajonot pituusjärjestyksessä.

Esimerkkitulostus:

Anna merkkijono: testi\nt\nte\ntes\ntest\ntesti

Tee ohjelma, joka kysyy käyttäjältä merkkijonon ja tulostaa sitten kaikki sen viimeiseen merkkiin päättyvät osajonot pituusjärjestyksessä.

Esimerkkitulostus:

Anna merkkijono: testi\ni\nti\nsti\nesti\ntesti

Osajonon etsiminen

Voimme tutkia in-operaattorin avulla, onko merkkijonossa tiettyä osajonoa.\nLauseke a in b on tosi, jos merkkijonossa b on osajono a.

Esimerkiksi

mjono = \"testi\"\n\nprint(\"t\" in mjono)\nprint(\"x\" in mjono)\nprint(\"est\" in mjono)\nprint(\"ets\" in mjono)

True\nFalse\nTrue\nFalse

Seuraava ohjelma antaa käyttäjän etsiä merkkijonon osajonoja:

mjono = \"saippuakauppias\"\n\nwhile True:\n    osa = input(\"Mitä etsit? \")\n    if osa in mjono:\n        print(\"Löytyi\")\n    else:\n        print(\"Ei löytynyt\")

Mitä etsit? kaup\nLöytyi\nMitä etsit? abc\nEi löytynyt\nMitä etsit? ippu\nLöytyi\n...

Tee ohjelma, joka kysyy käyttäjältä merkkijonon ja tulostaa sitten tiedon löytyvätkö vokaalit a, e ja o merkkijonosta.

Voit olettaa, että merkkijono on syötetty kokonaan pienillä kirjaimilla. Katso mallia esimerkkitulostuksesta.

Esimerkkitulostus:

Anna merkkijono: heippa sulle\na löytyy\ne löytyy\no ei löydy

Anna merkkijono: moi\na ei löydy\ne ei löydy\no löytyy

Operaattori in palauttaa tiedon osajonon esiintymisestä, muttei tietoa siitä, mistä se löytyy. Tätä varten löytyy Pythonin merkkijonojen metodi find, joka saa parametrikseen etsittävän osajonon ja palauttaa joko ensimmäisen indeksin, josta osajono löytyy, tai -1, jos osajonoa ei löydy merkkijonosta.

Metodia käytetään seuraavasti:

\n \n

Merkkijonon sisältä merkkijonoa etsivä find on siis metodi. Metodit ovat sukua jo meille tutuille asioille eli funktioille. Metodit ovatkin eräänlaisia funktioita, mutta niiden suorittama operaatio kohdistuu siihen olioon, jonka kautta metodia kutsutaan, eli joka esiintyy metodikutsun alussa ennen metodin nimeä. Metodin find tapauksessa oliona on merkkijono, jonka osajonoa etsitään.

Tee ohjelma, joka kysyy käyttäjältä merkkijonoa ja yksittäistä merkkiä. Ohjelma tulostaa merkkijonosta löytyvän ensimmäisen kolmen merkin pituisen osajonon, jonka alkukirjain on käyttäjän syöttämä merkki. Voit olettaa, että merkkijono on vähintään kolmen merkin pituinen.

Sana: apinatalo\nMerkki: a\napi

Sana: banaani\nMerkki: n\nnaa

Sana: tomaatti\nMerkki: x

Sana: python\nMerkki: n

Tee edellisestä ohjelmasta laajennettu versio, joka tulostaa kaikki merkkijonon sisältämät kolmen merkin pituiset osajonot, joiden alkukirjain on käyttäjän syöttämä merkki. Voit olettaa, että merkkijono on vähintään kolmen merkin pituinen.

Sana: apinatalo\nMerkki: a\napi\nata\nalo

Sana: banaani\nMerkki: n\nnaa

Vihje seuraava esimerkki saattaa antaa jotain inspiraatiota eräästä tavasta miten tätä tehtävää voi lähestyä

sana = input(\"Sana: \")\nwhile True:\n    if len(sana) == 0:\n        break\n    print(sana)\n    sana = sana[2:]

Sana: apinatalo\napinatalo\ninatalo\natalo\nalo\no

Tee ohjelma, joka etsii merkkijonosta osajonon toisen esiintymän. Jos toista (tai edes ensimmäistä) esiintymää ei löydy, ohjelma tulostaa tästä tiedon.

Määritellään tässä yhteydessä, että esiintymät eivät voi mennä päällekkäin, merkkijonossa aaaa osajonon aa toinen esiintymä löytyy siis indeksin 2 kohdalta.

Muutama esimerkkisuoritus:

Anna merkkijono: abcabc\nAnna osajono: ab\nOsajonon toinen esiintymä on kohdassa 3.

Anna merkkijono: saippuakauppias\nAnna osajono: a\nOsajonon toinen esiintymä on kohdassa 6.

Anna merkkijono: aybabtu\nAnna osajono: ba\nOsajono ei esiinny merkkijonossa kahdesti.

","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-3/2-merkkijonojen-kasittely.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-3/3-lisaa-silmukoista/page-data.json b/page-data/osa-3/3-lisaa-silmukoista/page-data.json index 29484a6fb..3a125ac43 100644 --- a/page-data/osa-3/3-lisaa-silmukoista/page-data.json +++ b/page-data/osa-3/3-lisaa-silmukoista/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-3/3-lisaa-silmukoista", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ymmärrät milloin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"-komentoa tarvitaan silmukan keskeyttämiseen"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat siirtyä silmukan seuraavalle kierrokselle "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"continue"}]},{"type":"text","value":"-komennolla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ymmärrät sisäkkäisen silmukan toiminnan"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"break-komento","style":"position:relative;"},"children":[{"type":"text","value":"break-komento"},{"type":"element","tagName":"a","properties":{"href":"#break-komento","ariaLabel":"break komento permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aiemmin silmukoiden yhteydessä tutustuttiin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"-komentoon. Komennolla voidaan katkaista silmukan suoritus välittömästi. Tyypillinen esimerkki komennon käytöstä on silmukka, jossa kysytään käyttäjältä syötteitä, ja suoritus päättyy, kun käyttäjä antaa tietyn syötteen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaavaan toiminnallisuuteen päästään myös ilman "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"-komentoa sopivan ehdon avulla. Alla olevat esimerkit toteuttavat molemmat ohjelman, joka laskee käyttäjän syötteiden summan kunnes käyttäjä syöttää luvun -1:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# 1. versio break-komennon avulla"}]},{"type":"text","value":"\n\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku, -1 lopettaa: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" luku\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Summa on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# 2. versio ilman break-komentoa"}]},{"type":"text","value":"\n\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"!="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku, -1 lopettaa: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"!="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" luku\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Summa on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Molempien ohjelmien esimerkkisuoritus voisi näyttää seuraavalta:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nAnna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nAnna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nAnna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nAnna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-1"}]},{"type":"text","value":"\nSumma on 14"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Molemmat versiot ovat toiminnallisuudeltaan siis käytännössä samanlaisia. Ensimmäinen tapa on kuitenkin usein helpompi, koska ehto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku == -1"}]},{"type":"text","value":" riittää kirjoittaa vain kerran eikä muuttujaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku"}]},{"type":"text","value":" tarvitse alustaa silmukan ulkopuolella."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Komentoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":" voidaan käyttää myös silloin, kun silmukassa on annettu jokin muu ehto kuin pelkkä totuusarvo "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":". Esimerkiksi seuraava silmukka jatkuu niin kauan, kuin annettujen lukujen summa on enintään 100. Kuitenkin silmukka katkeaa myös, jos käyttäjä antaa luvun -1."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku, -1 lopettaa: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" luku\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Summa on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mahdollisia suorituksia:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"15"}]},{"type":"text","value":"\nAnna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"8"}]},{"type":"text","value":"\nAnna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"21"}]},{"type":"text","value":"\nAnna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-1"}]},{"type":"text","value":"\nSumma on 44"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"15"}]},{"type":"text","value":"\nAnna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"8"}]},{"type":"text","value":"\nAnna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"21"}]},{"type":"text","value":"\nAnna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"45"}]},{"type":"text","value":"\nAnna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"17"}]},{"type":"text","value":"\nSumma on 106"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ensimmäisessä tapauksessa silmukka päättyy, koska käyttäjä antaa luvun -1. Toisessa tapauksessa silmukka päättyy, koska lukujen summa on yli 100."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toisaalta voisimme toteuttaa vastaavasti toimivan silmukan myös näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku, -1 lopettaa: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" luku\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Summa on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"continue-komento","style":"position:relative;"},"children":[{"type":"text","value":"continue-komento"},{"type":"element","tagName":"a","properties":{"href":"#continue-komento","ariaLabel":"continue komento permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Komento "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"continue"}]},{"type":"text","value":" on toinen tapa vaikuttaa silmukan suoritukseen. Kun silmukan sisällä tulee vastaan komento "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"continue"}]},{"type":"text","value":", hyppää suoritus välittömästi silmukan alkuun riville, jossa on silmukan ehto. Tämän jälkeen silmukan suoritus jatkuu normaalisti ehdon tarkastamisella:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 546px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/e4c20762d6e18dc80431b1926dfe4222/76aed/3_3.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 78.69565217391303%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB0ElEQVQ4y41U2U7DMBD0/38QbxWCByjiCalqKb3SM4l7pjmcNMegcevghqpgybFjz653dscWuLSqqpCmaT23x1trxN7aF5yY7vt+vWl3e60sS/0vpaznNlaYE7IsQ6/XQ1EUaDY7EtP6/T7iOP61LngKIxsMBpjP53rk/+Fw0D1Jkhq8XC4xnU4xGo30OBwO9ZrBhmF4phxFEaT04bkupO8jjiMdFaMmkO10OmGz2eio1msJ13XheR6Ox6Nmxb7f738oFxXwNRjBJkdQEAR1SmyKk7GDLM2u0kKsSLMTVLSH8jvovD4gW3dRFenFYX7lkBEmKsFyN8PjWwufiy5Unlw7PAQh0lAicZ4guy2o6TOqPKppGofMNSMM4xCdxQfavRe8D9sI1DklRVlgt9tBKKVuVPU8siAskpHHvcb0jMdjCJMXGnGxqspaJnn+Q7mpSWJpY2vwnMPL7TBlN1U1hqyirUU6MVhW1Y5eO+THcRytQWqLI/+ZChrSyHbIvG63W0wmE61BapIseTCLJkiLelqtVnqTcwqbhnTK/aZDGlLUxFKPBsux1iFPYJVI5dbVsykTQyzZNa+lsBfuPQ5Nx38+DtyczWb/fr6Ya1JsHvQNn8ja+ah5+/cAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/e4c20762d6e18dc80431b1926dfe4222/a0b58/3_3.webp 230w","/static/e4c20762d6e18dc80431b1926dfe4222/bc10c/3_3.webp 460w","/static/e4c20762d6e18dc80431b1926dfe4222/a3666/3_3.webp 546w"],"sizes":"(max-width: 546px) 100vw, 546px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/e4c20762d6e18dc80431b1926dfe4222/81c8e/3_3.png 230w","/static/e4c20762d6e18dc80431b1926dfe4222/08a84/3_3.png 460w","/static/e4c20762d6e18dc80431b1926dfe4222/76aed/3_3.png 546w"],"sizes":"(max-width: 546px) 100vw, 546px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/e4c20762d6e18dc80431b1926dfe4222/76aed/3_3.png","alt":"3 3","title":"3 3","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraava ohjelma laskee summaan mukaan vain luvut, jotka ovat pienempiä kuin 10. Jos luku on 10 tai suurempi, suoritus palaa silmukan alkuun eikä lukua lisätä summaan."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku, -1 lopettaa: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"continue"}]},{"type":"text","value":"\n summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" luku\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Summa on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nAnna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"7"}]},{"type":"text","value":"\nAnna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"99"}]},{"type":"text","value":"\nAnna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nAnna luku, -1 lopettaa: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-1"}]},{"type":"text","value":"\nSumma on 16"}]}]},{"type":"element","tagName":"h2","properties":{"id":"sisakkaiset-silmukat","style":"position:relative;"},"children":[{"type":"text","value":"Sisäkkäiset silmukat"},{"type":"element","tagName":"a","properties":{"href":"#sisakkaiset-silmukat","ariaLabel":"sisakkaiset silmukat permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Silmukoita voidaan kirjoittaa toisten silmukoiden sisään. Esimerkiksi seuraava ohjelma kysyy käyttäjältä silmukassa luvun ja tulostaa sen avulla lukujonon toisen silmukan avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\n4\n3\n2\n1\nAnna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n3\n2\n1\nAnna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"6"}]},{"type":"text","value":"\n6\n5\n4\n3\n2\n1\nAnna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-1"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että kun silmukoita on sisäkkäin, komennot "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"continue"}]},{"type":"text","value":" vaikuttavat vain sisimpään silmukkaan. Esimerkiksi voisimme toteuttaa äskeisen ohjelman vähän eri tavalla myös näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt jälkimmäinen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"-komento keskeyttää vain sisimmän silmukan, joka tulostaa lukuja, jos ehto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku <= 0"}]},{"type":"text","value":" pätee."}]},{"type":"element","tagName":"h2","properties":{"id":"silmukoiden-apumuuttujat","style":"position:relative;"},"children":[{"type":"text","value":"Silmukoiden apumuuttujat"},{"type":"element","tagName":"a","properties":{"href":"#silmukoiden-apumuuttujat","ariaLabel":"silmukoiden apumuuttujat permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olemme jo monesti käyttäneet silmukoissa apu- tai indeksimuuttujaa, jonka arvo kasvaa tai laskee jokaisella silmukan lohkon suorituskerralla. Esimerkiksi seuraava ohjelma tulostaa parilliset luvut käyttäjän haluamaan lukuun asti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"raja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ni "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" raja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"8"}]},{"type":"text","value":"\n0\n2\n4\n6"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Apumuuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"i"}]},{"type":"text","value":" arvo on silmukkaan ensimmäistä kertaa mentäessä 0 ja se kasvaa jokaisella silmukan suorituskerralla kahdella."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sisäkkäisten silmukoiden tapauksessa on tilanteita, joissa sisempi silmukka tarvitsee oman indeksimuuttujansa. Seuraava ohjelma tulostaa käyttäjän antamaan lukuun perustuvan \"lukupyramidin\":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" \""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" end"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\n0 1 2 3 4\n0 1 2 3\n0 1 2\n0 1\n0"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt sisemmässä silmukassa on käytössä apumuuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"i"}]},{"type":"text","value":", jonka arvo on aina sisempään silmukkaan mentäessä 0. Muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"i"}]},{"type":"text","value":" arvo kasvaa yhden välein, kunnes se on yhtä suuri kuin muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku"}]},{"type":"text","value":" nykyinen arvo, joka taas vähenee ulomman silmukan vuoksi kohti nollaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sisempi silmukka tulostaa apumuuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"i"}]},{"type":"text","value":" arvot välilyönnillä eroteltuna samalle riville. Kun sisempi silmukka päättyy, tulostetaan aina rivinvaihto komennolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos et ole täysin varma, että ymmärrät esimerkkikoodin toiminnan, kokeile kopioida koodi Python Tutorin "},{"type":"element","tagName":"a","properties":{"href":"http://www.pythontutor.com/visualize.html#mode=edit","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"visualisaattoriin"}]},{"type":"text","value":" ja tarkastele, mitä ohjelma tulostaa ja miten muuttujien arvot vaihtuvat koodin edetessä."}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Kertotaulut","tmcname":"osa03-15b_kertotaulut"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä positiivisen kokonaisluvun. Ohjelma tulostaa esimerkkitulostuksen mukaisesti kertolaskuja lukuun asti:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuorituksia:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: 2\n1 x 1 = 1\n1 x 2 = 2\n2 x 1 = 2\n2 x 2 = 4"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: 3\n1 x 1 = 1\n1 x 2 = 2\n1 x 3 = 3\n2 x 1 = 2\n2 x 2 = 4\n2 x 3 = 6\n3 x 1 = 3\n3 x 2 = 6\n3 x 3 = 9"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Sanojen ensimmäiset kirjaimet","tmcname":"osa03-16_sanojen_ensimmaiset_kirjaimet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä lauseen. Ohjelma tulostaa jokaisen sanan ensimmäisen kirjaimen ruudulle omille riveilleen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuoritus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lause: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vesihiisi sihisi hississä"}]},{"type":"text","value":"\nV\ns\nh"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Kertomat","tmcname":"osa03-17_kertomat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä kokonaisluvun. Jos käyttäjä syöttää negatiivisen luvun tai nollan, ohjelman suoritus päättyy. Muuten ohjelma tulostaa luvun kertoman."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kertoma lasketaan kertomalla keskenään luku ja kaikki sitä pienemmät positiiviset kokonaisluvut. Esim. luvun 5 kertoma on 1 * 2 * 3 * 4 * 5 = 120."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuorituksia:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nLuvun 3 kertoma on 6\nAnna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nLuvun 4 kertoma on 24\nAnna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-1"}]},{"type":"text","value":"\nKiitos ja moi!"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nLuvun 1 kertoma on 1\nAnna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nKiitos ja moi!"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Parit ympäri","tmcname":"osa03-18_parit_ympari"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka tulostaa luvut 1:stä käyttäjän antamaan lukuun. Luvut on kuitenkin käännetty pareittain ympäri."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\n2\n1\n4\n3\n5"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"6"}]},{"type":"text","value":"\n2\n1\n4\n3\n6\n5"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Vuorotellen","tmcname":"osa03-19_vuorotellen"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä luvun ja tulostaa sitten lukuja vuorotellen seuraavien esimerkkien mukaisesti."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\n1\n5\n2\n4\n3"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"6"}]},{"type":"text","value":"\n1\n6\n2\n5\n3\n4"}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Ymmärrät milloin break-komentoa tarvitaan silmukan keskeyttämiseen
  • \n
  • Osaat siirtyä silmukan seuraavalle kierrokselle continue-komennolla
  • \n
  • Ymmärrät sisäkkäisen silmukan toiminnan
  • \n

break-komento

Aiemmin silmukoiden yhteydessä tutustuttiin break-komentoon. Komennolla voidaan katkaista silmukan suoritus välittömästi. Tyypillinen esimerkki komennon käytöstä on silmukka, jossa kysytään käyttäjältä syötteitä, ja suoritus päättyy, kun käyttäjä antaa tietyn syötteen.

Vastaavaan toiminnallisuuteen päästään myös ilman break-komentoa sopivan ehdon avulla. Alla olevat esimerkit toteuttavat molemmat ohjelman, joka laskee käyttäjän syötteiden summan kunnes käyttäjä syöttää luvun -1:

# 1. versio break-komennon avulla\n\nsumma = 0\n\nwhile True:\n    luku = int(input(\"Anna luku, -1 lopettaa: \"))\n    if luku == -1:\n        break\n    summa += luku\n\nprint (f\"Summa on {summa}\")
# 2. versio ilman break-komentoa\n\nsumma = 0\nluku = 0\n\nwhile luku != -1:\n    luku = int(input(\"Anna luku, -1 lopettaa: \"))\n    if luku != -1:\n        summa += luku\n\nprint (f\"Summa on {summa}\")

Molempien ohjelmien esimerkkisuoritus voisi näyttää seuraavalta:

Anna luku, -1 lopettaa: 2\nAnna luku, -1 lopettaa: 4\nAnna luku, -1 lopettaa: 5\nAnna luku, -1 lopettaa: 3\nAnna luku, -1 lopettaa: -1\nSumma on 14

Molemmat versiot ovat toiminnallisuudeltaan siis käytännössä samanlaisia. Ensimmäinen tapa on kuitenkin usein helpompi, koska ehto luku == -1 riittää kirjoittaa vain kerran eikä muuttujaa luku tarvitse alustaa silmukan ulkopuolella.

Komentoa break voidaan käyttää myös silloin, kun silmukassa on annettu jokin muu ehto kuin pelkkä totuusarvo True. Esimerkiksi seuraava silmukka jatkuu niin kauan, kuin annettujen lukujen summa on enintään 100. Kuitenkin silmukka katkeaa myös, jos käyttäjä antaa luvun -1.

summa = 0\n\nwhile summa <= 100:\n    luku = int(input(\"Anna luku, -1 lopettaa: \"))\n    if luku == -1:\n        break\n    summa += luku\n\nprint (f\"Summa on {summa}\")

Mahdollisia suorituksia:

Anna luku, -1 lopettaa: 15\nAnna luku, -1 lopettaa: 8\nAnna luku, -1 lopettaa: 21\nAnna luku, -1 lopettaa: -1\nSumma on 44

Anna luku, -1 lopettaa: 15\nAnna luku, -1 lopettaa: 8\nAnna luku, -1 lopettaa: 21\nAnna luku, -1 lopettaa: 45\nAnna luku, -1 lopettaa: 17\nSumma on 106

Ensimmäisessä tapauksessa silmukka päättyy, koska käyttäjä antaa luvun -1. Toisessa tapauksessa silmukka päättyy, koska lukujen summa on yli 100.

Toisaalta voisimme toteuttaa vastaavasti toimivan silmukan myös näin:

summa = 0\n\nwhile True:\n    luku = int(input(\"Anna luku, -1 lopettaa: \"))\n    if luku == -1:\n        break\n    summa += luku\n    if summa > 100:\n        break\n\nprint (f\"Summa on {summa}\")

continue-komento

Komento continue on toinen tapa vaikuttaa silmukan suoritukseen. Kun silmukan sisällä tulee vastaan komento continue, hyppää suoritus välittömästi silmukan alkuun riville, jossa on silmukan ehto. Tämän jälkeen silmukan suoritus jatkuu normaalisti ehdon tarkastamisella:

\n \n

Tämän osion jälkeen

    \n
  • Ymmärrät milloin break-komentoa tarvitaan silmukan keskeyttämiseen
  • \n
  • Osaat siirtyä silmukan seuraavalle kierrokselle continue-komennolla
  • \n
  • Ymmärrät sisäkkäisen silmukan toiminnan
  • \n

break-komento

Aiemmin silmukoiden yhteydessä tutustuttiin break-komentoon. Komennolla voidaan katkaista silmukan suoritus välittömästi. Tyypillinen esimerkki komennon käytöstä on silmukka, jossa kysytään käyttäjältä syötteitä, ja suoritus päättyy, kun käyttäjä antaa tietyn syötteen.

Vastaavaan toiminnallisuuteen päästään myös ilman break-komentoa sopivan ehdon avulla. Alla olevat esimerkit toteuttavat molemmat ohjelman, joka laskee käyttäjän syötteiden summan kunnes käyttäjä syöttää luvun -1:

# 1. versio break-komennon avulla\n\nsumma = 0\n\nwhile True:\n    luku = int(input(\"Anna luku, -1 lopettaa: \"))\n    if luku == -1:\n        break\n    summa += luku\n\nprint (f\"Summa on {summa}\")
# 2. versio ilman break-komentoa\n\nsumma = 0\nluku = 0\n\nwhile luku != -1:\n    luku = int(input(\"Anna luku, -1 lopettaa: \"))\n    if luku != -1:\n        summa += luku\n\nprint (f\"Summa on {summa}\")

Molempien ohjelmien esimerkkisuoritus voisi näyttää seuraavalta:

Anna luku, -1 lopettaa: 2\nAnna luku, -1 lopettaa: 4\nAnna luku, -1 lopettaa: 5\nAnna luku, -1 lopettaa: 3\nAnna luku, -1 lopettaa: -1\nSumma on 14

Molemmat versiot ovat toiminnallisuudeltaan siis käytännössä samanlaisia. Ensimmäinen tapa on kuitenkin usein helpompi, koska ehto luku == -1 riittää kirjoittaa vain kerran eikä muuttujaa luku tarvitse alustaa silmukan ulkopuolella.

Komentoa break voidaan käyttää myös silloin, kun silmukassa on annettu jokin muu ehto kuin pelkkä totuusarvo True. Esimerkiksi seuraava silmukka jatkuu niin kauan, kuin annettujen lukujen summa on enintään 100. Kuitenkin silmukka katkeaa myös, jos käyttäjä antaa luvun -1.

summa = 0\n\nwhile summa <= 100:\n    luku = int(input(\"Anna luku, -1 lopettaa: \"))\n    if luku == -1:\n        break\n    summa += luku\n\nprint (f\"Summa on {summa}\")

Mahdollisia suorituksia:

Anna luku, -1 lopettaa: 15\nAnna luku, -1 lopettaa: 8\nAnna luku, -1 lopettaa: 21\nAnna luku, -1 lopettaa: -1\nSumma on 44

Anna luku, -1 lopettaa: 15\nAnna luku, -1 lopettaa: 8\nAnna luku, -1 lopettaa: 21\nAnna luku, -1 lopettaa: 45\nAnna luku, -1 lopettaa: 17\nSumma on 106

Ensimmäisessä tapauksessa silmukka päättyy, koska käyttäjä antaa luvun -1. Toisessa tapauksessa silmukka päättyy, koska lukujen summa on yli 100.

Toisaalta voisimme toteuttaa vastaavasti toimivan silmukan myös näin:

summa = 0\n\nwhile True:\n    luku = int(input(\"Anna luku, -1 lopettaa: \"))\n    if luku == -1:\n        break\n    summa += luku\n    if summa > 100:\n        break\n\nprint (f\"Summa on {summa}\")

continue-komento

Komento continue on toinen tapa vaikuttaa silmukan suoritukseen. Kun silmukan sisällä tulee vastaan komento continue, hyppää suoritus välittömästi silmukan alkuun riville, jossa on silmukan ehto. Tämän jälkeen silmukan suoritus jatkuu normaalisti ehdon tarkastamisella:

\n \n

Tämän osion jälkeen

    \n
  • Osaat luoda oman funktion ja kutsua sitä
  • \n
  • Ymmärrät, mikä on funktion parametri
  • \n
  • Osaat käyttää parametreja omissa funktioissa
  • \n

Aikaisemmissa osissa on käytetty esimerkiksi funktioita len, print ja input eri tarkoituksiin. Nämä ovat Pythonin sisäänrakennettuja funktioita, mutta voimme myös määritellä omia funktioita.

Funktion määrittely

Oma funktio määritellään avainsanalla def (lyhenne sanasta define). Funktiolle annetaan jokin nimi, jonka jälkeen on alku- ja loppusulku. Tämän jälkeen annetaan lohkossa funktioon kuuluva koodi.

Esimerkiksi seuraava koodi määrittelee funktion viesti:

def viesti():\n    print(\"Tämä on oma funktio!\")

Jos yllä oleva ohjelma suoritetaan, se ei näytä tekevän mitään. Tämä johtuu siitä, että funktion sisältämä koodi suoritetaan vasta silloin, kun funktiota kutsutaan.

Funktion kutsuminen tapahtuu funktion nimellä. Esimerkiksi seuraava koodi kutsuu funktiota:

def viesti():\n    print(\"Tämä on oma funktio!\")\n\nviesti()

Tämä on oma funktio!

Samaa funktiota voidaan määrittelyn jälkeen kutsua useita kertoja.

def viesti():\n    print(\"Tämä on oma funktio!\")\n\nviesti()\nviesti()\nviesti()

Tämä on oma funktio!\nTämä on oma funktio!\nTämä on oma funktio!

Huom! Tästä eteenpäin valtaosassa kurssin tehtäviä pyydetään kirjoittamaan oma funktio (tai funktioita).

Kun ohjelma koostuu pelkästään funktiosta, ei sen suorittaminen näytä tekevän mitään. Esimerkiksi seuraava ohjelma ei tulosta mitään:

def moikkaa():\n    print(\"Moi!\")

Funktion moikkaa sisällä oleva koodi suoritetaan vasta, kun funktiota kutsutaan.

Funktion alla olevaan \"pääohjelmaan\" kannattaa siis kirjoittaa sopivia funktiokutsuja ohjelman testaamiseksi, esimerkiksi:

def moikkaa():\n    print(\"Moi!\")\n\n# Pääohjelma on se ohjelman osa, joka ei ole minkään funktion sisällä\n# Kutsutaan omaa funktiota\n\nmoikkaa()

Tärkeä huomio: kurssin tehtävien testit edellyttävät, että funktioita testaava pääohjelma tulee kirjoittaa seuraavasti määriteltyyn if-lohkoon:

def moikkaa():\n    print(\"Moi!\")\n\n# Kirjoita pääohjelma aina seuraavanlaisen lohkon sisälle\nif __name__ == \"__main__\":\n    moikkaa()

Lohkon ulkopuolelle jätetty testikoodi aiheuttaa seuraavan virheilmoituksen:

\n \n \n \n \n \n \"3\n \n \n

Kannattaa myös huomata, että testit eivät suorita if __name__ == \"__main__\" -lohkon sisälle kirjoitettua koodia eikä sinne tule sijoittaa tehtävien edellyttämää koodia.

Tee funktio seitseman_veljesta jonka kutsuminen tulostaa seitsemän veljeksen nimet aakkosjärjestyksessä:

Aapo\nEero\nJuhani\nLauri\nSimeoni\nTimo\nTuomas

Funktion parametri

Usein funktiolla on yksi tai useampi parametri, jolla sen toimintaan voi vaikuttaa. Esimerkiksi Pythonin valmiissa funktioissa print ja input parametrin avulla annetaan näytettävä teksti:

print(\"Hei!\")                     # parametrina merkkijono \"Hei!\"\nnimi = input(\"Kerro nimesi: \")    # parametrina merkkijono \"Kerro nimesi: \"\nprint(nimi)                       # parametrina muuttujan nimi arvo

Voimme määritellä parametreja myös omille funktioillemme. Parametrit määritellään funktion nimen jälkeen olevien sulkujen sisällä:

def tervehdi(kohde):\n    print(\"Hei\", kohde)

Jos funktiota kutsutaan kaksi kertaa

tervehdi(\"Emilia\")\ntervehdi(\"maailma!\")

tulostaa se kaksi erilaista tervehdystä:

Hei Emilia\nHei maailma!

Katsotaan funktion määrittelyä vielä tarkemmin:

def tervehdi(kohde):\n    print(\"Hei\", kohde)

Määrittelimme ensimmäisellä rivillä, että funktion parametri on nimeltään kohde. Toisella rivillä print-komento käyttää parametrissa kohde olevaa arvoa.

Kun funktiota kutsutaan, saa parametri funktiokutsussa annettavan arvon. Esimerkiksi kun kutsutaan

nimi = \"Antti\"\ntervehdi(nimi)

niin parametrin kohde arvo funktiossa on merkkijono Antti.

Funktioiden ja parametrien nimeämistä koskevat samat periaatteet kuin mitä olemme jo aiemmin käsitelleet, eli nimien kannattaa olla kuvaavia ja käytössä ovat ensisijaisesti pienet kirjaimet sekä alaviiva.

Täydennä koodipohjassa oleva funktio ensimmainen siten, että se tulostaa parametrinaan saamansa merkkijonon ensimmäisen merkin.

def ensimmainen(merkkijono):\n     # kirjoita koodia tähän\n\n# kokeillaan funktiota:\nif __name__ == \"__main__\":\n    ensimmainen('python')\n    ensimmainen('yhtälö')\n    ensimmainen('tieto')\n    ensimmainen('huominen')\n    ensimmainen('omena')\n    ensimmainen('nukkumaanmenoaika')

p\ny\nt\nh\no\nn

Kun omassa funktiossa on määritelty yksi tai useampia parametreja, kannattaa funktiota testata usealla erilaisella parametrilla.

Kannattaa erityisesti miettiä, toimivatko myös \"erikoistapaukset\": mitä funktio esimerkiksi tekee, jos sille annetaan negatiivinen luku tai liukuluku kokonaisluvun sijasta.

Jos tehtävänannossa ei ole erityisesti käsketty kirjoittamaan tiettyjä funktiokutsuja, voit vapaasti lisätä omia kutsujasi pääohjelmaan ja testit jättävät nämä huomiotta.

Lisää esimerkkejä

Katsotaan vielä pari muuta esimerkkiä parametrien käyttämisestä. Seuraavassa funktiossa parametri on luku:

def nelio(x):\n    print(f\"Luvun {x} neliö on {x * x}\")\n\nnelio(2)\nnelio(5)

Luvun 2 neliö on 4\nLuvun 5 neliö on 25

Seuraavassa esimerkissä funktion sisällä on ehtorakenne:

def tervehdi(nimi):\n    if nimi == \"Emilia\":\n        print(\"Heippa,\", nimi)\n    else:\n        print(\"Moikka,\", nimi)\n\ntervehdi(\"Emilia\")\ntervehdi(\"Matti\")

Heippa, Emilia\nMoikka, Matti

Seuraavassa funktiossa puolestaan on kaksi parametria:

def summa(x, y):\n    tulos = x + y\n    print(f\"Parametrien {x} ja {y} summa on {tulos} \")\n\nsumma(1, 2)\nsumma(5, 24)

Parametrien 1 ja 2 summa on 3\nParametrien 5 ja 24 summa on 29

Funktio myös määrittelee \"apumuuttujan\" tulos, mihin se sijoittaa parametriensa summan.

Huomaa, että parametrien nimillä ei ole mitään tekemistä funktion ulkopuolella olevien muuttujien kanssa. Esimerkiksi jos kutsumme äskeistä funktiota

x = 100\ny = 30\nsumma(1, 2)\nsumma(x + y, 10)

niin tuloksena on:

Parametrien 1 ja 2 summa on 3\nParametrien 130 ja 10 summa on 140

Ensimmäisessä kutsussa parametrien arvot funktion sisällä ovat x = 1 ja y = 2, ja toisessa kutsussa arvot ovat x = 130 ja y = 10.

Palaamme funktioihin ja parametrien määrittelyyn tarkemmin seuraavan osan alussa.

Varoitus: globaalin muuttujan käyttö funktion sisällä

Kuten olemme nähneet, funktioiden sisällä on mahdollista määritellä muuttujia. Kannattaa myös huomata se, että funktio näkee sen ulkopuolella eli pääohjelmassa määritellyt muuttujat. Tälläisia muuttujia sanotaan globaaleiksi muuttujiksi.

Globaalien muuttujien käyttämistä funktioista käsin ei useimmiten pidetä hyvänä asiana muun muassa siksi, että ne saattavat johtaa ikäviin bugeihin.

Seuraavassa on esimerkki funktiosta, joka käyttää \"vahingossa\" globaalia muuttujaa:

# globaali muuttuja\nnimi = \"Emilia\"\n\ndef tervehdi(etunimi):\n    # tulostetaan vahingossa parametrin sijaan globaalin muuttujan arvo\n    print(\"Hei\", nimi)\n\ntervehdi(\"Antti\")\ntervehdi(\"Emilia\")

Hei Emilia\nHei Emilia

Vaikka funktiota kutsutaan oikein, se tulostaa aina globaalissa muuttujassa olevan nimen Emilia.

Tee funktio keskiarvo, joka saa parametrina kolme kokonaislukua. Funktio tulostaa parametriensa keskiarvon.

keskiarvo(5, 3, 1)\nkeskiarvo(10, 1, 1)

3.0\n4.0

Tee funktio tulosta_monesti(merkkijono, kertaa), joka saa parametriksi merkkijonon sekä kokonaisluvun, joka kertoo, montako kertaa funktion tulee tulostaa parametrina saamansa merkkijono:

tulosta_monesti(\"hei\", 5)\n\nprint()\n\nmerkkijono = \"Alussa olivat suo, kuokka ja Python\"\nkertaa = 3\ntulosta_monesti(merkkijono, kertaa)

hei\nhei\nhei\nhei\nhei

Alussa olivat suo, kuokka ja Python.\nAlussa olivat suo, kuokka ja Python.\nAlussa olivat suo, kuokka ja Python.

Tee funktio risunelio(pituus) joka saa parametriksi kokonaisluvun, joka kertoo kuinka suuri risuneliö funktion pitää tulostaa:

risunelio(3)\nprint()\nrisunelio(5)
\n###\n###\n###\n\n#####\n#####\n#####\n#####\n#####\n

Tee funktio shakkilauta, joka tulostaa shakkilaudan numeroista 0 ja 1 alla olevien esimerkkien mukaisesti.

shakkilauta(3)\nprint()\nshakkilauta(6)
\n101\n010\n101\n\n101010\n010101\n101010\n010101\n101010\n010101\n

Tee funktio nelio, joka tulostaa sananeliön alla olevien esimerkkien mukaisesti.

nelio(\"ab\", 3)\nprint()\nnelio(\"aybabtu\", 5)
\naba\nbab\naba\n\naybab\ntuayb\nabtua\nybabt\nuayba\n

Vastaa lopuksi osion loppukyselyyn:

","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-3/4-omat-funktiot.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat luoda oman funktion ja kutsua sitä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ymmärrät, mikä on funktion parametri"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää parametreja omissa funktioissa"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aikaisemmissa osissa on käytetty esimerkiksi funktioita "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"len"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"input"}]},{"type":"text","value":" eri tarkoituksiin. Nämä ovat Pythonin sisäänrakennettuja funktioita, mutta voimme myös määritellä omia funktioita."}]},{"type":"element","tagName":"h2","properties":{"id":"funktion-maarittely","style":"position:relative;"},"children":[{"type":"text","value":"Funktion määrittely"},{"type":"element","tagName":"a","properties":{"href":"#funktion-maarittely","ariaLabel":"funktion maarittely permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oma funktio määritellään avainsanalla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" (lyhenne sanasta define). Funktiolle annetaan jokin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":", jonka jälkeen on alku- ja loppusulku. Tämän jälkeen annetaan lohkossa funktioon kuuluva koodi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraava koodi määrittelee funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viesti"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"viesti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tämä on oma funktio!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos yllä oleva ohjelma suoritetaan, se ei näytä tekevän mitään. Tämä johtuu siitä, että funktion sisältämä koodi suoritetaan vasta silloin, kun funktiota "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kutsutaan"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion kutsuminen tapahtuu funktion nimellä. Esimerkiksi seuraava koodi kutsuu funktiota:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"viesti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tämä on oma funktio!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nviesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä on oma funktio!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Samaa funktiota voidaan määrittelyn jälkeen kutsua useita kertoja."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"viesti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tämä on oma funktio!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nviesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nviesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nviesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä on oma funktio!\nTämä on oma funktio!\nTämä on oma funktio!"}]}]},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Omien funktioiden testaaminen"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huom! Tästä eteenpäin valtaosassa kurssin tehtäviä pyydetään kirjoittamaan oma funktio (tai funktioita)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun ohjelma koostuu pelkästään funktiosta, ei sen suorittaminen näytä tekevän mitään. Esimerkiksi seuraava ohjelma ei tulosta mitään:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"moikkaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"moikkaa"}]},{"type":"text","value":" sisällä oleva koodi suoritetaan vasta, kun funktiota kutsutaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion alla olevaan \"pääohjelmaan\" kannattaa siis kirjoittaa sopivia funktiokutsuja ohjelman testaamiseksi, esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"moikkaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Pääohjelma on se ohjelman osa, joka ei ole minkään funktion sisällä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kutsutaan omaa funktiota"}]},{"type":"text","value":"\n\nmoikkaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Tärkeä huomio"}]},{"type":"text","value":": kurssin tehtävien testit edellyttävät, että funktioita testaava pääohjelma tulee kirjoittaa seuraavasti määriteltyyn "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":"-lohkoon:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"moikkaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kirjoita pääohjelma aina seuraavanlaisen lohkon sisälle"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n moikkaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lohkon ulkopuolelle jätetty testikoodi aiheuttaa seuraavan virheilmoituksen:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/198bfb36dc5d02ba030280b89c26ecee/7575b/3_4_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 70.43478260869564%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAABYlAAAWJQFJUiTwAAABpUlEQVQoz8WTPW8TQRCG7ycixEdFigiQECKipOEn0OQXEIFMESw7HyBEkFKkCDFWFBGwIM7Zudjn+4739nbvbmd3ZsEBghREFCoePZpiRm81M07Gsr7fLwVIWZZClKUEALwcjgJQ2jBWRUGWjkc5m2oNRHixiAbROKDBoOE8LwrOeS5kcTa7QK2hrmtHa20t2d/QJSWis/A/S4T/MWzOh2cgERAZol8tIkvC2B+WpxWQnKU9eWVZzq2Kmy15tcFuPI2vLSULa/njd8XDV/mddn5vlV9virmVotUdNXeG7a7X6IQvtr3NQ+483xO31tX9DZjfwNvPooUnnx8sHjS2sjcfi9aH/GWHtXeyR2/l3ddyfXe00nHXuoPmbrj8frjlcke5B/aob09SmwR2GluWWpZiNIEw0HGo01gbTajJ2op+WqOt0Goip+ztn/Q+HXve5GgY+/5oMDh23WQ8zpN4GoV5moqiYIwRnb+C2Z6r3n729Ys3CcIwGvt+EIaFkELKqq65EAbR/oVZuHQPIYkBUSkFAEopRCQiY8zsSo3Rp5g/+P4Y3wBFRBaDdLVPZAAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/198bfb36dc5d02ba030280b89c26ecee/a0b58/3_4_1.webp 230w","/static/198bfb36dc5d02ba030280b89c26ecee/bc10c/3_4_1.webp 460w","/static/198bfb36dc5d02ba030280b89c26ecee/966d8/3_4_1.webp 920w","/static/198bfb36dc5d02ba030280b89c26ecee/445df/3_4_1.webp 1380w","/static/198bfb36dc5d02ba030280b89c26ecee/40fa0/3_4_1.webp 1608w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/198bfb36dc5d02ba030280b89c26ecee/81c8e/3_4_1.png 230w","/static/198bfb36dc5d02ba030280b89c26ecee/08a84/3_4_1.png 460w","/static/198bfb36dc5d02ba030280b89c26ecee/c0255/3_4_1.png 920w","/static/198bfb36dc5d02ba030280b89c26ecee/b1001/3_4_1.png 1380w","/static/198bfb36dc5d02ba030280b89c26ecee/7575b/3_4_1.png 1608w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/198bfb36dc5d02ba030280b89c26ecee/c0255/3_4_1.png","alt":"3 4 1","title":"3 4 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kannattaa myös huomata, että testit eivät suorita "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":" -lohkon sisälle kirjoitettua koodia eikä sinne tule sijoittaa tehtävien edellyttämää koodia."}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Seitsemän veljestä","tmcname":"osa03-21_seitseman_veljesta"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"seitseman_veljesta"}]},{"type":"text","value":" jonka kutsuminen tulostaa seitsemän veljeksen nimet aakkosjärjestyksessä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aapo\nEero\nJuhani\nLauri\nSimeoni\nTimo\nTuomas"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"funktion-parametri","style":"position:relative;"},"children":[{"type":"text","value":"Funktion parametri"},{"type":"element","tagName":"a","properties":{"href":"#funktion-parametri","ariaLabel":"funktion parametri permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Usein funktiolla on yksi tai useampi "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"parametri"}]},{"type":"text","value":", jolla sen toimintaan voi vaikuttaa. Esimerkiksi Pythonin valmiissa funktioissa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"input"}]},{"type":"text","value":" parametrin avulla annetaan näytettävä teksti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hei!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# parametrina merkkijono \"Hei!\""}]},{"type":"text","value":"\nnimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kerro nimesi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# parametrina merkkijono \"Kerro nimesi: \""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# parametrina muuttujan nimi arvo"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme määritellä parametreja myös omille funktioillemme. Parametrit määritellään funktion nimen jälkeen olevien sulkujen sisällä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tervehdi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kohde"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hei\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kohde"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos funktiota kutsutaan kaksi kertaa"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tervehdi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntervehdi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"maailma!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tulostaa se kaksi erilaista tervehdystä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hei Emilia\nHei maailma!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Katsotaan funktion määrittelyä vielä tarkemmin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tervehdi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kohde"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hei\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kohde"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Määrittelimme ensimmäisellä rivillä, että funktion parametri on nimeltään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kohde"}]},{"type":"text","value":". Toisella rivillä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komento käyttää parametrissa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kohde"}]},{"type":"text","value":" olevaa arvoa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun funktiota kutsutaan, saa parametri "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"funktiokutsussa"}]},{"type":"text","value":" annettavan arvon. Esimerkiksi kun kutsutaan"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"text","value":"\ntervehdi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"niin parametrin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kohde"}]},{"type":"text","value":" arvo funktiossa on merkkijono "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Antti"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktioiden ja parametrien nimeämistä koskevat samat periaatteet kuin mitä olemme jo aiemmin käsitelleet, eli nimien kannattaa olla kuvaavia ja käytössä ovat ensisijaisesti pienet kirjaimet sekä alaviiva."}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Ensimmäinen merkki","tmcname":"osa03-22_ensimmainen_merkki"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Täydennä koodipohjassa oleva funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ensimmainen"}]},{"type":"text","value":" siten, että se tulostaa parametrinaan saamansa merkkijonon ensimmäisen merkin."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"ensimmainen"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"merkkijono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kirjoita koodia tähän"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kokeillaan funktiota:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n ensimmainen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'python'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n ensimmainen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'yhtälö'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n ensimmainen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'tieto'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n ensimmainen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'huominen'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n ensimmainen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'omena'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n ensimmainen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'nukkumaanmenoaika'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"p\ny\nt\nh\no\nn"}]}]}]},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Omien funktioiden testaaminen: parametrit"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun omassa funktiossa on määritelty yksi tai useampia parametreja, kannattaa funktiota testata usealla erilaisella parametrilla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kannattaa erityisesti miettiä, toimivatko myös \"erikoistapaukset\": mitä funktio esimerkiksi tekee, jos sille annetaan negatiivinen luku tai liukuluku kokonaisluvun sijasta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos tehtävänannossa ei ole erityisesti käsketty kirjoittamaan tiettyjä funktiokutsuja, voit vapaasti lisätä omia kutsujasi pääohjelmaan ja testit jättävät nämä huomiotta."}]}]},{"type":"element","tagName":"h2","properties":{"id":"lisaa-esimerkkeja","style":"position:relative;"},"children":[{"type":"text","value":"Lisää esimerkkejä"},{"type":"element","tagName":"a","properties":{"href":"#lisaa-esimerkkeja","ariaLabel":"lisaa esimerkkeja permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Katsotaan vielä pari muuta esimerkkiä parametrien käyttämisestä. Seuraavassa funktiossa parametri on luku:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"nelio"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Luvun "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" neliö on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nnelio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnelio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luvun 2 neliö on 4\nLuvun 5 neliö on 25"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa esimerkissä funktion sisällä on ehtorakenne:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tervehdi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Heippa,\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moikka,\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntervehdi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntervehdi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Matti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Heippa, Emilia\nMoikka, Matti"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa funktiossa puolestaan on kaksi parametria:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"summa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" y\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Parametrien "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ja "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" summa on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" \""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsumma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Parametrien 1 ja 2 summa on 3\nParametrien 5 ja 24 summa on 29"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio myös määrittelee \"apumuuttujan\" "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tulos"}]},{"type":"text","value":", mihin se sijoittaa parametriensa summan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että parametrien nimillä ei ole mitään tekemistä funktion ulkopuolella olevien muuttujien kanssa. Esimerkiksi jos kutsumme äskeistä funktiota"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"text","value":"\ny "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"30"}]},{"type":"text","value":"\nsumma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"niin tuloksena on:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Parametrien 1 ja 2 summa on 3\nParametrien 130 ja 10 summa on 140"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ensimmäisessä kutsussa parametrien arvot funktion sisällä ovat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x = 1"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"y = 2"}]},{"type":"text","value":", ja toisessa kutsussa arvot ovat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x = 130"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"y = 10"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Palaamme funktioihin ja parametrien määrittelyyn tarkemmin seuraavan osan alussa."}]},{"type":"comment","value":"vastaava varoitusteksti löytyy osioista 3-4, 4-6 ja 5-1, tsekkaa kaikki jos muokkaat tätä"},{"type":"element","tagName":"h2","properties":{"id":"varoitus-globaalin-muuttujan-kaytto-funktion-sisalla","style":"position:relative;"},"children":[{"type":"text","value":"Varoitus: globaalin muuttujan käyttö funktion sisällä"},{"type":"element","tagName":"a","properties":{"href":"#varoitus-globaalin-muuttujan-kaytto-funktion-sisalla","ariaLabel":"varoitus globaalin muuttujan kaytto funktion sisalla permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten olemme nähneet, funktioiden sisällä on mahdollista määritellä muuttujia. Kannattaa myös huomata se, että funktio näkee sen ulkopuolella eli pääohjelmassa määritellyt muuttujat. Tälläisia muuttujia sanotaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"globaaleiksi"}]},{"type":"text","value":" muuttujiksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Globaalien muuttujien käyttämistä funktioista käsin ei useimmiten pidetä hyvänä asiana muun muassa siksi, että ne saattavat johtaa ikäviin bugeihin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on esimerkki funktiosta, joka käyttää \"vahingossa\" globaalia muuttujaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# globaali muuttuja"}]},{"type":"text","value":"\nnimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tervehdi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"etunimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tulostetaan vahingossa parametrin sijaan globaalin muuttujan arvo"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hei\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntervehdi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntervehdi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hei Emilia\nHei Emilia"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaikka funktiota kutsutaan oikein, se tulostaa aina globaalissa muuttujassa olevan nimen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Emilia"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Keskiarvo","tmcname":"osa03-25_keskiarvo"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"keskiarvo"}]},{"type":"text","value":", joka saa parametrina kolme kokonaislukua. Funktio tulostaa parametriensa keskiarvon."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"keskiarvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkeskiarvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3.0\n4.0"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Monta tulostusta","tmcname":"osa03-24_monta_tulostusta"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta_monesti(merkkijono, kertaa)"}]},{"type":"text","value":", joka saa parametriksi merkkijonon sekä kokonaisluvun, joka kertoo, montako kertaa funktion tulee tulostaa parametrina saamansa merkkijono:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tulosta_monesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hei\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nmerkkijono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Alussa olivat suo, kuokka ja Python\""}]},{"type":"text","value":"\nkertaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\ntulosta_monesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"merkkijono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kertaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"hei\nhei\nhei\nhei\nhei"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Alussa olivat suo, kuokka ja Python.\nAlussa olivat suo, kuokka ja Python.\nAlussa olivat suo, kuokka ja Python."}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Risuneliö","tmcname":"osa03-23_risunelio"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"risunelio(pituus)"}]},{"type":"text","value":" joka saa parametriksi kokonaisluvun, joka kertoo kuinka suuri risuneliö funktion pitää tulostaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"risunelio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nrisunelio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"###\n###\n###\n\n#####\n#####\n#####\n#####\n#####\n"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Shakkilauta","tmcname":"osa03-26_shakkilauta"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"shakkilauta"}]},{"type":"text","value":", joka tulostaa shakkilaudan numeroista 0 ja 1 alla olevien esimerkkien mukaisesti."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"shakkilauta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nshakkilauta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"101\n010\n101\n\n101010\n010101\n101010\n010101\n101010\n010101\n"}]}]}]},{"type":"element","tagName":"in-browser-programming-exercise","properties":{"name":"Sananeliö","tmcname":"osa03-27_sananelio"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nelio"}]},{"type":"text","value":", joka tulostaa sananeliön alla olevien esimerkkien mukaisesti."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nelio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ab\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnelio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"aybabtu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"aba\nbab\naba\n\naybab\ntuayb\nabtua\nybabt\nuayba\n"}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3"},"children":[]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa lopuksi osion loppukyselyyn:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat luoda oman funktion ja kutsua sitä
  • \n
  • Ymmärrät, mikä on funktion parametri
  • \n
  • Osaat käyttää parametreja omissa funktioissa
  • \n

Aikaisemmissa osissa on käytetty esimerkiksi funktioita len, print ja input eri tarkoituksiin. Nämä ovat Pythonin sisäänrakennettuja funktioita, mutta voimme myös määritellä omia funktioita.

Funktion määrittely

Oma funktio määritellään avainsanalla def (lyhenne sanasta define). Funktiolle annetaan jokin nimi, jonka jälkeen on alku- ja loppusulku. Tämän jälkeen annetaan lohkossa funktioon kuuluva koodi.

Esimerkiksi seuraava koodi määrittelee funktion viesti:

def viesti():\n    print(\"Tämä on oma funktio!\")

Jos yllä oleva ohjelma suoritetaan, se ei näytä tekevän mitään. Tämä johtuu siitä, että funktion sisältämä koodi suoritetaan vasta silloin, kun funktiota kutsutaan.

Funktion kutsuminen tapahtuu funktion nimellä. Esimerkiksi seuraava koodi kutsuu funktiota:

def viesti():\n    print(\"Tämä on oma funktio!\")\n\nviesti()

Tämä on oma funktio!

Samaa funktiota voidaan määrittelyn jälkeen kutsua useita kertoja.

def viesti():\n    print(\"Tämä on oma funktio!\")\n\nviesti()\nviesti()\nviesti()

Tämä on oma funktio!\nTämä on oma funktio!\nTämä on oma funktio!

Huom! Tästä eteenpäin valtaosassa kurssin tehtäviä pyydetään kirjoittamaan oma funktio (tai funktioita).

Kun ohjelma koostuu pelkästään funktiosta, ei sen suorittaminen näytä tekevän mitään. Esimerkiksi seuraava ohjelma ei tulosta mitään:

def moikkaa():\n    print(\"Moi!\")

Funktion moikkaa sisällä oleva koodi suoritetaan vasta, kun funktiota kutsutaan.

Funktion alla olevaan \"pääohjelmaan\" kannattaa siis kirjoittaa sopivia funktiokutsuja ohjelman testaamiseksi, esimerkiksi:

def moikkaa():\n    print(\"Moi!\")\n\n# Pääohjelma on se ohjelman osa, joka ei ole minkään funktion sisällä\n# Kutsutaan omaa funktiota\n\nmoikkaa()

Tärkeä huomio: kurssin tehtävien testit edellyttävät, että funktioita testaava pääohjelma tulee kirjoittaa seuraavasti määriteltyyn if-lohkoon:

def moikkaa():\n    print(\"Moi!\")\n\n# Kirjoita pääohjelma aina seuraavanlaisen lohkon sisälle\nif __name__ == \"__main__\":\n    moikkaa()

Lohkon ulkopuolelle jätetty testikoodi aiheuttaa seuraavan virheilmoituksen:

\n \n \n \n \n \n \"3\n \n \n

Kannattaa myös huomata, että testit eivät suorita if __name__ == \"__main__\" -lohkon sisälle kirjoitettua koodia eikä sinne tule sijoittaa tehtävien edellyttämää koodia.

Tee funktio seitseman_veljesta jonka kutsuminen tulostaa seitsemän veljeksen nimet aakkosjärjestyksessä:

Aapo\nEero\nJuhani\nLauri\nSimeoni\nTimo\nTuomas

Funktion parametri

Usein funktiolla on yksi tai useampi parametri, jolla sen toimintaan voi vaikuttaa. Esimerkiksi Pythonin valmiissa funktioissa print ja input parametrin avulla annetaan näytettävä teksti:

print(\"Hei!\")                     # parametrina merkkijono \"Hei!\"\nnimi = input(\"Kerro nimesi: \")    # parametrina merkkijono \"Kerro nimesi: \"\nprint(nimi)                       # parametrina muuttujan nimi arvo

Voimme määritellä parametreja myös omille funktioillemme. Parametrit määritellään funktion nimen jälkeen olevien sulkujen sisällä:

def tervehdi(kohde):\n    print(\"Hei\", kohde)

Jos funktiota kutsutaan kaksi kertaa

tervehdi(\"Emilia\")\ntervehdi(\"maailma!\")

tulostaa se kaksi erilaista tervehdystä:

Hei Emilia\nHei maailma!

Katsotaan funktion määrittelyä vielä tarkemmin:

def tervehdi(kohde):\n    print(\"Hei\", kohde)

Määrittelimme ensimmäisellä rivillä, että funktion parametri on nimeltään kohde. Toisella rivillä print-komento käyttää parametrissa kohde olevaa arvoa.

Kun funktiota kutsutaan, saa parametri funktiokutsussa annettavan arvon. Esimerkiksi kun kutsutaan

nimi = \"Antti\"\ntervehdi(nimi)

niin parametrin kohde arvo funktiossa on merkkijono Antti.

Funktioiden ja parametrien nimeämistä koskevat samat periaatteet kuin mitä olemme jo aiemmin käsitelleet, eli nimien kannattaa olla kuvaavia ja käytössä ovat ensisijaisesti pienet kirjaimet sekä alaviiva.

Täydennä koodipohjassa oleva funktio ensimmainen siten, että se tulostaa parametrinaan saamansa merkkijonon ensimmäisen merkin.

def ensimmainen(merkkijono):\n     # kirjoita koodia tähän\n\n# kokeillaan funktiota:\nif __name__ == \"__main__\":\n    ensimmainen('python')\n    ensimmainen('yhtälö')\n    ensimmainen('tieto')\n    ensimmainen('huominen')\n    ensimmainen('omena')\n    ensimmainen('nukkumaanmenoaika')

p\ny\nt\nh\no\nn

Kun omassa funktiossa on määritelty yksi tai useampia parametreja, kannattaa funktiota testata usealla erilaisella parametrilla.

Kannattaa erityisesti miettiä, toimivatko myös \"erikoistapaukset\": mitä funktio esimerkiksi tekee, jos sille annetaan negatiivinen luku tai liukuluku kokonaisluvun sijasta.

Jos tehtävänannossa ei ole erityisesti käsketty kirjoittamaan tiettyjä funktiokutsuja, voit vapaasti lisätä omia kutsujasi pääohjelmaan ja testit jättävät nämä huomiotta.

Lisää esimerkkejä

Katsotaan vielä pari muuta esimerkkiä parametrien käyttämisestä. Seuraavassa funktiossa parametri on luku:

def nelio(x):\n    print(f\"Luvun {x} neliö on {x * x}\")\n\nnelio(2)\nnelio(5)

Luvun 2 neliö on 4\nLuvun 5 neliö on 25

Seuraavassa esimerkissä funktion sisällä on ehtorakenne:

def tervehdi(nimi):\n    if nimi == \"Emilia\":\n        print(\"Heippa,\", nimi)\n    else:\n        print(\"Moikka,\", nimi)\n\ntervehdi(\"Emilia\")\ntervehdi(\"Matti\")

Heippa, Emilia\nMoikka, Matti

Seuraavassa funktiossa puolestaan on kaksi parametria:

def summa(x, y):\n    tulos = x + y\n    print(f\"Parametrien {x} ja {y} summa on {tulos} \")\n\nsumma(1, 2)\nsumma(5, 24)

Parametrien 1 ja 2 summa on 3\nParametrien 5 ja 24 summa on 29

Funktio myös määrittelee \"apumuuttujan\" tulos, mihin se sijoittaa parametriensa summan.

Huomaa, että parametrien nimillä ei ole mitään tekemistä funktion ulkopuolella olevien muuttujien kanssa. Esimerkiksi jos kutsumme äskeistä funktiota

x = 100\ny = 30\nsumma(1, 2)\nsumma(x + y, 10)

niin tuloksena on:

Parametrien 1 ja 2 summa on 3\nParametrien 130 ja 10 summa on 140

Ensimmäisessä kutsussa parametrien arvot funktion sisällä ovat x = 1 ja y = 2, ja toisessa kutsussa arvot ovat x = 130 ja y = 10.

Palaamme funktioihin ja parametrien määrittelyyn tarkemmin seuraavan osan alussa.

Varoitus: globaalin muuttujan käyttö funktion sisällä

Kuten olemme nähneet, funktioiden sisällä on mahdollista määritellä muuttujia. Kannattaa myös huomata se, että funktio näkee sen ulkopuolella eli pääohjelmassa määritellyt muuttujat. Tälläisia muuttujia sanotaan globaaleiksi muuttujiksi.

Globaalien muuttujien käyttämistä funktioista käsin ei useimmiten pidetä hyvänä asiana muun muassa siksi, että ne saattavat johtaa ikäviin bugeihin.

Seuraavassa on esimerkki funktiosta, joka käyttää \"vahingossa\" globaalia muuttujaa:

# globaali muuttuja\nnimi = \"Emilia\"\n\ndef tervehdi(etunimi):\n    # tulostetaan vahingossa parametrin sijaan globaalin muuttujan arvo\n    print(\"Hei\", nimi)\n\ntervehdi(\"Antti\")\ntervehdi(\"Emilia\")

Hei Emilia\nHei Emilia

Vaikka funktiota kutsutaan oikein, se tulostaa aina globaalissa muuttujassa olevan nimen Emilia.

Tee funktio keskiarvo, joka saa parametrina kolme kokonaislukua. Funktio tulostaa parametriensa keskiarvon.

keskiarvo(5, 3, 1)\nkeskiarvo(10, 1, 1)

3.0\n4.0

Tee funktio tulosta_monesti(merkkijono, kertaa), joka saa parametriksi merkkijonon sekä kokonaisluvun, joka kertoo, montako kertaa funktion tulee tulostaa parametrina saamansa merkkijono:

tulosta_monesti(\"hei\", 5)\n\nprint()\n\nmerkkijono = \"Alussa olivat suo, kuokka ja Python\"\nkertaa = 3\ntulosta_monesti(merkkijono, kertaa)

hei\nhei\nhei\nhei\nhei

Alussa olivat suo, kuokka ja Python.\nAlussa olivat suo, kuokka ja Python.\nAlussa olivat suo, kuokka ja Python.

Tee funktio risunelio(pituus) joka saa parametriksi kokonaisluvun, joka kertoo kuinka suuri risuneliö funktion pitää tulostaa:

risunelio(3)\nprint()\nrisunelio(5)
\n###\n###\n###\n\n#####\n#####\n#####\n#####\n#####\n

Tee funktio shakkilauta, joka tulostaa shakkilaudan numeroista 0 ja 1 alla olevien esimerkkien mukaisesti.

shakkilauta(3)\nprint()\nshakkilauta(6)
\n101\n010\n101\n\n101010\n010101\n101010\n010101\n101010\n010101\n

Tee funktio nelio, joka tulostaa sananeliön alla olevien esimerkkien mukaisesti.

nelio(\"ab\", 3)\nprint()\nnelio(\"aybabtu\", 5)
\naba\nbab\naba\n\naybab\ntuayb\nabtua\nybabt\nuayba\n

Vastaa lopuksi osion loppukyselyyn:

","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-3/4-omat-funktiot.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-3/page-data.json b/page-data/osa-3/page-data.json index a69676b3b..210ee3e4e 100644 --- a/page-data/osa-3/page-data.json +++ b/page-data/osa-3/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-part-overview-template-js", "path": "/osa-3", - "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-3","title":"Osa 3"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-3/index.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-3","title":"Osa 3"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-3/index.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-4/1-vscode/page-data.json b/page-data/osa-4/1-vscode/page-data.json index e88d3b6a1..dbee76d34 100644 --- a/page-data/osa-4/1-vscode/page-data.json +++ b/page-data/osa-4/1-vscode/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-4/1-vscode", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää Visual studio Code -editoria kurssin tehtävien tekemiseen"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat suorittaa koodia interaktiivisen Python-tulkin avulla"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olemme tähän mennessä ohjelmoineet kaikki tehtävät kurssisivuille upotettuihin editori-ikkunoihin. Selaineditorissa tapahtuva ohjelmointi sopii hyvin kurssin alkuun, mutta siirrymme nyt käyttämään erillistä ohjelmointiin tarkoitettua editoria."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Erilaisia ohjelmointiin sopivia editoreja on kymmeniä. Käytämme kurssilla viime vuosina suureen suosioon noussutta "},{"type":"element","tagName":"a","properties":{"href":"https://code.visualstudio.com/","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Visual Studio Code"}]},{"type":"text","value":" -editoria."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Asenna nyt Visual Studio Code ja kurssin tehtävien testien suorittamiseen käytettävä TMC-plugin "},{"type":"element","tagName":"a","properties":{"href":"https://www.mooc.fi/fi/installation/vscode","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"tämän ohjeen"}]},{"type":"text","value":" avulla. Valitse TMC-pluginissa organisaatioksi "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"MOOC"}]},{"type":"text","value":" ja kurssiksi "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Ohjelmoinnin MOOC 2023"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Hello Visual Studio Code","tmcname":"osa04-01_hello_visualstudio_code"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä, mikä editori on käytössä. Ohjelma jatkaa, kunnes vastaus on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Visual Studio Code"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava käyttöesimerkki havainnollistaa ohjelman haluttua tulostusta:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Editori: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Emacs"}]},{"type":"text","value":"\nei ole hyvä\nEditori: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vim"}]},{"type":"text","value":"\nei ole hyvä\nEditori: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Word"}]},{"type":"text","value":"\nsurkea\nEditori: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Atom"}]},{"type":"text","value":"\nei ole hyvä\nEditori: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Visual Studio Code"}]},{"type":"text","value":"\nloistava valinta!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos käyttäjä kirjoittaa Word tai Notepad, ohjelma vastaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"surkea"}]},{"type":"text","value":". Muissa epäkelvoissa tapauksissa vastaus on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei ole hyvä"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia siten, että \"oikean vastauksen\" kirjoitusasu ei riipu siitä, kirjoitetaanko vastaus isoja vai pieniä kirjaimia käyttämällä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Editori: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"NOTEPAD"}]},{"type":"text","value":"\nsurkea\nEditori: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"viSUal STudiO cODe"}]},{"type":"text","value":"\nloistava valinta!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjainten koon voi jättää huomiotta esim. muuttamalla kirjaimet pieniksi merkkijonojen metodilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lower"}]},{"type":"text","value":", jota voi käyttää seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Visual Studio CODE\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"visual studio code\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lower"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"merkkijono oli etsitty!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"h2","properties":{"id":"koodin-suorittaminen","style":"position:relative;"},"children":[{"type":"text","value":"Koodin suorittaminen"},{"type":"element","tagName":"a","properties":{"href":"#koodin-suorittaminen","ariaLabel":"koodin suorittaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Visual Studio Codessa koodi suoritetaan painamalla vihreää kolmiota. Joskus koodisi suoritus voi jäädä kesken, esimerkiksi odottamaan käyttäjän syötettä tai ikuiseen silmukkaan, vaikka siirryt jo seuraavaan tehtävään. Kun yrität suorittaa seuraavan tehtävän koodia, esille tuleekin edellisen tehtävän kesken ollut suoritus. Näissä tilanteissa voit joutua sammuttamaan edellisen suorituksen painamalla yhtä aikaa näppäimiä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Control"}]},{"type":"text","value":"+"},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"C"}]},{"type":"text","value":", jotta saat suoritetuksi uuden tehtävän koodin."}]},{"type":"element","tagName":"h2","properties":{"id":"interaktiivinen-python-tulkki","style":"position:relative;"},"children":[{"type":"text","value":"Interaktiivinen Python-tulkki"},{"type":"element","tagName":"a","properties":{"href":"#interaktiivinen-python-tulkki","ariaLabel":"interaktiivinen python tulkki permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Emme ole toistaiseksi puhuneet kurssilla sanallakaan eräästä Python-ohjelmoinnin tärkeimmästä työkalusta, interaktiivisesta komentotulkista."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Komentotulkki käynnistyy antamalla komentoriviltä komento "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"python3"}]},{"type":"text","value":" (joissain tapauksissa, esim. Windowsilla, komento saattaa olla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"python"}]},{"type":"text","value":"). Esim. Macilla komentotulkin avaaminen näyttää seuraavalta:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/7267d91f6d4cbf0f25e0a55ca8dea0ce/0f246/4_1_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 17.82608695652174%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAABYlAAAWJQFJUiTwAAAArUlEQVQI13XLywqDMBCFYd//tbroMhiYZFppBG/YJAQTN+o4sVS77bc6HPiL2/Pe1E3ftc8HlmWJiFprKWVVVQAgpUT8/gCglBJCGGPatm1ORV2Zruve49s5F2O01nrvnXMppb7vQwjHfwU+cBxHRBRCAIB5GaUUIg7DoLUGgJRSjDGEME2T995aO8/zLyainDMzExEzH8ex7zsz55yvvW0bEW2ndV2XZSGiK/4AItbceE5Q2z8AAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/7267d91f6d4cbf0f25e0a55ca8dea0ce/a0b58/4_1_1.webp 230w","/static/7267d91f6d4cbf0f25e0a55ca8dea0ce/bc10c/4_1_1.webp 460w","/static/7267d91f6d4cbf0f25e0a55ca8dea0ce/966d8/4_1_1.webp 920w","/static/7267d91f6d4cbf0f25e0a55ca8dea0ce/34186/4_1_1.webp 1118w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/7267d91f6d4cbf0f25e0a55ca8dea0ce/81c8e/4_1_1.png 230w","/static/7267d91f6d4cbf0f25e0a55ca8dea0ce/08a84/4_1_1.png 460w","/static/7267d91f6d4cbf0f25e0a55ca8dea0ce/c0255/4_1_1.png 920w","/static/7267d91f6d4cbf0f25e0a55ca8dea0ce/0f246/4_1_1.png 1118w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/7267d91f6d4cbf0f25e0a55ca8dea0ce/c0255/4_1_1.png","alt":"4 1 1","title":"4 1 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Komentotulkki on myös mahdollista avata Visual Studio Coden sisälle, ensin suorittamalla jokin ohjelma \"vihreällä kolmiolla\" ja sen jälkeen kirjoittamalla avautuvaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Terminal"}]},{"type":"text","value":"-näkymään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"python3"}]},{"type":"text","value":" (tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"python"}]},{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/895b071970fc467ecad71d69e6d70d5a/e431d/4_1_2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 49.130434782608695%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAABYlAAAWJQFJUiTwAAABF0lEQVQoz52RWW7DIBCGuUcLw2I2Ox42O7hZrtCXqve/SgVOokh5aNVPCM32s8wQjDHFlHIOIRhjnfP78r7ttgVuEWedMuZo58mNNak4e+JHnxYsBXPBcfbaaGOsbSKntZZqMM4111qplGfySyYL4h2AASeUUiG4EJxzAAD6BOs8uwr4G6MUGPQU6Wl2K/wNym4y9hD/GwIAfyyFO7vdxLajtUbEaZqsMcZZLsUDKSXnfBzHdV0Ph8M8z62kt5PUWtd1RcRSSs4ZQ9hy+UjLmkuKMYSwx2OMy7KkNtOcOqUUcr1eL5dLrXXbtvPpVOrxO54/h4jSDEoJIeD+yNdfkG3bEHE/MvarQgiD1koPzjml1GNmrw37AVG5Vxy3ozSFAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/895b071970fc467ecad71d69e6d70d5a/a0b58/4_1_2.webp 230w","/static/895b071970fc467ecad71d69e6d70d5a/bc10c/4_1_2.webp 460w","/static/895b071970fc467ecad71d69e6d70d5a/966d8/4_1_2.webp 920w","/static/895b071970fc467ecad71d69e6d70d5a/445df/4_1_2.webp 1380w","/static/895b071970fc467ecad71d69e6d70d5a/78de1/4_1_2.webp 1840w","/static/895b071970fc467ecad71d69e6d70d5a/609ff/4_1_2.webp 1882w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/895b071970fc467ecad71d69e6d70d5a/81c8e/4_1_2.png 230w","/static/895b071970fc467ecad71d69e6d70d5a/08a84/4_1_2.png 460w","/static/895b071970fc467ecad71d69e6d70d5a/c0255/4_1_2.png 920w","/static/895b071970fc467ecad71d69e6d70d5a/b1001/4_1_2.png 1380w","/static/895b071970fc467ecad71d69e6d70d5a/161ec/4_1_2.png 1840w","/static/895b071970fc467ecad71d69e6d70d5a/e431d/4_1_2.png 1882w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/895b071970fc467ecad71d69e6d70d5a/c0255/4_1_2.png","alt":"4 1 2","title":"4 1 2","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"On olemassa myös selaimessa toimivia interaktiivisia tulkkeja, kuten "},{"type":"element","tagName":"a","properties":{"href":"https://www.python.org/shell/","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"https://www.python.org/shell/"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Komentotulkki tarjoaa interaktiivisen tavan suorittaa Python-koodia rivi riviltä sitä mukaa kuin käyttäjä kirjoittaa koodia. Ideana on, että kun käyttäjä kirjoittaa rivin koodia, Python suorittaa rivin välittömästi ja näyttää rivin operaation tuloksen:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/7977922a8e37fd253a7fd34e364e6d58/0f246/4_1_3.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 19.565217391304348%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAkElEQVQI143LwQqDMAwAUP//53qQRq0zKmJALe0wB3HRZtDtOti7v6Kua0QchmEcRwCoqso5BwDOub7vjTFEpKoi8srO8xQRzYppmh4ZESHiuq7HcXjvY4zMHELw3jPzM4sxLsvCzN88z3PTNGVZtm2773tKSUTu+9Y/FETUdZ21FgAQcdu2kF3Xparph09+Az024L8JLoKAAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/7977922a8e37fd253a7fd34e364e6d58/a0b58/4_1_3.webp 230w","/static/7977922a8e37fd253a7fd34e364e6d58/bc10c/4_1_3.webp 460w","/static/7977922a8e37fd253a7fd34e364e6d58/966d8/4_1_3.webp 920w","/static/7977922a8e37fd253a7fd34e364e6d58/34186/4_1_3.webp 1118w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/7977922a8e37fd253a7fd34e364e6d58/81c8e/4_1_3.png 230w","/static/7977922a8e37fd253a7fd34e364e6d58/08a84/4_1_3.png 460w","/static/7977922a8e37fd253a7fd34e364e6d58/c0255/4_1_3.png 920w","/static/7977922a8e37fd253a7fd34e364e6d58/0f246/4_1_3.png 1118w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/7977922a8e37fd253a7fd34e364e6d58/c0255/4_1_3.png","alt":"4 1 3","title":"4 1 3","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Komentotulkkiin on mahdollista kirjoittaa mitä tahansa Pythonia, muuttujien ja metodienkin määrittely on mahdollista:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" t "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" t"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"itseisarvo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"luku\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" luku\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" itseisarvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nTraceback "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"most recent call last"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n File "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" line "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"module"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":"\nNameError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" name "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'luku'"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"is"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" defined\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" itseisarvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" itseisarvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Parhaimmillaan komentotulkki on pienten tarkistusten tekemiseen, esim. miten tietty metodi toimii tai onko metodia ylipäätään olemassa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"TekstIä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"toupper"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nTraceback "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"most recent call last"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n File "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" line "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"module"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":"\nAttributeError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'str'"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"object"}]},{"type":"text","value":" has no attribute "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'toupper'"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"TekstIä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"upper"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'TEKSTIÄ'"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos muistaa melkein jonkin metodin nimen, googlaamisen sijaan voi olla nopeampi käyttää komentotulkkia ja kysyä funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"dir"}]},{"type":"text","value":", mitä metodeja tietyllä oliolla on:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"dir"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"teksti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__add__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__class__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__contains__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__delattr__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__dir__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__doc__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__eq__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__format__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__ge__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__getattribute__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__getitem__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__getnewargs__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__gt__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__hash__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__init__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__init_subclass__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__iter__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__le__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__len__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__lt__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__mod__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__mul__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__ne__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__new__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__reduce__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__reduce_ex__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__repr__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__rmod__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__rmul__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__setattr__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__sizeof__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__str__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__subclasshook__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'capitalize'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'casefold'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'center'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'count'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'encode'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'endswith'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'expandtabs'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'find'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'format'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'format_map'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'isalnum'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'isalpha'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'isascii'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'isdecimal'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'isdigit'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'isidentifier'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'islower'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'isnumeric'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'isprintable'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'isspace'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'istitle'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'isupper'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'join'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'ljust'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'lower'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'lstrip'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'maketrans'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'partition'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'replace'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'rfind'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'rindex'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'rjust'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'rpartition'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'rsplit'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'rstrip'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'split'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'splitlines'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'startswith'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'strip'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'swapcase'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'translate'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'upper'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'zfill'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten näemme, merkkijonoilla on suuri määrä metodeja. Kurssin tässä vaiheessa ei kannata välittää alaviivoja sisältävistä metodeista, mutta muut voivat olla käyttökelpoisia. Osa metodien toiminnasta voi selvitä kokeilemalla, osan toiminta selviää googlaamalla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Listojen metodeista käy ilmi seuraavaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"dir"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__add__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__class__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__contains__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__delattr__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__delitem__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__dir__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__doc__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__eq__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__format__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__ge__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__getattribute__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__getitem__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__gt__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__hash__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__iadd__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__imul__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__init__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__init_subclass__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__iter__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__le__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__len__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__lt__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__mul__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__ne__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__new__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__reduce__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__reduce_ex__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__repr__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__reversed__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__rmul__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__setattr__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__setitem__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__sizeof__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__str__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__subclasshook__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'append'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'clear'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'copy'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'count'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'extend'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'insert'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'pop'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'remove'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'reverse'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'sort'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarjolla näyttää siis olevan mm. metodit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reverse"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"clear"}]},{"type":"text","value":". Kokeillaan niitä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"reverse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" luvut\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"clear"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" luvut\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodit siis tekevät aika lailla sen, mitä nimen perusteella voi olettaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että komentotulkki ei näytä mitään tulosta, kun kutsutaan esim. metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lista.reverse()"}]},{"type":"text","value":". Mistä tämä johtuu? Komentotulkki tekee komentojen suorituksen yhteydessä tulostuksen vain, jos suoritetulla koodirivillä on jokin arvo. Edellisessä esimerkissä saatiin tulostettua listan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luvut"}]},{"type":"text","value":" arvo kirjoittamalla komentotulkkiin pelkkä muuttujan nimi. Komentotulkissa ei siis useinkaan ole tarvetta kirjottaa erikseen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komentoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tärkeä komento on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"exit()"}]},{"type":"text","value":", joka sulkee komentotulkin. Erityisesti jos käytät komentotulkkia Visual Studio Codessa, se tulee muistaa sulkea, ennen kuin suoritat jonkin ohjelman uudelleen \"vihreällä kolmiolla\". Jos tämä unohtuu, on seurauksena hieman erikoinen virheilmoitus:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/030410f1be5c4a9d02209afb96fe30e4/966ce/4_1_4.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 28.695652173913043%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA7klEQVQY023G0W6EIBCFYd9jBQZQgWEERdx1FTdbTd//lZqYthdNT76T/FXOkyMa0phzTikhekRy1nXGInrvyVqrlP4DVBNJVwbtOA8u9tA2QggAkFJKgO+4kv+MMc6uc8YAZKV0E4YQxwRaMyFqzm91fWOXK2rGfoGSoJSQwEEwwatnTFtM52MtcVrD+KA4O8rWz67PjiaDFz9Znwy+0v2dl1ea15BWjNVxnp/HeX4ceynPZdme615KWbfXvpdtC9QTInnfe+o92c5YYwjRIS4uVHcfHxgWGobGRt1FbaI2wyXqLsj2H6oj1S7KfgH1/DpLnHkC8gAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/030410f1be5c4a9d02209afb96fe30e4/a0b58/4_1_4.webp 230w","/static/030410f1be5c4a9d02209afb96fe30e4/bc10c/4_1_4.webp 460w","/static/030410f1be5c4a9d02209afb96fe30e4/966d8/4_1_4.webp 920w","/static/030410f1be5c4a9d02209afb96fe30e4/445df/4_1_4.webp 1380w","/static/030410f1be5c4a9d02209afb96fe30e4/78de1/4_1_4.webp 1840w","/static/030410f1be5c4a9d02209afb96fe30e4/df82e/4_1_4.webp 2050w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/030410f1be5c4a9d02209afb96fe30e4/81c8e/4_1_4.png 230w","/static/030410f1be5c4a9d02209afb96fe30e4/08a84/4_1_4.png 460w","/static/030410f1be5c4a9d02209afb96fe30e4/c0255/4_1_4.png 920w","/static/030410f1be5c4a9d02209afb96fe30e4/b1001/4_1_4.png 1380w","/static/030410f1be5c4a9d02209afb96fe30e4/161ec/4_1_4.png 1840w","/static/030410f1be5c4a9d02209afb96fe30e4/966ce/4_1_4.png 2050w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/030410f1be5c4a9d02209afb96fe30e4/c0255/4_1_4.png","alt":"4 1 4","title":"4 1 4","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"h2","properties":{"id":"debuggeri","style":"position:relative;"},"children":[{"type":"text","value":"Debuggeri"},{"type":"element","tagName":"a","properties":{"href":"#debuggeri","ariaLabel":"debuggeri permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muutamassa edellisessä osassa on jo korostettu debuggaustaitojen tärkeyttä ja demonstroitu tulostamalla tapahtuvaa debuggausta. Visual Studio Code sisältää debuggausta varten "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"visuaalisen debuggerin"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Debuggaus aloitetaan määrittelemällä koodiin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"breakpoint"}]},{"type":"text","value":" eli kohta, johon debuggeri pysäyttää koodin suorituksen. Breakpoint asetetaan klikkaamalla hiirellä halutun koodirivin vasemmalta puolelta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa esimerkissä breakpoint on asetettu "},{"type":"element","tagName":"a","properties":{"href":"/osa-3/1-ehdot-silmukoissa"},"children":[{"type":"text","value":"edellisen osan"}]},{"type":"text","value":" tehtävän "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Peräkkäisten summa"}]},{"type":"text","value":" hieman virheellisen ratkaisun riville 5:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/b2aa8f4cae6fd0db736f2cf1d62607f9/6e29b/4_1_5.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 39.130434782608695%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAABYlAAAWJQFJUiTwAAAAv0lEQVQY042NW66DMAwFWQiO47wdY7glJEXd/8Iq+nelVmJ0/o5GM6WUZN3O8zyOo/euuubCXEVk0UVFFpGFuX7dpLrlwr33R2vtHM/R/oRrrarKzKWUlBIAmG9MsqwAUHLWbQUENEAWLV7fPM8A8y/zkpPzAbGyvJ6vozWugmjxHlMM0dEV2x/7GCPmQuSN+Vn7V/YhOu+ttTnmMUZlRgAD9+QQovc+xhBT3PemqvnDXdkYJLJEZD+Qc0R0R34DaJdB2A9pXSUAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/b2aa8f4cae6fd0db736f2cf1d62607f9/a0b58/4_1_5.webp 230w","/static/b2aa8f4cae6fd0db736f2cf1d62607f9/bc10c/4_1_5.webp 460w","/static/b2aa8f4cae6fd0db736f2cf1d62607f9/966d8/4_1_5.webp 920w","/static/b2aa8f4cae6fd0db736f2cf1d62607f9/445df/4_1_5.webp 1380w","/static/b2aa8f4cae6fd0db736f2cf1d62607f9/a9e74/4_1_5.webp 1610w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/b2aa8f4cae6fd0db736f2cf1d62607f9/81c8e/4_1_5.png 230w","/static/b2aa8f4cae6fd0db736f2cf1d62607f9/08a84/4_1_5.png 460w","/static/b2aa8f4cae6fd0db736f2cf1d62607f9/c0255/4_1_5.png 920w","/static/b2aa8f4cae6fd0db736f2cf1d62607f9/b1001/4_1_5.png 1380w","/static/b2aa8f4cae6fd0db736f2cf1d62607f9/6e29b/4_1_5.png 1610w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/b2aa8f4cae6fd0db736f2cf1d62607f9/c0255/4_1_5.png","alt":"4 1 5","title":"4 1 5","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Breakpointin asetuksen jälkeen valitaan valikosta "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Run"}]},{"type":"text","value":" kohta "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Start debugging"}]},{"type":"text","value":". Tämä avaa valintanäkymän, josta valitaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Python File"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/4ab241b5d1246646156624044be64914/adef7/4_1_6.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 36.52173913043478%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA/klEQVQY043PyW6DMBSFYT9HEyZPYBsINpMxeGjSpqCmUt//aaoIRUpX7a9vec/igrxgSspgFzebYJdz8NvH9XNbb9v6/XVb398uwbvZWDO52aim4ZwLIUQpyroCVVnjUsmwnexVTBfSWdq7fPC4tVAtmVwyOaPW3nUuwiw6HqJHQHBR1Kp/3U7mzAcrRi9GX2kP6+FQNLuXfCePkCRJnDwCKINS8ODcYiajR933Y9fpYagFpxjlBD+DaZo8BSDEZVVZ67quH7WWbdtIJVVbMH6/J7+kaRY/BTAmCCFKKUKYMQ4hiuN4fyn+K0AITdMMoYxQUjBGKS0YRxj/Z/wD++1E6Al0/nYAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/4ab241b5d1246646156624044be64914/a0b58/4_1_6.webp 230w","/static/4ab241b5d1246646156624044be64914/bc10c/4_1_6.webp 460w","/static/4ab241b5d1246646156624044be64914/966d8/4_1_6.webp 920w","/static/4ab241b5d1246646156624044be64914/445df/4_1_6.webp 1380w","/static/4ab241b5d1246646156624044be64914/211fa/4_1_6.webp 1716w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/4ab241b5d1246646156624044be64914/81c8e/4_1_6.png 230w","/static/4ab241b5d1246646156624044be64914/08a84/4_1_6.png 460w","/static/4ab241b5d1246646156624044be64914/c0255/4_1_6.png 920w","/static/4ab241b5d1246646156624044be64914/b1001/4_1_6.png 1380w","/static/4ab241b5d1246646156624044be64914/adef7/4_1_6.png 1716w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/4ab241b5d1246646156624044be64914/c0255/4_1_6.png","alt":"4 1 6","title":"4 1 6","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Debuggeri käynnistyy ja alkaa suorittaa koodia normaaliin tapaan, kunnes se törmää breakpointiin ja pysähtyy:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/8a01f8e6fba73266b2dd512d79dfb681/3145a/4_1_7.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 46.95652173913043%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAABYlAAAWJQFJUiTwAAABUElEQVQoz2WP4Y6kIBCEfYvbyyAigjoobdOgpwaGGe/93+myzGVzuf1SP6p/VLqq8j7ElPZ9n6fZGKOUBgBH5Dwtdp5hASQAmMxdiLZt5b+qHDq0ON/t2I9KaSmlUsoui1RStaJtOOd1zeq6rvk3KnSEM9rJKqW1HrTqei1/P93jMaPjFn5Y+AD4CfBhv6miM3v0k5lLuFdKCSGMMUQkpeS8bpr/HzYNbwoVEbWl6ied6rpOylZpZQG01iX/DvyFc84Yu91ujLHKr3vY431GY53FVY9Tmd11neqH4Sv/3swYE0JM0wQAxphq3X7tR9qPeMYc02tBH0Ig8tu2necZQti2jYi890QUCjnn67pSShUiNo2QUpbCn7uv63o+nyml1+v1eDxyzsdxvM3XeRxHjLFyzoWwLguO473vh74fUko55xjjuq6I6JxbClh4e1f4A1GXWrWtxlxFAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8a01f8e6fba73266b2dd512d79dfb681/a0b58/4_1_7.webp 230w","/static/8a01f8e6fba73266b2dd512d79dfb681/bc10c/4_1_7.webp 460w","/static/8a01f8e6fba73266b2dd512d79dfb681/966d8/4_1_7.webp 920w","/static/8a01f8e6fba73266b2dd512d79dfb681/445df/4_1_7.webp 1380w","/static/8a01f8e6fba73266b2dd512d79dfb681/78de1/4_1_7.webp 1840w","/static/8a01f8e6fba73266b2dd512d79dfb681/407bd/4_1_7.webp 2112w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8a01f8e6fba73266b2dd512d79dfb681/81c8e/4_1_7.png 230w","/static/8a01f8e6fba73266b2dd512d79dfb681/08a84/4_1_7.png 460w","/static/8a01f8e6fba73266b2dd512d79dfb681/c0255/4_1_7.png 920w","/static/8a01f8e6fba73266b2dd512d79dfb681/b1001/4_1_7.png 1380w","/static/8a01f8e6fba73266b2dd512d79dfb681/161ec/4_1_7.png 1840w","/static/8a01f8e6fba73266b2dd512d79dfb681/3145a/4_1_7.png 2112w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/8a01f8e6fba73266b2dd512d79dfb681/c0255/4_1_7.png","alt":"4 1 7","title":"4 1 7","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vasempaan reunaan on avautunut näkymä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Variables"}]},{"type":"text","value":", joka kertoo senhetkisten muuttujien arvot. Koodia voidaan suorittaa rivi riviltä painelemalla alaspäin osoittavaa nuolta ("},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Step into"}]},{"type":"text","value":")."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa tilanteessa silmukkaa on suoritettu muutamia kertoja:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/748cafbc68941c7eaaebec0f9b422806/cc418/4_1_8.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 51.73913043478261%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAABYlAAAWJQFJUiTwAAABbElEQVQoz3WP7Y6jMAxFeY62gUmcLyctJAETKKCWoWjf/41WVNpqd6U5Orp/ri3LxTB20zKv6zcRpRCNxZjaIR8QUUtE40x5HMecQmMRjbEfiybEcbjffG2UUUoJAVqbJkTjvbNGAwhQnENVccaq0+lyPrOPRVPXjWsa36BBpbSWEvgXdYG6G6JQkkk4w1spL/9ZhH7sQ3fzN3VgjJJSVCnq16tLrfT+7P3pJ4tIg0M02mqljdIAEqT8qngI0TlfspKx6ieLEKKQGpSGd3JQXHClQBt7fGEM55yxC2OsLNnflCUrunx/bL8i3euUh3mtU2+MtcYgYgjBe3+9XhFRvlFKAQAiTtO0LEvRtl1ThxhSjG3b0tVfu66bpomIcs79m6Mg6vv+kznnY7mua865ECAEAEghxLLM+74/n89931+v17Zt67ouy/L9h23b5vmYKVJKj8eDqHfOaW2U0p/LMUb8F+ccIlprtdaI+Bvm42YuwG95FAAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/748cafbc68941c7eaaebec0f9b422806/a0b58/4_1_8.webp 230w","/static/748cafbc68941c7eaaebec0f9b422806/bc10c/4_1_8.webp 460w","/static/748cafbc68941c7eaaebec0f9b422806/966d8/4_1_8.webp 920w","/static/748cafbc68941c7eaaebec0f9b422806/445df/4_1_8.webp 1380w","/static/748cafbc68941c7eaaebec0f9b422806/78de1/4_1_8.webp 1840w","/static/748cafbc68941c7eaaebec0f9b422806/75f48/4_1_8.webp 1992w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/748cafbc68941c7eaaebec0f9b422806/81c8e/4_1_8.png 230w","/static/748cafbc68941c7eaaebec0f9b422806/08a84/4_1_8.png 460w","/static/748cafbc68941c7eaaebec0f9b422806/c0255/4_1_8.png 920w","/static/748cafbc68941c7eaaebec0f9b422806/b1001/4_1_8.png 1380w","/static/748cafbc68941c7eaaebec0f9b422806/161ec/4_1_8.png 1840w","/static/748cafbc68941c7eaaebec0f9b422806/cc418/4_1_8.png 1992w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/748cafbc68941c7eaaebec0f9b422806/c0255/4_1_8.png","alt":"4 1 8","title":"4 1 8","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Debuggerin välilehti "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Debug console"}]},{"type":"text","value":" mahdollistaa myös lausekkeiden arvojen näyttämisen debuggaushetken muuttujien arvoilla. Voidaan esimerkiksi kokeilla, mikä silmukan lopetusehdon arvo on:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/cb417e312ed6b45c9910c5a50d7fa175/cb1ac/4_1_9.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 43.913043478260875%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAABYlAAAWJQFJUiTwAAABLUlEQVQoz2WQ207EIBRF+Qs1GW7n1tJSyghMp3WeNPr/n6TTiUmjKysEEnbOBnXdrp9fX+u6nnMehxFZSrtTW4sxxpTnesmvpbQyhgAAeECVc63nGjgwCxEDABGmNDlnrTXGGGuNd87Zx1kfVUM/zDGFPnTSCQsTCMPnR3l/n2uDNL+k9Pzr02F/V01jarn1nYSuYxZEdM5OcSj1zILOa+e039f/qpTmaUpEzCx7mBABAV9LGcfRe2+tM8Zo/VdjrGIWACTiPUbeg3OWCIkZkFjEWqv3u0e01qfTSW3b2+WyxDjV2mpt3b08E9HjY4koxigix7zWGhFzzqrWy7Jsy3Ldttu63sIwxpRDCHthCwAiAgB/JjvnREQ93vmoTcTeQ993BGB+R+kd84+f2t90809R3YMDEQAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/cb417e312ed6b45c9910c5a50d7fa175/a0b58/4_1_9.webp 230w","/static/cb417e312ed6b45c9910c5a50d7fa175/bc10c/4_1_9.webp 460w","/static/cb417e312ed6b45c9910c5a50d7fa175/966d8/4_1_9.webp 920w","/static/cb417e312ed6b45c9910c5a50d7fa175/445df/4_1_9.webp 1380w","/static/cb417e312ed6b45c9910c5a50d7fa175/78de1/4_1_9.webp 1840w","/static/cb417e312ed6b45c9910c5a50d7fa175/cb61f/4_1_9.webp 1936w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/cb417e312ed6b45c9910c5a50d7fa175/81c8e/4_1_9.png 230w","/static/cb417e312ed6b45c9910c5a50d7fa175/08a84/4_1_9.png 460w","/static/cb417e312ed6b45c9910c5a50d7fa175/c0255/4_1_9.png 920w","/static/cb417e312ed6b45c9910c5a50d7fa175/b1001/4_1_9.png 1380w","/static/cb417e312ed6b45c9910c5a50d7fa175/161ec/4_1_9.png 1840w","/static/cb417e312ed6b45c9910c5a50d7fa175/cb1ac/4_1_9.png 1936w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/cb417e312ed6b45c9910c5a50d7fa175/c0255/4_1_9.png","alt":"4 1 9","title":"4 1 9","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmassa voi olla myös useita breakpointeja. Pysähtymisen jälkeen koodi voidaan taas käynnistää sinisellä kolmiolla ("},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Continue"}]},{"type":"text","value":") ja suoritus jatkuu, kunnes ohjelma törmää seuraavaan breakpointiin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Visuaalinen debuggeri on vaihtoehto debug-tulostuksille, mutta on mieltymyksistä kiinni, mitä debuggaustekniikoita kukin ohjelmoija käyttää. On hyvä kokeilla erilaisia tapoja ja valita itselle sopiva tapa."}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat käyttää Visual studio Code -editoria kurssin tehtävien tekemiseen
  • \n
  • Osaat suorittaa koodia interaktiivisen Python-tulkin avulla
  • \n

Olemme tähän mennessä ohjelmoineet kaikki tehtävät kurssisivuille upotettuihin editori-ikkunoihin. Selaineditorissa tapahtuva ohjelmointi sopii hyvin kurssin alkuun, mutta siirrymme nyt käyttämään erillistä ohjelmointiin tarkoitettua editoria.

Erilaisia ohjelmointiin sopivia editoreja on kymmeniä. Käytämme kurssilla viime vuosina suureen suosioon noussutta Visual Studio Code -editoria.

Asenna nyt Visual Studio Code ja kurssin tehtävien testien suorittamiseen käytettävä TMC-plugin tämän ohjeen avulla. Valitse TMC-pluginissa organisaatioksi MOOC ja kurssiksi Ohjelmoinnin MOOC 2023.

Tee ohjelma, joka kysyy käyttäjältä, mikä editori on käytössä. Ohjelma jatkaa, kunnes vastaus on Visual Studio Code.

Seuraava käyttöesimerkki havainnollistaa ohjelman haluttua tulostusta:

Editori: Emacs\nei ole hyvä\nEditori: Vim\nei ole hyvä\nEditori: Word\nsurkea\nEditori: Atom\nei ole hyvä\nEditori: Visual Studio Code\nloistava valinta!

Jos käyttäjä kirjoittaa Word tai Notepad, ohjelma vastaa surkea. Muissa epäkelvoissa tapauksissa vastaus on ei ole hyvä.

Ohjelman tulee toimia siten, että \"oikean vastauksen\" kirjoitusasu ei riipu siitä, kirjoitetaanko vastaus isoja vai pieniä kirjaimia käyttämällä:

Editori: NOTEPAD\nsurkea\nEditori: viSUal STudiO cODe\nloistava valinta!

Kirjainten koon voi jättää huomiotta esim. muuttamalla kirjaimet pieniksi merkkijonojen metodilla lower, jota voi käyttää seuraavasti:

mjono = \"Visual Studio CODE\"\nif \"visual studio code\" == mjono.lower():\n    print(\"merkkijono oli etsitty!\")

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Koodin suorittaminen

Visual Studio Codessa koodi suoritetaan painamalla vihreää kolmiota. Joskus koodisi suoritus voi jäädä kesken, esimerkiksi odottamaan käyttäjän syötettä tai ikuiseen silmukkaan, vaikka siirryt jo seuraavaan tehtävään. Kun yrität suorittaa seuraavan tehtävän koodia, esille tuleekin edellisen tehtävän kesken ollut suoritus. Näissä tilanteissa voit joutua sammuttamaan edellisen suorituksen painamalla yhtä aikaa näppäimiä Control+C, jotta saat suoritetuksi uuden tehtävän koodin.

Interaktiivinen Python-tulkki

Emme ole toistaiseksi puhuneet kurssilla sanallakaan eräästä Python-ohjelmoinnin tärkeimmästä työkalusta, interaktiivisesta komentotulkista.

Komentotulkki käynnistyy antamalla komentoriviltä komento python3 (joissain tapauksissa, esim. Windowsilla, komento saattaa olla python). Esim. Macilla komentotulkin avaaminen näyttää seuraavalta:

\n \n \n \n \n \n \"4\n \n \n

On olemassa myös selaimessa toimivia interaktiivisia tulkkeja, kuten https://www.python.org/shell/.

Komentotulkki tarjoaa interaktiivisen tavan suorittaa Python-koodia rivi riviltä sitä mukaa kuin käyttäjä kirjoittaa koodia. Ideana on, että kun käyttäjä kirjoittaa rivin koodia, Python suorittaa rivin välittömästi ja näyttää rivin operaation tuloksen:

\n \n \n \n \n \n \"4\n \n \n

Komentotulkkiin on mahdollista kirjoittaa mitä tahansa Pythonia, muuttujien ja metodienkin määrittely on mahdollista:

>>> t = [1,2,3,4,5]\n>>> for luku in t:\n...   print(luku)\n...\n1\n2\n3\n4\n5\n>>> def itseisarvo(luku):\n...   if luku<0:\n...      luku = -luku\n...   return luku\n...\n>>> x = 10\n>>> y = -7\n>>> itseisarvo(luku)\nTraceback (most recent call last):\n  File \"<stdin>\", line 1, in <module>\nNameError: name 'luku' is not defined\n>>> itseisarvo(x)\n10\n>>> itseisarvo(y)\n7\n>>>

Parhaimmillaan komentotulkki on pienten tarkistusten tekemiseen, esim. miten tietty metodi toimii tai onko metodia ylipäätään olemassa:

>>> \"TekstIä\".toupper()\nTraceback (most recent call last):\n  File \"<stdin>\", line 1, in <module>\nAttributeError: 'str' object has no attribute 'toupper'\n>>> \"TekstIä\".upper()\n'TEKSTIÄ'\n>>>

Jos muistaa melkein jonkin metodin nimen, googlaamisen sijaan voi olla nopeampi käyttää komentotulkkia ja kysyä funktiolla dir, mitä metodeja tietyllä oliolla on:

>>> dir(\"teksti\")\n['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__',\n'__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__',\n'__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__',\n'__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',\n'__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',\n'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find',\n'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit',\n'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join',\n'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust','rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase',\n'title', 'translate', 'upper', 'zfill']

Kuten näemme, merkkijonoilla on suuri määrä metodeja. Kurssin tässä vaiheessa ei kannata välittää alaviivoja sisältävistä metodeista, mutta muut voivat olla käyttökelpoisia. Osa metodien toiminnasta voi selvitä kokeilemalla, osan toiminta selviää googlaamalla.

Listojen metodeista käy ilmi seuraavaa:

>>> dir([])\n['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__',\n'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__',\n'__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__',\n'__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',\n'__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__',\n'__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop',\n'remove', 'reverse', 'sort']\n>>>

Tarjolla näyttää siis olevan mm. metodit reverse ja clear. Kokeillaan niitä:

>>> luvut = [1,2,3,4,5]\n>>> luvut.reverse()\n>>> luvut\n[5, 4, 3, 2, 1]\n>>> luvut.clear()\n>>> luvut\n[]

Metodit siis tekevät aika lailla sen, mitä nimen perusteella voi olettaa.

Huomaa, että komentotulkki ei näytä mitään tulosta, kun kutsutaan esim. metodia lista.reverse(). Mistä tämä johtuu? Komentotulkki tekee komentojen suorituksen yhteydessä tulostuksen vain, jos suoritetulla koodirivillä on jokin arvo. Edellisessä esimerkissä saatiin tulostettua listan luvut arvo kirjoittamalla komentotulkkiin pelkkä muuttujan nimi. Komentotulkissa ei siis useinkaan ole tarvetta kirjottaa erikseen print-komentoja.

Tärkeä komento on exit(), joka sulkee komentotulkin. Erityisesti jos käytät komentotulkkia Visual Studio Codessa, se tulee muistaa sulkea, ennen kuin suoritat jonkin ohjelman uudelleen \"vihreällä kolmiolla\". Jos tämä unohtuu, on seurauksena hieman erikoinen virheilmoitus:

\n \n \n \n \n \n \"4\n \n \n

Debuggeri

Muutamassa edellisessä osassa on jo korostettu debuggaustaitojen tärkeyttä ja demonstroitu tulostamalla tapahtuvaa debuggausta. Visual Studio Code sisältää debuggausta varten visuaalisen debuggerin.

Debuggaus aloitetaan määrittelemällä koodiin breakpoint eli kohta, johon debuggeri pysäyttää koodin suorituksen. Breakpoint asetetaan klikkaamalla hiirellä halutun koodirivin vasemmalta puolelta.

Seuraavassa esimerkissä breakpoint on asetettu edellisen osan tehtävän Peräkkäisten summa hieman virheellisen ratkaisun riville 5:

\n \n \n \n \n \n \"4\n \n \n

Vasempaan reunaan on avautunut näkymä Variables, joka kertoo senhetkisten muuttujien arvot. Koodia voidaan suorittaa rivi riviltä painelemalla alaspäin osoittavaa nuolta (Step into).

Seuraavassa tilanteessa silmukkaa on suoritettu muutamia kertoja:

\n \n \n \n \n \n \"4\n \n \n

Debuggerin välilehti Debug console mahdollistaa myös lausekkeiden arvojen näyttämisen debuggaushetken muuttujien arvoilla. Voidaan esimerkiksi kokeilla, mikä silmukan lopetusehdon arvo on:

\n \n \n \n \n \n \"4\n \n \n

Ohjelmassa voi olla myös useita breakpointeja. Pysähtymisen jälkeen koodi voidaan taas käynnistää sinisellä kolmiolla (Continue) ja suoritus jatkuu, kunnes ohjelma törmää seuraavaan breakpointiin.

Visuaalinen debuggeri on vaihtoehto debug-tulostuksille, mutta on mieltymyksistä kiinni, mitä debuggaustekniikoita kukin ohjelmoija käyttää. On hyvä kokeilla erilaisia tapoja ja valita itselle sopiva tapa.

","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-4/1-vscode.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää Visual studio Code -editoria kurssin tehtävien tekemiseen"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat suorittaa koodia interaktiivisen Python-tulkin avulla"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olemme tähän mennessä ohjelmoineet kaikki tehtävät kurssisivuille upotettuihin editori-ikkunoihin. Selaineditorissa tapahtuva ohjelmointi sopii hyvin kurssin alkuun, mutta siirrymme nyt käyttämään erillistä ohjelmointiin tarkoitettua editoria."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Erilaisia ohjelmointiin sopivia editoreja on kymmeniä. Käytämme kurssilla viime vuosina suureen suosioon noussutta "},{"type":"element","tagName":"a","properties":{"href":"https://code.visualstudio.com/","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Visual Studio Code"}]},{"type":"text","value":" -editoria."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Asenna nyt Visual Studio Code ja kurssin tehtävien testien suorittamiseen käytettävä TMC-plugin "},{"type":"element","tagName":"a","properties":{"href":"https://www.mooc.fi/fi/installation/vscode","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"tämän ohjeen"}]},{"type":"text","value":" avulla. Valitse TMC-pluginissa organisaatioksi "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"MOOC"}]},{"type":"text","value":" ja kurssiksi "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Ohjelmoinnin MOOC 2023"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Hello Visual Studio Code","tmcname":"osa04-01_hello_visualstudio_code"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä, mikä editori on käytössä. Ohjelma jatkaa, kunnes vastaus on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Visual Studio Code"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava käyttöesimerkki havainnollistaa ohjelman haluttua tulostusta:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Editori: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Emacs"}]},{"type":"text","value":"\nei ole hyvä\nEditori: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vim"}]},{"type":"text","value":"\nei ole hyvä\nEditori: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Word"}]},{"type":"text","value":"\nsurkea\nEditori: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Atom"}]},{"type":"text","value":"\nei ole hyvä\nEditori: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Visual Studio Code"}]},{"type":"text","value":"\nloistava valinta!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos käyttäjä kirjoittaa Word tai Notepad, ohjelma vastaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"surkea"}]},{"type":"text","value":". Muissa epäkelvoissa tapauksissa vastaus on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei ole hyvä"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia siten, että \"oikean vastauksen\" kirjoitusasu ei riipu siitä, kirjoitetaanko vastaus isoja vai pieniä kirjaimia käyttämällä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Editori: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"NOTEPAD"}]},{"type":"text","value":"\nsurkea\nEditori: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"viSUal STudiO cODe"}]},{"type":"text","value":"\nloistava valinta!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjainten koon voi jättää huomiotta esim. muuttamalla kirjaimet pieniksi merkkijonojen metodilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lower"}]},{"type":"text","value":", jota voi käyttää seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Visual Studio CODE\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"visual studio code\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lower"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"merkkijono oli etsitty!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"h2","properties":{"id":"koodin-suorittaminen","style":"position:relative;"},"children":[{"type":"text","value":"Koodin suorittaminen"},{"type":"element","tagName":"a","properties":{"href":"#koodin-suorittaminen","ariaLabel":"koodin suorittaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Visual Studio Codessa koodi suoritetaan painamalla vihreää kolmiota. Joskus koodisi suoritus voi jäädä kesken, esimerkiksi odottamaan käyttäjän syötettä tai ikuiseen silmukkaan, vaikka siirryt jo seuraavaan tehtävään. Kun yrität suorittaa seuraavan tehtävän koodia, esille tuleekin edellisen tehtävän kesken ollut suoritus. Näissä tilanteissa voit joutua sammuttamaan edellisen suorituksen painamalla yhtä aikaa näppäimiä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Control"}]},{"type":"text","value":"+"},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"C"}]},{"type":"text","value":", jotta saat suoritetuksi uuden tehtävän koodin."}]},{"type":"element","tagName":"h2","properties":{"id":"interaktiivinen-python-tulkki","style":"position:relative;"},"children":[{"type":"text","value":"Interaktiivinen Python-tulkki"},{"type":"element","tagName":"a","properties":{"href":"#interaktiivinen-python-tulkki","ariaLabel":"interaktiivinen python tulkki permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Emme ole toistaiseksi puhuneet kurssilla sanallakaan eräästä Python-ohjelmoinnin tärkeimmästä työkalusta, interaktiivisesta komentotulkista."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Komentotulkki käynnistyy antamalla komentoriviltä komento "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"python3"}]},{"type":"text","value":" (joissain tapauksissa, esim. Windowsilla, komento saattaa olla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"python"}]},{"type":"text","value":"). Esim. Macilla komentotulkin avaaminen näyttää seuraavalta:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/7267d91f6d4cbf0f25e0a55ca8dea0ce/0f246/4_1_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 17.82608695652174%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAABYlAAAWJQFJUiTwAAAArUlEQVQI13XLywqDMBCFYd//tbroMhiYZFppBG/YJAQTN+o4sVS77bc6HPiL2/Pe1E3ftc8HlmWJiFprKWVVVQAgpUT8/gCglBJCGGPatm1ORV2Zruve49s5F2O01nrvnXMppb7vQwjHfwU+cBxHRBRCAIB5GaUUIg7DoLUGgJRSjDGEME2T995aO8/zLyainDMzExEzH8ex7zsz55yvvW0bEW2ndV2XZSGiK/4AItbceE5Q2z8AAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/7267d91f6d4cbf0f25e0a55ca8dea0ce/a0b58/4_1_1.webp 230w","/static/7267d91f6d4cbf0f25e0a55ca8dea0ce/bc10c/4_1_1.webp 460w","/static/7267d91f6d4cbf0f25e0a55ca8dea0ce/966d8/4_1_1.webp 920w","/static/7267d91f6d4cbf0f25e0a55ca8dea0ce/34186/4_1_1.webp 1118w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/7267d91f6d4cbf0f25e0a55ca8dea0ce/81c8e/4_1_1.png 230w","/static/7267d91f6d4cbf0f25e0a55ca8dea0ce/08a84/4_1_1.png 460w","/static/7267d91f6d4cbf0f25e0a55ca8dea0ce/c0255/4_1_1.png 920w","/static/7267d91f6d4cbf0f25e0a55ca8dea0ce/0f246/4_1_1.png 1118w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/7267d91f6d4cbf0f25e0a55ca8dea0ce/c0255/4_1_1.png","alt":"4 1 1","title":"4 1 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Komentotulkki on myös mahdollista avata Visual Studio Coden sisälle, ensin suorittamalla jokin ohjelma \"vihreällä kolmiolla\" ja sen jälkeen kirjoittamalla avautuvaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Terminal"}]},{"type":"text","value":"-näkymään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"python3"}]},{"type":"text","value":" (tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"python"}]},{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/895b071970fc467ecad71d69e6d70d5a/e431d/4_1_2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 49.130434782608695%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAABYlAAAWJQFJUiTwAAABF0lEQVQoz52RWW7DIBCGuUcLw2I2Ox42O7hZrtCXqve/SgVOokh5aNVPCM32s8wQjDHFlHIOIRhjnfP78r7ttgVuEWedMuZo58mNNak4e+JHnxYsBXPBcfbaaGOsbSKntZZqMM4111qplGfySyYL4h2AASeUUiG4EJxzAAD6BOs8uwr4G6MUGPQU6Wl2K/wNym4y9hD/GwIAfyyFO7vdxLajtUbEaZqsMcZZLsUDKSXnfBzHdV0Ph8M8z62kt5PUWtd1RcRSSs4ZQ9hy+UjLmkuKMYSwx2OMy7KkNtOcOqUUcr1eL5dLrXXbtvPpVOrxO54/h4jSDEoJIeD+yNdfkG3bEHE/MvarQgiD1koPzjml1GNmrw37AVG5Vxy3ozSFAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/895b071970fc467ecad71d69e6d70d5a/a0b58/4_1_2.webp 230w","/static/895b071970fc467ecad71d69e6d70d5a/bc10c/4_1_2.webp 460w","/static/895b071970fc467ecad71d69e6d70d5a/966d8/4_1_2.webp 920w","/static/895b071970fc467ecad71d69e6d70d5a/445df/4_1_2.webp 1380w","/static/895b071970fc467ecad71d69e6d70d5a/78de1/4_1_2.webp 1840w","/static/895b071970fc467ecad71d69e6d70d5a/609ff/4_1_2.webp 1882w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/895b071970fc467ecad71d69e6d70d5a/81c8e/4_1_2.png 230w","/static/895b071970fc467ecad71d69e6d70d5a/08a84/4_1_2.png 460w","/static/895b071970fc467ecad71d69e6d70d5a/c0255/4_1_2.png 920w","/static/895b071970fc467ecad71d69e6d70d5a/b1001/4_1_2.png 1380w","/static/895b071970fc467ecad71d69e6d70d5a/161ec/4_1_2.png 1840w","/static/895b071970fc467ecad71d69e6d70d5a/e431d/4_1_2.png 1882w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/895b071970fc467ecad71d69e6d70d5a/c0255/4_1_2.png","alt":"4 1 2","title":"4 1 2","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"On olemassa myös selaimessa toimivia interaktiivisia tulkkeja, kuten "},{"type":"element","tagName":"a","properties":{"href":"https://www.python.org/shell/","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"https://www.python.org/shell/"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Komentotulkki tarjoaa interaktiivisen tavan suorittaa Python-koodia rivi riviltä sitä mukaa kuin käyttäjä kirjoittaa koodia. Ideana on, että kun käyttäjä kirjoittaa rivin koodia, Python suorittaa rivin välittömästi ja näyttää rivin operaation tuloksen:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/7977922a8e37fd253a7fd34e364e6d58/0f246/4_1_3.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 19.565217391304348%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAkElEQVQI143LwQqDMAwAUP//53qQRq0zKmJALe0wB3HRZtDtOti7v6Kua0QchmEcRwCoqso5BwDOub7vjTFEpKoi8srO8xQRzYppmh4ZESHiuq7HcXjvY4zMHELw3jPzM4sxLsvCzN88z3PTNGVZtm2773tKSUTu+9Y/FETUdZ21FgAQcdu2kF3Xparph09+Az024L8JLoKAAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/7977922a8e37fd253a7fd34e364e6d58/a0b58/4_1_3.webp 230w","/static/7977922a8e37fd253a7fd34e364e6d58/bc10c/4_1_3.webp 460w","/static/7977922a8e37fd253a7fd34e364e6d58/966d8/4_1_3.webp 920w","/static/7977922a8e37fd253a7fd34e364e6d58/34186/4_1_3.webp 1118w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/7977922a8e37fd253a7fd34e364e6d58/81c8e/4_1_3.png 230w","/static/7977922a8e37fd253a7fd34e364e6d58/08a84/4_1_3.png 460w","/static/7977922a8e37fd253a7fd34e364e6d58/c0255/4_1_3.png 920w","/static/7977922a8e37fd253a7fd34e364e6d58/0f246/4_1_3.png 1118w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/7977922a8e37fd253a7fd34e364e6d58/c0255/4_1_3.png","alt":"4 1 3","title":"4 1 3","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Komentotulkkiin on mahdollista kirjoittaa mitä tahansa Pythonia, muuttujien ja metodienkin määrittely on mahdollista:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" t "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" t"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"itseisarvo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"luku\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" luku\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" itseisarvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nTraceback "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"most recent call last"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n File "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" line "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"module"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":"\nNameError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" name "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'luku'"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"is"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" defined\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" itseisarvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" itseisarvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Parhaimmillaan komentotulkki on pienten tarkistusten tekemiseen, esim. miten tietty metodi toimii tai onko metodia ylipäätään olemassa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"TekstIä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"toupper"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nTraceback "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"most recent call last"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n File "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" line "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"module"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":"\nAttributeError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'str'"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"object"}]},{"type":"text","value":" has no attribute "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'toupper'"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"TekstIä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"upper"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'TEKSTIÄ'"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos muistaa melkein jonkin metodin nimen, googlaamisen sijaan voi olla nopeampi käyttää komentotulkkia ja kysyä funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"dir"}]},{"type":"text","value":", mitä metodeja tietyllä oliolla on:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"dir"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"teksti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__add__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__class__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__contains__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__delattr__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__dir__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__doc__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__eq__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__format__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__ge__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__getattribute__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__getitem__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__getnewargs__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__gt__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__hash__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__init__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__init_subclass__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__iter__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__le__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__len__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__lt__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__mod__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__mul__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__ne__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__new__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__reduce__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__reduce_ex__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__repr__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__rmod__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__rmul__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__setattr__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__sizeof__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__str__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__subclasshook__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'capitalize'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'casefold'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'center'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'count'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'encode'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'endswith'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'expandtabs'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'find'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'format'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'format_map'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'isalnum'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'isalpha'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'isascii'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'isdecimal'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'isdigit'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'isidentifier'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'islower'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'isnumeric'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'isprintable'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'isspace'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'istitle'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'isupper'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'join'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'ljust'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'lower'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'lstrip'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'maketrans'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'partition'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'replace'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'rfind'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'rindex'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'rjust'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'rpartition'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'rsplit'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'rstrip'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'split'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'splitlines'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'startswith'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'strip'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'swapcase'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'title'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'translate'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'upper'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'zfill'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten näemme, merkkijonoilla on suuri määrä metodeja. Kurssin tässä vaiheessa ei kannata välittää alaviivoja sisältävistä metodeista, mutta muut voivat olla käyttökelpoisia. Osa metodien toiminnasta voi selvitä kokeilemalla, osan toiminta selviää googlaamalla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Listojen metodeista käy ilmi seuraavaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"dir"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__add__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__class__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__contains__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__delattr__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__delitem__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__dir__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__doc__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__eq__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__format__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__ge__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__getattribute__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__getitem__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__gt__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__hash__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__iadd__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__imul__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__init__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__init_subclass__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__iter__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__le__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__len__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__lt__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__mul__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__ne__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__new__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__reduce__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__reduce_ex__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__repr__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__reversed__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__rmul__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__setattr__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__setitem__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__sizeof__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__str__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'__subclasshook__'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'append'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'clear'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'copy'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'count'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'extend'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'insert'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'pop'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'remove'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'reverse'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'sort'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarjolla näyttää siis olevan mm. metodit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"reverse"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"clear"}]},{"type":"text","value":". Kokeillaan niitä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"reverse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" luvut\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"clear"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" luvut\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodit siis tekevät aika lailla sen, mitä nimen perusteella voi olettaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että komentotulkki ei näytä mitään tulosta, kun kutsutaan esim. metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lista.reverse()"}]},{"type":"text","value":". Mistä tämä johtuu? Komentotulkki tekee komentojen suorituksen yhteydessä tulostuksen vain, jos suoritetulla koodirivillä on jokin arvo. Edellisessä esimerkissä saatiin tulostettua listan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luvut"}]},{"type":"text","value":" arvo kirjoittamalla komentotulkkiin pelkkä muuttujan nimi. Komentotulkissa ei siis useinkaan ole tarvetta kirjottaa erikseen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komentoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tärkeä komento on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"exit()"}]},{"type":"text","value":", joka sulkee komentotulkin. Erityisesti jos käytät komentotulkkia Visual Studio Codessa, se tulee muistaa sulkea, ennen kuin suoritat jonkin ohjelman uudelleen \"vihreällä kolmiolla\". Jos tämä unohtuu, on seurauksena hieman erikoinen virheilmoitus:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/030410f1be5c4a9d02209afb96fe30e4/966ce/4_1_4.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 28.695652173913043%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA7klEQVQY023G0W6EIBCFYd9jBQZQgWEERdx1FTdbTd//lZqYthdNT76T/FXOkyMa0phzTikhekRy1nXGInrvyVqrlP4DVBNJVwbtOA8u9tA2QggAkFJKgO+4kv+MMc6uc8YAZKV0E4YQxwRaMyFqzm91fWOXK2rGfoGSoJSQwEEwwatnTFtM52MtcVrD+KA4O8rWz67PjiaDFz9Znwy+0v2dl1ea15BWjNVxnp/HeX4ceynPZdme615KWbfXvpdtC9QTInnfe+o92c5YYwjRIS4uVHcfHxgWGobGRt1FbaI2wyXqLsj2H6oj1S7KfgH1/DpLnHkC8gAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/030410f1be5c4a9d02209afb96fe30e4/a0b58/4_1_4.webp 230w","/static/030410f1be5c4a9d02209afb96fe30e4/bc10c/4_1_4.webp 460w","/static/030410f1be5c4a9d02209afb96fe30e4/966d8/4_1_4.webp 920w","/static/030410f1be5c4a9d02209afb96fe30e4/445df/4_1_4.webp 1380w","/static/030410f1be5c4a9d02209afb96fe30e4/78de1/4_1_4.webp 1840w","/static/030410f1be5c4a9d02209afb96fe30e4/df82e/4_1_4.webp 2050w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/030410f1be5c4a9d02209afb96fe30e4/81c8e/4_1_4.png 230w","/static/030410f1be5c4a9d02209afb96fe30e4/08a84/4_1_4.png 460w","/static/030410f1be5c4a9d02209afb96fe30e4/c0255/4_1_4.png 920w","/static/030410f1be5c4a9d02209afb96fe30e4/b1001/4_1_4.png 1380w","/static/030410f1be5c4a9d02209afb96fe30e4/161ec/4_1_4.png 1840w","/static/030410f1be5c4a9d02209afb96fe30e4/966ce/4_1_4.png 2050w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/030410f1be5c4a9d02209afb96fe30e4/c0255/4_1_4.png","alt":"4 1 4","title":"4 1 4","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"h2","properties":{"id":"debuggeri","style":"position:relative;"},"children":[{"type":"text","value":"Debuggeri"},{"type":"element","tagName":"a","properties":{"href":"#debuggeri","ariaLabel":"debuggeri permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muutamassa edellisessä osassa on jo korostettu debuggaustaitojen tärkeyttä ja demonstroitu tulostamalla tapahtuvaa debuggausta. Visual Studio Code sisältää debuggausta varten "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"visuaalisen debuggerin"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Debuggaus aloitetaan määrittelemällä koodiin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"breakpoint"}]},{"type":"text","value":" eli kohta, johon debuggeri pysäyttää koodin suorituksen. Breakpoint asetetaan klikkaamalla hiirellä halutun koodirivin vasemmalta puolelta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa esimerkissä breakpoint on asetettu "},{"type":"element","tagName":"a","properties":{"href":"/osa-3/1-ehdot-silmukoissa"},"children":[{"type":"text","value":"edellisen osan"}]},{"type":"text","value":" tehtävän "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Peräkkäisten summa"}]},{"type":"text","value":" hieman virheellisen ratkaisun riville 5:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/b2aa8f4cae6fd0db736f2cf1d62607f9/6e29b/4_1_5.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 39.130434782608695%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAABYlAAAWJQFJUiTwAAAAv0lEQVQY042NW66DMAwFWQiO47wdY7glJEXd/8Iq+nelVmJ0/o5GM6WUZN3O8zyOo/euuubCXEVk0UVFFpGFuX7dpLrlwr33R2vtHM/R/oRrrarKzKWUlBIAmG9MsqwAUHLWbQUENEAWLV7fPM8A8y/zkpPzAbGyvJ6vozWugmjxHlMM0dEV2x/7GCPmQuSN+Vn7V/YhOu+ttTnmMUZlRgAD9+QQovc+xhBT3PemqvnDXdkYJLJEZD+Qc0R0R34DaJdB2A9pXSUAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/b2aa8f4cae6fd0db736f2cf1d62607f9/a0b58/4_1_5.webp 230w","/static/b2aa8f4cae6fd0db736f2cf1d62607f9/bc10c/4_1_5.webp 460w","/static/b2aa8f4cae6fd0db736f2cf1d62607f9/966d8/4_1_5.webp 920w","/static/b2aa8f4cae6fd0db736f2cf1d62607f9/445df/4_1_5.webp 1380w","/static/b2aa8f4cae6fd0db736f2cf1d62607f9/a9e74/4_1_5.webp 1610w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/b2aa8f4cae6fd0db736f2cf1d62607f9/81c8e/4_1_5.png 230w","/static/b2aa8f4cae6fd0db736f2cf1d62607f9/08a84/4_1_5.png 460w","/static/b2aa8f4cae6fd0db736f2cf1d62607f9/c0255/4_1_5.png 920w","/static/b2aa8f4cae6fd0db736f2cf1d62607f9/b1001/4_1_5.png 1380w","/static/b2aa8f4cae6fd0db736f2cf1d62607f9/6e29b/4_1_5.png 1610w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/b2aa8f4cae6fd0db736f2cf1d62607f9/c0255/4_1_5.png","alt":"4 1 5","title":"4 1 5","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Breakpointin asetuksen jälkeen valitaan valikosta "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Run"}]},{"type":"text","value":" kohta "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Start debugging"}]},{"type":"text","value":". Tämä avaa valintanäkymän, josta valitaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Python File"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/4ab241b5d1246646156624044be64914/adef7/4_1_6.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 36.52173913043478%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA/klEQVQY043PyW6DMBSFYT9HEyZPYBsINpMxeGjSpqCmUt//aaoIRUpX7a9vec/igrxgSspgFzebYJdz8NvH9XNbb9v6/XVb398uwbvZWDO52aim4ZwLIUQpyroCVVnjUsmwnexVTBfSWdq7fPC4tVAtmVwyOaPW3nUuwiw6HqJHQHBR1Kp/3U7mzAcrRi9GX2kP6+FQNLuXfCePkCRJnDwCKINS8ODcYiajR933Y9fpYagFpxjlBD+DaZo8BSDEZVVZ67quH7WWbdtIJVVbMH6/J7+kaRY/BTAmCCFKKUKYMQ4hiuN4fyn+K0AITdMMoYxQUjBGKS0YRxj/Z/wD++1E6Al0/nYAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/4ab241b5d1246646156624044be64914/a0b58/4_1_6.webp 230w","/static/4ab241b5d1246646156624044be64914/bc10c/4_1_6.webp 460w","/static/4ab241b5d1246646156624044be64914/966d8/4_1_6.webp 920w","/static/4ab241b5d1246646156624044be64914/445df/4_1_6.webp 1380w","/static/4ab241b5d1246646156624044be64914/211fa/4_1_6.webp 1716w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/4ab241b5d1246646156624044be64914/81c8e/4_1_6.png 230w","/static/4ab241b5d1246646156624044be64914/08a84/4_1_6.png 460w","/static/4ab241b5d1246646156624044be64914/c0255/4_1_6.png 920w","/static/4ab241b5d1246646156624044be64914/b1001/4_1_6.png 1380w","/static/4ab241b5d1246646156624044be64914/adef7/4_1_6.png 1716w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/4ab241b5d1246646156624044be64914/c0255/4_1_6.png","alt":"4 1 6","title":"4 1 6","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Debuggeri käynnistyy ja alkaa suorittaa koodia normaaliin tapaan, kunnes se törmää breakpointiin ja pysähtyy:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/8a01f8e6fba73266b2dd512d79dfb681/3145a/4_1_7.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 46.95652173913043%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAABYlAAAWJQFJUiTwAAABUElEQVQoz2WP4Y6kIBCEfYvbyyAigjoobdOgpwaGGe/93+myzGVzuf1SP6p/VLqq8j7ElPZ9n6fZGKOUBgBH5Dwtdp5hASQAmMxdiLZt5b+qHDq0ON/t2I9KaSmlUsoui1RStaJtOOd1zeq6rvk3KnSEM9rJKqW1HrTqei1/P93jMaPjFn5Y+AD4CfBhv6miM3v0k5lLuFdKCSGMMUQkpeS8bpr/HzYNbwoVEbWl6ied6rpOylZpZQG01iX/DvyFc84Yu91ujLHKr3vY431GY53FVY9Tmd11neqH4Sv/3swYE0JM0wQAxphq3X7tR9qPeMYc02tBH0Ig8tu2necZQti2jYi890QUCjnn67pSShUiNo2QUpbCn7uv63o+nyml1+v1eDxyzsdxvM3XeRxHjLFyzoWwLguO473vh74fUko55xjjuq6I6JxbClh4e1f4A1GXWrWtxlxFAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8a01f8e6fba73266b2dd512d79dfb681/a0b58/4_1_7.webp 230w","/static/8a01f8e6fba73266b2dd512d79dfb681/bc10c/4_1_7.webp 460w","/static/8a01f8e6fba73266b2dd512d79dfb681/966d8/4_1_7.webp 920w","/static/8a01f8e6fba73266b2dd512d79dfb681/445df/4_1_7.webp 1380w","/static/8a01f8e6fba73266b2dd512d79dfb681/78de1/4_1_7.webp 1840w","/static/8a01f8e6fba73266b2dd512d79dfb681/407bd/4_1_7.webp 2112w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8a01f8e6fba73266b2dd512d79dfb681/81c8e/4_1_7.png 230w","/static/8a01f8e6fba73266b2dd512d79dfb681/08a84/4_1_7.png 460w","/static/8a01f8e6fba73266b2dd512d79dfb681/c0255/4_1_7.png 920w","/static/8a01f8e6fba73266b2dd512d79dfb681/b1001/4_1_7.png 1380w","/static/8a01f8e6fba73266b2dd512d79dfb681/161ec/4_1_7.png 1840w","/static/8a01f8e6fba73266b2dd512d79dfb681/3145a/4_1_7.png 2112w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/8a01f8e6fba73266b2dd512d79dfb681/c0255/4_1_7.png","alt":"4 1 7","title":"4 1 7","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vasempaan reunaan on avautunut näkymä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Variables"}]},{"type":"text","value":", joka kertoo senhetkisten muuttujien arvot. Koodia voidaan suorittaa rivi riviltä painelemalla alaspäin osoittavaa nuolta ("},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Step into"}]},{"type":"text","value":")."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa tilanteessa silmukkaa on suoritettu muutamia kertoja:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/748cafbc68941c7eaaebec0f9b422806/cc418/4_1_8.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 51.73913043478261%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAABYlAAAWJQFJUiTwAAABbElEQVQoz3WP7Y6jMAxFeY62gUmcLyctJAETKKCWoWjf/41WVNpqd6U5Orp/ri3LxTB20zKv6zcRpRCNxZjaIR8QUUtE40x5HMecQmMRjbEfiybEcbjffG2UUUoJAVqbJkTjvbNGAwhQnENVccaq0+lyPrOPRVPXjWsa36BBpbSWEvgXdYG6G6JQkkk4w1spL/9ZhH7sQ3fzN3VgjJJSVCnq16tLrfT+7P3pJ4tIg0M02mqljdIAEqT8qngI0TlfspKx6ieLEKKQGpSGd3JQXHClQBt7fGEM55yxC2OsLNnflCUrunx/bL8i3euUh3mtU2+MtcYgYgjBe3+9XhFRvlFKAQAiTtO0LEvRtl1ThxhSjG3b0tVfu66bpomIcs79m6Mg6vv+kznnY7mua865ECAEAEghxLLM+74/n89931+v17Zt67ouy/L9h23b5vmYKVJKj8eDqHfOaW2U0p/LMUb8F+ccIlprtdaI+Bvm42YuwG95FAAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/748cafbc68941c7eaaebec0f9b422806/a0b58/4_1_8.webp 230w","/static/748cafbc68941c7eaaebec0f9b422806/bc10c/4_1_8.webp 460w","/static/748cafbc68941c7eaaebec0f9b422806/966d8/4_1_8.webp 920w","/static/748cafbc68941c7eaaebec0f9b422806/445df/4_1_8.webp 1380w","/static/748cafbc68941c7eaaebec0f9b422806/78de1/4_1_8.webp 1840w","/static/748cafbc68941c7eaaebec0f9b422806/75f48/4_1_8.webp 1992w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/748cafbc68941c7eaaebec0f9b422806/81c8e/4_1_8.png 230w","/static/748cafbc68941c7eaaebec0f9b422806/08a84/4_1_8.png 460w","/static/748cafbc68941c7eaaebec0f9b422806/c0255/4_1_8.png 920w","/static/748cafbc68941c7eaaebec0f9b422806/b1001/4_1_8.png 1380w","/static/748cafbc68941c7eaaebec0f9b422806/161ec/4_1_8.png 1840w","/static/748cafbc68941c7eaaebec0f9b422806/cc418/4_1_8.png 1992w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/748cafbc68941c7eaaebec0f9b422806/c0255/4_1_8.png","alt":"4 1 8","title":"4 1 8","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Debuggerin välilehti "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Debug console"}]},{"type":"text","value":" mahdollistaa myös lausekkeiden arvojen näyttämisen debuggaushetken muuttujien arvoilla. Voidaan esimerkiksi kokeilla, mikä silmukan lopetusehdon arvo on:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/cb417e312ed6b45c9910c5a50d7fa175/cb1ac/4_1_9.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 43.913043478260875%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAABYlAAAWJQFJUiTwAAABLUlEQVQoz2WQ207EIBRF+Qs1GW7n1tJSyghMp3WeNPr/n6TTiUmjKysEEnbOBnXdrp9fX+u6nnMehxFZSrtTW4sxxpTnesmvpbQyhgAAeECVc63nGjgwCxEDABGmNDlnrTXGGGuNd87Zx1kfVUM/zDGFPnTSCQsTCMPnR3l/n2uDNL+k9Pzr02F/V01jarn1nYSuYxZEdM5OcSj1zILOa+e039f/qpTmaUpEzCx7mBABAV9LGcfRe2+tM8Zo/VdjrGIWACTiPUbeg3OWCIkZkFjEWqv3u0e01qfTSW3b2+WyxDjV2mpt3b08E9HjY4koxigix7zWGhFzzqrWy7Jsy3Ldttu63sIwxpRDCHthCwAiAgB/JjvnREQ93vmoTcTeQ993BGB+R+kd84+f2t90809R3YMDEQAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/cb417e312ed6b45c9910c5a50d7fa175/a0b58/4_1_9.webp 230w","/static/cb417e312ed6b45c9910c5a50d7fa175/bc10c/4_1_9.webp 460w","/static/cb417e312ed6b45c9910c5a50d7fa175/966d8/4_1_9.webp 920w","/static/cb417e312ed6b45c9910c5a50d7fa175/445df/4_1_9.webp 1380w","/static/cb417e312ed6b45c9910c5a50d7fa175/78de1/4_1_9.webp 1840w","/static/cb417e312ed6b45c9910c5a50d7fa175/cb61f/4_1_9.webp 1936w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/cb417e312ed6b45c9910c5a50d7fa175/81c8e/4_1_9.png 230w","/static/cb417e312ed6b45c9910c5a50d7fa175/08a84/4_1_9.png 460w","/static/cb417e312ed6b45c9910c5a50d7fa175/c0255/4_1_9.png 920w","/static/cb417e312ed6b45c9910c5a50d7fa175/b1001/4_1_9.png 1380w","/static/cb417e312ed6b45c9910c5a50d7fa175/161ec/4_1_9.png 1840w","/static/cb417e312ed6b45c9910c5a50d7fa175/cb1ac/4_1_9.png 1936w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/cb417e312ed6b45c9910c5a50d7fa175/c0255/4_1_9.png","alt":"4 1 9","title":"4 1 9","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmassa voi olla myös useita breakpointeja. Pysähtymisen jälkeen koodi voidaan taas käynnistää sinisellä kolmiolla ("},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Continue"}]},{"type":"text","value":") ja suoritus jatkuu, kunnes ohjelma törmää seuraavaan breakpointiin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Visuaalinen debuggeri on vaihtoehto debug-tulostuksille, mutta on mieltymyksistä kiinni, mitä debuggaustekniikoita kukin ohjelmoija käyttää. On hyvä kokeilla erilaisia tapoja ja valita itselle sopiva tapa."}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat käyttää Visual studio Code -editoria kurssin tehtävien tekemiseen
  • \n
  • Osaat suorittaa koodia interaktiivisen Python-tulkin avulla
  • \n

Olemme tähän mennessä ohjelmoineet kaikki tehtävät kurssisivuille upotettuihin editori-ikkunoihin. Selaineditorissa tapahtuva ohjelmointi sopii hyvin kurssin alkuun, mutta siirrymme nyt käyttämään erillistä ohjelmointiin tarkoitettua editoria.

Erilaisia ohjelmointiin sopivia editoreja on kymmeniä. Käytämme kurssilla viime vuosina suureen suosioon noussutta Visual Studio Code -editoria.

Asenna nyt Visual Studio Code ja kurssin tehtävien testien suorittamiseen käytettävä TMC-plugin tämän ohjeen avulla. Valitse TMC-pluginissa organisaatioksi MOOC ja kurssiksi Ohjelmoinnin MOOC 2023.

Tee ohjelma, joka kysyy käyttäjältä, mikä editori on käytössä. Ohjelma jatkaa, kunnes vastaus on Visual Studio Code.

Seuraava käyttöesimerkki havainnollistaa ohjelman haluttua tulostusta:

Editori: Emacs\nei ole hyvä\nEditori: Vim\nei ole hyvä\nEditori: Word\nsurkea\nEditori: Atom\nei ole hyvä\nEditori: Visual Studio Code\nloistava valinta!

Jos käyttäjä kirjoittaa Word tai Notepad, ohjelma vastaa surkea. Muissa epäkelvoissa tapauksissa vastaus on ei ole hyvä.

Ohjelman tulee toimia siten, että \"oikean vastauksen\" kirjoitusasu ei riipu siitä, kirjoitetaanko vastaus isoja vai pieniä kirjaimia käyttämällä:

Editori: NOTEPAD\nsurkea\nEditori: viSUal STudiO cODe\nloistava valinta!

Kirjainten koon voi jättää huomiotta esim. muuttamalla kirjaimet pieniksi merkkijonojen metodilla lower, jota voi käyttää seuraavasti:

mjono = \"Visual Studio CODE\"\nif \"visual studio code\" == mjono.lower():\n    print(\"merkkijono oli etsitty!\")

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Koodin suorittaminen

Visual Studio Codessa koodi suoritetaan painamalla vihreää kolmiota. Joskus koodisi suoritus voi jäädä kesken, esimerkiksi odottamaan käyttäjän syötettä tai ikuiseen silmukkaan, vaikka siirryt jo seuraavaan tehtävään. Kun yrität suorittaa seuraavan tehtävän koodia, esille tuleekin edellisen tehtävän kesken ollut suoritus. Näissä tilanteissa voit joutua sammuttamaan edellisen suorituksen painamalla yhtä aikaa näppäimiä Control+C, jotta saat suoritetuksi uuden tehtävän koodin.

Interaktiivinen Python-tulkki

Emme ole toistaiseksi puhuneet kurssilla sanallakaan eräästä Python-ohjelmoinnin tärkeimmästä työkalusta, interaktiivisesta komentotulkista.

Komentotulkki käynnistyy antamalla komentoriviltä komento python3 (joissain tapauksissa, esim. Windowsilla, komento saattaa olla python). Esim. Macilla komentotulkin avaaminen näyttää seuraavalta:

\n \n \n \n \n \n \"4\n \n \n

On olemassa myös selaimessa toimivia interaktiivisia tulkkeja, kuten https://www.python.org/shell/.

Komentotulkki tarjoaa interaktiivisen tavan suorittaa Python-koodia rivi riviltä sitä mukaa kuin käyttäjä kirjoittaa koodia. Ideana on, että kun käyttäjä kirjoittaa rivin koodia, Python suorittaa rivin välittömästi ja näyttää rivin operaation tuloksen:

\n \n \n \n \n \n \"4\n \n \n

Komentotulkkiin on mahdollista kirjoittaa mitä tahansa Pythonia, muuttujien ja metodienkin määrittely on mahdollista:

>>> t = [1,2,3,4,5]\n>>> for luku in t:\n...   print(luku)\n...\n1\n2\n3\n4\n5\n>>> def itseisarvo(luku):\n...   if luku<0:\n...      luku = -luku\n...   return luku\n...\n>>> x = 10\n>>> y = -7\n>>> itseisarvo(luku)\nTraceback (most recent call last):\n  File \"<stdin>\", line 1, in <module>\nNameError: name 'luku' is not defined\n>>> itseisarvo(x)\n10\n>>> itseisarvo(y)\n7\n>>>

Parhaimmillaan komentotulkki on pienten tarkistusten tekemiseen, esim. miten tietty metodi toimii tai onko metodia ylipäätään olemassa:

>>> \"TekstIä\".toupper()\nTraceback (most recent call last):\n  File \"<stdin>\", line 1, in <module>\nAttributeError: 'str' object has no attribute 'toupper'\n>>> \"TekstIä\".upper()\n'TEKSTIÄ'\n>>>

Jos muistaa melkein jonkin metodin nimen, googlaamisen sijaan voi olla nopeampi käyttää komentotulkkia ja kysyä funktiolla dir, mitä metodeja tietyllä oliolla on:

>>> dir(\"teksti\")\n['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__',\n'__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__',\n'__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__',\n'__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',\n'__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',\n'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find',\n'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit',\n'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join',\n'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust','rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase',\n'title', 'translate', 'upper', 'zfill']

Kuten näemme, merkkijonoilla on suuri määrä metodeja. Kurssin tässä vaiheessa ei kannata välittää alaviivoja sisältävistä metodeista, mutta muut voivat olla käyttökelpoisia. Osa metodien toiminnasta voi selvitä kokeilemalla, osan toiminta selviää googlaamalla.

Listojen metodeista käy ilmi seuraavaa:

>>> dir([])\n['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__',\n'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__',\n'__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__',\n'__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',\n'__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__',\n'__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop',\n'remove', 'reverse', 'sort']\n>>>

Tarjolla näyttää siis olevan mm. metodit reverse ja clear. Kokeillaan niitä:

>>> luvut = [1,2,3,4,5]\n>>> luvut.reverse()\n>>> luvut\n[5, 4, 3, 2, 1]\n>>> luvut.clear()\n>>> luvut\n[]

Metodit siis tekevät aika lailla sen, mitä nimen perusteella voi olettaa.

Huomaa, että komentotulkki ei näytä mitään tulosta, kun kutsutaan esim. metodia lista.reverse(). Mistä tämä johtuu? Komentotulkki tekee komentojen suorituksen yhteydessä tulostuksen vain, jos suoritetulla koodirivillä on jokin arvo. Edellisessä esimerkissä saatiin tulostettua listan luvut arvo kirjoittamalla komentotulkkiin pelkkä muuttujan nimi. Komentotulkissa ei siis useinkaan ole tarvetta kirjottaa erikseen print-komentoja.

Tärkeä komento on exit(), joka sulkee komentotulkin. Erityisesti jos käytät komentotulkkia Visual Studio Codessa, se tulee muistaa sulkea, ennen kuin suoritat jonkin ohjelman uudelleen \"vihreällä kolmiolla\". Jos tämä unohtuu, on seurauksena hieman erikoinen virheilmoitus:

\n \n \n \n \n \n \"4\n \n \n

Debuggeri

Muutamassa edellisessä osassa on jo korostettu debuggaustaitojen tärkeyttä ja demonstroitu tulostamalla tapahtuvaa debuggausta. Visual Studio Code sisältää debuggausta varten visuaalisen debuggerin.

Debuggaus aloitetaan määrittelemällä koodiin breakpoint eli kohta, johon debuggeri pysäyttää koodin suorituksen. Breakpoint asetetaan klikkaamalla hiirellä halutun koodirivin vasemmalta puolelta.

Seuraavassa esimerkissä breakpoint on asetettu edellisen osan tehtävän Peräkkäisten summa hieman virheellisen ratkaisun riville 5:

\n \n \n \n \n \n \"4\n \n \n

Vasempaan reunaan on avautunut näkymä Variables, joka kertoo senhetkisten muuttujien arvot. Koodia voidaan suorittaa rivi riviltä painelemalla alaspäin osoittavaa nuolta (Step into).

Seuraavassa tilanteessa silmukkaa on suoritettu muutamia kertoja:

\n \n \n \n \n \n \"4\n \n \n

Debuggerin välilehti Debug console mahdollistaa myös lausekkeiden arvojen näyttämisen debuggaushetken muuttujien arvoilla. Voidaan esimerkiksi kokeilla, mikä silmukan lopetusehdon arvo on:

\n \n \n \n \n \n \"4\n \n \n

Ohjelmassa voi olla myös useita breakpointeja. Pysähtymisen jälkeen koodi voidaan taas käynnistää sinisellä kolmiolla (Continue) ja suoritus jatkuu, kunnes ohjelma törmää seuraavaan breakpointiin.

Visuaalinen debuggeri on vaihtoehto debug-tulostuksille, mutta on mieltymyksistä kiinni, mitä debuggaustekniikoita kukin ohjelmoija käyttää. On hyvä kokeilla erilaisia tapoja ja valita itselle sopiva tapa.

","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-4/1-vscode.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-4/2-lisaa-funktioista/page-data.json b/page-data/osa-4/2-lisaa-funktioista/page-data.json index 665ded117..ad5d6484a 100644 --- a/page-data/osa-4/2-lisaa-funktioista/page-data.json +++ b/page-data/osa-4/2-lisaa-funktioista/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-4/2-lisaa-funktioista", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät lisää funktion parametrien käyttämisestä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat palauttaa arvon funktiosta ja käyttää sitä kutsukohdassa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat merkitä tyyppivihjeet parametreille ja paluuarvolle"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktioiden määrittely tapahtuu avainsanan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"viesti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tämä tulee funktiosta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Näin määriteltyä funktiota nimeltä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viesti"}]},{"type":"text","value":" kutsutaan seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"viesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tällöin ohjelman tulostus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä tulee funktiosta"}]}]},{"type":"element","tagName":"h2","properties":{"id":"funktion-parametrit","style":"position:relative;"},"children":[{"type":"text","value":"Funktion parametrit"},{"type":"element","tagName":"a","properties":{"href":"#funktion-parametrit","ariaLabel":"funktion parametrit permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiolla voi olla yksi tai useampi parametri. Parametrit määritellään suluissa funktion nimen jälkeen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraavassa koodissa funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tervehdi"}]},{"type":"text","value":" on yksi parametri ja funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa"}]},{"type":"text","value":" on kaksi parametria."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tervehdi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moikka,\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"summa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Parametrien summa on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tervehdi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moikka, Emilia\nParametrien summa on 5"}]}]},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Muodollinen ja todellinen parametri"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mitä oikeastaan tapahtuu, kun suoritetaan funktiokutsu "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tervehdi(\"Emilia\")"}]},{"type":"text","value":"?"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion määrittelyssä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tervehdi(nimi)"}]},{"type":"text","value":" oleva "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":" on funktion\n"},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"muodollinen parametri"}]},{"type":"text","value":". Parametrin nimi on annettu funktion alussa,\nja sitä voidaan käyttää funktiossa muuttujan tavoin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion kutsussa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tervehdi(\"Emilia\")"}]},{"type":"text","value":" oleva "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"text","value":" on funktion\n"},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"todellinen parametri"}]},{"type":"text","value":". Kun funktiota kutsutaan, todellinen parametri\nsijoitetaan muodollisen parametrin arvoksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joskus termillä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"parametri"}]},{"type":"text","value":" viitataan muodolliseen parametriin ja\ntermillä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"argumentti"}]},{"type":"text","value":" viitataan todelliseen parametriin,\nmutta monet myös käyttävät termejä sekaisin."}]}]},{"type":"element","tagName":"h2","properties":{"id":"testien-virheilmoitukset","style":"position:relative;"},"children":[{"type":"text","value":"Testien virheilmoitukset"},{"type":"element","tagName":"a","properties":{"href":"#testien-virheilmoitukset","ariaLabel":"testien virheilmoitukset permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos ohjelmasi ei toimi oikein, antavat testit enemmän tai vähemmän hyvän virheilmoituksen. Virheilmoitus kannattaa ehdottomasti lukea huolellisesti."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joissain tilanteissa virheilmoitus ei kerro tarkemmin, mistä on kyse. Esimerkiksi seuraavassa tehtävässä saatat törmätä seuraavaan virheeseen:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/fd084faad6510920cd24630f3868f652/76435/4_2_0a.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 41.73913043478261%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAABYlAAAWJQFJUiTwAAABTUlEQVQY02WQy04CQRBF+Qk16a5Hv+ienhlmcBQQEQxi1MQHoILRvStj4r+5deHar1JA4+vkrCq5dStV896HENIY8yxbGZMk+JBluVL6P8uhsdZpbWqIKKXUxpxNZmeT+elkNr6+HU+vxuMLAMDfECEt0VojYo2IGQX4TXH/zI+v9PACT2/Qu2NYV9Yare0PFX+CyyU1IkIEbVy1d1X156485vzI2rJO2pFhbYQz8kvtrJQSAFb9i/DiFsN8nKgTL4bMB1YM3cbQrR26TuFnIlximIK/odhV9bws0hiZ+auZyCkqCnC9kIyajcOtbNRMR6UfNQatcp5W07R5nVWnKmwCp408Jsl3WDJHIc59HO7uD7r9TtXubnX22r3edrfV3mkN+qEsbJYKqxHh79lAFACa1hhfV0wIEhYKAIlSkhAsJUupEQ0t/ruq/Qi/A2YuTKFDvDu7AAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/fd084faad6510920cd24630f3868f652/a0b58/4_2_0a.webp 230w","/static/fd084faad6510920cd24630f3868f652/bc10c/4_2_0a.webp 460w","/static/fd084faad6510920cd24630f3868f652/966d8/4_2_0a.webp 920w","/static/fd084faad6510920cd24630f3868f652/445df/4_2_0a.webp 1380w","/static/fd084faad6510920cd24630f3868f652/97499/4_2_0a.webp 1742w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/fd084faad6510920cd24630f3868f652/81c8e/4_2_0a.png 230w","/static/fd084faad6510920cd24630f3868f652/08a84/4_2_0a.png 460w","/static/fd084faad6510920cd24630f3868f652/c0255/4_2_0a.png 920w","/static/fd084faad6510920cd24630f3868f652/b1001/4_2_0a.png 1380w","/static/fd084faad6510920cd24630f3868f652/76435/4_2_0a.png 1742w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/fd084faad6510920cd24630f3868f652/c0255/4_2_0a.png","alt":"4 2 0a","title":"4 2 0a","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Virhe kertoo, että tehtävän funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viiva"}]},{"type":"text","value":" pitäisi pystyä kutsumaan seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"viiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Varsinainen ongelma paljastuu, kun kokeillaan, mitä funktiokutsu tekee, eli kopioidaan virheilmoituksen kertoma funktiokutsu koodiin ja painetaan vihreää kolmiota:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/5a22494efd4d5af2a80255c7ee6431f3/701e9/4_2_0b.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 42.173913043478265%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAABYlAAAWJQFJUiTwAAABWElEQVQY023P246bMBAGYJ4jWsDGDoNPGAPmFINN0KarFVLTXqeqmvd/iCpZbaWV+um/+DWai5no+4+fUAA90iMAKQBR8iH7l4xknwyB+7EvKUiOS55H+77nkDengRu5VaYtioSkmCCUpYggfERplsZPSRxDglGcxC8vmNAEZ9HlcjkcDgAFIviM+DckREqS/0nTNP46ia7XKwCwgkkpZaWBMyEEAHwcT+njDYyxMWae57qum6bhT4yx6P7n7p9CCGsI3vtlWbz327Y558Zx7LrOWts0jbW2ruvySSlVlmV0u92WeT6v6xpC8ME599hu277r+65v29a2bVPXutTGmEprJaXgTEklOI9+ve4Xt+x+ezv5rZ9eB3e2Y2iH1Y7nbnK6GYTuhbZMdUwNspqUGbieStMLHf1+vy7jtJ3mzS22rKzSigLDlGeUYZrHOE9xnjzzKOgzj/4XGdNWXD7/XR0AAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/5a22494efd4d5af2a80255c7ee6431f3/a0b58/4_2_0b.webp 230w","/static/5a22494efd4d5af2a80255c7ee6431f3/bc10c/4_2_0b.webp 460w","/static/5a22494efd4d5af2a80255c7ee6431f3/966d8/4_2_0b.webp 920w","/static/5a22494efd4d5af2a80255c7ee6431f3/445df/4_2_0b.webp 1380w","/static/5a22494efd4d5af2a80255c7ee6431f3/e11e5/4_2_0b.webp 1780w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/5a22494efd4d5af2a80255c7ee6431f3/81c8e/4_2_0b.png 230w","/static/5a22494efd4d5af2a80255c7ee6431f3/08a84/4_2_0b.png 460w","/static/5a22494efd4d5af2a80255c7ee6431f3/c0255/4_2_0b.png 920w","/static/5a22494efd4d5af2a80255c7ee6431f3/b1001/4_2_0b.png 1380w","/static/5a22494efd4d5af2a80255c7ee6431f3/701e9/4_2_0b.png 1780w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/5a22494efd4d5af2a80255c7ee6431f3/c0255/4_2_0b.png","alt":"4 2 0b","title":"4 2 0b","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodin suorituksen viimeiset rivit kertovat, mikä on vikana: koodin rivi 4 aiheuttaa virheen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"IndexError: string index out of range"}]},{"type":"text","value":". Kuten "},{"type":"element","tagName":"a","properties":{"href":"/osa-3/2-merkkijonojen-kasittely"},"children":[{"type":"text","value":"edellisessä osassa"}]},{"type":"text","value":" mainittiin, syy tälle on se, että koodissa yritetään indeksoida merkkijonon ulkopuolelle. Tällä kertaa syynä on se, että yritetään hakea nollan pituisen merkkijonon ensimmäistä merkkiä."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Viiva","tmcname":"osa04-02_viiva"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viiva"}]},{"type":"text","value":", joka saa kaksi parametria (leveys, merkkijono). Funktio tulostaa ensimmäisen parametrin määrittämän pituisen viivan käyttäen toisena parametrina olevan merkkijonon ensimmäistä merkkiä. Jos parametrina oleva merkkijono on tyhjä, tulostuu viiva tähtinä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"viiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"%\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nviiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"LOL\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nviiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"%%%%%%%\nLLLLLLLLLL\n***\n"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"sisakkaiset-kutsut","style":"position:relative;"},"children":[{"type":"text","value":"Sisäkkäiset kutsut"},{"type":"element","tagName":"a","properties":{"href":"#sisakkaiset-kutsut","ariaLabel":"sisakkaiset kutsut permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme kutsua funktiota myös toisen funktion sisältä. Esimerkiksi seuraavassa ohjelmassa funktio\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tervehdi_monesti"}]},{"type":"text","value":" kutsuu funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tervehdi"}]},{"type":"text","value":" halutun määrän kertoja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tervehdi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moikka,\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tervehdi_monesti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kerrat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" kerrat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tervehdi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kerrat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\ntervehdi_monesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moikka, Emilia\nMoikka, Emilia\nMoikka, Emilia"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Risulaatikko","tmcname":"osa04-02a_risulaatikko"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"risulaatikko"}]},{"type":"text","value":", joka piirtää risuaitamerkkiä käyttäen parametrinsa korkuisen, kymmenen merkkiä leveän risulaatikon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion tulee kutsua edellisen tehtävän funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viiva"}]},{"type":"text","value":" kaiken tulostuksen tekemiseen! Kopioi edellisen tehtävän funktion koodi tämän tehtävän funktion koodin yläpuolelle. Älä muuta funktiota mitenkään!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pari käyttöesimerkkiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"risulaatikko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nrisulaatikko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"##########\n##########\n##########\n##########\n##########\n\n##########\n##########\n"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Risuneliö","tmcname":"osa04-02b_risunelio"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"risunelio"}]},{"type":"text","value":", joka piirtää risuaitamerkkiä käyttäen parametrinsa kokoisen risuneliön."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion tulee kutsua edellisen tehtävän funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viiva"}]},{"type":"text","value":" kaiken tulostuksen tekemiseen! Kopioi edellisen tehtävän funktion koodi tämän tehtävän funktion koodin yläpuolelle. Älä muuta funktiota mitenkaan!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pari käyttöesimerkkiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"risunelio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nrisunelio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"#####\n#####\n#####\n#####\n#####\n\n###\n###\n###\n"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Neliö","tmcname":"osa04-02c_nelio"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nelio"}]},{"type":"text","value":", joka saa kaksi parametria. Funktio tulostaa neliön jonka korkeuden ja leveyden kertoo ensimmäinen parametri. Toinen parametri määrittelee mitä merkkiä käyttäen neliö piirretään."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion tulee kutsua edellisen tehtävän funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viiva"}]},{"type":"text","value":" kaiken tulostuksen tekemiseen! Kopioi edellisen tehtävän funktion koodi tämän tehtävän funktion koodin yläpuolelle. Älä muuta funktiota mitenkaan!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pari käyttöesimerkkiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nelio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"*\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnelio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"o\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"*****\n*****\n*****\n*****\n*****\n\nooo\nooo\nooo\n"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kolmio","tmcname":"osa04-02d_kolmio"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kolmio"}]},{"type":"text","value":", joka piirtää risuaitamerkkiä käyttäen parametrinsa korkuisen ja levyisen, risuaitakolmion."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion tulee kutsua edellisen tehtävän funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viiva"}]},{"type":"text","value":" kaiken tulostuksen tekemiseen! Kopioi edellisen tehtävän funktion koodi tämän tehtävän funktion koodin yläpuolelle. Älä muuta funktiota mitenkaan!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pari käyttöesimerkkiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kolmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkolmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"#\n##\n###\n####\n#####\n######\n\n#\n##\n###\n"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kuvio","tmcname":"osa04-03_kuvio"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kuvio"}]},{"type":"text","value":", joka saa neljä parametria. Funktio tulostaa kuvion, jonka yläosana on kahden ensimmäisen parametrin määrittelemä kolmio ja alaosana ensimmäisen ja kahden jälkimmäisen parametrin määrittelemä suorakulmio."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion tulee kutsua edellisen tehtävän funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viiva"}]},{"type":"text","value":" kaiken tulostuksen tekemiseen! Kopioi edellisen tehtävän funktion koodi tämän tehtävän funktion koodin yläpuolelle."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pari käyttöesimerkkiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kuvio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"X\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"*\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkuvio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"o\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkuvio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\".\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\",\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"X\nXX\nXXX\nXXXX\nXXXXX\n*****\n*****\n*****\n\no\noo\n++\n++\n++\n++\n\n.\n..\n...\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vihje"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Älä yritä ratkaista tehtävässä \"kaikkia asioita\" yhtä aikaa. Keskity ensin esim. siihen että saat kuvion yläosan kolmion piirtymään oikein, ja vasta sen jälkeen jatka kuvion täydentämistä alaosan suorakulmiolla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä on ylipäätänsäkin ohjelmoinnissa erittäin tärkeää: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"keskity pieniin osiin kerrallaan"}]},{"type":"text","value":", varmista että ne toimivat ennen kuin laajennat ratkaisuasi."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Joulukuusi","tmcname":"osa04-04_joulukuusi"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"joulukuusi"}]},{"type":"text","value":", joka saa yhden parametrin. Funktio tulostaa tekstin joulukuusi! ja parametrinsa kokoisen joulukuusen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esim. kutsuttaessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"joulukuusi(3)"}]},{"type":"text","value":" tulostuu"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"joulukuusi!\n *\n ***\n*****\n *\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esim. kutsuttaessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"joulukuusi(5)"}]},{"type":"text","value":" tulostuu"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"joulukuusi!\n *\n ***\n *****\n *******\n*********\n *\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huomaa, että joulukuusen vasemmalla puolella pitää olla täsmälleen oikea määrä välilyöntejä"}]},{"type":"text","value":". Eli vaikka kuusen muoto olisi täysin oikea, mutta sen alin \"neulastaso\" ei lähde ruudun vasemmasta reunasta, ei vastaus kelpaa testeille."}]}]},{"type":"element","tagName":"h2","properties":{"id":"funktion-paluuarvo","style":"position:relative;"},"children":[{"type":"text","value":"Funktion paluuarvo"},{"type":"element","tagName":"a","properties":{"href":"#funktion-paluuarvo","ariaLabel":"funktion paluuarvo permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiot voivat myös palauttaa arvoja. Esimerkiksi Pythonin valmis funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"input"}]},{"type":"text","value":" "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"palauttaa"}]},{"type":"text","value":" käyttäjän antaman syötteen. Funktion palauttama arvo voidaan esimerkiksi sijoittaa muuttujaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna sana: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Myös kokonaislukujen lukemisessa yhdessä funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"input"}]},{"type":"text","value":" kanssa käytettävä funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"int"}]},{"type":"text","value":" palauttaa arvon:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna kokonaisluku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"int"}]},{"type":"text","value":" saa parametrinaan funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"input"}]},{"type":"text","value":" palauttaman merkkijonon ja palauttaa sen kokonaislukutyyppisenä."}]},{"type":"element","tagName":"h2","properties":{"id":"funktion-arvon-palauttaminen-return-komennolla","style":"position:relative;"},"children":[{"type":"text","value":"Funktion arvon palauttaminen return-komennolla"},{"type":"element","tagName":"a","properties":{"href":"#funktion-arvon-palauttaminen-return-komennolla","ariaLabel":"funktion arvon palauttaminen return komennolla permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Myös itse määrittelemämme funktiot voivat palauttaa arvoja käyttämällä komentoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":". Esimerkiksi seuraava funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa"}]},{"type":"text","value":" palauttaa annettujen lukujen summan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"summa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" b\n\nvastaus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Summa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vastaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Summa: 5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on vielä toinen esimerkki, jossa funktio kysyy käyttäjän nimen ja palauttaa sen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kysy_nimi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikä on nimesi? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" nimi\n\nnimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kysy_nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moikka,\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mikä on nimesi? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Anna"}]},{"type":"text","value":"\nMoikka, Anna"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kannattaa huomata, että komento "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" lopettaa funktion suorituksen saman tien. Niinpä voimme tehdä seuraavan funktion:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pienin"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" a\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" b\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pienin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pienin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä ideana on, että jos "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":" on pienempi kuin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":", niin funktio palauttaa arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":" ja päättyy. Muuten funktion suoritus jatkuu eteenpäin, jolloin se palauttaa arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3\n2"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme myös käyttää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":"-komentoa siihen, että poistumme funktiosta palauttamatta mitään:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tervehdi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"???\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moikka,\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntervehdi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntervehdi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntervehdi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Matti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":" on tyhjä merkkijono, niin funktio tulostaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"???"}]},{"type":"text","value":" ja päättyy."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moikka, Emilia\n???\nMoikka, Matti"}]}]},{"type":"element","tagName":"h2","properties":{"id":"funktion-paluuarvojen-kaytto","style":"position:relative;"},"children":[{"type":"text","value":"Funktion paluuarvojen käyttö"},{"type":"element","tagName":"a","properties":{"href":"#funktion-paluuarvojen-kaytto","ariaLabel":"funktion paluuarvojen kaytto permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten olemme jo nähneet, funktioiden paluuarvoja on mahdollista sijoittaa muuttujiin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"summa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" b\n\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Summa on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Summa on 10"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska funktion paluuarvo käyttäytyy kuten mikä tahansa arvo, ei apumuuttuja ole tarpeen ja paluuarvoa on mahdollista käyttää suoraan komennon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":" parametrina:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Summa on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme myös antaa funktion palauttaman arvon toiselle funktiolle:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"summa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" a"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"b\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"erotus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" a"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"b\n\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" erotus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vastaus on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaus on 2"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tapauksessa suoritetaan ensin sisemmät funktiokutsut "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa(5, 2)"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa(2, 3)"}]},{"type":"text","value":", joiden palauttamat arvot 7 ja 5 käytetään ulomman funktiokutsun parametreina."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ulompi funktiokutsu "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"erotus(7, 5)"}]},{"type":"text","value":" palauttaa arvon 2, joka sijoitetaan muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulos"}]},{"type":"text","value":" arvoksi ja tulostetaan ruudulle."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktioiden palauttamat arvot toimivat täysin samalla tavalla kuin mitkä tahansa arvot Pythonissa. Niitä voidaan tulostaa, sijoittaa muuttujaan, käyttää osana lausekkeita tai käyttää parametreina muissa funktiokutsuissa."}]},{"type":"element","tagName":"h2","properties":{"id":"arvon-palauttaminen-return-ja-print","style":"position:relative;"},"children":[{"type":"text","value":"Arvon palauttaminen, return ja print"},{"type":"element","tagName":"a","properties":{"href":"#arvon-palauttaminen-return-ja-print","ariaLabel":"arvon palauttaminen return ja print permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joskus aloittelija hämmentyy funktioiden paluuarvon ja funktiossa tapahtuvan tulostuksen välistä eroa. Tarkastellaan kahta versiota funktiosta, joka selvittää kahden parametrinsa maksimiarvon:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"maksimi1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" a\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" b\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"maksimi2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nvastaus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" maksimi1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vastaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nmaksimi2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"5\n7"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Molemmat funktiot näyttävät toimivan hyvin, kumpikin selvittää maksimiarvon. Funktioissa on kuitenkin eräs ratkaiseva ero. Funktioista ensimmäinen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"maksimi1"}]},{"type":"text","value":" "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"palauttaa"}]},{"type":"text","value":" selvittämänsä arvon. Se ei itse tulosta mitään, eli jos suoritetaan koodi"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"maksimi1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"ei näytä tapahtuvan mitään. Funktion paluuarvo on siis otettava talteen muuttujaan, jos se halutaan tulostaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"vastaus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" maksimi1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vastaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktioista toinen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"maksimi2"}]},{"type":"text","value":" taas tulostaa itse "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komentoa käyttäen lukujen maksimin, eli riittää kutsua"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"maksimi2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"ja maksimi tulostuu ruudulle. Tämän funktion huono puoli on kuitenkin se, että funktion selvittämää arvoa ei ole mahdollista saada funktion ulkopuolelle muun ohjelman käsiteltäväksi. Tämän takia arvon palauttava funktio on useimmiten parempi vaihtoehto."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Luvuista suurin","tmcname":"osa04-05_luvuista_suurin"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luvuista_suurin"}]},{"type":"text","value":", joka saa parametriksi kolme kokonaislukua. Funktio palauttaa return-lausetta käyttäen luvuista suurimman."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käyttöesimerkki"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvuista_suurin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# 4"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvuista_suurin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"99"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# 99"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvuista_suurin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# 0"}]}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Merkit samat","tmcname":"osa04-06_merkit_samat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"samat"}]},{"type":"text","value":", joka saa parametriksi merkkijonon ja kaksi merkkijonon indeksejä kuvaavaa kokonaislukua. Funktio palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":"-lausetta käyttäen tiedon ("},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":") siitä, ovatko merkkijonon parametreina olevien indeksien osoittamissa paikoissa olevat merkit samat. Jos jompikumpi indekseistä ei osu merkkijonon sisälle, palauttaa metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muutama esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# samat merkit o ja o"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"samat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodari\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# True"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# eri merkit k ja a"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"samat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodari\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# False"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# toinen indeksi ei ole merkkijonon sisällä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"samat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodari\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# False"}]}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Eka, toka ja vika sana","tmcname":"osa04-07_eka_toka_vika_sana"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee kolme funktiota: "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"eka_sana"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"toka_sana"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vika_sana"}]},{"type":"text","value":". Jokainen funktioista saa parametrikseen lauseen (eli merkkijonon)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiot palauttavat nimensä mukaisesti lauseen ensimmäisen, toisen tai viimeisen sanan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa jokaisessa tapauksessa, että merkkijono koostuu vähintään kahdesta sanasta, ja että sanojen välillä on aina täsmälleen yksi välilyönti, ja että merkkijonon alussa ja lopussa ei ole välilyöntejä."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lause "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"olipa kerran kauan sitten ohjelmoija\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eka_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# olipa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"toka_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kerran"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vika_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ohjelmoija"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"olipa\nkerran\nohjelmoija"}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lause "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"olipa kerran\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"toka_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kerran"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vika_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kerran"}]}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"parametrin-tyyppi","style":"position:relative;"},"children":[{"type":"text","value":"Parametrin tyyppi"},{"type":"element","tagName":"a","properties":{"href":"#parametrin-tyyppi","ariaLabel":"parametrin tyyppi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kerrataan vielä tähän mennessä läpikäydyt tyypit:"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"left"},"children":[{"type":"text","value":"Tyyppi"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Pythonissa"}]},{"type":"element","tagName":"th","properties":{},"children":[{"type":"text","value":"Esimerkki"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"text","value":"Kokonaisluku"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"int"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"23"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"text","value":"Liukuluku"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"float"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"-0.45"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"text","value":"Merkkijono"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"str"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"Pekka Python\""}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"text","value":"Totuusarvo"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"bool"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun kutsumme funktiota, funktio toimii oikein vain,\njos annamme sille sopivan tyyppiset parametrit.\nTarkastellaan esimerkkinä seuraavaa funktiota:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta_monesti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"viesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kerrat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" kerrat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"viesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kerrat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii mainiosti, jos kutsumme sitä näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tulosta_monesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moikka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moikka\nMoikka\nMoikka\nMoikka\nMoikka"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuitenkaan funktio ei toimi, jos annamme sille väärän tyyppisen parametrin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tulosta_monesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moikka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"TypeError: '>' not supported between instances of 'str' and 'int'"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä ongelmaksi tulee, että funktion jälkimmäistä parametria "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kerrat"}]},{"type":"text","value":" vertaillaan kokonaislukuun 0. Kun parametri on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"text","value":" eikä kokonaisluku, tämä aiheuttaa virheen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme antaa funktion määrittelyssä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tyyppivihjeen"}]},{"type":"text","value":", joka ilmaisee, millaista tietoa parametreihin on tarkoitus sijoittaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta_monesti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"viesti "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kerrat "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" kerrat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"viesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kerrat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä kertoo funktion käyttäjälle, että parametrin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viesti"}]},{"type":"text","value":" on tarkoitus olla merkkijono, kun taas parametrin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kerrat"}]},{"type":"text","value":" on tarkoitus olla kokonaisluku."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaavasti funktion paluuarvon tyypin voi vihjata funktion määrittelyssä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kysy_nimi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikä on nimesi? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" nimi"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä kertoo funktion käyttäjälle, että funktion on tarkoitus palauttaa merkkijono."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa kuitenkin, että tyyppivihje ainoastaan neuvoo, mikä tyypin tulisi olla, mutta ei valvo sitä. Jos funktiolle annetaan väärän tyyppinen parametri tai se palauttaa väärän tyyppisen arvon, funktio suoritetaan kuitenkin, mutta se toimii mahdollisesti väärin."}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät lisää funktion parametrien käyttämisestä
  • \n
  • Osaat palauttaa arvon funktiosta ja käyttää sitä kutsukohdassa
  • \n
  • Osaat merkitä tyyppivihjeet parametreille ja paluuarvolle
  • \n

Funktioiden määrittely tapahtuu avainsanan def avulla:

def viesti():\n    print(\"Tämä tulee funktiosta\")

Näin määriteltyä funktiota nimeltä viesti kutsutaan seuraavasti:

viesti()

Tällöin ohjelman tulostus on seuraava:

Tämä tulee funktiosta

Funktion parametrit

Funktiolla voi olla yksi tai useampi parametri. Parametrit määritellään suluissa funktion nimen jälkeen.

Esimerkiksi seuraavassa koodissa funktiolla tervehdi on yksi parametri ja funktiolla summa on kaksi parametria.

def tervehdi(nimi):\n    print(\"Moikka,\", nimi)\n\ndef summa(a, b):\n    print(\"Parametrien summa on\", a + b)
tervehdi(\"Emilia\")\nsumma(2, 3)

Moikka, Emilia\nParametrien summa on 5

Mitä oikeastaan tapahtuu, kun suoritetaan funktiokutsu tervehdi(\"Emilia\")?

Funktion määrittelyssä tervehdi(nimi) oleva nimi on funktion\nmuodollinen parametri. Parametrin nimi on annettu funktion alussa,\nja sitä voidaan käyttää funktiossa muuttujan tavoin.

Funktion kutsussa tervehdi(\"Emilia\") oleva \"Emilia\" on funktion\ntodellinen parametri. Kun funktiota kutsutaan, todellinen parametri\nsijoitetaan muodollisen parametrin arvoksi.

Joskus termillä parametri viitataan muodolliseen parametriin ja\ntermillä argumentti viitataan todelliseen parametriin,\nmutta monet myös käyttävät termejä sekaisin.

Testien virheilmoitukset

Jos ohjelmasi ei toimi oikein, antavat testit enemmän tai vähemmän hyvän virheilmoituksen. Virheilmoitus kannattaa ehdottomasti lukea huolellisesti.

Joissain tilanteissa virheilmoitus ei kerro tarkemmin, mistä on kyse. Esimerkiksi seuraavassa tehtävässä saatat törmätä seuraavaan virheeseen:

\n \n \n \n \n \n \"4\n \n \n

Virhe kertoo, että tehtävän funktiota viiva pitäisi pystyä kutsumaan seuraavasti:

viiva(5, \"\")

Varsinainen ongelma paljastuu, kun kokeillaan, mitä funktiokutsu tekee, eli kopioidaan virheilmoituksen kertoma funktiokutsu koodiin ja painetaan vihreää kolmiota:

\n \n

Tee funktio viiva, joka saa kaksi parametria (leveys, merkkijono). Funktio tulostaa ensimmäisen parametrin määrittämän pituisen viivan käyttäen toisena parametrina olevan merkkijonon ensimmäistä merkkiä. Jos parametrina oleva merkkijono on tyhjä, tulostuu viiva tähtinä.

Käyttöesimerkki:

viiva(7, \"%\")\nviiva(10, \"LOL\")\nviiva(3, \"\")
\n%%%%%%%\nLLLLLLLLLL\n***\n

Sisäkkäiset kutsut

Voimme kutsua funktiota myös toisen funktion sisältä. Esimerkiksi seuraavassa ohjelmassa funktio\ntervehdi_monesti kutsuu funktiota tervehdi halutun määrän kertoja:

def tervehdi(nimi):\n    print(\"Moikka,\", nimi)\n\ndef tervehdi_monesti(nimi, kerrat):\n    while kerrat > 0:\n        tervehdi(nimi)\n        kerrat -= 1\n\ntervehdi_monesti(\"Emilia\", 3)

Moikka, Emilia\nMoikka, Emilia\nMoikka, Emilia

Tee funktio risulaatikko, joka piirtää risuaitamerkkiä käyttäen parametrinsa korkuisen, kymmenen merkkiä leveän risulaatikon.

Funktion tulee kutsua edellisen tehtävän funktiota viiva kaiken tulostuksen tekemiseen! Kopioi edellisen tehtävän funktion koodi tämän tehtävän funktion koodin yläpuolelle. Älä muuta funktiota mitenkään!

Pari käyttöesimerkkiä:

risulaatikko(5)\nprint()\nrisulaatikko(2)
\n##########\n##########\n##########\n##########\n##########\n\n##########\n##########\n

Tee funktio risunelio, joka piirtää risuaitamerkkiä käyttäen parametrinsa kokoisen risuneliön.

Funktion tulee kutsua edellisen tehtävän funktiota viiva kaiken tulostuksen tekemiseen! Kopioi edellisen tehtävän funktion koodi tämän tehtävän funktion koodin yläpuolelle. Älä muuta funktiota mitenkaan!

Pari käyttöesimerkkiä:

risunelio(5)\nprint()\nrisunelio(3)
\n#####\n#####\n#####\n#####\n#####\n\n###\n###\n###\n

Tee funktio nelio, joka saa kaksi parametria. Funktio tulostaa neliön jonka korkeuden ja leveyden kertoo ensimmäinen parametri. Toinen parametri määrittelee mitä merkkiä käyttäen neliö piirretään.

Funktion tulee kutsua edellisen tehtävän funktiota viiva kaiken tulostuksen tekemiseen! Kopioi edellisen tehtävän funktion koodi tämän tehtävän funktion koodin yläpuolelle. Älä muuta funktiota mitenkaan!

Pari käyttöesimerkkiä:

nelio(5, \"*\")\nprint()\nnelio(3, \"o\")
\n*****\n*****\n*****\n*****\n*****\n\nooo\nooo\nooo\n

Tee funktio kolmio, joka piirtää risuaitamerkkiä käyttäen parametrinsa korkuisen ja levyisen, risuaitakolmion.

Funktion tulee kutsua edellisen tehtävän funktiota viiva kaiken tulostuksen tekemiseen! Kopioi edellisen tehtävän funktion koodi tämän tehtävän funktion koodin yläpuolelle. Älä muuta funktiota mitenkaan!

Pari käyttöesimerkkiä:

kolmio(6)\nprint()\nkolmio(3)
\n#\n##\n###\n####\n#####\n######\n\n#\n##\n###\n

Tee funktio kuvio, joka saa neljä parametria. Funktio tulostaa kuvion, jonka yläosana on kahden ensimmäisen parametrin määrittelemä kolmio ja alaosana ensimmäisen ja kahden jälkimmäisen parametrin määrittelemä suorakulmio.

Funktion tulee kutsua edellisen tehtävän funktiota viiva kaiken tulostuksen tekemiseen! Kopioi edellisen tehtävän funktion koodi tämän tehtävän funktion koodin yläpuolelle.

Pari käyttöesimerkkiä:

kuvio(5, \"X\", 3, \"*\")\nprint()\nkuvio(2, \"o\", 4, \"+\")\nprint()\nkuvio(3, \".\", 0, \",\")
\nX\nXX\nXXX\nXXXX\nXXXXX\n*****\n*****\n*****\n\no\noo\n++\n++\n++\n++\n\n.\n..\n...\n

Vihje

Älä yritä ratkaista tehtävässä \"kaikkia asioita\" yhtä aikaa. Keskity ensin esim. siihen että saat kuvion yläosan kolmion piirtymään oikein, ja vasta sen jälkeen jatka kuvion täydentämistä alaosan suorakulmiolla.

Tämä on ylipäätänsäkin ohjelmoinnissa erittäin tärkeää: keskity pieniin osiin kerrallaan, varmista että ne toimivat ennen kuin laajennat ratkaisuasi.

Tee funktio joulukuusi, joka saa yhden parametrin. Funktio tulostaa tekstin joulukuusi! ja parametrinsa kokoisen joulukuusen.

Esim. kutsuttaessa joulukuusi(3) tulostuu

\njoulukuusi!\n  *\n ***\n*****\n  *\n

Esim. kutsuttaessa joulukuusi(5) tulostuu

\njoulukuusi!\n    *\n   ***\n  *****\n *******\n*********\n    *\n

Huomaa, että joulukuusen vasemmalla puolella pitää olla täsmälleen oikea määrä välilyöntejä. Eli vaikka kuusen muoto olisi täysin oikea, mutta sen alin \"neulastaso\" ei lähde ruudun vasemmasta reunasta, ei vastaus kelpaa testeille.

Funktion paluuarvo

Funktiot voivat myös palauttaa arvoja. Esimerkiksi Pythonin valmis funktio input palauttaa käyttäjän antaman syötteen. Funktion palauttama arvo voidaan esimerkiksi sijoittaa muuttujaan:

sana = input(\"Anna sana: \")

Myös kokonaislukujen lukemisessa yhdessä funktion input kanssa käytettävä funktio int palauttaa arvon:

luku = int(input(\"Anna kokonaisluku: \"))

Funktio int saa parametrinaan funktion input palauttaman merkkijonon ja palauttaa sen kokonaislukutyyppisenä.

Funktion arvon palauttaminen return-komennolla

Myös itse määrittelemämme funktiot voivat palauttaa arvoja käyttämällä komentoa return. Esimerkiksi seuraava funktio summa palauttaa annettujen lukujen summan:

def summa(a, b):\n    return a + b\n\nvastaus = summa(2, 3)\n\nprint(\"Summa:\", vastaus)

Summa: 5

Seuraavassa on vielä toinen esimerkki, jossa funktio kysyy käyttäjän nimen ja palauttaa sen:

def kysy_nimi():\n    nimi = input(\"Mikä on nimesi? \")\n    return nimi\n\nnimi = kysy_nimi()\nprint(\"Moikka,\", nimi)

Mikä on nimesi? Anna\nMoikka, Anna

Kannattaa huomata, että komento return lopettaa funktion suorituksen saman tien. Niinpä voimme tehdä seuraavan funktion:

def pienin(a,b):\n    if a < b:\n        return a\n    return b\n\nprint(pienin(3, 7))\nprint(pienin(5, 2))

Tässä ideana on, että jos a on pienempi kuin b, niin funktio palauttaa arvon a ja päättyy. Muuten funktion suoritus jatkuu eteenpäin, jolloin se palauttaa arvon b.

3\n2

Voimme myös käyttää return-komentoa siihen, että poistumme funktiosta palauttamatta mitään:

def tervehdi(nimi):\n    if nimi == \"\":\n        print(\"???\")\n        return\n    print(\"Moikka,\", nimi)\n\ntervehdi(\"Emilia\")\ntervehdi(\"\")\ntervehdi(\"Matti\")

Jos nimi on tyhjä merkkijono, niin funktio tulostaa ??? ja päättyy.

Moikka, Emilia\n???\nMoikka, Matti

Funktion paluuarvojen käyttö

Kuten olemme jo nähneet, funktioiden paluuarvoja on mahdollista sijoittaa muuttujiin:

def summa(a, b):\n    return a + b\n\ntulos = summa(4, 6)\nprint(\"Summa on\", tulos)

Summa on 10

Koska funktion paluuarvo käyttäytyy kuten mikä tahansa arvo, ei apumuuttuja ole tarpeen ja paluuarvoa on mahdollista käyttää suoraan komennon print parametrina:

print(\"Summa on\", summa(4, 6))

Voimme myös antaa funktion palauttaman arvon toiselle funktiolle:

def summa(a, b):\n    return a+b\n\ndef erotus(a, b):\n    return a-b\n\ntulos = erotus(summa(5, 2), summa(2, 3))\nprint(\"Vastaus on\", tulos)

Vastaus on 2

Tässä tapauksessa suoritetaan ensin sisemmät funktiokutsut summa(5, 2) ja summa(2, 3), joiden palauttamat arvot 7 ja 5 käytetään ulomman funktiokutsun parametreina.

Ulompi funktiokutsu erotus(7, 5) palauttaa arvon 2, joka sijoitetaan muuttujan tulos arvoksi ja tulostetaan ruudulle.

Funktioiden palauttamat arvot toimivat täysin samalla tavalla kuin mitkä tahansa arvot Pythonissa. Niitä voidaan tulostaa, sijoittaa muuttujaan, käyttää osana lausekkeita tai käyttää parametreina muissa funktiokutsuissa.

Arvon palauttaminen, return ja print

Joskus aloittelija hämmentyy funktioiden paluuarvon ja funktiossa tapahtuvan tulostuksen välistä eroa. Tarkastellaan kahta versiota funktiosta, joka selvittää kahden parametrinsa maksimiarvon:

def maksimi1(a, b):\n    if a > b:\n        return a\n    else:\n        return b\n\ndef maksimi2(a, b):\n    if a > b:\n        print(a)\n    else:\n        print(b)\n\nvastaus = maksimi1(3, 5)\nprint(vastaus)\n\nmaksimi2(7, 2)

5\n7

Molemmat funktiot näyttävät toimivan hyvin, kumpikin selvittää maksimiarvon. Funktioissa on kuitenkin eräs ratkaiseva ero. Funktioista ensimmäinen maksimi1 palauttaa selvittämänsä arvon. Se ei itse tulosta mitään, eli jos suoritetaan koodi

maksimi1(3, 5)

ei näytä tapahtuvan mitään. Funktion paluuarvo on siis otettava talteen muuttujaan, jos se halutaan tulostaa:

vastaus = maksimi1(3, 5)\nprint(vastaus)

Funktioista toinen maksimi2 taas tulostaa itse print-komentoa käyttäen lukujen maksimin, eli riittää kutsua

maksimi2(7, 5)

ja maksimi tulostuu ruudulle. Tämän funktion huono puoli on kuitenkin se, että funktion selvittämää arvoa ei ole mahdollista saada funktion ulkopuolelle muun ohjelman käsiteltäväksi. Tämän takia arvon palauttava funktio on useimmiten parempi vaihtoehto.

Tee funktio luvuista_suurin, joka saa parametriksi kolme kokonaislukua. Funktio palauttaa return-lausetta käyttäen luvuista suurimman.

Käyttöesimerkki

print(luvuista_suurin(3, 4, 1)) # 4\nprint(luvuista_suurin(99, -4, 7)) # 99\nprint(luvuista_suurin(0, 0, 0)) # 0

Tee funktio samat, joka saa parametriksi merkkijonon ja kaksi merkkijonon indeksejä kuvaavaa kokonaislukua. Funktio palauttaa return-lausetta käyttäen tiedon (True tai False) siitä, ovatko merkkijonon parametreina olevien indeksien osoittamissa paikoissa olevat merkit samat. Jos jompikumpi indekseistä ei osu merkkijonon sisälle, palauttaa metodi False.

Muutama esimerkki:

# samat merkit o ja o\nprint(samat(\"koodari\", 1, 2)) # True\n\n# eri merkit k ja a\nprint(samat(\"koodari\", 0, 4)) # False\n\n# toinen indeksi ei ole merkkijonon sisällä\nprint(samat(\"koodari\", 0, 10)) # False

Tee kolme funktiota: eka_sana, toka_sana ja vika_sana. Jokainen funktioista saa parametrikseen lauseen (eli merkkijonon).

Funktiot palauttavat nimensä mukaisesti lauseen ensimmäisen, toisen tai viimeisen sanan.

Voit olettaa jokaisessa tapauksessa, että merkkijono koostuu vähintään kahdesta sanasta, ja että sanojen välillä on aina täsmälleen yksi välilyönti, ja että merkkijonon alussa ja lopussa ei ole välilyöntejä.

lause = \"olipa kerran kauan sitten ohjelmoija\"\n\nprint(eka_sana(lause)) # olipa\nprint(toka_sana(lause)) # kerran\nprint(vika_sana(lause)) # ohjelmoija

olipa\nkerran\nohjelmoija

lause = \"olipa kerran\"\n\nprint(toka_sana(lause)) # kerran\nprint(vika_sana(lause)) # kerran

Parametrin tyyppi

Kerrataan vielä tähän mennessä läpikäydyt tyypit:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TyyppiPythonissaEsimerkki
Kokonaislukuint23
Liukulukufloat-0.45
Merkkijonostr\"Pekka Python\"
TotuusarvoboolTrue

Kun kutsumme funktiota, funktio toimii oikein vain,\njos annamme sille sopivan tyyppiset parametrit.\nTarkastellaan esimerkkinä seuraavaa funktiota:

def tulosta_monesti(viesti, kerrat):\n    while kerrat > 0:\n        print(viesti)\n        kerrat -= 1

Funktio toimii mainiosti, jos kutsumme sitä näin:

tulosta_monesti(\"Moikka\", 5)

Moikka\nMoikka\nMoikka\nMoikka\nMoikka

Kuitenkaan funktio ei toimi, jos annamme sille väärän tyyppisen parametrin:

tulosta_monesti(\"Moikka\", \"Emilia\")

TypeError: '>' not supported between instances of 'str' and 'int'

Tässä ongelmaksi tulee, että funktion jälkimmäistä parametria kerrat vertaillaan kokonaislukuun 0. Kun parametri on \"Emilia\" eikä kokonaisluku, tämä aiheuttaa virheen.

Voimme antaa funktion määrittelyssä tyyppivihjeen, joka ilmaisee, millaista tietoa parametreihin on tarkoitus sijoittaa:

def tulosta_monesti(viesti : str, kerrat : int):\n    while kerrat > 0:\n        print(viesti)\n        kerrat -= 1

Tämä kertoo funktion käyttäjälle, että parametrin viesti on tarkoitus olla merkkijono, kun taas parametrin kerrat on tarkoitus olla kokonaisluku.

Vastaavasti funktion paluuarvon tyypin voi vihjata funktion määrittelyssä:

def kysy_nimi() -> str:\n    nimi = input(\"Mikä on nimesi? \")\n    return nimi

Tämä kertoo funktion käyttäjälle, että funktion on tarkoitus palauttaa merkkijono.

Huomaa kuitenkin, että tyyppivihje ainoastaan neuvoo, mikä tyypin tulisi olla, mutta ei valvo sitä. Jos funktiolle annetaan väärän tyyppinen parametri tai se palauttaa väärän tyyppisen arvon, funktio suoritetaan kuitenkin, mutta se toimii mahdollisesti väärin.

","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-4/2-lisaa-funktioista.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät lisää funktion parametrien käyttämisestä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat palauttaa arvon funktiosta ja käyttää sitä kutsukohdassa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat merkitä tyyppivihjeet parametreille ja paluuarvolle"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktioiden määrittely tapahtuu avainsanan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"viesti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tämä tulee funktiosta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Näin määriteltyä funktiota nimeltä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viesti"}]},{"type":"text","value":" kutsutaan seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"viesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tällöin ohjelman tulostus on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä tulee funktiosta"}]}]},{"type":"element","tagName":"h2","properties":{"id":"funktion-parametrit","style":"position:relative;"},"children":[{"type":"text","value":"Funktion parametrit"},{"type":"element","tagName":"a","properties":{"href":"#funktion-parametrit","ariaLabel":"funktion parametrit permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiolla voi olla yksi tai useampi parametri. Parametrit määritellään suluissa funktion nimen jälkeen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraavassa koodissa funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tervehdi"}]},{"type":"text","value":" on yksi parametri ja funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa"}]},{"type":"text","value":" on kaksi parametria."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tervehdi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moikka,\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"summa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Parametrien summa on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tervehdi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moikka, Emilia\nParametrien summa on 5"}]}]},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Muodollinen ja todellinen parametri"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mitä oikeastaan tapahtuu, kun suoritetaan funktiokutsu "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tervehdi(\"Emilia\")"}]},{"type":"text","value":"?"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion määrittelyssä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tervehdi(nimi)"}]},{"type":"text","value":" oleva "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":" on funktion\n"},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"muodollinen parametri"}]},{"type":"text","value":". Parametrin nimi on annettu funktion alussa,\nja sitä voidaan käyttää funktiossa muuttujan tavoin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion kutsussa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tervehdi(\"Emilia\")"}]},{"type":"text","value":" oleva "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"text","value":" on funktion\n"},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"todellinen parametri"}]},{"type":"text","value":". Kun funktiota kutsutaan, todellinen parametri\nsijoitetaan muodollisen parametrin arvoksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joskus termillä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"parametri"}]},{"type":"text","value":" viitataan muodolliseen parametriin ja\ntermillä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"argumentti"}]},{"type":"text","value":" viitataan todelliseen parametriin,\nmutta monet myös käyttävät termejä sekaisin."}]}]},{"type":"element","tagName":"h2","properties":{"id":"testien-virheilmoitukset","style":"position:relative;"},"children":[{"type":"text","value":"Testien virheilmoitukset"},{"type":"element","tagName":"a","properties":{"href":"#testien-virheilmoitukset","ariaLabel":"testien virheilmoitukset permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos ohjelmasi ei toimi oikein, antavat testit enemmän tai vähemmän hyvän virheilmoituksen. Virheilmoitus kannattaa ehdottomasti lukea huolellisesti."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joissain tilanteissa virheilmoitus ei kerro tarkemmin, mistä on kyse. Esimerkiksi seuraavassa tehtävässä saatat törmätä seuraavaan virheeseen:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/fd084faad6510920cd24630f3868f652/76435/4_2_0a.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 41.73913043478261%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAABYlAAAWJQFJUiTwAAABTUlEQVQY02WQy04CQRBF+Qk16a5Hv+ienhlmcBQQEQxi1MQHoILRvStj4r+5deHar1JA4+vkrCq5dStV896HENIY8yxbGZMk+JBluVL6P8uhsdZpbWqIKKXUxpxNZmeT+elkNr6+HU+vxuMLAMDfECEt0VojYo2IGQX4TXH/zI+v9PACT2/Qu2NYV9Yare0PFX+CyyU1IkIEbVy1d1X156485vzI2rJO2pFhbYQz8kvtrJQSAFb9i/DiFsN8nKgTL4bMB1YM3cbQrR26TuFnIlximIK/odhV9bws0hiZ+auZyCkqCnC9kIyajcOtbNRMR6UfNQatcp5W07R5nVWnKmwCp408Jsl3WDJHIc59HO7uD7r9TtXubnX22r3edrfV3mkN+qEsbJYKqxHh79lAFACa1hhfV0wIEhYKAIlSkhAsJUupEQ0t/ruq/Qi/A2YuTKFDvDu7AAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/fd084faad6510920cd24630f3868f652/a0b58/4_2_0a.webp 230w","/static/fd084faad6510920cd24630f3868f652/bc10c/4_2_0a.webp 460w","/static/fd084faad6510920cd24630f3868f652/966d8/4_2_0a.webp 920w","/static/fd084faad6510920cd24630f3868f652/445df/4_2_0a.webp 1380w","/static/fd084faad6510920cd24630f3868f652/97499/4_2_0a.webp 1742w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/fd084faad6510920cd24630f3868f652/81c8e/4_2_0a.png 230w","/static/fd084faad6510920cd24630f3868f652/08a84/4_2_0a.png 460w","/static/fd084faad6510920cd24630f3868f652/c0255/4_2_0a.png 920w","/static/fd084faad6510920cd24630f3868f652/b1001/4_2_0a.png 1380w","/static/fd084faad6510920cd24630f3868f652/76435/4_2_0a.png 1742w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/fd084faad6510920cd24630f3868f652/c0255/4_2_0a.png","alt":"4 2 0a","title":"4 2 0a","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Virhe kertoo, että tehtävän funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viiva"}]},{"type":"text","value":" pitäisi pystyä kutsumaan seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"viiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Varsinainen ongelma paljastuu, kun kokeillaan, mitä funktiokutsu tekee, eli kopioidaan virheilmoituksen kertoma funktiokutsu koodiin ja painetaan vihreää kolmiota:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/5a22494efd4d5af2a80255c7ee6431f3/701e9/4_2_0b.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 42.173913043478265%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAABYlAAAWJQFJUiTwAAABWElEQVQY023P246bMBAGYJ4jWsDGDoNPGAPmFINN0KarFVLTXqeqmvd/iCpZbaWV+um/+DWai5no+4+fUAA90iMAKQBR8iH7l4xknwyB+7EvKUiOS55H+77nkDengRu5VaYtioSkmCCUpYggfERplsZPSRxDglGcxC8vmNAEZ9HlcjkcDgAFIviM+DckREqS/0nTNP46ia7XKwCwgkkpZaWBMyEEAHwcT+njDYyxMWae57qum6bhT4yx6P7n7p9CCGsI3vtlWbz327Y558Zx7LrOWts0jbW2ruvySSlVlmV0u92WeT6v6xpC8ME599hu277r+65v29a2bVPXutTGmEprJaXgTEklOI9+ve4Xt+x+ezv5rZ9eB3e2Y2iH1Y7nbnK6GYTuhbZMdUwNspqUGbieStMLHf1+vy7jtJ3mzS22rKzSigLDlGeUYZrHOE9xnjzzKOgzj/4XGdNWXD7/XR0AAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/5a22494efd4d5af2a80255c7ee6431f3/a0b58/4_2_0b.webp 230w","/static/5a22494efd4d5af2a80255c7ee6431f3/bc10c/4_2_0b.webp 460w","/static/5a22494efd4d5af2a80255c7ee6431f3/966d8/4_2_0b.webp 920w","/static/5a22494efd4d5af2a80255c7ee6431f3/445df/4_2_0b.webp 1380w","/static/5a22494efd4d5af2a80255c7ee6431f3/e11e5/4_2_0b.webp 1780w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/5a22494efd4d5af2a80255c7ee6431f3/81c8e/4_2_0b.png 230w","/static/5a22494efd4d5af2a80255c7ee6431f3/08a84/4_2_0b.png 460w","/static/5a22494efd4d5af2a80255c7ee6431f3/c0255/4_2_0b.png 920w","/static/5a22494efd4d5af2a80255c7ee6431f3/b1001/4_2_0b.png 1380w","/static/5a22494efd4d5af2a80255c7ee6431f3/701e9/4_2_0b.png 1780w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/5a22494efd4d5af2a80255c7ee6431f3/c0255/4_2_0b.png","alt":"4 2 0b","title":"4 2 0b","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodin suorituksen viimeiset rivit kertovat, mikä on vikana: koodin rivi 4 aiheuttaa virheen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"IndexError: string index out of range"}]},{"type":"text","value":". Kuten "},{"type":"element","tagName":"a","properties":{"href":"/osa-3/2-merkkijonojen-kasittely"},"children":[{"type":"text","value":"edellisessä osassa"}]},{"type":"text","value":" mainittiin, syy tälle on se, että koodissa yritetään indeksoida merkkijonon ulkopuolelle. Tällä kertaa syynä on se, että yritetään hakea nollan pituisen merkkijonon ensimmäistä merkkiä."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Viiva","tmcname":"osa04-02_viiva"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viiva"}]},{"type":"text","value":", joka saa kaksi parametria (leveys, merkkijono). Funktio tulostaa ensimmäisen parametrin määrittämän pituisen viivan käyttäen toisena parametrina olevan merkkijonon ensimmäistä merkkiä. Jos parametrina oleva merkkijono on tyhjä, tulostuu viiva tähtinä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"viiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"%\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nviiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"LOL\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nviiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"%%%%%%%\nLLLLLLLLLL\n***\n"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"sisakkaiset-kutsut","style":"position:relative;"},"children":[{"type":"text","value":"Sisäkkäiset kutsut"},{"type":"element","tagName":"a","properties":{"href":"#sisakkaiset-kutsut","ariaLabel":"sisakkaiset kutsut permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme kutsua funktiota myös toisen funktion sisältä. Esimerkiksi seuraavassa ohjelmassa funktio\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tervehdi_monesti"}]},{"type":"text","value":" kutsuu funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tervehdi"}]},{"type":"text","value":" halutun määrän kertoja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tervehdi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moikka,\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tervehdi_monesti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kerrat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" kerrat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tervehdi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kerrat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\ntervehdi_monesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moikka, Emilia\nMoikka, Emilia\nMoikka, Emilia"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Risulaatikko","tmcname":"osa04-02a_risulaatikko"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"risulaatikko"}]},{"type":"text","value":", joka piirtää risuaitamerkkiä käyttäen parametrinsa korkuisen, kymmenen merkkiä leveän risulaatikon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion tulee kutsua edellisen tehtävän funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viiva"}]},{"type":"text","value":" kaiken tulostuksen tekemiseen! Kopioi edellisen tehtävän funktion koodi tämän tehtävän funktion koodin yläpuolelle. Älä muuta funktiota mitenkään!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pari käyttöesimerkkiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"risulaatikko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nrisulaatikko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"##########\n##########\n##########\n##########\n##########\n\n##########\n##########\n"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Risuneliö","tmcname":"osa04-02b_risunelio"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"risunelio"}]},{"type":"text","value":", joka piirtää risuaitamerkkiä käyttäen parametrinsa kokoisen risuneliön."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion tulee kutsua edellisen tehtävän funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viiva"}]},{"type":"text","value":" kaiken tulostuksen tekemiseen! Kopioi edellisen tehtävän funktion koodi tämän tehtävän funktion koodin yläpuolelle. Älä muuta funktiota mitenkaan!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pari käyttöesimerkkiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"risunelio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nrisunelio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"#####\n#####\n#####\n#####\n#####\n\n###\n###\n###\n"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Neliö","tmcname":"osa04-02c_nelio"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nelio"}]},{"type":"text","value":", joka saa kaksi parametria. Funktio tulostaa neliön jonka korkeuden ja leveyden kertoo ensimmäinen parametri. Toinen parametri määrittelee mitä merkkiä käyttäen neliö piirretään."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion tulee kutsua edellisen tehtävän funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viiva"}]},{"type":"text","value":" kaiken tulostuksen tekemiseen! Kopioi edellisen tehtävän funktion koodi tämän tehtävän funktion koodin yläpuolelle. Älä muuta funktiota mitenkaan!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pari käyttöesimerkkiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nelio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"*\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnelio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"o\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"*****\n*****\n*****\n*****\n*****\n\nooo\nooo\nooo\n"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kolmio","tmcname":"osa04-02d_kolmio"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kolmio"}]},{"type":"text","value":", joka piirtää risuaitamerkkiä käyttäen parametrinsa korkuisen ja levyisen, risuaitakolmion."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion tulee kutsua edellisen tehtävän funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viiva"}]},{"type":"text","value":" kaiken tulostuksen tekemiseen! Kopioi edellisen tehtävän funktion koodi tämän tehtävän funktion koodin yläpuolelle. Älä muuta funktiota mitenkaan!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pari käyttöesimerkkiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kolmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkolmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"#\n##\n###\n####\n#####\n######\n\n#\n##\n###\n"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kuvio","tmcname":"osa04-03_kuvio"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kuvio"}]},{"type":"text","value":", joka saa neljä parametria. Funktio tulostaa kuvion, jonka yläosana on kahden ensimmäisen parametrin määrittelemä kolmio ja alaosana ensimmäisen ja kahden jälkimmäisen parametrin määrittelemä suorakulmio."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion tulee kutsua edellisen tehtävän funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viiva"}]},{"type":"text","value":" kaiken tulostuksen tekemiseen! Kopioi edellisen tehtävän funktion koodi tämän tehtävän funktion koodin yläpuolelle."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pari käyttöesimerkkiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kuvio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"X\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"*\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkuvio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"o\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"+\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkuvio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\".\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\",\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"X\nXX\nXXX\nXXXX\nXXXXX\n*****\n*****\n*****\n\no\noo\n++\n++\n++\n++\n\n.\n..\n...\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vihje"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Älä yritä ratkaista tehtävässä \"kaikkia asioita\" yhtä aikaa. Keskity ensin esim. siihen että saat kuvion yläosan kolmion piirtymään oikein, ja vasta sen jälkeen jatka kuvion täydentämistä alaosan suorakulmiolla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä on ylipäätänsäkin ohjelmoinnissa erittäin tärkeää: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"keskity pieniin osiin kerrallaan"}]},{"type":"text","value":", varmista että ne toimivat ennen kuin laajennat ratkaisuasi."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Joulukuusi","tmcname":"osa04-04_joulukuusi"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"joulukuusi"}]},{"type":"text","value":", joka saa yhden parametrin. Funktio tulostaa tekstin joulukuusi! ja parametrinsa kokoisen joulukuusen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esim. kutsuttaessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"joulukuusi(3)"}]},{"type":"text","value":" tulostuu"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"joulukuusi!\n *\n ***\n*****\n *\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esim. kutsuttaessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"joulukuusi(5)"}]},{"type":"text","value":" tulostuu"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"joulukuusi!\n *\n ***\n *****\n *******\n*********\n *\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huomaa, että joulukuusen vasemmalla puolella pitää olla täsmälleen oikea määrä välilyöntejä"}]},{"type":"text","value":". Eli vaikka kuusen muoto olisi täysin oikea, mutta sen alin \"neulastaso\" ei lähde ruudun vasemmasta reunasta, ei vastaus kelpaa testeille."}]}]},{"type":"element","tagName":"h2","properties":{"id":"funktion-paluuarvo","style":"position:relative;"},"children":[{"type":"text","value":"Funktion paluuarvo"},{"type":"element","tagName":"a","properties":{"href":"#funktion-paluuarvo","ariaLabel":"funktion paluuarvo permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiot voivat myös palauttaa arvoja. Esimerkiksi Pythonin valmis funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"input"}]},{"type":"text","value":" "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"palauttaa"}]},{"type":"text","value":" käyttäjän antaman syötteen. Funktion palauttama arvo voidaan esimerkiksi sijoittaa muuttujaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna sana: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Myös kokonaislukujen lukemisessa yhdessä funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"input"}]},{"type":"text","value":" kanssa käytettävä funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"int"}]},{"type":"text","value":" palauttaa arvon:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna kokonaisluku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"int"}]},{"type":"text","value":" saa parametrinaan funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"input"}]},{"type":"text","value":" palauttaman merkkijonon ja palauttaa sen kokonaislukutyyppisenä."}]},{"type":"element","tagName":"h2","properties":{"id":"funktion-arvon-palauttaminen-return-komennolla","style":"position:relative;"},"children":[{"type":"text","value":"Funktion arvon palauttaminen return-komennolla"},{"type":"element","tagName":"a","properties":{"href":"#funktion-arvon-palauttaminen-return-komennolla","ariaLabel":"funktion arvon palauttaminen return komennolla permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Myös itse määrittelemämme funktiot voivat palauttaa arvoja käyttämällä komentoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":". Esimerkiksi seuraava funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa"}]},{"type":"text","value":" palauttaa annettujen lukujen summan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"summa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" b\n\nvastaus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Summa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vastaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Summa: 5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on vielä toinen esimerkki, jossa funktio kysyy käyttäjän nimen ja palauttaa sen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kysy_nimi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikä on nimesi? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" nimi\n\nnimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kysy_nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moikka,\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mikä on nimesi? "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Anna"}]},{"type":"text","value":"\nMoikka, Anna"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kannattaa huomata, että komento "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" lopettaa funktion suorituksen saman tien. Niinpä voimme tehdä seuraavan funktion:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pienin"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" a\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" b\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pienin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pienin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä ideana on, että jos "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":" on pienempi kuin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":", niin funktio palauttaa arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":" ja päättyy. Muuten funktion suoritus jatkuu eteenpäin, jolloin se palauttaa arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3\n2"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme myös käyttää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":"-komentoa siihen, että poistumme funktiosta palauttamatta mitään:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tervehdi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"???\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moikka,\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntervehdi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntervehdi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntervehdi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Matti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":" on tyhjä merkkijono, niin funktio tulostaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"???"}]},{"type":"text","value":" ja päättyy."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moikka, Emilia\n???\nMoikka, Matti"}]}]},{"type":"element","tagName":"h2","properties":{"id":"funktion-paluuarvojen-kaytto","style":"position:relative;"},"children":[{"type":"text","value":"Funktion paluuarvojen käyttö"},{"type":"element","tagName":"a","properties":{"href":"#funktion-paluuarvojen-kaytto","ariaLabel":"funktion paluuarvojen kaytto permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten olemme jo nähneet, funktioiden paluuarvoja on mahdollista sijoittaa muuttujiin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"summa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" b\n\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Summa on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Summa on 10"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska funktion paluuarvo käyttäytyy kuten mikä tahansa arvo, ei apumuuttuja ole tarpeen ja paluuarvoa on mahdollista käyttää suoraan komennon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":" parametrina:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Summa on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme myös antaa funktion palauttaman arvon toiselle funktiolle:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"summa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" a"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"b\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"erotus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" a"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"b\n\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" erotus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vastaus on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaus on 2"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tapauksessa suoritetaan ensin sisemmät funktiokutsut "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa(5, 2)"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa(2, 3)"}]},{"type":"text","value":", joiden palauttamat arvot 7 ja 5 käytetään ulomman funktiokutsun parametreina."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ulompi funktiokutsu "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"erotus(7, 5)"}]},{"type":"text","value":" palauttaa arvon 2, joka sijoitetaan muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulos"}]},{"type":"text","value":" arvoksi ja tulostetaan ruudulle."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktioiden palauttamat arvot toimivat täysin samalla tavalla kuin mitkä tahansa arvot Pythonissa. Niitä voidaan tulostaa, sijoittaa muuttujaan, käyttää osana lausekkeita tai käyttää parametreina muissa funktiokutsuissa."}]},{"type":"element","tagName":"h2","properties":{"id":"arvon-palauttaminen-return-ja-print","style":"position:relative;"},"children":[{"type":"text","value":"Arvon palauttaminen, return ja print"},{"type":"element","tagName":"a","properties":{"href":"#arvon-palauttaminen-return-ja-print","ariaLabel":"arvon palauttaminen return ja print permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joskus aloittelija hämmentyy funktioiden paluuarvon ja funktiossa tapahtuvan tulostuksen välistä eroa. Tarkastellaan kahta versiota funktiosta, joka selvittää kahden parametrinsa maksimiarvon:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"maksimi1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" a\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" b\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"maksimi2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nvastaus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" maksimi1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vastaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nmaksimi2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"5\n7"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Molemmat funktiot näyttävät toimivan hyvin, kumpikin selvittää maksimiarvon. Funktioissa on kuitenkin eräs ratkaiseva ero. Funktioista ensimmäinen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"maksimi1"}]},{"type":"text","value":" "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"palauttaa"}]},{"type":"text","value":" selvittämänsä arvon. Se ei itse tulosta mitään, eli jos suoritetaan koodi"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"maksimi1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"ei näytä tapahtuvan mitään. Funktion paluuarvo on siis otettava talteen muuttujaan, jos se halutaan tulostaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"vastaus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" maksimi1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vastaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktioista toinen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"maksimi2"}]},{"type":"text","value":" taas tulostaa itse "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komentoa käyttäen lukujen maksimin, eli riittää kutsua"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"maksimi2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"ja maksimi tulostuu ruudulle. Tämän funktion huono puoli on kuitenkin se, että funktion selvittämää arvoa ei ole mahdollista saada funktion ulkopuolelle muun ohjelman käsiteltäväksi. Tämän takia arvon palauttava funktio on useimmiten parempi vaihtoehto."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Luvuista suurin","tmcname":"osa04-05_luvuista_suurin"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luvuista_suurin"}]},{"type":"text","value":", joka saa parametriksi kolme kokonaislukua. Funktio palauttaa return-lausetta käyttäen luvuista suurimman."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käyttöesimerkki"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvuista_suurin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# 4"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvuista_suurin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"99"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# 99"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvuista_suurin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# 0"}]}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Merkit samat","tmcname":"osa04-06_merkit_samat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"samat"}]},{"type":"text","value":", joka saa parametriksi merkkijonon ja kaksi merkkijonon indeksejä kuvaavaa kokonaislukua. Funktio palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":"-lausetta käyttäen tiedon ("},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":") siitä, ovatko merkkijonon parametreina olevien indeksien osoittamissa paikoissa olevat merkit samat. Jos jompikumpi indekseistä ei osu merkkijonon sisälle, palauttaa metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muutama esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# samat merkit o ja o"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"samat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodari\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# True"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# eri merkit k ja a"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"samat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodari\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# False"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# toinen indeksi ei ole merkkijonon sisällä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"samat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodari\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# False"}]}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Eka, toka ja vika sana","tmcname":"osa04-07_eka_toka_vika_sana"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee kolme funktiota: "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"eka_sana"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"toka_sana"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vika_sana"}]},{"type":"text","value":". Jokainen funktioista saa parametrikseen lauseen (eli merkkijonon)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiot palauttavat nimensä mukaisesti lauseen ensimmäisen, toisen tai viimeisen sanan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa jokaisessa tapauksessa, että merkkijono koostuu vähintään kahdesta sanasta, ja että sanojen välillä on aina täsmälleen yksi välilyönti, ja että merkkijonon alussa ja lopussa ei ole välilyöntejä."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lause "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"olipa kerran kauan sitten ohjelmoija\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eka_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# olipa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"toka_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kerran"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vika_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ohjelmoija"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"olipa\nkerran\nohjelmoija"}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lause "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"olipa kerran\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"toka_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kerran"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vika_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kerran"}]}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"parametrin-tyyppi","style":"position:relative;"},"children":[{"type":"text","value":"Parametrin tyyppi"},{"type":"element","tagName":"a","properties":{"href":"#parametrin-tyyppi","ariaLabel":"parametrin tyyppi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kerrataan vielä tähän mennessä läpikäydyt tyypit:"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"left"},"children":[{"type":"text","value":"Tyyppi"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"Pythonissa"}]},{"type":"element","tagName":"th","properties":{},"children":[{"type":"text","value":"Esimerkki"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"text","value":"Kokonaisluku"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"int"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"23"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"text","value":"Liukuluku"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"float"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"-0.45"}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"text","value":"Merkkijono"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"str"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"Pekka Python\""}]}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"text","value":"Totuusarvo"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"bool"}]}]},{"type":"element","tagName":"td","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun kutsumme funktiota, funktio toimii oikein vain,\njos annamme sille sopivan tyyppiset parametrit.\nTarkastellaan esimerkkinä seuraavaa funktiota:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta_monesti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"viesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kerrat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" kerrat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"viesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kerrat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii mainiosti, jos kutsumme sitä näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tulosta_monesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moikka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moikka\nMoikka\nMoikka\nMoikka\nMoikka"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuitenkaan funktio ei toimi, jos annamme sille väärän tyyppisen parametrin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tulosta_monesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moikka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"TypeError: '>' not supported between instances of 'str' and 'int'"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä ongelmaksi tulee, että funktion jälkimmäistä parametria "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kerrat"}]},{"type":"text","value":" vertaillaan kokonaislukuun 0. Kun parametri on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"text","value":" eikä kokonaisluku, tämä aiheuttaa virheen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme antaa funktion määrittelyssä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tyyppivihjeen"}]},{"type":"text","value":", joka ilmaisee, millaista tietoa parametreihin on tarkoitus sijoittaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta_monesti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"viesti "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kerrat "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" kerrat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"viesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kerrat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä kertoo funktion käyttäjälle, että parametrin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viesti"}]},{"type":"text","value":" on tarkoitus olla merkkijono, kun taas parametrin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kerrat"}]},{"type":"text","value":" on tarkoitus olla kokonaisluku."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaavasti funktion paluuarvon tyypin voi vihjata funktion määrittelyssä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kysy_nimi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mikä on nimesi? \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" nimi"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä kertoo funktion käyttäjälle, että funktion on tarkoitus palauttaa merkkijono."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa kuitenkin, että tyyppivihje ainoastaan neuvoo, mikä tyypin tulisi olla, mutta ei valvo sitä. Jos funktiolle annetaan väärän tyyppinen parametri tai se palauttaa väärän tyyppisen arvon, funktio suoritetaan kuitenkin, mutta se toimii mahdollisesti väärin."}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät lisää funktion parametrien käyttämisestä
  • \n
  • Osaat palauttaa arvon funktiosta ja käyttää sitä kutsukohdassa
  • \n
  • Osaat merkitä tyyppivihjeet parametreille ja paluuarvolle
  • \n

Funktioiden määrittely tapahtuu avainsanan def avulla:

def viesti():\n    print(\"Tämä tulee funktiosta\")

Näin määriteltyä funktiota nimeltä viesti kutsutaan seuraavasti:

viesti()

Tällöin ohjelman tulostus on seuraava:

Tämä tulee funktiosta

Funktion parametrit

Funktiolla voi olla yksi tai useampi parametri. Parametrit määritellään suluissa funktion nimen jälkeen.

Esimerkiksi seuraavassa koodissa funktiolla tervehdi on yksi parametri ja funktiolla summa on kaksi parametria.

def tervehdi(nimi):\n    print(\"Moikka,\", nimi)\n\ndef summa(a, b):\n    print(\"Parametrien summa on\", a + b)
tervehdi(\"Emilia\")\nsumma(2, 3)

Moikka, Emilia\nParametrien summa on 5

Mitä oikeastaan tapahtuu, kun suoritetaan funktiokutsu tervehdi(\"Emilia\")?

Funktion määrittelyssä tervehdi(nimi) oleva nimi on funktion\nmuodollinen parametri. Parametrin nimi on annettu funktion alussa,\nja sitä voidaan käyttää funktiossa muuttujan tavoin.

Funktion kutsussa tervehdi(\"Emilia\") oleva \"Emilia\" on funktion\ntodellinen parametri. Kun funktiota kutsutaan, todellinen parametri\nsijoitetaan muodollisen parametrin arvoksi.

Joskus termillä parametri viitataan muodolliseen parametriin ja\ntermillä argumentti viitataan todelliseen parametriin,\nmutta monet myös käyttävät termejä sekaisin.

Testien virheilmoitukset

Jos ohjelmasi ei toimi oikein, antavat testit enemmän tai vähemmän hyvän virheilmoituksen. Virheilmoitus kannattaa ehdottomasti lukea huolellisesti.

Joissain tilanteissa virheilmoitus ei kerro tarkemmin, mistä on kyse. Esimerkiksi seuraavassa tehtävässä saatat törmätä seuraavaan virheeseen:

\n \n \n \n \n \n \"4\n \n \n

Virhe kertoo, että tehtävän funktiota viiva pitäisi pystyä kutsumaan seuraavasti:

viiva(5, \"\")

Varsinainen ongelma paljastuu, kun kokeillaan, mitä funktiokutsu tekee, eli kopioidaan virheilmoituksen kertoma funktiokutsu koodiin ja painetaan vihreää kolmiota:

\n \n

Tee funktio viiva, joka saa kaksi parametria (leveys, merkkijono). Funktio tulostaa ensimmäisen parametrin määrittämän pituisen viivan käyttäen toisena parametrina olevan merkkijonon ensimmäistä merkkiä. Jos parametrina oleva merkkijono on tyhjä, tulostuu viiva tähtinä.

Käyttöesimerkki:

viiva(7, \"%\")\nviiva(10, \"LOL\")\nviiva(3, \"\")
\n%%%%%%%\nLLLLLLLLLL\n***\n

Sisäkkäiset kutsut

Voimme kutsua funktiota myös toisen funktion sisältä. Esimerkiksi seuraavassa ohjelmassa funktio\ntervehdi_monesti kutsuu funktiota tervehdi halutun määrän kertoja:

def tervehdi(nimi):\n    print(\"Moikka,\", nimi)\n\ndef tervehdi_monesti(nimi, kerrat):\n    while kerrat > 0:\n        tervehdi(nimi)\n        kerrat -= 1\n\ntervehdi_monesti(\"Emilia\", 3)

Moikka, Emilia\nMoikka, Emilia\nMoikka, Emilia

Tee funktio risulaatikko, joka piirtää risuaitamerkkiä käyttäen parametrinsa korkuisen, kymmenen merkkiä leveän risulaatikon.

Funktion tulee kutsua edellisen tehtävän funktiota viiva kaiken tulostuksen tekemiseen! Kopioi edellisen tehtävän funktion koodi tämän tehtävän funktion koodin yläpuolelle. Älä muuta funktiota mitenkään!

Pari käyttöesimerkkiä:

risulaatikko(5)\nprint()\nrisulaatikko(2)
\n##########\n##########\n##########\n##########\n##########\n\n##########\n##########\n

Tee funktio risunelio, joka piirtää risuaitamerkkiä käyttäen parametrinsa kokoisen risuneliön.

Funktion tulee kutsua edellisen tehtävän funktiota viiva kaiken tulostuksen tekemiseen! Kopioi edellisen tehtävän funktion koodi tämän tehtävän funktion koodin yläpuolelle. Älä muuta funktiota mitenkaan!

Pari käyttöesimerkkiä:

risunelio(5)\nprint()\nrisunelio(3)
\n#####\n#####\n#####\n#####\n#####\n\n###\n###\n###\n

Tee funktio nelio, joka saa kaksi parametria. Funktio tulostaa neliön jonka korkeuden ja leveyden kertoo ensimmäinen parametri. Toinen parametri määrittelee mitä merkkiä käyttäen neliö piirretään.

Funktion tulee kutsua edellisen tehtävän funktiota viiva kaiken tulostuksen tekemiseen! Kopioi edellisen tehtävän funktion koodi tämän tehtävän funktion koodin yläpuolelle. Älä muuta funktiota mitenkaan!

Pari käyttöesimerkkiä:

nelio(5, \"*\")\nprint()\nnelio(3, \"o\")
\n*****\n*****\n*****\n*****\n*****\n\nooo\nooo\nooo\n

Tee funktio kolmio, joka piirtää risuaitamerkkiä käyttäen parametrinsa korkuisen ja levyisen, risuaitakolmion.

Funktion tulee kutsua edellisen tehtävän funktiota viiva kaiken tulostuksen tekemiseen! Kopioi edellisen tehtävän funktion koodi tämän tehtävän funktion koodin yläpuolelle. Älä muuta funktiota mitenkaan!

Pari käyttöesimerkkiä:

kolmio(6)\nprint()\nkolmio(3)
\n#\n##\n###\n####\n#####\n######\n\n#\n##\n###\n

Tee funktio kuvio, joka saa neljä parametria. Funktio tulostaa kuvion, jonka yläosana on kahden ensimmäisen parametrin määrittelemä kolmio ja alaosana ensimmäisen ja kahden jälkimmäisen parametrin määrittelemä suorakulmio.

Funktion tulee kutsua edellisen tehtävän funktiota viiva kaiken tulostuksen tekemiseen! Kopioi edellisen tehtävän funktion koodi tämän tehtävän funktion koodin yläpuolelle.

Pari käyttöesimerkkiä:

kuvio(5, \"X\", 3, \"*\")\nprint()\nkuvio(2, \"o\", 4, \"+\")\nprint()\nkuvio(3, \".\", 0, \",\")
\nX\nXX\nXXX\nXXXX\nXXXXX\n*****\n*****\n*****\n\no\noo\n++\n++\n++\n++\n\n.\n..\n...\n

Vihje

Älä yritä ratkaista tehtävässä \"kaikkia asioita\" yhtä aikaa. Keskity ensin esim. siihen että saat kuvion yläosan kolmion piirtymään oikein, ja vasta sen jälkeen jatka kuvion täydentämistä alaosan suorakulmiolla.

Tämä on ylipäätänsäkin ohjelmoinnissa erittäin tärkeää: keskity pieniin osiin kerrallaan, varmista että ne toimivat ennen kuin laajennat ratkaisuasi.

Tee funktio joulukuusi, joka saa yhden parametrin. Funktio tulostaa tekstin joulukuusi! ja parametrinsa kokoisen joulukuusen.

Esim. kutsuttaessa joulukuusi(3) tulostuu

\njoulukuusi!\n  *\n ***\n*****\n  *\n

Esim. kutsuttaessa joulukuusi(5) tulostuu

\njoulukuusi!\n    *\n   ***\n  *****\n *******\n*********\n    *\n

Huomaa, että joulukuusen vasemmalla puolella pitää olla täsmälleen oikea määrä välilyöntejä. Eli vaikka kuusen muoto olisi täysin oikea, mutta sen alin \"neulastaso\" ei lähde ruudun vasemmasta reunasta, ei vastaus kelpaa testeille.

Funktion paluuarvo

Funktiot voivat myös palauttaa arvoja. Esimerkiksi Pythonin valmis funktio input palauttaa käyttäjän antaman syötteen. Funktion palauttama arvo voidaan esimerkiksi sijoittaa muuttujaan:

sana = input(\"Anna sana: \")

Myös kokonaislukujen lukemisessa yhdessä funktion input kanssa käytettävä funktio int palauttaa arvon:

luku = int(input(\"Anna kokonaisluku: \"))

Funktio int saa parametrinaan funktion input palauttaman merkkijonon ja palauttaa sen kokonaislukutyyppisenä.

Funktion arvon palauttaminen return-komennolla

Myös itse määrittelemämme funktiot voivat palauttaa arvoja käyttämällä komentoa return. Esimerkiksi seuraava funktio summa palauttaa annettujen lukujen summan:

def summa(a, b):\n    return a + b\n\nvastaus = summa(2, 3)\n\nprint(\"Summa:\", vastaus)

Summa: 5

Seuraavassa on vielä toinen esimerkki, jossa funktio kysyy käyttäjän nimen ja palauttaa sen:

def kysy_nimi():\n    nimi = input(\"Mikä on nimesi? \")\n    return nimi\n\nnimi = kysy_nimi()\nprint(\"Moikka,\", nimi)

Mikä on nimesi? Anna\nMoikka, Anna

Kannattaa huomata, että komento return lopettaa funktion suorituksen saman tien. Niinpä voimme tehdä seuraavan funktion:

def pienin(a,b):\n    if a < b:\n        return a\n    return b\n\nprint(pienin(3, 7))\nprint(pienin(5, 2))

Tässä ideana on, että jos a on pienempi kuin b, niin funktio palauttaa arvon a ja päättyy. Muuten funktion suoritus jatkuu eteenpäin, jolloin se palauttaa arvon b.

3\n2

Voimme myös käyttää return-komentoa siihen, että poistumme funktiosta palauttamatta mitään:

def tervehdi(nimi):\n    if nimi == \"\":\n        print(\"???\")\n        return\n    print(\"Moikka,\", nimi)\n\ntervehdi(\"Emilia\")\ntervehdi(\"\")\ntervehdi(\"Matti\")

Jos nimi on tyhjä merkkijono, niin funktio tulostaa ??? ja päättyy.

Moikka, Emilia\n???\nMoikka, Matti

Funktion paluuarvojen käyttö

Kuten olemme jo nähneet, funktioiden paluuarvoja on mahdollista sijoittaa muuttujiin:

def summa(a, b):\n    return a + b\n\ntulos = summa(4, 6)\nprint(\"Summa on\", tulos)

Summa on 10

Koska funktion paluuarvo käyttäytyy kuten mikä tahansa arvo, ei apumuuttuja ole tarpeen ja paluuarvoa on mahdollista käyttää suoraan komennon print parametrina:

print(\"Summa on\", summa(4, 6))

Voimme myös antaa funktion palauttaman arvon toiselle funktiolle:

def summa(a, b):\n    return a+b\n\ndef erotus(a, b):\n    return a-b\n\ntulos = erotus(summa(5, 2), summa(2, 3))\nprint(\"Vastaus on\", tulos)

Vastaus on 2

Tässä tapauksessa suoritetaan ensin sisemmät funktiokutsut summa(5, 2) ja summa(2, 3), joiden palauttamat arvot 7 ja 5 käytetään ulomman funktiokutsun parametreina.

Ulompi funktiokutsu erotus(7, 5) palauttaa arvon 2, joka sijoitetaan muuttujan tulos arvoksi ja tulostetaan ruudulle.

Funktioiden palauttamat arvot toimivat täysin samalla tavalla kuin mitkä tahansa arvot Pythonissa. Niitä voidaan tulostaa, sijoittaa muuttujaan, käyttää osana lausekkeita tai käyttää parametreina muissa funktiokutsuissa.

Arvon palauttaminen, return ja print

Joskus aloittelija hämmentyy funktioiden paluuarvon ja funktiossa tapahtuvan tulostuksen välistä eroa. Tarkastellaan kahta versiota funktiosta, joka selvittää kahden parametrinsa maksimiarvon:

def maksimi1(a, b):\n    if a > b:\n        return a\n    else:\n        return b\n\ndef maksimi2(a, b):\n    if a > b:\n        print(a)\n    else:\n        print(b)\n\nvastaus = maksimi1(3, 5)\nprint(vastaus)\n\nmaksimi2(7, 2)

5\n7

Molemmat funktiot näyttävät toimivan hyvin, kumpikin selvittää maksimiarvon. Funktioissa on kuitenkin eräs ratkaiseva ero. Funktioista ensimmäinen maksimi1 palauttaa selvittämänsä arvon. Se ei itse tulosta mitään, eli jos suoritetaan koodi

maksimi1(3, 5)

ei näytä tapahtuvan mitään. Funktion paluuarvo on siis otettava talteen muuttujaan, jos se halutaan tulostaa:

vastaus = maksimi1(3, 5)\nprint(vastaus)

Funktioista toinen maksimi2 taas tulostaa itse print-komentoa käyttäen lukujen maksimin, eli riittää kutsua

maksimi2(7, 5)

ja maksimi tulostuu ruudulle. Tämän funktion huono puoli on kuitenkin se, että funktion selvittämää arvoa ei ole mahdollista saada funktion ulkopuolelle muun ohjelman käsiteltäväksi. Tämän takia arvon palauttava funktio on useimmiten parempi vaihtoehto.

Tee funktio luvuista_suurin, joka saa parametriksi kolme kokonaislukua. Funktio palauttaa return-lausetta käyttäen luvuista suurimman.

Käyttöesimerkki

print(luvuista_suurin(3, 4, 1)) # 4\nprint(luvuista_suurin(99, -4, 7)) # 99\nprint(luvuista_suurin(0, 0, 0)) # 0

Tee funktio samat, joka saa parametriksi merkkijonon ja kaksi merkkijonon indeksejä kuvaavaa kokonaislukua. Funktio palauttaa return-lausetta käyttäen tiedon (True tai False) siitä, ovatko merkkijonon parametreina olevien indeksien osoittamissa paikoissa olevat merkit samat. Jos jompikumpi indekseistä ei osu merkkijonon sisälle, palauttaa metodi False.

Muutama esimerkki:

# samat merkit o ja o\nprint(samat(\"koodari\", 1, 2)) # True\n\n# eri merkit k ja a\nprint(samat(\"koodari\", 0, 4)) # False\n\n# toinen indeksi ei ole merkkijonon sisällä\nprint(samat(\"koodari\", 0, 10)) # False

Tee kolme funktiota: eka_sana, toka_sana ja vika_sana. Jokainen funktioista saa parametrikseen lauseen (eli merkkijonon).

Funktiot palauttavat nimensä mukaisesti lauseen ensimmäisen, toisen tai viimeisen sanan.

Voit olettaa jokaisessa tapauksessa, että merkkijono koostuu vähintään kahdesta sanasta, ja että sanojen välillä on aina täsmälleen yksi välilyönti, ja että merkkijonon alussa ja lopussa ei ole välilyöntejä.

lause = \"olipa kerran kauan sitten ohjelmoija\"\n\nprint(eka_sana(lause)) # olipa\nprint(toka_sana(lause)) # kerran\nprint(vika_sana(lause)) # ohjelmoija

olipa\nkerran\nohjelmoija

lause = \"olipa kerran\"\n\nprint(toka_sana(lause)) # kerran\nprint(vika_sana(lause)) # kerran

Parametrin tyyppi

Kerrataan vielä tähän mennessä läpikäydyt tyypit:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TyyppiPythonissaEsimerkki
Kokonaislukuint23
Liukulukufloat-0.45
Merkkijonostr\"Pekka Python\"
TotuusarvoboolTrue

Kun kutsumme funktiota, funktio toimii oikein vain,\njos annamme sille sopivan tyyppiset parametrit.\nTarkastellaan esimerkkinä seuraavaa funktiota:

def tulosta_monesti(viesti, kerrat):\n    while kerrat > 0:\n        print(viesti)\n        kerrat -= 1

Funktio toimii mainiosti, jos kutsumme sitä näin:

tulosta_monesti(\"Moikka\", 5)

Moikka\nMoikka\nMoikka\nMoikka\nMoikka

Kuitenkaan funktio ei toimi, jos annamme sille väärän tyyppisen parametrin:

tulosta_monesti(\"Moikka\", \"Emilia\")

TypeError: '>' not supported between instances of 'str' and 'int'

Tässä ongelmaksi tulee, että funktion jälkimmäistä parametria kerrat vertaillaan kokonaislukuun 0. Kun parametri on \"Emilia\" eikä kokonaisluku, tämä aiheuttaa virheen.

Voimme antaa funktion määrittelyssä tyyppivihjeen, joka ilmaisee, millaista tietoa parametreihin on tarkoitus sijoittaa:

def tulosta_monesti(viesti : str, kerrat : int):\n    while kerrat > 0:\n        print(viesti)\n        kerrat -= 1

Tämä kertoo funktion käyttäjälle, että parametrin viesti on tarkoitus olla merkkijono, kun taas parametrin kerrat on tarkoitus olla kokonaisluku.

Vastaavasti funktion paluuarvon tyypin voi vihjata funktion määrittelyssä:

def kysy_nimi() -> str:\n    nimi = input(\"Mikä on nimesi? \")\n    return nimi

Tämä kertoo funktion käyttäjälle, että funktion on tarkoitus palauttaa merkkijono.

Huomaa kuitenkin, että tyyppivihje ainoastaan neuvoo, mikä tyypin tulisi olla, mutta ei valvo sitä. Jos funktiolle annetaan väärän tyyppinen parametri tai se palauttaa väärän tyyppisen arvon, funktio suoritetaan kuitenkin, mutta se toimii mahdollisesti väärin.

","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-4/2-lisaa-funktioista.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-4/3-listat/page-data.json b/page-data/osa-4/3-listat/page-data.json index 21970c404..61b94f8a8 100644 --- a/page-data/osa-4/3-listat/page-data.json +++ b/page-data/osa-4/3-listat/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-4/3-listat", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä lista tarkoittaa ohjelmoinnissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat viitata listan yksittäisiin alkioihin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat lisätä ja poistaa listan alkioita"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat hyödyntää valmiita funktioita ja metodeita listojen käsittelyyn"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tähän asti olemme tallentaneet ohjelmissa käytettävää tietoa muuttujien avulla. Yksittäisillä muuttujilla on kuitenkin rajoituksensa. Jos ohjelman käsittelemä tiedon määrä on vaihteleva ja saattaa olla suuri, olisi vaivalloista määritellä jokaiselle arvolle erillinen muuttuja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Lista"}]},{"type":"text","value":" on kokoelma tietoa, johon viitataan yhteisen nimen kautta. Listan sisältö kirjoitetaan hakasulkeiden sisään, ja jokaista listalla olevaa arvoa kutsutaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"alkioksi"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraava koodi luo uuden tyhjän listan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava koodi puolestaan luo listan, jossa on valmiina viisi alkiota:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"listan-alkioihin-viittaaminen","style":"position:relative;"},"children":[{"type":"text","value":"Listan alkioihin viittaaminen"},{"type":"element","tagName":"a","properties":{"href":"#listan-alkioihin-viittaaminen","ariaLabel":"listan alkioihin viittaaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Listan alkiot on indeksoitu samalla tavalla kuin merkkijonon yksittäiset merkit. Tässäkin tapauksessa indeksointi alkaa nollasta:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 581px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/0c718cff85e5c83bbec15a7ce1a29896/92d15/4_2_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 26.08695652173913%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAvUlEQVQY031QWQqEMBTr/a/jWQQFFxRBtIL7vkQS6DDzM4WQvjRN36tZlgVt22IcR5zniXmesW0b1nUV9n3HcRwfjfW/Zb4LmnnpeR7c9y12e4LL6eTrurRnI87zE1jXNZIkkYkd0UiwQz7GADI19zhDOCVr3jMccZomgWMT1lqZhmEQ86zve32Hq93X0N91nYJ934cpyxJFUUhsmkZh7DLLMoRhiDRNEUURgiCQTsRxLM7zXGcMqqoKnufhBUAvgMcmbGmAAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/0c718cff85e5c83bbec15a7ce1a29896/a0b58/4_2_1.webp 230w","/static/0c718cff85e5c83bbec15a7ce1a29896/bc10c/4_2_1.webp 460w","/static/0c718cff85e5c83bbec15a7ce1a29896/39daa/4_2_1.webp 581w"],"sizes":"(max-width: 581px) 100vw, 581px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/0c718cff85e5c83bbec15a7ce1a29896/81c8e/4_2_1.png 230w","/static/0c718cff85e5c83bbec15a7ce1a29896/08a84/4_2_1.png 460w","/static/0c718cff85e5c83bbec15a7ce1a29896/92d15/4_2_1.png 581w"],"sizes":"(max-width: 581px) 100vw, 581px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/0c718cff85e5c83bbec15a7ce1a29896/92d15/4_2_1.png","alt":"Lista indeksoidaan nollasta alkaen","title":"Lista indeksoidaan nollasta alkaen","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yksittäiseen listan alkioon voidaan viitata samalla tavalla kuin merkkijonon yksittäisiin merkkeihin hakasulkujen avulla. Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kahden ekan summa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"7\n2\n5\nKahden ekan summa: 9"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme tulostaa listan koko sisällön näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[7, 2, 2, 5, 2]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Listan alkioita voidaan myös muuttaa. Alkion arvon muuttaminen tapahtuu sijoittamalla uusi arvo vanhan paikalle – siis samalla tavalla kuin muuttujia käytettäessä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[7, 2, 2, 5, 2]\n[7, 3, 2, 5, 2]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"len"}]},{"type":"text","value":" antaa listan alkioiden määrän:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"5"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Alkioiden arvojen muutokset","tmcname":"osa04-07a_alkioiden_arvojen_muutokset"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka alustaa listan jossa on arvot "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[1, 2, 3, 4, 5]"}]},{"type":"text","value":". Tämän jälkeen ohjelma kysyy käyttäjältä alkion indeksin ja uuden arvon, vaihtaa kyseisen alkion arvon ja tulostaa listan uudelleen. Ohjelman suoritus päättyy, jos käyttäjä antaa alkion indeksiksi -1."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuoritus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna indeksi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nAnna arvo: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n[10, 2, 3, 4, 5]\nAnna indeksi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nAnna arvo: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"250"}]},{"type":"text","value":"\n[10, 2, 250, 4, 5]\nAnna indeksi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nAnna arvo: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-45"}]},{"type":"text","value":"\n[10, 2, 250, 4, -45]\nAnna indeksi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-1"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"h2","properties":{"id":"alkioiden-lisaaminen-ja-poistaminen","style":"position:relative;"},"children":[{"type":"text","value":"Alkioiden lisääminen ja poistaminen"},{"type":"element","tagName":"a","properties":{"href":"#alkioiden-lisaaminen-ja-poistaminen","ariaLabel":"alkioiden lisaaminen ja poistaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Listan loppuun voidaan lisätä uusia alkioita "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"append"}]},{"type":"text","value":"-metodin avulla. Metodia käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nluvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[5, 10, 3]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa esimerkissä ohjelman käytössä on kaksi erillistä listaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nkengannumerot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nluvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkengannumerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"37"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkengannumerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"44"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkengannumerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"40"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkengannumerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"28"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luvut:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kengännumerot:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kengannumerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisäys menee siis siihen listaan, mihin metodikutsu kohdistetaan:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luvut:\n[5, 10, 3]\nKengännumerot:\n[37, 44, 40, 28]"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Alkioiden lisäys listaan","tmcname":"osa04-07b_alkoiden_lisays_listaan"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä ensin lukujen määrän. Sen jälkeen ohjelma pyytää käyttäjää syöttämään annetun määrän lukuja yksitellen ja lisää ne listaan samassa järjestyksessä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lopuksi lista tulostetaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuoritus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuinka monta lukua: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nAnna luku 1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\nAnna luku 2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"250"}]},{"type":"text","value":"\nAnna luku 3: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"34"}]},{"type":"text","value":"\n[10, 250, 34]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mikäli halutaan lisätä alkio johonkin muualle kuin listan loppuun, voidaan käyttää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"insert"}]},{"type":"text","value":"-metodia. Metodi lisää alkion halutun indeksin paikalle. Kaikkia listalla valmiina olevia alkioita lisäyspaikasta alkaen siirretään yhdellä askeleella eteenpäin:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 632px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/fbc699b555a562e011de8d156d23ff29/084e2/4_2_2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 65.21739130434783%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAABTklEQVQ4y62S3W7CMAyF+xZ75d3spfYUu0JCSAUEbZP0v5Qe9AU5Q91Au5glK47jHNvHzqqq0n6/V9M0CiGorutkd12nYRjUtm30YyPLsvyqSKZ/FECfAvZ9HwMul4umaUpqd6pFuaOpwnmeo+N6vcpsAqGC1mnVex/VKLHTOZf8RkcGf9vtVkVR6Hg8RjvPc53P5+gDmI92GiAdlGUZFR98P+WQasdxjMpAAHtUQNb3BMgHMnOS2bJbC4Dzxgc7D4dDjDEfSvIIaATbycOa6LVABW2S7M9TXu/bmhIGRmdryV4t6bc9axg6OXefNmDwttlsfmzByz1E5nnRNEltO6tp6sSbrY7xijKgyKENwYKtghBaeZ/L+w+F8CnvR4Vwr4Q4qnrcS3wZO8fuAXA6nbTb7eIUq6qUc71C+FIIb3LuXWUpeV+kRTZghoRNcTeEg/JdQzeckwAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/fbc699b555a562e011de8d156d23ff29/a0b58/4_2_2.webp 230w","/static/fbc699b555a562e011de8d156d23ff29/bc10c/4_2_2.webp 460w","/static/fbc699b555a562e011de8d156d23ff29/59680/4_2_2.webp 632w"],"sizes":"(max-width: 632px) 100vw, 632px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/fbc699b555a562e011de8d156d23ff29/81c8e/4_2_2.png 230w","/static/fbc699b555a562e011de8d156d23ff29/08a84/4_2_2.png 460w","/static/fbc699b555a562e011de8d156d23ff29/084e2/4_2_2.png 632w"],"sizes":"(max-width: 632px) 100vw, 632px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/fbc699b555a562e011de8d156d23ff29/084e2/4_2_2.png","alt":"Alkion lisäys listaan","title":"Alkion lisäys listaan","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nluvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"insert"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"insert"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[10, 1, 2, 3, 4, 5, 6]\n[10, 1, 20, 2, 3, 4, 5, 6]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Alkioita voidaan poistaa listasta kahden eri lähtökohdan mukaisesti:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Jos tiedetään, "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"missä"}]},{"type":"text","value":" poistettava alkio sijaitsee, voidaan käyttää metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pop"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Jos tiedetään, "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"mikä"}]},{"type":"text","value":" poistettavan alkion arvo on, käytetään metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"remove"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodille "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pop"}]},{"type":"text","value":" annetaan poistettavan alkion indeksi. Esimerkiksi seuraava koodi poistaa listalta alkiot kohdista 2 ja 3. Huomaa, että alkioiden indeksit muuttuvat poiston jälkeen."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pop"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pop"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 2, 4, 5, 6]\n[1, 2, 4, 6]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pop"}]},{"type":"text","value":" myös "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"palauttaa"}]},{"type":"text","value":" poistetun listan alkion:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pop"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"7\n[4, 2, 2, 5]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodille "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"remove"}]},{"type":"text","value":" annetaan indeksin sijasta poistettavan alkion arvo. Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"remove"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"remove"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 3, 4, 5, 6]\n[1, 3, 4, 6]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että metodi poistaa listalta "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ensimmäisen"}]},{"type":"text","value":" alkion, jolla on annettu arvo:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"remove"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"remove"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[2, 1, 2]\n[2, 2]"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Lisäys ja poisto","tmcname":"osa04-07c_lisays_ja_poisto"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka pyytää käyttäjää valitsemaan alkion lisäyksen tai poiston. Sekä lisäys että poisto tehdään listan loppuun. Lisättävän alkion arvo on aina yhtä suurempi kuin listan viimeinen alkio (tai 1, jos listassa ei ole alkioita)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joka operaation välissä lista tulostetaan. Katso esimerkkiä seuraavasta tulosteesta:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lista on nyt []\n(l)isää, (p)oista vai e(x)it: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"l"}]},{"type":"text","value":"\nLista on nyt [1]\n(l)isää, (p)oista vai e(x)it: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"l"}]},{"type":"text","value":"\nLista on nyt [1, 2]\n(l)isää, (p)oista vai e(x)it: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"l"}]},{"type":"text","value":"\nLista on nyt [1, 2, 3]\n(l)isää, (p)oista vai e(x)it: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"p"}]},{"type":"text","value":"\nLista on nyt [1, 2]\n(l)isää, (p)oista vai e(x)it: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"l"}]},{"type":"text","value":"\nLista on nyt [1, 2, 3]\n(l)isää, (p)oista vai e(x)it: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"x"}]},{"type":"text","value":"\nMoi!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa, että listalta ei yritetä poistaa alkioita, jos lista on tyhjä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos listalla ei ole poistettavaa alkiota, seuraa virhe. Merkkijonoista tutulla tavalla alkion olemassaolon listalla voi testata "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":"-operaattorin avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Listalla on alkio 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"listalla on alkio 2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Listalla on alkio 1"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sama sana kahdesti","tmcname":"osa04-08_sama_sana_kahdesti"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kyselee käyttäjältä sanoja. Kun käyttäjä syöttää jonkin sanan kahdesti, ohjelma tulostaa eri sanojen määrän ja lopettaa toimintansa."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"olipa"}]},{"type":"text","value":"\nsana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kerran"}]},{"type":"text","value":"\nsana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kauan"}]},{"type":"text","value":"\nsana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"sitten"}]},{"type":"text","value":"\nsana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kerran"}]},{"type":"text","value":"\nAnnoit 4 eri sanaa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"h2","properties":{"id":"listan-jarjestaminen","style":"position:relative;"},"children":[{"type":"text","value":"Listan järjestäminen"},{"type":"element","tagName":"a","properties":{"href":"#listan-jarjestaminen","ariaLabel":"listan jarjestaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Listan alkiot voidaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"järjestää"}]},{"type":"text","value":" pienimmästä suurimpaan metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sort"}]},{"type":"text","value":" avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sort"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 2, 2, 4, 5]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen tapa on käyttää funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sorted"}]},{"type":"text","value":", joka "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"palauttaa"}]},{"type":"text","value":" järjestetyn listan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 2, 2, 4, 5]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa ero näissä tavoissa: "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sort"}]},{"type":"text","value":" muuttaa listan sisällön järjestetyksi, kun taas "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sorted"}]},{"type":"text","value":" luo uuden järjestetyn listan. Jälkimmäisessä tavassa voimme säilyttää myös listan alkuperäisen järjestyksen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"alkuperainen "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\njarjestetty "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkuperainen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkuperainen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jarjestetty"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[2, 5, 1, 2, 4]\n[1, 2, 2, 4, 5]"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Lista kahdesti","tmcname":"osa04-08b_lista_kahdesti"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä lukuja ja lisää niitä listaan. Lista tulostetaan jokaisen luvun lisäyksen jälkeen kahdella eri tavalla:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"alkiot lisäysjärjestyksessä ja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"järjestettynä pienimmästä suurimpaan alkioon"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suoritus päättyy, kun käyttäjä syöttää luvun 0."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuoritus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nLista: [3]\nJärjestettynä: [3]\nAnna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nLista: [3, 1]\nJärjestettynä: [1, 3]\nAnna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"9"}]},{"type":"text","value":"\nLista: [3, 1, 9]\nJärjestettynä: [1, 3, 9]\nAnna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nLista: [3, 1, 9, 5]\nJärjestettynä: [1, 3, 5, 9]\nAnna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nMoi!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"h2","properties":{"id":"suurin-pienin-ja-summa","style":"position:relative;"},"children":[{"type":"text","value":"Suurin, pienin ja summa"},{"type":"element","tagName":"a","properties":{"href":"#suurin-pienin-ja-summa","ariaLabel":"suurin pienin ja summa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiot "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"max"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"min"}]},{"type":"text","value":" antavat listan suurimman ja pienimmän alkion.\nFunktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sum"}]},{"type":"text","value":" puolestaan laskee listan alkioiden summan."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nsuurin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"max"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npienin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"min"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sum"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pienin:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pienin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suurin:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" suurin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Summa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pienin: 1\nSuurin: 5\nSumma: 15"}]}]},{"type":"element","tagName":"h2","properties":{"id":"metodit-vs-funktiot","style":"position:relative;"},"children":[{"type":"text","value":"Metodit vs. funktiot"},{"type":"element","tagName":"a","properties":{"href":"#metodit-vs-funktiot","ariaLabel":"metodit vs funktiot permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa on ehkä hieman hämmentävästi käytössä kaksi eri tapaa listojen käsittelyyn."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Suurin osa käsittelystä tapahtuu "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"metodien"}]},{"type":"text","value":" avulla. Esimerkiksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"append"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sort"}]},{"type":"text","value":" ovat metodeja, joita kutsutaan listamuuttujan kautta pistenotaatiolla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# metodikutsuja"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# metodikutsu"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sort"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sen sijaan esimerkiksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"max"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"min"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"len"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sorted"}]},{"type":"text","value":" ovat "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"funktioita"}]},{"type":"text","value":", joille lista annetaan parametrina:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# funktiokutsuissa lista on parametrina"}]},{"type":"text","value":"\nsuurin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"max"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npienin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"min"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pienin:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pienin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suurin:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" suurin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Listan pituus:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# funktiokutsu: lista on parametrina, järjestetty lista paluuarvona"}]},{"type":"text","value":"\njarjestyksessa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jarjestyksessa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pienin: 1\nSuurin: 7\nListan pituus: 4\n[1, 2, 3, 7]"}]}]},{"type":"element","tagName":"h2","properties":{"id":"lista-funktion-parametrina-ja-paluuarvona","style":"position:relative;"},"children":[{"type":"text","value":"Lista funktion parametrina ja paluuarvona"},{"type":"element","tagName":"a","properties":{"href":"#lista-funktion-parametrina-ja-paluuarvona","ariaLabel":"lista funktion parametrina ja paluuarvona permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Itse tekemiemme funktioiden parametreina voi olla myös listoja. Seuraavassa on funktio, joka selvittää parametrina listan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"mediaanin"}]},{"type":"text","value":" eli keskimmäisen alkion järjestetyssä listassa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"mediaani"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n jarjestetty "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n keskikohta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jarjestetty"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"//"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" jarjestetty"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"keskikohta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio selvittää mediaanin tekemällä parametrinaan saamasta listasta järjestetyn version ja palauttamalla sen keskimmäisen alkion. Huomaa, että käytössä on kokonaislukujakolasku "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"//"}]},{"type":"text","value":", koska listan indeksin tulee olla kokonaisluku."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kengannumerot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"45"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"44"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"36"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"39"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"40"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kengännumeroiden mediaani on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" mediaani"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kengannumerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\niat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"56"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"34"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"22"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"77"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ikien mediaani on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" mediaani"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"iat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kengännumeroiden mediaani on 40\nIkien mediaani on 22"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio voi myös palauttaa listan. Seuraavassa on funktio, joka palauttaa listan käyttäjän syöttämiä kokonaislukuja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lue_luvut"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n syote "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku (tyhjä lopettaa): \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" luvut"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio käyttää lista-tyyppistä apumuuttujaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luvut"}]},{"type":"text","value":", johon se lisää kaikki käyttäjän antamat luvut. Silmukan jälkeen funktio palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":"-komennon avulla listan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luvut"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiota käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue_luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suurin luku on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"max"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lukujen mediaani on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" mediaani"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku (tyhjä lopettaa): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nAnna luku (tyhjä lopettaa): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-22"}]},{"type":"text","value":"\nAnna luku (tyhjä lopettaa): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nAnna luku (tyhjä lopettaa): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"35"}]},{"type":"text","value":"\nAnna luku (tyhjä lopettaa): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nAnna luku (tyhjä lopettaa):\nSuurin luku on 35\nLukujen mediaani on 4"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pieni esimerkkiohjelmamme demonstroi jo yhtä funktioiden tärkeimmistä käyttötarkoituksista: niiden avulla ohjelma saadaan jaettua loogisiin selkeästi ymmärrettäviin kokonaisuuksiin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sinänsä sama ohjelma olisi voitu tehdä myös ilman funktiota:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n syote "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku (tyhjä lopettaa): \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\njarjestetty "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkeskikohta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jarjestetty"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"//"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nmediaani "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" jarjestetty"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"keskikohta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suurin luku on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"max"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lukujen mediaani on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" mediaani"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt kuitenkin ohjelman logiikan seuraaminen on vaikeampaa, koska ei ole enää yhtä selvää, mitkä komennot liittyvät minkäkin kokonaisuuden (syötteiden lukeminen, mediaanin laskeminen, ohjelman muu toiminta) toteuttamiseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jako funktioiksi siis selkeyttää koodin rakennetta ja tuo esille loogisia kokonaisuuksia. Tämän ansiosta on myös helpompaa varmistaa, että ohjelma toimii halutulla tavalla, koska voimme testata erikseen tiettyä funktiota (esim. toimiiko funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"mediaani"}]},{"type":"text","value":" oikein)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman rakenteen loogisen jakamisen lisäksi funktioiden toinen käyttötarkoitus on koodin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"uusiokäyttö"}]},{"type":"text","value":". Jos ohjelmassa on tarvetta tehdä samankaltainen operaatio useaan kertaan, kannattaa sitä varten luoda oma selkeästi nimetty funktio:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kengännumerot:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkengat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue_luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Painot:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npainot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue_luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pituudet:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npituudet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue_luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Listan pituus","tmcname":"osa04-09_listan_pituus"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pituus"}]},{"type":"text","value":", joka palauttaa parametrinaan saamansa listan pituuden."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nvastaus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vastaus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vastaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# huomaa, että voit kutsua funktiota myös antamalla listan suoraan funktion parametriksi"}]},{"type":"text","value":"\nvastaus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vastaus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vastaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"vastaus 5\nvastaus 4"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Keskiarvo","tmcname":"osa04-10_keskiarvo"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"keskiarvo"}]},{"type":"text","value":", joka palauttaa parametrinaan saamansa kokonaislukuja sisältävän listan alkioiden keskiarvon."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nvastaus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" keskiarvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vastaus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vastaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"vastaus 3.0"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Vaihteluväli","tmcname":"osa04-11_vaihteluvali"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vaihteluvali"}]},{"type":"text","value":", joka palauttaa parametrinaan saamansa kokonaislukuja sisältävän listan vaihteluvälin (eli suurimman ja pienimmän alkion erotuksen)."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nvastaus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" vaihteluvali"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vastaus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vastaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"vastaus 4"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"lisaa-listan-kasittelysta","style":"position:relative;"},"children":[{"type":"text","value":"Lisää listan käsittelystä"},{"type":"element","tagName":"a","properties":{"href":"#lisaa-listan-kasittelysta","ariaLabel":"lisaa listan kasittelysta permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa on paljon muitakin mahdollisuuksia listan käsittelyyn. Voit tutustua niihin Pythonin "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/tutorial/datastructures.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"dokumentaation"}]},{"type":"text","value":" kautta."}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, mitä lista tarkoittaa ohjelmoinnissa
  • \n
  • Osaat viitata listan yksittäisiin alkioihin
  • \n
  • Osaat lisätä ja poistaa listan alkioita
  • \n
  • Osaat hyödyntää valmiita funktioita ja metodeita listojen käsittelyyn
  • \n

Tähän asti olemme tallentaneet ohjelmissa käytettävää tietoa muuttujien avulla. Yksittäisillä muuttujilla on kuitenkin rajoituksensa. Jos ohjelman käsittelemä tiedon määrä on vaihteleva ja saattaa olla suuri, olisi vaivalloista määritellä jokaiselle arvolle erillinen muuttuja.

Lista on kokoelma tietoa, johon viitataan yhteisen nimen kautta. Listan sisältö kirjoitetaan hakasulkeiden sisään, ja jokaista listalla olevaa arvoa kutsutaan alkioksi.

Esimerkiksi seuraava koodi luo uuden tyhjän listan:

lista = []

Seuraava koodi puolestaan luo listan, jossa on valmiina viisi alkiota:

lista = [7, 2, 2, 5, 2]

Listan alkioihin viittaaminen

Listan alkiot on indeksoitu samalla tavalla kuin merkkijonon yksittäiset merkit. Tässäkin tapauksessa indeksointi alkaa nollasta:

\n \n \n \n \n \n \"Lista\n \n \n

Yksittäiseen listan alkioon voidaan viitata samalla tavalla kuin merkkijonon yksittäisiin merkkeihin hakasulkujen avulla. Esimerkiksi:

lista = [7, 2, 2, 5, 2]\n\nprint(lista[0])\nprint(lista[1])\nprint(lista[3])\n\nprint(\"Kahden ekan summa:\", lista[0] + lista[1])

7\n2\n5\nKahden ekan summa: 9

Voimme tulostaa listan koko sisällön näin:

lista = [7, 2, 2, 5, 2]\nprint(lista)

[7, 2, 2, 5, 2]

Listan alkioita voidaan myös muuttaa. Alkion arvon muuttaminen tapahtuu sijoittamalla uusi arvo vanhan paikalle – siis samalla tavalla kuin muuttujia käytettäessä:

lista = [7, 2, 2, 5, 2]\nprint(lista)\nlista[1] = 3\nprint(lista)

[7, 2, 2, 5, 2]\n[7, 3, 2, 5, 2]

Funktio len antaa listan alkioiden määrän:

lista = [7, 2, 2, 5, 2]\nprint(len(lista))

5

Tee ohjelma, joka alustaa listan jossa on arvot [1, 2, 3, 4, 5]. Tämän jälkeen ohjelma kysyy käyttäjältä alkion indeksin ja uuden arvon, vaihtaa kyseisen alkion arvon ja tulostaa listan uudelleen. Ohjelman suoritus päättyy, jos käyttäjä antaa alkion indeksiksi -1.

Esimerkkisuoritus:

Anna indeksi: 0\nAnna arvo: 10\n[10, 2, 3, 4, 5]\nAnna indeksi: 2\nAnna arvo: 250\n[10, 2, 250, 4, 5]\nAnna indeksi: 4\nAnna arvo: -45\n[10, 2, 250, 4, -45]\nAnna indeksi: -1

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Alkioiden lisääminen ja poistaminen

Listan loppuun voidaan lisätä uusia alkioita append-metodin avulla. Metodia käytetään seuraavasti:

luvut = []\nluvut.append(5)\nluvut.append(10)\nluvut.append(3)\nprint(luvut)

[5, 10, 3]

Seuraavassa esimerkissä ohjelman käytössä on kaksi erillistä listaa:

luvut = []\nkengannumerot = []\n\nluvut.append(5)\nluvut.append(10)\nluvut.append(3)\n\nkengannumerot.append(37)\nkengannumerot.append(44)\nkengannumerot.append(40)\nkengannumerot.append(28)\n\nprint(\"Luvut:\")\nprint(luvut)\n\nprint(\"Kengännumerot:\")\nprint(kengannumerot)

Lisäys menee siis siihen listaan, mihin metodikutsu kohdistetaan:

Luvut:\n[5, 10, 3]\nKengännumerot:\n[37, 44, 40, 28]

Tee ohjelma, joka kysyy käyttäjältä ensin lukujen määrän. Sen jälkeen ohjelma pyytää käyttäjää syöttämään annetun määrän lukuja yksitellen ja lisää ne listaan samassa järjestyksessä.

Lopuksi lista tulostetaan.

Esimerkkisuoritus:

Kuinka monta lukua: 3\nAnna luku 1: 10\nAnna luku 2: 250\nAnna luku 3: 34\n[10, 250, 34]

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Mikäli halutaan lisätä alkio johonkin muualle kuin listan loppuun, voidaan käyttää insert-metodia. Metodi lisää alkion halutun indeksin paikalle. Kaikkia listalla valmiina olevia alkioita lisäyspaikasta alkaen siirretään yhdellä askeleella eteenpäin:

\n \n \n \n \n \n \"Alkion\n \n \n

Esimerkiksi

luvut = [1, 2, 3, 4, 5, 6]\nluvut.insert(0, 10)\nprint(luvut)\nluvut.insert(2, 20)\nprint(luvut)

[10, 1, 2, 3, 4, 5, 6]\n[10, 1, 20, 2, 3, 4, 5, 6]

Alkioita voidaan poistaa listasta kahden eri lähtökohdan mukaisesti:

    \n
  • Jos tiedetään, missä poistettava alkio sijaitsee, voidaan käyttää metodia pop.
  • \n
  • Jos tiedetään, mikä poistettavan alkion arvo on, käytetään metodia remove.
  • \n

Metodille pop annetaan poistettavan alkion indeksi. Esimerkiksi seuraava koodi poistaa listalta alkiot kohdista 2 ja 3. Huomaa, että alkioiden indeksit muuttuvat poiston jälkeen.

lista = [1, 2, 3, 4, 5, 6]\n\nlista.pop(2)\nprint(lista)\nlista.pop(3)\nprint(lista)

[1, 2, 4, 5, 6]\n[1, 2, 4, 6]

Metodi pop myös palauttaa poistetun listan alkion:

lista = [4, 2, 7, 2, 5]\n\nluku = lista.pop(2)\nprint(luku)\nprint(lista)

7\n[4, 2, 2, 5]

Metodille remove annetaan indeksin sijasta poistettavan alkion arvo. Esimerkiksi:

lista = [1, 2, 3, 4, 5, 6]\n\nlista.remove(2)\nprint(lista)\nlista.remove(5)\nprint(lista)

[1, 3, 4, 5, 6]\n[1, 3, 4, 6]

Huomaa, että metodi poistaa listalta ensimmäisen alkion, jolla on annettu arvo:

lista = [1, 2, 1, 2]\n\nlista.remove(1)\nprint(lista)\nlista.remove(1)\nprint(lista)

[2, 1, 2]\n[2, 2]

Tee ohjelma, joka pyytää käyttäjää valitsemaan alkion lisäyksen tai poiston. Sekä lisäys että poisto tehdään listan loppuun. Lisättävän alkion arvo on aina yhtä suurempi kuin listan viimeinen alkio (tai 1, jos listassa ei ole alkioita).

Joka operaation välissä lista tulostetaan. Katso esimerkkiä seuraavasta tulosteesta:

Lista on nyt []\n(l)isää, (p)oista vai e(x)it: l\nLista on nyt [1]\n(l)isää, (p)oista vai e(x)it: l\nLista on nyt [1, 2]\n(l)isää, (p)oista vai e(x)it: l\nLista on nyt [1, 2, 3]\n(l)isää, (p)oista vai e(x)it: p\nLista on nyt [1, 2]\n(l)isää, (p)oista vai e(x)it: l\nLista on nyt [1, 2, 3]\n(l)isää, (p)oista vai e(x)it: x\nMoi!

Voit olettaa, että listalta ei yritetä poistaa alkioita, jos lista on tyhjä.

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Jos listalla ei ole poistettavaa alkiota, seuraa virhe. Merkkijonoista tutulla tavalla alkion olemassaolon listalla voi testata in-operaattorin avulla:

lista = [1, 3, 4]\n\nif 1 in lista:\n    print(\"Listalla on alkio 1\")\n\nif 2 in lista:\n    print(\"listalla on alkio 2\")

Listalla on alkio 1

Tee ohjelma, joka kyselee käyttäjältä sanoja. Kun käyttäjä syöttää jonkin sanan kahdesti, ohjelma tulostaa eri sanojen määrän ja lopettaa toimintansa.

sana: olipa\nsana: kerran\nsana: kauan\nsana: sitten\nsana: kerran\nAnnoit 4 eri sanaa

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Listan järjestäminen

Listan alkiot voidaan järjestää pienimmästä suurimpaan metodin sort avulla:

lista = [2,5,1,2,4]\nlista.sort()\nprint(lista)

[1, 2, 2, 4, 5]

Toinen tapa on käyttää funktiota sorted, joka palauttaa järjestetyn listan:

lista = [2,5,1,2,4]\nprint(sorted(lista))

[1, 2, 2, 4, 5]

Huomaa ero näissä tavoissa: sort muuttaa listan sisällön järjestetyksi, kun taas sorted luo uuden järjestetyn listan. Jälkimmäisessä tavassa voimme säilyttää myös listan alkuperäisen järjestyksen:

alkuperainen = [2, 5, 1, 2, 4]\njarjestetty = sorted(alkuperainen)\nprint(alkuperainen)\nprint(jarjestetty)

[2, 5, 1, 2, 4]\n[1, 2, 2, 4, 5]

Tee ohjelma, joka kysyy käyttäjältä lukuja ja lisää niitä listaan. Lista tulostetaan jokaisen luvun lisäyksen jälkeen kahdella eri tavalla:

    \n
  • alkiot lisäysjärjestyksessä ja
  • \n
  • järjestettynä pienimmästä suurimpaan alkioon
  • \n

Ohjelman suoritus päättyy, kun käyttäjä syöttää luvun 0.

Esimerkkisuoritus:

Anna luku: 3\nLista: [3]\nJärjestettynä: [3]\nAnna luku: 1\nLista: [3, 1]\nJärjestettynä: [1, 3]\nAnna luku: 9\nLista: [3, 1, 9]\nJärjestettynä: [1, 3, 9]\nAnna luku: 5\nLista: [3, 1, 9, 5]\nJärjestettynä: [1, 3, 5, 9]\nAnna luku: 0\nMoi!

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Suurin, pienin ja summa

Funktiot max ja min antavat listan suurimman ja pienimmän alkion.\nFunktio sum puolestaan laskee listan alkioiden summan.

lista = [5, 2, 3, 1, 4]\n\nsuurin = max(lista)\npienin = min(lista)\nsumma = sum(lista)\n\nprint(\"Pienin:\", pienin)\nprint(\"Suurin:\", suurin)\nprint(\"Summa:\", summa)

Pienin: 1\nSuurin: 5\nSumma: 15

Metodit vs. funktiot

Pythonissa on ehkä hieman hämmentävästi käytössä kaksi eri tapaa listojen käsittelyyn.

Suurin osa käsittelystä tapahtuu metodien avulla. Esimerkiksi append ja sort ovat metodeja, joita kutsutaan listamuuttujan kautta pistenotaatiolla:

lista = []\n\n# metodikutsuja\nlista.append(3)\nlista.append(1)\nlista.append(7)\nlista.append(2)\n\n# metodikutsu\nlista.sort()

Sen sijaan esimerkiksi max, min, len ja sorted ovat funktioita, joille lista annetaan parametrina:

lista = [3, 2, 7, 1]\n\n# funktiokutsuissa lista on parametrina\nsuurin = max(lista)\npienin = min(lista)\npituus = len(lista)\n\nprint(\"Pienin:\", pienin)\nprint(\"Suurin:\", suurin)\nprint(\"Listan pituus:\", pituus)\n\n# funktiokutsu: lista on parametrina, järjestetty lista paluuarvona\njarjestyksessa = sorted(lista)\nprint(jarjestyksessa)

Pienin: 1\nSuurin: 7\nListan pituus: 4\n[1, 2, 3, 7]

Lista funktion parametrina ja paluuarvona

Itse tekemiemme funktioiden parametreina voi olla myös listoja. Seuraavassa on funktio, joka selvittää parametrina listan mediaanin eli keskimmäisen alkion järjestetyssä listassa:

def mediaani(lista: list):\n    jarjestetty = sorted(lista)\n    keskikohta = len(jarjestetty) // 2\n    return jarjestetty[keskikohta]

Funktio selvittää mediaanin tekemällä parametrinaan saamasta listasta järjestetyn version ja palauttamalla sen keskimmäisen alkion. Huomaa, että käytössä on kokonaislukujakolasku //, koska listan indeksin tulee olla kokonaisluku.

Seuraavassa on esimerkki funktion käytöstä:

kengannumerot = [45, 44, 36, 39, 40]\nprint(\"Kengännumeroiden mediaani on\", mediaani(kengannumerot))\n\niat = [1, 56, 34, 22, 5, 77, 5]\nprint(\"Ikien mediaani on\", mediaani(iat))

Kengännumeroiden mediaani on 40\nIkien mediaani on 22

Funktio voi myös palauttaa listan. Seuraavassa on funktio, joka palauttaa listan käyttäjän syöttämiä kokonaislukuja:

def lue_luvut():\n    luvut = []\n    while True:\n        syote = input(\"Anna luku (tyhjä lopettaa): \")\n        if len(syote) == 0:\n            break\n        luvut.append(int(syote))\n    return luvut

Funktio käyttää lista-tyyppistä apumuuttujaa luvut, johon se lisää kaikki käyttäjän antamat luvut. Silmukan jälkeen funktio palauttaa return-komennon avulla listan luvut.

Funktiota käytetään seuraavasti:

luvut = lue_luvut()\n\nprint(\"Suurin luku on\", max(luvut))\nprint(\"Lukujen mediaani on\", mediaani(luvut))

Anna luku (tyhjä lopettaa): 5\nAnna luku (tyhjä lopettaa): -22\nAnna luku (tyhjä lopettaa): 4\nAnna luku (tyhjä lopettaa): 35\nAnna luku (tyhjä lopettaa): 1\nAnna luku (tyhjä lopettaa):\nSuurin luku on 35\nLukujen mediaani on 4

Pieni esimerkkiohjelmamme demonstroi jo yhtä funktioiden tärkeimmistä käyttötarkoituksista: niiden avulla ohjelma saadaan jaettua loogisiin selkeästi ymmärrettäviin kokonaisuuksiin.

Sinänsä sama ohjelma olisi voitu tehdä myös ilman funktiota:

luvut = []\nwhile True:\n    syote = input(\"Anna luku (tyhjä lopettaa): \")\n    if len(syote) == 0:\n        break\n    luvut.append(int(syote))\n\njarjestetty = sorted(luvut)\nkeskikohta = len(jarjestetty) // 2\nmediaani = jarjestetty[keskikohta]\n\nprint(\"Suurin luku on\", max(luvut))\nprint(\"Lukujen mediaani on\", mediaani)

Nyt kuitenkin ohjelman logiikan seuraaminen on vaikeampaa, koska ei ole enää yhtä selvää, mitkä komennot liittyvät minkäkin kokonaisuuden (syötteiden lukeminen, mediaanin laskeminen, ohjelman muu toiminta) toteuttamiseen.

Jako funktioiksi siis selkeyttää koodin rakennetta ja tuo esille loogisia kokonaisuuksia. Tämän ansiosta on myös helpompaa varmistaa, että ohjelma toimii halutulla tavalla, koska voimme testata erikseen tiettyä funktiota (esim. toimiiko funktio mediaani oikein).

Ohjelman rakenteen loogisen jakamisen lisäksi funktioiden toinen käyttötarkoitus on koodin uusiokäyttö. Jos ohjelmassa on tarvetta tehdä samankaltainen operaatio useaan kertaan, kannattaa sitä varten luoda oma selkeästi nimetty funktio:

print(\"Kengännumerot:\")\nkengat = lue_luvut()\n\nprint(\"Painot:\")\npainot = lue_luvut()\n\nprint(\"Pituudet:\")\npituudet = lue_luvut()

Tee funktio pituus, joka palauttaa parametrinaan saamansa listan pituuden.

lista = [1, 2, 3, 4, 5]\nvastaus = pituus(lista)\nprint(\"vastaus\", vastaus)\n\n# huomaa, että voit kutsua funktiota myös antamalla listan suoraan funktion parametriksi\nvastaus = pituus([1, 1, 1, 1])\nprint(\"vastaus\", vastaus)

vastaus 5\nvastaus 4

Tee funktio keskiarvo, joka palauttaa parametrinaan saamansa kokonaislukuja sisältävän listan alkioiden keskiarvon.

lista = [1, 2, 3, 4, 5]\nvastaus = keskiarvo(lista)\nprint(\"vastaus\", vastaus)

vastaus 3.0

Tee funktio vaihteluvali, joka palauttaa parametrinaan saamansa kokonaislukuja sisältävän listan vaihteluvälin (eli suurimman ja pienimmän alkion erotuksen).

lista = [1, 2, 3, 4, 5]\nvastaus = vaihteluvali(lista)\nprint(\"vastaus\", vastaus)

vastaus 4

Lisää listan käsittelystä

Pythonissa on paljon muitakin mahdollisuuksia listan käsittelyyn. Voit tutustua niihin Pythonin dokumentaation kautta.

","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-4/3-listat.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä lista tarkoittaa ohjelmoinnissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat viitata listan yksittäisiin alkioihin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat lisätä ja poistaa listan alkioita"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat hyödyntää valmiita funktioita ja metodeita listojen käsittelyyn"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tähän asti olemme tallentaneet ohjelmissa käytettävää tietoa muuttujien avulla. Yksittäisillä muuttujilla on kuitenkin rajoituksensa. Jos ohjelman käsittelemä tiedon määrä on vaihteleva ja saattaa olla suuri, olisi vaivalloista määritellä jokaiselle arvolle erillinen muuttuja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Lista"}]},{"type":"text","value":" on kokoelma tietoa, johon viitataan yhteisen nimen kautta. Listan sisältö kirjoitetaan hakasulkeiden sisään, ja jokaista listalla olevaa arvoa kutsutaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"alkioksi"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraava koodi luo uuden tyhjän listan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava koodi puolestaan luo listan, jossa on valmiina viisi alkiota:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"listan-alkioihin-viittaaminen","style":"position:relative;"},"children":[{"type":"text","value":"Listan alkioihin viittaaminen"},{"type":"element","tagName":"a","properties":{"href":"#listan-alkioihin-viittaaminen","ariaLabel":"listan alkioihin viittaaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Listan alkiot on indeksoitu samalla tavalla kuin merkkijonon yksittäiset merkit. Tässäkin tapauksessa indeksointi alkaa nollasta:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 581px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/0c718cff85e5c83bbec15a7ce1a29896/92d15/4_2_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 26.08695652173913%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAvUlEQVQY031QWQqEMBTr/a/jWQQFFxRBtIL7vkQS6DDzM4WQvjRN36tZlgVt22IcR5zniXmesW0b1nUV9n3HcRwfjfW/Zb4LmnnpeR7c9y12e4LL6eTrurRnI87zE1jXNZIkkYkd0UiwQz7GADI19zhDOCVr3jMccZomgWMT1lqZhmEQ86zve32Hq93X0N91nYJ934cpyxJFUUhsmkZh7DLLMoRhiDRNEUURgiCQTsRxLM7zXGcMqqoKnufhBUAvgMcmbGmAAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/0c718cff85e5c83bbec15a7ce1a29896/a0b58/4_2_1.webp 230w","/static/0c718cff85e5c83bbec15a7ce1a29896/bc10c/4_2_1.webp 460w","/static/0c718cff85e5c83bbec15a7ce1a29896/39daa/4_2_1.webp 581w"],"sizes":"(max-width: 581px) 100vw, 581px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/0c718cff85e5c83bbec15a7ce1a29896/81c8e/4_2_1.png 230w","/static/0c718cff85e5c83bbec15a7ce1a29896/08a84/4_2_1.png 460w","/static/0c718cff85e5c83bbec15a7ce1a29896/92d15/4_2_1.png 581w"],"sizes":"(max-width: 581px) 100vw, 581px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/0c718cff85e5c83bbec15a7ce1a29896/92d15/4_2_1.png","alt":"Lista indeksoidaan nollasta alkaen","title":"Lista indeksoidaan nollasta alkaen","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yksittäiseen listan alkioon voidaan viitata samalla tavalla kuin merkkijonon yksittäisiin merkkeihin hakasulkujen avulla. Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kahden ekan summa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"7\n2\n5\nKahden ekan summa: 9"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme tulostaa listan koko sisällön näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[7, 2, 2, 5, 2]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Listan alkioita voidaan myös muuttaa. Alkion arvon muuttaminen tapahtuu sijoittamalla uusi arvo vanhan paikalle – siis samalla tavalla kuin muuttujia käytettäessä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[7, 2, 2, 5, 2]\n[7, 3, 2, 5, 2]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"len"}]},{"type":"text","value":" antaa listan alkioiden määrän:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"5"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Alkioiden arvojen muutokset","tmcname":"osa04-07a_alkioiden_arvojen_muutokset"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka alustaa listan jossa on arvot "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[1, 2, 3, 4, 5]"}]},{"type":"text","value":". Tämän jälkeen ohjelma kysyy käyttäjältä alkion indeksin ja uuden arvon, vaihtaa kyseisen alkion arvon ja tulostaa listan uudelleen. Ohjelman suoritus päättyy, jos käyttäjä antaa alkion indeksiksi -1."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuoritus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna indeksi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nAnna arvo: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n[10, 2, 3, 4, 5]\nAnna indeksi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nAnna arvo: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"250"}]},{"type":"text","value":"\n[10, 2, 250, 4, 5]\nAnna indeksi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nAnna arvo: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-45"}]},{"type":"text","value":"\n[10, 2, 250, 4, -45]\nAnna indeksi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-1"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"h2","properties":{"id":"alkioiden-lisaaminen-ja-poistaminen","style":"position:relative;"},"children":[{"type":"text","value":"Alkioiden lisääminen ja poistaminen"},{"type":"element","tagName":"a","properties":{"href":"#alkioiden-lisaaminen-ja-poistaminen","ariaLabel":"alkioiden lisaaminen ja poistaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Listan loppuun voidaan lisätä uusia alkioita "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"append"}]},{"type":"text","value":"-metodin avulla. Metodia käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nluvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[5, 10, 3]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa esimerkissä ohjelman käytössä on kaksi erillistä listaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nkengannumerot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nluvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkengannumerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"37"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkengannumerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"44"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkengannumerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"40"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkengannumerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"28"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luvut:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kengännumerot:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kengannumerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisäys menee siis siihen listaan, mihin metodikutsu kohdistetaan:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luvut:\n[5, 10, 3]\nKengännumerot:\n[37, 44, 40, 28]"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Alkioiden lisäys listaan","tmcname":"osa04-07b_alkoiden_lisays_listaan"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä ensin lukujen määrän. Sen jälkeen ohjelma pyytää käyttäjää syöttämään annetun määrän lukuja yksitellen ja lisää ne listaan samassa järjestyksessä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lopuksi lista tulostetaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuoritus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuinka monta lukua: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nAnna luku 1: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\nAnna luku 2: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"250"}]},{"type":"text","value":"\nAnna luku 3: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"34"}]},{"type":"text","value":"\n[10, 250, 34]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mikäli halutaan lisätä alkio johonkin muualle kuin listan loppuun, voidaan käyttää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"insert"}]},{"type":"text","value":"-metodia. Metodi lisää alkion halutun indeksin paikalle. Kaikkia listalla valmiina olevia alkioita lisäyspaikasta alkaen siirretään yhdellä askeleella eteenpäin:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 632px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/fbc699b555a562e011de8d156d23ff29/084e2/4_2_2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 65.21739130434783%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAABTklEQVQ4y62S3W7CMAyF+xZ75d3spfYUu0JCSAUEbZP0v5Qe9AU5Q91Au5glK47jHNvHzqqq0n6/V9M0CiGorutkd12nYRjUtm30YyPLsvyqSKZ/FECfAvZ9HwMul4umaUpqd6pFuaOpwnmeo+N6vcpsAqGC1mnVex/VKLHTOZf8RkcGf9vtVkVR6Hg8RjvPc53P5+gDmI92GiAdlGUZFR98P+WQasdxjMpAAHtUQNb3BMgHMnOS2bJbC4Dzxgc7D4dDjDEfSvIIaATbycOa6LVABW2S7M9TXu/bmhIGRmdryV4t6bc9axg6OXefNmDwttlsfmzByz1E5nnRNEltO6tp6sSbrY7xijKgyKENwYKtghBaeZ/L+w+F8CnvR4Vwr4Q4qnrcS3wZO8fuAXA6nbTb7eIUq6qUc71C+FIIb3LuXWUpeV+kRTZghoRNcTeEg/JdQzeckwAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/fbc699b555a562e011de8d156d23ff29/a0b58/4_2_2.webp 230w","/static/fbc699b555a562e011de8d156d23ff29/bc10c/4_2_2.webp 460w","/static/fbc699b555a562e011de8d156d23ff29/59680/4_2_2.webp 632w"],"sizes":"(max-width: 632px) 100vw, 632px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/fbc699b555a562e011de8d156d23ff29/81c8e/4_2_2.png 230w","/static/fbc699b555a562e011de8d156d23ff29/08a84/4_2_2.png 460w","/static/fbc699b555a562e011de8d156d23ff29/084e2/4_2_2.png 632w"],"sizes":"(max-width: 632px) 100vw, 632px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/fbc699b555a562e011de8d156d23ff29/084e2/4_2_2.png","alt":"Alkion lisäys listaan","title":"Alkion lisäys listaan","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nluvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"insert"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"insert"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[10, 1, 2, 3, 4, 5, 6]\n[10, 1, 20, 2, 3, 4, 5, 6]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Alkioita voidaan poistaa listasta kahden eri lähtökohdan mukaisesti:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Jos tiedetään, "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"missä"}]},{"type":"text","value":" poistettava alkio sijaitsee, voidaan käyttää metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pop"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Jos tiedetään, "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"mikä"}]},{"type":"text","value":" poistettavan alkion arvo on, käytetään metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"remove"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodille "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pop"}]},{"type":"text","value":" annetaan poistettavan alkion indeksi. Esimerkiksi seuraava koodi poistaa listalta alkiot kohdista 2 ja 3. Huomaa, että alkioiden indeksit muuttuvat poiston jälkeen."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pop"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pop"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 2, 4, 5, 6]\n[1, 2, 4, 6]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pop"}]},{"type":"text","value":" myös "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"palauttaa"}]},{"type":"text","value":" poistetun listan alkion:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pop"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"7\n[4, 2, 2, 5]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodille "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"remove"}]},{"type":"text","value":" annetaan indeksin sijasta poistettavan alkion arvo. Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"remove"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"remove"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 3, 4, 5, 6]\n[1, 3, 4, 6]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että metodi poistaa listalta "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ensimmäisen"}]},{"type":"text","value":" alkion, jolla on annettu arvo:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"remove"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"remove"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[2, 1, 2]\n[2, 2]"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Lisäys ja poisto","tmcname":"osa04-07c_lisays_ja_poisto"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka pyytää käyttäjää valitsemaan alkion lisäyksen tai poiston. Sekä lisäys että poisto tehdään listan loppuun. Lisättävän alkion arvo on aina yhtä suurempi kuin listan viimeinen alkio (tai 1, jos listassa ei ole alkioita)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joka operaation välissä lista tulostetaan. Katso esimerkkiä seuraavasta tulosteesta:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lista on nyt []\n(l)isää, (p)oista vai e(x)it: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"l"}]},{"type":"text","value":"\nLista on nyt [1]\n(l)isää, (p)oista vai e(x)it: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"l"}]},{"type":"text","value":"\nLista on nyt [1, 2]\n(l)isää, (p)oista vai e(x)it: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"l"}]},{"type":"text","value":"\nLista on nyt [1, 2, 3]\n(l)isää, (p)oista vai e(x)it: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"p"}]},{"type":"text","value":"\nLista on nyt [1, 2]\n(l)isää, (p)oista vai e(x)it: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"l"}]},{"type":"text","value":"\nLista on nyt [1, 2, 3]\n(l)isää, (p)oista vai e(x)it: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"x"}]},{"type":"text","value":"\nMoi!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa, että listalta ei yritetä poistaa alkioita, jos lista on tyhjä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos listalla ei ole poistettavaa alkiota, seuraa virhe. Merkkijonoista tutulla tavalla alkion olemassaolon listalla voi testata "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":"-operaattorin avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Listalla on alkio 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"listalla on alkio 2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Listalla on alkio 1"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sama sana kahdesti","tmcname":"osa04-08_sama_sana_kahdesti"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kyselee käyttäjältä sanoja. Kun käyttäjä syöttää jonkin sanan kahdesti, ohjelma tulostaa eri sanojen määrän ja lopettaa toimintansa."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"olipa"}]},{"type":"text","value":"\nsana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kerran"}]},{"type":"text","value":"\nsana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kauan"}]},{"type":"text","value":"\nsana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"sitten"}]},{"type":"text","value":"\nsana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kerran"}]},{"type":"text","value":"\nAnnoit 4 eri sanaa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"h2","properties":{"id":"listan-jarjestaminen","style":"position:relative;"},"children":[{"type":"text","value":"Listan järjestäminen"},{"type":"element","tagName":"a","properties":{"href":"#listan-jarjestaminen","ariaLabel":"listan jarjestaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Listan alkiot voidaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"järjestää"}]},{"type":"text","value":" pienimmästä suurimpaan metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sort"}]},{"type":"text","value":" avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sort"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 2, 2, 4, 5]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen tapa on käyttää funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sorted"}]},{"type":"text","value":", joka "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"palauttaa"}]},{"type":"text","value":" järjestetyn listan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 2, 2, 4, 5]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa ero näissä tavoissa: "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sort"}]},{"type":"text","value":" muuttaa listan sisällön järjestetyksi, kun taas "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sorted"}]},{"type":"text","value":" luo uuden järjestetyn listan. Jälkimmäisessä tavassa voimme säilyttää myös listan alkuperäisen järjestyksen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"alkuperainen "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\njarjestetty "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkuperainen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkuperainen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jarjestetty"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[2, 5, 1, 2, 4]\n[1, 2, 2, 4, 5]"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Lista kahdesti","tmcname":"osa04-08b_lista_kahdesti"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjältä lukuja ja lisää niitä listaan. Lista tulostetaan jokaisen luvun lisäyksen jälkeen kahdella eri tavalla:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"alkiot lisäysjärjestyksessä ja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"järjestettynä pienimmästä suurimpaan alkioon"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suoritus päättyy, kun käyttäjä syöttää luvun 0."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuoritus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nLista: [3]\nJärjestettynä: [3]\nAnna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nLista: [3, 1]\nJärjestettynä: [1, 3]\nAnna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"9"}]},{"type":"text","value":"\nLista: [3, 1, 9]\nJärjestettynä: [1, 3, 9]\nAnna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nLista: [3, 1, 9, 5]\nJärjestettynä: [1, 3, 5, 9]\nAnna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nMoi!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"h2","properties":{"id":"suurin-pienin-ja-summa","style":"position:relative;"},"children":[{"type":"text","value":"Suurin, pienin ja summa"},{"type":"element","tagName":"a","properties":{"href":"#suurin-pienin-ja-summa","ariaLabel":"suurin pienin ja summa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiot "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"max"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"min"}]},{"type":"text","value":" antavat listan suurimman ja pienimmän alkion.\nFunktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sum"}]},{"type":"text","value":" puolestaan laskee listan alkioiden summan."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nsuurin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"max"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npienin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"min"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sum"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pienin:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pienin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suurin:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" suurin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Summa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pienin: 1\nSuurin: 5\nSumma: 15"}]}]},{"type":"element","tagName":"h2","properties":{"id":"metodit-vs-funktiot","style":"position:relative;"},"children":[{"type":"text","value":"Metodit vs. funktiot"},{"type":"element","tagName":"a","properties":{"href":"#metodit-vs-funktiot","ariaLabel":"metodit vs funktiot permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa on ehkä hieman hämmentävästi käytössä kaksi eri tapaa listojen käsittelyyn."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Suurin osa käsittelystä tapahtuu "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"metodien"}]},{"type":"text","value":" avulla. Esimerkiksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"append"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sort"}]},{"type":"text","value":" ovat metodeja, joita kutsutaan listamuuttujan kautta pistenotaatiolla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# metodikutsuja"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# metodikutsu"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sort"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sen sijaan esimerkiksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"max"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"min"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"len"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sorted"}]},{"type":"text","value":" ovat "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"funktioita"}]},{"type":"text","value":", joille lista annetaan parametrina:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# funktiokutsuissa lista on parametrina"}]},{"type":"text","value":"\nsuurin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"max"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npienin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"min"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pienin:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pienin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suurin:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" suurin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Listan pituus:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# funktiokutsu: lista on parametrina, järjestetty lista paluuarvona"}]},{"type":"text","value":"\njarjestyksessa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jarjestyksessa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pienin: 1\nSuurin: 7\nListan pituus: 4\n[1, 2, 3, 7]"}]}]},{"type":"element","tagName":"h2","properties":{"id":"lista-funktion-parametrina-ja-paluuarvona","style":"position:relative;"},"children":[{"type":"text","value":"Lista funktion parametrina ja paluuarvona"},{"type":"element","tagName":"a","properties":{"href":"#lista-funktion-parametrina-ja-paluuarvona","ariaLabel":"lista funktion parametrina ja paluuarvona permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Itse tekemiemme funktioiden parametreina voi olla myös listoja. Seuraavassa on funktio, joka selvittää parametrina listan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"mediaanin"}]},{"type":"text","value":" eli keskimmäisen alkion järjestetyssä listassa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"mediaani"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n jarjestetty "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n keskikohta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jarjestetty"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"//"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" jarjestetty"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"keskikohta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio selvittää mediaanin tekemällä parametrinaan saamasta listasta järjestetyn version ja palauttamalla sen keskimmäisen alkion. Huomaa, että käytössä on kokonaislukujakolasku "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"//"}]},{"type":"text","value":", koska listan indeksin tulee olla kokonaisluku."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kengannumerot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"45"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"44"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"36"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"39"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"40"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kengännumeroiden mediaani on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" mediaani"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kengannumerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\niat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"56"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"34"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"22"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"77"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ikien mediaani on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" mediaani"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"iat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kengännumeroiden mediaani on 40\nIkien mediaani on 22"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio voi myös palauttaa listan. Seuraavassa on funktio, joka palauttaa listan käyttäjän syöttämiä kokonaislukuja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lue_luvut"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n syote "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku (tyhjä lopettaa): \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" luvut"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio käyttää lista-tyyppistä apumuuttujaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luvut"}]},{"type":"text","value":", johon se lisää kaikki käyttäjän antamat luvut. Silmukan jälkeen funktio palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":"-komennon avulla listan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luvut"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiota käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue_luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suurin luku on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"max"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lukujen mediaani on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" mediaani"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku (tyhjä lopettaa): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nAnna luku (tyhjä lopettaa): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-22"}]},{"type":"text","value":"\nAnna luku (tyhjä lopettaa): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\nAnna luku (tyhjä lopettaa): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"35"}]},{"type":"text","value":"\nAnna luku (tyhjä lopettaa): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nAnna luku (tyhjä lopettaa):\nSuurin luku on 35\nLukujen mediaani on 4"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pieni esimerkkiohjelmamme demonstroi jo yhtä funktioiden tärkeimmistä käyttötarkoituksista: niiden avulla ohjelma saadaan jaettua loogisiin selkeästi ymmärrettäviin kokonaisuuksiin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sinänsä sama ohjelma olisi voitu tehdä myös ilman funktiota:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n syote "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku (tyhjä lopettaa): \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\njarjestetty "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkeskikohta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jarjestetty"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"//"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nmediaani "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" jarjestetty"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"keskikohta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suurin luku on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"max"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lukujen mediaani on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" mediaani"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt kuitenkin ohjelman logiikan seuraaminen on vaikeampaa, koska ei ole enää yhtä selvää, mitkä komennot liittyvät minkäkin kokonaisuuden (syötteiden lukeminen, mediaanin laskeminen, ohjelman muu toiminta) toteuttamiseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jako funktioiksi siis selkeyttää koodin rakennetta ja tuo esille loogisia kokonaisuuksia. Tämän ansiosta on myös helpompaa varmistaa, että ohjelma toimii halutulla tavalla, koska voimme testata erikseen tiettyä funktiota (esim. toimiiko funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"mediaani"}]},{"type":"text","value":" oikein)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman rakenteen loogisen jakamisen lisäksi funktioiden toinen käyttötarkoitus on koodin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"uusiokäyttö"}]},{"type":"text","value":". Jos ohjelmassa on tarvetta tehdä samankaltainen operaatio useaan kertaan, kannattaa sitä varten luoda oma selkeästi nimetty funktio:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kengännumerot:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkengat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue_luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Painot:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npainot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue_luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pituudet:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npituudet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue_luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Listan pituus","tmcname":"osa04-09_listan_pituus"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pituus"}]},{"type":"text","value":", joka palauttaa parametrinaan saamansa listan pituuden."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nvastaus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vastaus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vastaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# huomaa, että voit kutsua funktiota myös antamalla listan suoraan funktion parametriksi"}]},{"type":"text","value":"\nvastaus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vastaus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vastaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"vastaus 5\nvastaus 4"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Keskiarvo","tmcname":"osa04-10_keskiarvo"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"keskiarvo"}]},{"type":"text","value":", joka palauttaa parametrinaan saamansa kokonaislukuja sisältävän listan alkioiden keskiarvon."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nvastaus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" keskiarvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vastaus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vastaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"vastaus 3.0"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Vaihteluväli","tmcname":"osa04-11_vaihteluvali"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vaihteluvali"}]},{"type":"text","value":", joka palauttaa parametrinaan saamansa kokonaislukuja sisältävän listan vaihteluvälin (eli suurimman ja pienimmän alkion erotuksen)."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nvastaus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" vaihteluvali"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vastaus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vastaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"vastaus 4"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"lisaa-listan-kasittelysta","style":"position:relative;"},"children":[{"type":"text","value":"Lisää listan käsittelystä"},{"type":"element","tagName":"a","properties":{"href":"#lisaa-listan-kasittelysta","ariaLabel":"lisaa listan kasittelysta permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa on paljon muitakin mahdollisuuksia listan käsittelyyn. Voit tutustua niihin Pythonin "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/tutorial/datastructures.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"dokumentaation"}]},{"type":"text","value":" kautta."}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, mitä lista tarkoittaa ohjelmoinnissa
  • \n
  • Osaat viitata listan yksittäisiin alkioihin
  • \n
  • Osaat lisätä ja poistaa listan alkioita
  • \n
  • Osaat hyödyntää valmiita funktioita ja metodeita listojen käsittelyyn
  • \n

Tähän asti olemme tallentaneet ohjelmissa käytettävää tietoa muuttujien avulla. Yksittäisillä muuttujilla on kuitenkin rajoituksensa. Jos ohjelman käsittelemä tiedon määrä on vaihteleva ja saattaa olla suuri, olisi vaivalloista määritellä jokaiselle arvolle erillinen muuttuja.

Lista on kokoelma tietoa, johon viitataan yhteisen nimen kautta. Listan sisältö kirjoitetaan hakasulkeiden sisään, ja jokaista listalla olevaa arvoa kutsutaan alkioksi.

Esimerkiksi seuraava koodi luo uuden tyhjän listan:

lista = []

Seuraava koodi puolestaan luo listan, jossa on valmiina viisi alkiota:

lista = [7, 2, 2, 5, 2]

Listan alkioihin viittaaminen

Listan alkiot on indeksoitu samalla tavalla kuin merkkijonon yksittäiset merkit. Tässäkin tapauksessa indeksointi alkaa nollasta:

\n \n \n \n \n \n \"Lista\n \n \n

Yksittäiseen listan alkioon voidaan viitata samalla tavalla kuin merkkijonon yksittäisiin merkkeihin hakasulkujen avulla. Esimerkiksi:

lista = [7, 2, 2, 5, 2]\n\nprint(lista[0])\nprint(lista[1])\nprint(lista[3])\n\nprint(\"Kahden ekan summa:\", lista[0] + lista[1])

7\n2\n5\nKahden ekan summa: 9

Voimme tulostaa listan koko sisällön näin:

lista = [7, 2, 2, 5, 2]\nprint(lista)

[7, 2, 2, 5, 2]

Listan alkioita voidaan myös muuttaa. Alkion arvon muuttaminen tapahtuu sijoittamalla uusi arvo vanhan paikalle – siis samalla tavalla kuin muuttujia käytettäessä:

lista = [7, 2, 2, 5, 2]\nprint(lista)\nlista[1] = 3\nprint(lista)

[7, 2, 2, 5, 2]\n[7, 3, 2, 5, 2]

Funktio len antaa listan alkioiden määrän:

lista = [7, 2, 2, 5, 2]\nprint(len(lista))

5

Tee ohjelma, joka alustaa listan jossa on arvot [1, 2, 3, 4, 5]. Tämän jälkeen ohjelma kysyy käyttäjältä alkion indeksin ja uuden arvon, vaihtaa kyseisen alkion arvon ja tulostaa listan uudelleen. Ohjelman suoritus päättyy, jos käyttäjä antaa alkion indeksiksi -1.

Esimerkkisuoritus:

Anna indeksi: 0\nAnna arvo: 10\n[10, 2, 3, 4, 5]\nAnna indeksi: 2\nAnna arvo: 250\n[10, 2, 250, 4, 5]\nAnna indeksi: 4\nAnna arvo: -45\n[10, 2, 250, 4, -45]\nAnna indeksi: -1

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Alkioiden lisääminen ja poistaminen

Listan loppuun voidaan lisätä uusia alkioita append-metodin avulla. Metodia käytetään seuraavasti:

luvut = []\nluvut.append(5)\nluvut.append(10)\nluvut.append(3)\nprint(luvut)

[5, 10, 3]

Seuraavassa esimerkissä ohjelman käytössä on kaksi erillistä listaa:

luvut = []\nkengannumerot = []\n\nluvut.append(5)\nluvut.append(10)\nluvut.append(3)\n\nkengannumerot.append(37)\nkengannumerot.append(44)\nkengannumerot.append(40)\nkengannumerot.append(28)\n\nprint(\"Luvut:\")\nprint(luvut)\n\nprint(\"Kengännumerot:\")\nprint(kengannumerot)

Lisäys menee siis siihen listaan, mihin metodikutsu kohdistetaan:

Luvut:\n[5, 10, 3]\nKengännumerot:\n[37, 44, 40, 28]

Tee ohjelma, joka kysyy käyttäjältä ensin lukujen määrän. Sen jälkeen ohjelma pyytää käyttäjää syöttämään annetun määrän lukuja yksitellen ja lisää ne listaan samassa järjestyksessä.

Lopuksi lista tulostetaan.

Esimerkkisuoritus:

Kuinka monta lukua: 3\nAnna luku 1: 10\nAnna luku 2: 250\nAnna luku 3: 34\n[10, 250, 34]

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Mikäli halutaan lisätä alkio johonkin muualle kuin listan loppuun, voidaan käyttää insert-metodia. Metodi lisää alkion halutun indeksin paikalle. Kaikkia listalla valmiina olevia alkioita lisäyspaikasta alkaen siirretään yhdellä askeleella eteenpäin:

\n \n \n \n \n \n \"Alkion\n \n \n

Esimerkiksi

luvut = [1, 2, 3, 4, 5, 6]\nluvut.insert(0, 10)\nprint(luvut)\nluvut.insert(2, 20)\nprint(luvut)

[10, 1, 2, 3, 4, 5, 6]\n[10, 1, 20, 2, 3, 4, 5, 6]

Alkioita voidaan poistaa listasta kahden eri lähtökohdan mukaisesti:

    \n
  • Jos tiedetään, missä poistettava alkio sijaitsee, voidaan käyttää metodia pop.
  • \n
  • Jos tiedetään, mikä poistettavan alkion arvo on, käytetään metodia remove.
  • \n

Metodille pop annetaan poistettavan alkion indeksi. Esimerkiksi seuraava koodi poistaa listalta alkiot kohdista 2 ja 3. Huomaa, että alkioiden indeksit muuttuvat poiston jälkeen.

lista = [1, 2, 3, 4, 5, 6]\n\nlista.pop(2)\nprint(lista)\nlista.pop(3)\nprint(lista)

[1, 2, 4, 5, 6]\n[1, 2, 4, 6]

Metodi pop myös palauttaa poistetun listan alkion:

lista = [4, 2, 7, 2, 5]\n\nluku = lista.pop(2)\nprint(luku)\nprint(lista)

7\n[4, 2, 2, 5]

Metodille remove annetaan indeksin sijasta poistettavan alkion arvo. Esimerkiksi:

lista = [1, 2, 3, 4, 5, 6]\n\nlista.remove(2)\nprint(lista)\nlista.remove(5)\nprint(lista)

[1, 3, 4, 5, 6]\n[1, 3, 4, 6]

Huomaa, että metodi poistaa listalta ensimmäisen alkion, jolla on annettu arvo:

lista = [1, 2, 1, 2]\n\nlista.remove(1)\nprint(lista)\nlista.remove(1)\nprint(lista)

[2, 1, 2]\n[2, 2]

Tee ohjelma, joka pyytää käyttäjää valitsemaan alkion lisäyksen tai poiston. Sekä lisäys että poisto tehdään listan loppuun. Lisättävän alkion arvo on aina yhtä suurempi kuin listan viimeinen alkio (tai 1, jos listassa ei ole alkioita).

Joka operaation välissä lista tulostetaan. Katso esimerkkiä seuraavasta tulosteesta:

Lista on nyt []\n(l)isää, (p)oista vai e(x)it: l\nLista on nyt [1]\n(l)isää, (p)oista vai e(x)it: l\nLista on nyt [1, 2]\n(l)isää, (p)oista vai e(x)it: l\nLista on nyt [1, 2, 3]\n(l)isää, (p)oista vai e(x)it: p\nLista on nyt [1, 2]\n(l)isää, (p)oista vai e(x)it: l\nLista on nyt [1, 2, 3]\n(l)isää, (p)oista vai e(x)it: x\nMoi!

Voit olettaa, että listalta ei yritetä poistaa alkioita, jos lista on tyhjä.

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Jos listalla ei ole poistettavaa alkiota, seuraa virhe. Merkkijonoista tutulla tavalla alkion olemassaolon listalla voi testata in-operaattorin avulla:

lista = [1, 3, 4]\n\nif 1 in lista:\n    print(\"Listalla on alkio 1\")\n\nif 2 in lista:\n    print(\"listalla on alkio 2\")

Listalla on alkio 1

Tee ohjelma, joka kyselee käyttäjältä sanoja. Kun käyttäjä syöttää jonkin sanan kahdesti, ohjelma tulostaa eri sanojen määrän ja lopettaa toimintansa.

sana: olipa\nsana: kerran\nsana: kauan\nsana: sitten\nsana: kerran\nAnnoit 4 eri sanaa

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Listan järjestäminen

Listan alkiot voidaan järjestää pienimmästä suurimpaan metodin sort avulla:

lista = [2,5,1,2,4]\nlista.sort()\nprint(lista)

[1, 2, 2, 4, 5]

Toinen tapa on käyttää funktiota sorted, joka palauttaa järjestetyn listan:

lista = [2,5,1,2,4]\nprint(sorted(lista))

[1, 2, 2, 4, 5]

Huomaa ero näissä tavoissa: sort muuttaa listan sisällön järjestetyksi, kun taas sorted luo uuden järjestetyn listan. Jälkimmäisessä tavassa voimme säilyttää myös listan alkuperäisen järjestyksen:

alkuperainen = [2, 5, 1, 2, 4]\njarjestetty = sorted(alkuperainen)\nprint(alkuperainen)\nprint(jarjestetty)

[2, 5, 1, 2, 4]\n[1, 2, 2, 4, 5]

Tee ohjelma, joka kysyy käyttäjältä lukuja ja lisää niitä listaan. Lista tulostetaan jokaisen luvun lisäyksen jälkeen kahdella eri tavalla:

    \n
  • alkiot lisäysjärjestyksessä ja
  • \n
  • järjestettynä pienimmästä suurimpaan alkioon
  • \n

Ohjelman suoritus päättyy, kun käyttäjä syöttää luvun 0.

Esimerkkisuoritus:

Anna luku: 3\nLista: [3]\nJärjestettynä: [3]\nAnna luku: 1\nLista: [3, 1]\nJärjestettynä: [1, 3]\nAnna luku: 9\nLista: [3, 1, 9]\nJärjestettynä: [1, 3, 9]\nAnna luku: 5\nLista: [3, 1, 9, 5]\nJärjestettynä: [1, 3, 5, 9]\nAnna luku: 0\nMoi!

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Suurin, pienin ja summa

Funktiot max ja min antavat listan suurimman ja pienimmän alkion.\nFunktio sum puolestaan laskee listan alkioiden summan.

lista = [5, 2, 3, 1, 4]\n\nsuurin = max(lista)\npienin = min(lista)\nsumma = sum(lista)\n\nprint(\"Pienin:\", pienin)\nprint(\"Suurin:\", suurin)\nprint(\"Summa:\", summa)

Pienin: 1\nSuurin: 5\nSumma: 15

Metodit vs. funktiot

Pythonissa on ehkä hieman hämmentävästi käytössä kaksi eri tapaa listojen käsittelyyn.

Suurin osa käsittelystä tapahtuu metodien avulla. Esimerkiksi append ja sort ovat metodeja, joita kutsutaan listamuuttujan kautta pistenotaatiolla:

lista = []\n\n# metodikutsuja\nlista.append(3)\nlista.append(1)\nlista.append(7)\nlista.append(2)\n\n# metodikutsu\nlista.sort()

Sen sijaan esimerkiksi max, min, len ja sorted ovat funktioita, joille lista annetaan parametrina:

lista = [3, 2, 7, 1]\n\n# funktiokutsuissa lista on parametrina\nsuurin = max(lista)\npienin = min(lista)\npituus = len(lista)\n\nprint(\"Pienin:\", pienin)\nprint(\"Suurin:\", suurin)\nprint(\"Listan pituus:\", pituus)\n\n# funktiokutsu: lista on parametrina, järjestetty lista paluuarvona\njarjestyksessa = sorted(lista)\nprint(jarjestyksessa)

Pienin: 1\nSuurin: 7\nListan pituus: 4\n[1, 2, 3, 7]

Lista funktion parametrina ja paluuarvona

Itse tekemiemme funktioiden parametreina voi olla myös listoja. Seuraavassa on funktio, joka selvittää parametrina listan mediaanin eli keskimmäisen alkion järjestetyssä listassa:

def mediaani(lista: list):\n    jarjestetty = sorted(lista)\n    keskikohta = len(jarjestetty) // 2\n    return jarjestetty[keskikohta]

Funktio selvittää mediaanin tekemällä parametrinaan saamasta listasta järjestetyn version ja palauttamalla sen keskimmäisen alkion. Huomaa, että käytössä on kokonaislukujakolasku //, koska listan indeksin tulee olla kokonaisluku.

Seuraavassa on esimerkki funktion käytöstä:

kengannumerot = [45, 44, 36, 39, 40]\nprint(\"Kengännumeroiden mediaani on\", mediaani(kengannumerot))\n\niat = [1, 56, 34, 22, 5, 77, 5]\nprint(\"Ikien mediaani on\", mediaani(iat))

Kengännumeroiden mediaani on 40\nIkien mediaani on 22

Funktio voi myös palauttaa listan. Seuraavassa on funktio, joka palauttaa listan käyttäjän syöttämiä kokonaislukuja:

def lue_luvut():\n    luvut = []\n    while True:\n        syote = input(\"Anna luku (tyhjä lopettaa): \")\n        if len(syote) == 0:\n            break\n        luvut.append(int(syote))\n    return luvut

Funktio käyttää lista-tyyppistä apumuuttujaa luvut, johon se lisää kaikki käyttäjän antamat luvut. Silmukan jälkeen funktio palauttaa return-komennon avulla listan luvut.

Funktiota käytetään seuraavasti:

luvut = lue_luvut()\n\nprint(\"Suurin luku on\", max(luvut))\nprint(\"Lukujen mediaani on\", mediaani(luvut))

Anna luku (tyhjä lopettaa): 5\nAnna luku (tyhjä lopettaa): -22\nAnna luku (tyhjä lopettaa): 4\nAnna luku (tyhjä lopettaa): 35\nAnna luku (tyhjä lopettaa): 1\nAnna luku (tyhjä lopettaa):\nSuurin luku on 35\nLukujen mediaani on 4

Pieni esimerkkiohjelmamme demonstroi jo yhtä funktioiden tärkeimmistä käyttötarkoituksista: niiden avulla ohjelma saadaan jaettua loogisiin selkeästi ymmärrettäviin kokonaisuuksiin.

Sinänsä sama ohjelma olisi voitu tehdä myös ilman funktiota:

luvut = []\nwhile True:\n    syote = input(\"Anna luku (tyhjä lopettaa): \")\n    if len(syote) == 0:\n        break\n    luvut.append(int(syote))\n\njarjestetty = sorted(luvut)\nkeskikohta = len(jarjestetty) // 2\nmediaani = jarjestetty[keskikohta]\n\nprint(\"Suurin luku on\", max(luvut))\nprint(\"Lukujen mediaani on\", mediaani)

Nyt kuitenkin ohjelman logiikan seuraaminen on vaikeampaa, koska ei ole enää yhtä selvää, mitkä komennot liittyvät minkäkin kokonaisuuden (syötteiden lukeminen, mediaanin laskeminen, ohjelman muu toiminta) toteuttamiseen.

Jako funktioiksi siis selkeyttää koodin rakennetta ja tuo esille loogisia kokonaisuuksia. Tämän ansiosta on myös helpompaa varmistaa, että ohjelma toimii halutulla tavalla, koska voimme testata erikseen tiettyä funktiota (esim. toimiiko funktio mediaani oikein).

Ohjelman rakenteen loogisen jakamisen lisäksi funktioiden toinen käyttötarkoitus on koodin uusiokäyttö. Jos ohjelmassa on tarvetta tehdä samankaltainen operaatio useaan kertaan, kannattaa sitä varten luoda oma selkeästi nimetty funktio:

print(\"Kengännumerot:\")\nkengat = lue_luvut()\n\nprint(\"Painot:\")\npainot = lue_luvut()\n\nprint(\"Pituudet:\")\npituudet = lue_luvut()

Tee funktio pituus, joka palauttaa parametrinaan saamansa listan pituuden.

lista = [1, 2, 3, 4, 5]\nvastaus = pituus(lista)\nprint(\"vastaus\", vastaus)\n\n# huomaa, että voit kutsua funktiota myös antamalla listan suoraan funktion parametriksi\nvastaus = pituus([1, 1, 1, 1])\nprint(\"vastaus\", vastaus)

vastaus 5\nvastaus 4

Tee funktio keskiarvo, joka palauttaa parametrinaan saamansa kokonaislukuja sisältävän listan alkioiden keskiarvon.

lista = [1, 2, 3, 4, 5]\nvastaus = keskiarvo(lista)\nprint(\"vastaus\", vastaus)

vastaus 3.0

Tee funktio vaihteluvali, joka palauttaa parametrinaan saamansa kokonaislukuja sisältävän listan vaihteluvälin (eli suurimman ja pienimmän alkion erotuksen).

lista = [1, 2, 3, 4, 5]\nvastaus = vaihteluvali(lista)\nprint(\"vastaus\", vastaus)

vastaus 4

Lisää listan käsittelystä

Pythonissa on paljon muitakin mahdollisuuksia listan käsittelyyn. Voit tutustua niihin Pythonin dokumentaation kautta.

","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-4/3-listat.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-4/4-silmukat-ja-iterointi/page-data.json b/page-data/osa-4/4-silmukat-ja-iterointi/page-data.json index 1c0daa7b0..44f4a47e7 100644 --- a/page-data/osa-4/4-silmukat-ja-iterointi/page-data.json +++ b/page-data/osa-4/4-silmukat-ja-iterointi/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-4/4-silmukat-ja-iterointi", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä tarkoitetaan iteroinnilla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukka toimii"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukkaa listojen ja merkkijonojen läpikäyntiin"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme käydä listan alkiot läpi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":"-silmukalla samaan tapaan kuin olemme aiemmin käyneet läpi merkkijonon merkkejä. Esimerkiksi seuraava ohjelma tulostaa kaikki listan alkiot omille riveilleen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nkohta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" kohta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"kohta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kohta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3\n2\n4\n5\n2"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä on kuitenkin melko vaivalloinen tapa, sillä joudumme käyttämään indeksimuuttujaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kohta"}]},{"type":"text","value":", joka \"muistaa\", missä kohtaa listaa ollaan menossa. Nyt on aika opetella parempi tapa listan, merkkijonon tai muun vastaavan rakenteen läpikäyntiin."}]},{"type":"element","tagName":"h2","properties":{"id":"for-silmukka","style":"position:relative;"},"children":[{"type":"text","value":"for-silmukka"},{"type":"element","tagName":"a","properties":{"href":"#for-silmukka","ariaLabel":"for silmukka permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukka käy läpi annetun rakenteen sisällön. Esimerkiksi voimme käydä läpi kaikki listalla olevat alkiot vasemmalta oikealle. Ohjelmoinnissa tällaista läpikäyntiä kutsutaan myös nimellä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"iterointi"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ideana on, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukka poimii yksi kerrallaan kunkin alkion ja suorittaa kaikille saman operaation. Näin ohjelmoijan ei tarvitse itse huolehtia, mistä kohdasta alkio haetaan missäkin vaiheessa. Silmukan syntaksi on seuraava:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"muuttuja"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"rakenne"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"lohko"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukka käy listan läpi, se poimii vuorollaan kunkin alkion, sijoittaa sen muuttujaan ja suorittaa lohkon. Kun silmukka on käynyt kaikki alkiot läpi, ohjelman suoritus jatkuu silmukan jälkeiseltä riviltä."}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 327px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/d00a7a558297b987a466855819434573/00e65/4_3_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 214.3478260869565%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAArCAYAAAB4pah1AAAACXBIWXMAAAsTAAALEwEAmpwYAAADSklEQVRIx62XWVMqMRCF5+f7O3zHB3yDJy2RYhNXRAERWQT3XVGwra9v9VQcMwxQN1WpyYTMyenu050QiKd9f3/rczKZyNfX16+5pBbMAry9vZWrq6v/B3hzcyOj0Sicmwc08IHZh8/Pz3J3d7ccoC3mie9oxWJRdnd3Q3+6a2IB+XE6nWqPLkyn05LNZr0W+HoI6LbxeCzD4VDa7baa/Pj4KOfn5xoci3hcA0tNbjQa0mq1FKjb7crx8bHUajXp9/tyenqq7/V6XX+7vLyUh4cH3cie9/f38vb29o8hk2tra7K+vi5HR0e6iI9LpZKUy2XZ2NiQQqEgg8FAZVSpVOTi4kIZQ4DOuNlsKmjQ6/Xk8/MzpMwCAgEoAEjn5OREmZomfY0Nn56eJGCAr6INU/Dj2dmZLnQj7HaCScM94AQMXl5ewsW2gCfBwAKfRqPPWEBr7+/vamq1WpWPjw/x6TURkIY0DIBgZTIZHTNngnc39gKaDwkA8ul0OioRgrO3t6djIgtj/JnI0AABQ9jRvDW/okE2nRsQge/s7MjBwYHKBIbkM8KGKWm4ECAyYQHvgOVyOd0AMHyIDhcCRCYWYVgCtr29rU8ruPS5ARHx6+urRhpQMghmpBQfosnr6+tYQM0UF5A8JsLMkYJWJBgzh0vYMJoxNDYLAV0dwsjeV1dXJZVKhdXbzfmoDtmUzX4xxOmwQHfMU32sjMEgTodUms3NTQ2iFgczw6Ic14hwXJQhQcACBjiaQKA9nnQLCEInQDROQDfKbjGBGK7SAgszJiioLDJz0eLh4aEWCKryLIZhlF2TyFfY2cnndvNxog5d2uhw1kEE4CwdhoA2SZWmQJAx0Y4+7dyYCei7IBEQC44bJLNkZj307ZZ09iYydM1GkwjYDig646i5c5uM433HJanlk0wiILJAwOgS0cPWBB2NsDsOi4PvTghDDvp8Pq/ixmQUsLKyovURNuYKOiogy8iqP4CwYCd2JNnJFHxHRuFHt+JES5j3fuiK122YTfq5h5bvmvcHENMorJjFoUWHLSa5pSv2fujTmDGwSu3OJWnVeyV279hmpk97iYBRhvv7+1rGlmLoNvuYe83W1lY4t9TfiqgLFvnTA+APb770FQpxSTwAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/d00a7a558297b987a466855819434573/a0b58/4_3_1.webp 230w","/static/d00a7a558297b987a466855819434573/e25e9/4_3_1.webp 327w"],"sizes":"(max-width: 327px) 100vw, 327px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/d00a7a558297b987a466855819434573/81c8e/4_3_1.png 230w","/static/d00a7a558297b987a466855819434573/00e65/4_3_1.png 327w"],"sizes":"(max-width: 327px) 100vw, 327px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/d00a7a558297b987a466855819434573/00e65/4_3_1.png","alt":"Listan iterointi","title":"Listan iterointi","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma tulostaa listan kaikki alkiot "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukan avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3\n2\n4\n5\n2"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos verrataan tätä edelliseen esimerkkiin, huomataan, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukka selkeyttää suoraviivaista listan alkioiden läpikäyntiä huomattavasti."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme käydä samalla idealla läpi myös merkkijonon merkit:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna nimesi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"merkki"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Pekka"}]},{"type":"text","value":"\nP\ne\nk\nk\na"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Tulostus tähdillä","tmcname":"osa04-11a_tulostus_tahdilla"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka pyytää käyttäjää syöttämään merkkijonon ja tulostaa sitten merkkijonon kirjaimet yksitellen allekkain."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jokaisen kirjaimen jälkeen tulostetaan lisäksi tähti (*) omalle rivilleen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Python"}]},{"type":"text","value":"\nP\n*\ny\n*\nt\n*\nh\n*\no\n*\nn\n*"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"h2","properties":{"id":"funktio-range","style":"position:relative;"},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"a","properties":{"href":"#funktio-range","ariaLabel":"funktio range permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Silmukkaa tarvitaan usein myös siihen, että haluamme toistaa jonkin asian tietyn määrän kertoja tai käydä läpi tietyn lukuvälin (esimerkiksi kaikki luvut väliltä 1–100). Myös tämä onnistuu kätevästi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukalla funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"range"}]},{"type":"text","value":" avulla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme kutsua "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"range"}]},{"type":"text","value":"-funktiota monella tavalla. Yksinkertaisin tapa on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"range(n)"}]},{"type":"text","value":", jolloin silmukka käy läpi kokonaisluvut 0:sta lukuun "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"n"}]},{"type":"text","value":"–1:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"0\n1\n2\n3\n4"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun annamme kaksi parametria, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"range(a, b)"}]},{"type":"text","value":" aloittaa luvusta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":" ja lopettaa lukuun "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":"–1:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3\n4\n5\n6"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun annamme kolme parametria, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"range(a, b, c)"}]},{"type":"text","value":" aloittaa luvusta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":", lopettaa lukuun "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":"–1 ja muuttaa lukua "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"c"}]},{"type":"text","value":":llä joka askeleella:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1\n3\n5\n7"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme myös antaa negatiivisen askeleen, jolloin luvut käydään läpi käänteisesti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"6\n5\n4\n3"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Negatiivisesta positiiviseen","tmcname":"osa04-11b_negatiivisesta_positiiviseen"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka lukee käyttäjältä positiivisen kokonaisluvun N. Ohjelma tulostaa sen jälkeen luvut väliltä -N...N "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"nollaa lukuunottamatta"}]},{"type":"text","value":". Jokainen luku tulostetaan omalle rivilleen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\n-4\n-3\n-2\n-1\n1\n2\n3\n4"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"h2","properties":{"id":"lukuvali-listaksi","style":"position:relative;"},"children":[{"type":"text","value":"Lukuväli listaksi"},{"type":"element","tagName":"a","properties":{"href":"#lukuvali-listaksi","ariaLabel":"lukuvali listaksi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"range"}]},{"type":"text","value":" palauttaa lukuvälin, joka voidaan käydä läpi listan kaltaisesti mutta joka ei kuitenkaan ole lista. Tämän näkee siitä, että jos tulostamme funktion palauttaman arvon, näemme vain kuvauksen lukuvälistä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"range(2, 7)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tutustumme asiaan tarkemmin Ohjelmoinnin jatkokurssilla, mutta on hyvä tietää, että voimme muuttaa lukuvälin listaksi funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"list"}]},{"type":"text","value":". Tällöin listaan tulevat kaikki lukuväliin kuuluvat arvot:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[2, 3, 4, 5, 6]"}]}]},{"type":"element","tagName":"h2","properties":{"id":"muistutus-tehtavien-funktioita-testaavasta-omasta-koodista","style":"position:relative;"},"children":[{"type":"text","value":"Muistutus tehtävien funktioita testaavasta omasta koodista"},{"type":"element","tagName":"a","properties":{"href":"#muistutus-tehtavien-funktioita-testaavasta-omasta-koodista","ariaLabel":"muistutus tehtavien funktioita testaavasta omasta koodista permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiotehtävien tehtäväpohjat ovat tähän asti näyttäneet seuraavilta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tee ratkaisu tänne"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# funktiota kannattaa testata kutsumalla sitä täällä seuraavasti"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n lause "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"olipa kerran kauan sitten ohjelmoija\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eka_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"toka_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vika_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tästä eteenpäin muistutusta siitä, että testikoodi on sijoitettava "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":" -lohkoon, jota ei tehtäväpohjissa enää ole. Testit kuitenkin vaativat lohkon edelleen, eli joudut lisäämään sen itse."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huomaa kuitenkin"}]},{"type":"text","value":", että jotkut tehtävät, esim. hetken kuluttua vuorossa oleva "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Palindromit"}]},{"type":"text","value":", edellyttävät funktioiden lisäksi myös funktiota kutsuvaa koodia. Tätä koodia "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei tule"}]},{"type":"text","value":" sijoittaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":" -lohkon sisälle. Testit eivät nimittäin suorita mitään kyseisen lohkon koodista."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Tähdet","tmcname":"osa04-12_tahdet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lista_tahtina"}]},{"type":"text","value":", joka saa parametriksi listan kokonaislukuja. Funktio tulostaa joukon tähtirivejä siten, että listalla olevat luvut kertovat kunkin rivin tähtimäärän."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esim. kutsuttaessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lista_tahtina([3, 7, 1, 1, 2])"}]},{"type":"text","value":" tulostus on:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"***\n*******\n*\n*\n**\n"}]}]},{"type":"comment","value":" **Huomaa** että tällä hetkellä Windowsissa on ongelmia joidenkin tehtävien testien suorittamisessa. Jos törmäät seuraavaan virheilmoitukseen\n\n\"Listan\n\nvoit suorittaa testit lähettämällä ne palvelimelle valitsemalla testien suoritusnapin oikealla puolella olevasta symbolista avautuvasta TMC-valikosta _Submit solutions_.\n\nOngelman saa korjattua menemällä laajennuksen asennusvalikkoon ja muuttamalla \"TMC Data\" -kohdassa tehtävien sijainnin johonkin toiseen sijaintiin, jonka tiedostopolku on lyhempi, allaolevassa kuvassa nappi _change path_. Siirrossa saattaa kestää hetken, joten odotathan operaation päättymistä.\n\n\"Listan\n\nOngelmaan pyritään saamaan parempi ratkaisu lähipäivinä. "}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Anagrammi","tmcname":"osa04-13_anagrammi"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"anagrammi"}]},{"type":"text","value":" joka saa parametriksi kaksi merkkijonoa. Funktio palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", jos merkkijonot ovat anagrammeja eli ne muodostuvat täsmälleen samoista kirjaimista."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi funktiota voisi käyttää näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"anagrammi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"talo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tola\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# True"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"anagrammi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"talo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lato\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# True"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"anagrammi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"talo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"olat\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# True"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"anagrammi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tammi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"mitta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# False"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"anagrammi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"java\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# False"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vihje: funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sorted"}]},{"type":"text","value":" toimii myös merkkijonoille."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Palindromit","tmcname":"osa04-14_palindromit"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"palindromi"}]},{"type":"text","value":", joka saa parametriksi merkkijonon ja palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", jos merkkijono on palindromi (eli samansisältöinen luettuna alusta loppuun tai lopusta alkuun)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee myös funktiota hyödyntävä pääohjelma, joka kyselee käyttäjältä sanoja niin kauan, kunnes käyttäjä syöttää palindromin:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna palindromi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"python"}]},{"type":"text","value":"\nei ollut palindromi\nAnna palindromi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"java"}]},{"type":"text","value":"\nei ollut palindromi\nAnna palindromi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kauppias"}]},{"type":"text","value":"\nei ollut palindromi\nAnna palindromi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"saippuakauppias"}]},{"type":"text","value":"\nsaippuakauppias on palindromi!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huomaa"}]},{"type":"text","value":", että pääohjelmaa "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule kirjoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\":"}]},{"type":"text","value":"-lohkon sisälle"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Positiivisten summa","tmcname":"osa04-15_positiivisten_summa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"positiivisten_summa"}]},{"type":"text","value":", joka saa parametriksi kokonaislukuja sisältävän listan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa listan positiivisten lukujen summan."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nvastaus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" positiivisten_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vastaus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vastaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"vastaus 9"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kertaa nyt tarvittaessa "},{"type":"element","tagName":"a","properties":{"href":"/osa-4/3-listat"},"children":[{"type":"text","value":"edellisen osion"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Lista funktion parametrina ja paluuarvona"}]},{"type":"text","value":"!"}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Parilliset","tmcname":"osa04-16_parilliset"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"parilliset"}]},{"type":"text","value":", joka saa parametriksi kokonaislukuja sisältävän listan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa uuden listan, jolla on parametrina olevan listan sisältämät parilliset luvut."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nuusi_lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" parilliset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"alkuperäinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"uusi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" uusi_lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"alkuperäinen [1, 2, 3, 4, 5]\nuusi [2, 4]"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Summalista","tmcname":"osa04-17_summalista"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa"}]},{"type":"text","value":", joka saa parametriksi kaksi kokonaislukuja sisältävää listaa. Molemmissa listoissa on sama määrä alkioita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa uuden listan, jonka alkiot muodostuvat parametreina olevien listojen alkioiden summista."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esim:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nb "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# [8, 10, 12]"}]}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Uniikit","tmcname":"osa04-18_uniikit"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"uniikit"}]},{"type":"text","value":", joka saa parametriksi kokonaislukuja sisältävän listan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa uuden listan, joka sisältää parametrina annetun listan luvut suuruusjärjestyksessä siten, että jokainen luku on listalla vain kerran."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"uniikit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# [1, 2, 3]"}]}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"parhaan-tai-huonoimman-etsiminen-listalta","style":"position:relative;"},"children":[{"type":"text","value":"Parhaan tai huonoimman etsiminen listalta"},{"type":"element","tagName":"a","properties":{"href":"#parhaan-tai-huonoimman-etsiminen-listalta","ariaLabel":"parhaan tai huonoimman etsiminen listalta permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmoinnissa tulee usein esiin tilanne, missä listalta on löydettävä jonkin kriteerin mukaan paras tai huonoin alkio. Ratkaisu onnistuu käyttämällä sopivaa apumuuttujaa, jonka avulla voidaan \"muistaa\" läpikäynnin aikana siihen mennessä löytynyt paras alkio. Tätä muistettavaa alkiota verrataan sitten yksi kerrallaan jokaiseen vastaantulevaan alkioon, ja lopulta on tiedossa koko listan paras."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Algoritmin \"luonnos\" on seuraavassa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"paras "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" alkuarvo "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# sopiva alkuarvo riippuu tilanteesta"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" alkio parempi kuin paras"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n paras "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" alkio\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# paras on nyt tiedossa!"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodin yksityiskohdat riippuvat siitä minkä tyyppisiä alkioita listalla on ja mikä parhauden/huonouden vertailukriteeri on käytössä. Joissain tilanteissa myös apumuuttujia saatetaan tarvita useampia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Harjoitellaan hieman tämän ratkaisumenetelmän käyttöä."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Listan pisimmän pituus","tmcname":"osa04-18a_listan_pimman_pituus"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pisimman_pituus"}]},{"type":"text","value":", joka saa parametriksi listan merkkijonoja. Funktio palauttaa tiedon mikä on listan pisimmän merkkijonon pituus."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kolmas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"seitsemäs\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pisimman_pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"venla\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eero\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"juhani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pisimman_pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"9\n6"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Listan lyhin","tmcname":"osa04-18b_listan_lyhin"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lyhin"}]},{"type":"text","value":", joka saa parametriksi listan merkkijonoja. Funktio palauttaa listan lyhimmän merkkijonon. Jos samanpituisia on useita (testeissä näin ei ole), voi funktio palauttaa niistä minkä vaan. Funktio voi olettaa että listalla ei ole tyhjiä eli nollan pituisia merkkijonoja."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kolmas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"seitsemäs\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lyhin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"johanna\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"venla\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eero\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lyhin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"eka\neero"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Listan pisimmät","tmcname":"osa04-19_listan_pisimmat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pisimmat"}]},{"type":"text","value":", joka saa parametriksi listan merkkijonoja. Funktio palauttaa listan, joka sisältää parametrina annetun listan pisimmän merkkijonon. Jos pisimpiä merkkijonoja on useampia, funktio palauttaa ne kaikki listassa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkkijonojen järjestyksen tuloslistassa tulee noudattaa merkkijonojen järjestystä alkuperäisessä listassa."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kolmas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"seitsemäs\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pisimmat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ['seitsemäs']"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"venla\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eero\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"juhani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pisimmat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ['emilia', 'juhani']"}]}]}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, mitä tarkoitetaan iteroinnilla
  • \n
  • Tiedät, miten for-silmukka toimii
  • \n
  • Osaat käyttää for-silmukkaa listojen ja merkkijonojen läpikäyntiin
  • \n

Voimme käydä listan alkiot läpi while-silmukalla samaan tapaan kuin olemme aiemmin käyneet läpi merkkijonon merkkejä. Esimerkiksi seuraava ohjelma tulostaa kaikki listan alkiot omille riveilleen:

lista = [3, 2, 4, 5, 2]\n\nkohta = 0\nwhile kohta < len(lista):\n    print(lista[kohta])\n    kohta += 1

3\n2\n4\n5\n2

Tämä on kuitenkin melko vaivalloinen tapa, sillä joudumme käyttämään indeksimuuttujaa kohta, joka \"muistaa\", missä kohtaa listaa ollaan menossa. Nyt on aika opetella parempi tapa listan, merkkijonon tai muun vastaavan rakenteen läpikäyntiin.

for-silmukka

Pythonin for-silmukka käy läpi annetun rakenteen sisällön. Esimerkiksi voimme käydä läpi kaikki listalla olevat alkiot vasemmalta oikealle. Ohjelmoinnissa tällaista läpikäyntiä kutsutaan myös nimellä iterointi.

Ideana on, että for-silmukka poimii yksi kerrallaan kunkin alkion ja suorittaa kaikille saman operaation. Näin ohjelmoijan ei tarvitse itse huolehtia, mistä kohdasta alkio haetaan missäkin vaiheessa. Silmukan syntaksi on seuraava:

for <muuttuja> in <rakenne>:\n    <lohko>

Kun for-silmukka käy listan läpi, se poimii vuorollaan kunkin alkion, sijoittaa sen muuttujaan ja suorittaa lohkon. Kun silmukka on käynyt kaikki alkiot läpi, ohjelman suoritus jatkuu silmukan jälkeiseltä riviltä.

\n \n

Tee ohjelma, joka pyytää käyttäjää syöttämään merkkijonon ja tulostaa sitten merkkijonon kirjaimet yksitellen allekkain.

Jokaisen kirjaimen jälkeen tulostetaan lisäksi tähti (*) omalle rivilleen.

Esimerkiksi:

Anna merkkijono: Python\nP\n*\ny\n*\nt\n*\nh\n*\no\n*\nn\n*

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Funktio range

Silmukkaa tarvitaan usein myös siihen, että haluamme toistaa jonkin asian tietyn määrän kertoja tai käydä läpi tietyn lukuvälin (esimerkiksi kaikki luvut väliltä 1–100). Myös tämä onnistuu kätevästi for-silmukalla funktion range avulla.

Voimme kutsua range-funktiota monella tavalla. Yksinkertaisin tapa on range(n), jolloin silmukka käy läpi kokonaisluvut 0:sta lukuun n–1:

for i in range(5):\n    print(i)

0\n1\n2\n3\n4

Kun annamme kaksi parametria, range(a, b) aloittaa luvusta a ja lopettaa lukuun b–1:

for i in range(3, 7):\n    print(i)

3\n4\n5\n6

Kun annamme kolme parametria, range(a, b, c) aloittaa luvusta a, lopettaa lukuun b–1 ja muuttaa lukua c:llä joka askeleella:

for i in range(1, 9, 2):\n    print(i)

1\n3\n5\n7

Voimme myös antaa negatiivisen askeleen, jolloin luvut käydään läpi käänteisesti:

for i in range(6, 2, -1):\n    print(i)

6\n5\n4\n3

Tee ohjelma, joka lukee käyttäjältä positiivisen kokonaisluvun N. Ohjelma tulostaa sen jälkeen luvut väliltä -N...N nollaa lukuunottamatta. Jokainen luku tulostetaan omalle rivilleen.

Esimerkiksi

Anna luku: 4\n-4\n-3\n-2\n-1\n1\n2\n3\n4

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Lukuväli listaksi

Funktio range palauttaa lukuvälin, joka voidaan käydä läpi listan kaltaisesti mutta joka ei kuitenkaan ole lista. Tämän näkee siitä, että jos tulostamme funktion palauttaman arvon, näemme vain kuvauksen lukuvälistä:

luvut = range(2, 7)\nprint(luvut)

range(2, 7)

Tutustumme asiaan tarkemmin Ohjelmoinnin jatkokurssilla, mutta on hyvä tietää, että voimme muuttaa lukuvälin listaksi funktiolla list. Tällöin listaan tulevat kaikki lukuväliin kuuluvat arvot:

luvut = list(range(2, 7))\nprint(luvut)

[2, 3, 4, 5, 6]

Muistutus tehtävien funktioita testaavasta omasta koodista

Funktiotehtävien tehtäväpohjat ovat tähän asti näyttäneet seuraavilta:

# tee ratkaisu tänne\n# funktiota kannattaa testata kutsumalla sitä täällä seuraavasti\nif __name__ == \"__main__\":\n    lause = \"olipa kerran kauan sitten ohjelmoija\"\n    print(eka_sana(lause))\n    print(toka_sana(lause))\n    print(vika_sana(lause))

Tästä eteenpäin muistutusta siitä, että testikoodi on sijoitettava if __name__ == \"__main__\" -lohkoon, jota ei tehtäväpohjissa enää ole. Testit kuitenkin vaativat lohkon edelleen, eli joudut lisäämään sen itse.

Huomaa kuitenkin, että jotkut tehtävät, esim. hetken kuluttua vuorossa oleva Palindromit, edellyttävät funktioiden lisäksi myös funktiota kutsuvaa koodia. Tätä koodia ei tule sijoittaa if __name__ == \"__main__\" -lohkon sisälle. Testit eivät nimittäin suorita mitään kyseisen lohkon koodista.

Tee funktio lista_tahtina, joka saa parametriksi listan kokonaislukuja. Funktio tulostaa joukon tähtirivejä siten, että listalla olevat luvut kertovat kunkin rivin tähtimäärän.

Esim. kutsuttaessa lista_tahtina([3, 7, 1, 1, 2]) tulostus on:

\n***\n*******\n*\n*\n**\n

Tee funktio anagrammi joka saa parametriksi kaksi merkkijonoa. Funktio palauttaa True, jos merkkijonot ovat anagrammeja eli ne muodostuvat täsmälleen samoista kirjaimista.

Esimerkiksi funktiota voisi käyttää näin:

print(anagrammi(\"talo\", \"tola\")) # True\nprint(anagrammi(\"talo\", \"lato\")) # True\nprint(anagrammi(\"talo\", \"olat\")) # True\nprint(anagrammi(\"tammi\", \"mitta\")) # False\nprint(anagrammi(\"python\", \"java\")) # False

Vihje: funktio sorted toimii myös merkkijonoille.

Tee funktio palindromi, joka saa parametriksi merkkijonon ja palauttaa True, jos merkkijono on palindromi (eli samansisältöinen luettuna alusta loppuun tai lopusta alkuun).

Tee myös funktiota hyödyntävä pääohjelma, joka kyselee käyttäjältä sanoja niin kauan, kunnes käyttäjä syöttää palindromin:

Anna palindromi: python\nei ollut palindromi\nAnna palindromi: java\nei ollut palindromi\nAnna palindromi: kauppias\nei ollut palindromi\nAnna palindromi: saippuakauppias\nsaippuakauppias on palindromi!

Huomaa, että pääohjelmaa ei tule kirjoittaa\nif __name__ == \"__main__\":-lohkon sisälle

Tee funktio positiivisten_summa, joka saa parametriksi kokonaislukuja sisältävän listan.

Funktio palauttaa listan positiivisten lukujen summan.

lista = [1, -2, 3, -4, 5]\nvastaus = positiivisten_summa(lista)\nprint(\"vastaus\", vastaus)

vastaus 9

Kertaa nyt tarvittaessa edellisen osion luku Lista funktion parametrina ja paluuarvona!

Tee funktio parilliset, joka saa parametriksi kokonaislukuja sisältävän listan.

Funktio palauttaa uuden listan, jolla on parametrina olevan listan sisältämät parilliset luvut.

lista = [1, 2, 3, 4, 5]\nuusi_lista = parilliset(lista)\nprint(\"alkuperäinen\", lista)\nprint(\"uusi\", uusi_lista)

alkuperäinen [1, 2, 3, 4, 5]\nuusi [2, 4]

Tee funktio summa, joka saa parametriksi kaksi kokonaislukuja sisältävää listaa. Molemmissa listoissa on sama määrä alkioita.

Funktio palauttaa uuden listan, jonka alkiot muodostuvat parametreina olevien listojen alkioiden summista.

Esim:

a = [1, 2, 3]\nb = [7, 8, 9]\nprint(summa(a, b)) # [8, 10, 12]

Tee funktio uniikit, joka saa parametriksi kokonaislukuja sisältävän listan.

Funktio palauttaa uuden listan, joka sisältää parametrina annetun listan luvut suuruusjärjestyksessä siten, että jokainen luku on listalla vain kerran.

lista = [3, 2, 2, 1, 3, 3, 1]\nprint(uniikit(lista)) # [1, 2, 3]

Parhaan tai huonoimman etsiminen listalta

Ohjelmoinnissa tulee usein esiin tilanne, missä listalta on löydettävä jonkin kriteerin mukaan paras tai huonoin alkio. Ratkaisu onnistuu käyttämällä sopivaa apumuuttujaa, jonka avulla voidaan \"muistaa\" läpikäynnin aikana siihen mennessä löytynyt paras alkio. Tätä muistettavaa alkiota verrataan sitten yksi kerrallaan jokaiseen vastaantulevaan alkioon, ja lopulta on tiedossa koko listan paras.

Algoritmin \"luonnos\" on seuraavassa:

paras = alkuarvo # sopiva alkuarvo riippuu tilanteesta\nfor alkio in lista:\n    if alkio parempi kuin paras:\n        paras = alkio\n\n# paras on nyt tiedossa!

Koodin yksityiskohdat riippuvat siitä minkä tyyppisiä alkioita listalla on ja mikä parhauden/huonouden vertailukriteeri on käytössä. Joissain tilanteissa myös apumuuttujia saatetaan tarvita useampia.

Harjoitellaan hieman tämän ratkaisumenetelmän käyttöä.

Tee funktio pisimman_pituus, joka saa parametriksi listan merkkijonoja. Funktio palauttaa tiedon mikä on listan pisimmän merkkijonon pituus.

lista = [\"eka\", \"toka\", \"kolmas\", \"seitsemäs\"]\n\ntulos = pisimman_pituus(lista)\nprint(tulos)
lista = [\"pekka\", \"emilia\", \"venla\", \"eero\", \"antti\", \"juhani\"]\n\ntulos = pisimman_pituus(lista)\nprint(tulos)

9\n6

Tee funktio lyhin, joka saa parametriksi listan merkkijonoja. Funktio palauttaa listan lyhimmän merkkijonon. Jos samanpituisia on useita (testeissä näin ei ole), voi funktio palauttaa niistä minkä vaan. Funktio voi olettaa että listalla ei ole tyhjiä eli nollan pituisia merkkijonoja.

lista = [\"eka\", \"toka\", \"kolmas\", \"seitsemäs\"]\n\ntulos = lyhin(lista)\nprint(tulos)
lista = [\"pekka\", \"emilia\", \"johanna\", \"venla\", \"eero\", \"antti\"]\n\ntulos = lyhin(lista)\nprint(tulos)

eka\neero

Tee funktio pisimmat, joka saa parametriksi listan merkkijonoja. Funktio palauttaa listan, joka sisältää parametrina annetun listan pisimmän merkkijonon. Jos pisimpiä merkkijonoja on useampia, funktio palauttaa ne kaikki listassa.

Merkkijonojen järjestyksen tuloslistassa tulee noudattaa merkkijonojen järjestystä alkuperäisessä listassa.

lista = [\"eka\", \"toka\", \"kolmas\", \"seitsemäs\"]\n\ntulos = pisimmat(lista)\nprint(tulos) # ['seitsemäs']
lista = [\"pekka\", \"emilia\", \"venla\", \"eero\", \"antti\", \"juhani\"]\n\ntulos = pisimmat(lista)\nprint(tulos) # ['emilia', 'juhani']
","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-4/4-silmukat-ja-iterointi.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä tarkoitetaan iteroinnilla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukka toimii"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukkaa listojen ja merkkijonojen läpikäyntiin"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme käydä listan alkiot läpi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":"-silmukalla samaan tapaan kuin olemme aiemmin käyneet läpi merkkijonon merkkejä. Esimerkiksi seuraava ohjelma tulostaa kaikki listan alkiot omille riveilleen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nkohta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" kohta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"kohta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kohta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3\n2\n4\n5\n2"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä on kuitenkin melko vaivalloinen tapa, sillä joudumme käyttämään indeksimuuttujaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kohta"}]},{"type":"text","value":", joka \"muistaa\", missä kohtaa listaa ollaan menossa. Nyt on aika opetella parempi tapa listan, merkkijonon tai muun vastaavan rakenteen läpikäyntiin."}]},{"type":"element","tagName":"h2","properties":{"id":"for-silmukka","style":"position:relative;"},"children":[{"type":"text","value":"for-silmukka"},{"type":"element","tagName":"a","properties":{"href":"#for-silmukka","ariaLabel":"for silmukka permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukka käy läpi annetun rakenteen sisällön. Esimerkiksi voimme käydä läpi kaikki listalla olevat alkiot vasemmalta oikealle. Ohjelmoinnissa tällaista läpikäyntiä kutsutaan myös nimellä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"iterointi"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ideana on, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukka poimii yksi kerrallaan kunkin alkion ja suorittaa kaikille saman operaation. Näin ohjelmoijan ei tarvitse itse huolehtia, mistä kohdasta alkio haetaan missäkin vaiheessa. Silmukan syntaksi on seuraava:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"muuttuja"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"rakenne"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"lohko"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukka käy listan läpi, se poimii vuorollaan kunkin alkion, sijoittaa sen muuttujaan ja suorittaa lohkon. Kun silmukka on käynyt kaikki alkiot läpi, ohjelman suoritus jatkuu silmukan jälkeiseltä riviltä."}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 327px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/d00a7a558297b987a466855819434573/00e65/4_3_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 214.3478260869565%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAArCAYAAAB4pah1AAAACXBIWXMAAAsTAAALEwEAmpwYAAADSklEQVRIx62XWVMqMRCF5+f7O3zHB3yDJy2RYhNXRAERWQT3XVGwra9v9VQcMwxQN1WpyYTMyenu050QiKd9f3/rczKZyNfX16+5pBbMAry9vZWrq6v/B3hzcyOj0Sicmwc08IHZh8/Pz3J3d7ccoC3mie9oxWJRdnd3Q3+6a2IB+XE6nWqPLkyn05LNZr0W+HoI6LbxeCzD4VDa7baa/Pj4KOfn5xoci3hcA0tNbjQa0mq1FKjb7crx8bHUajXp9/tyenqq7/V6XX+7vLyUh4cH3cie9/f38vb29o8hk2tra7K+vi5HR0e6iI9LpZKUy2XZ2NiQQqEgg8FAZVSpVOTi4kIZQ4DOuNlsKmjQ6/Xk8/MzpMwCAgEoAEjn5OREmZomfY0Nn56eJGCAr6INU/Dj2dmZLnQj7HaCScM94AQMXl5ewsW2gCfBwAKfRqPPWEBr7+/vamq1WpWPjw/x6TURkIY0DIBgZTIZHTNngnc39gKaDwkA8ul0OioRgrO3t6djIgtj/JnI0AABQ9jRvDW/okE2nRsQge/s7MjBwYHKBIbkM8KGKWm4ECAyYQHvgOVyOd0AMHyIDhcCRCYWYVgCtr29rU8ruPS5ARHx6+urRhpQMghmpBQfosnr6+tYQM0UF5A8JsLMkYJWJBgzh0vYMJoxNDYLAV0dwsjeV1dXJZVKhdXbzfmoDtmUzX4xxOmwQHfMU32sjMEgTodUms3NTQ2iFgczw6Ic14hwXJQhQcACBjiaQKA9nnQLCEInQDROQDfKbjGBGK7SAgszJiioLDJz0eLh4aEWCKryLIZhlF2TyFfY2cnndvNxog5d2uhw1kEE4CwdhoA2SZWmQJAx0Y4+7dyYCei7IBEQC44bJLNkZj307ZZ09iYydM1GkwjYDig646i5c5uM433HJanlk0wiILJAwOgS0cPWBB2NsDsOi4PvTghDDvp8Pq/ixmQUsLKyovURNuYKOiogy8iqP4CwYCd2JNnJFHxHRuFHt+JES5j3fuiK122YTfq5h5bvmvcHENMorJjFoUWHLSa5pSv2fujTmDGwSu3OJWnVeyV279hmpk97iYBRhvv7+1rGlmLoNvuYe83W1lY4t9TfiqgLFvnTA+APb770FQpxSTwAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/d00a7a558297b987a466855819434573/a0b58/4_3_1.webp 230w","/static/d00a7a558297b987a466855819434573/e25e9/4_3_1.webp 327w"],"sizes":"(max-width: 327px) 100vw, 327px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/d00a7a558297b987a466855819434573/81c8e/4_3_1.png 230w","/static/d00a7a558297b987a466855819434573/00e65/4_3_1.png 327w"],"sizes":"(max-width: 327px) 100vw, 327px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/d00a7a558297b987a466855819434573/00e65/4_3_1.png","alt":"Listan iterointi","title":"Listan iterointi","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma tulostaa listan kaikki alkiot "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukan avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3\n2\n4\n5\n2"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos verrataan tätä edelliseen esimerkkiin, huomataan, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukka selkeyttää suoraviivaista listan alkioiden läpikäyntiä huomattavasti."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme käydä samalla idealla läpi myös merkkijonon merkit:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna nimesi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"merkki"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna nimesi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Pekka"}]},{"type":"text","value":"\nP\ne\nk\nk\na"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Tulostus tähdillä","tmcname":"osa04-11a_tulostus_tahdilla"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka pyytää käyttäjää syöttämään merkkijonon ja tulostaa sitten merkkijonon kirjaimet yksitellen allekkain."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jokaisen kirjaimen jälkeen tulostetaan lisäksi tähti (*) omalle rivilleen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Python"}]},{"type":"text","value":"\nP\n*\ny\n*\nt\n*\nh\n*\no\n*\nn\n*"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"h2","properties":{"id":"funktio-range","style":"position:relative;"},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"a","properties":{"href":"#funktio-range","ariaLabel":"funktio range permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Silmukkaa tarvitaan usein myös siihen, että haluamme toistaa jonkin asian tietyn määrän kertoja tai käydä läpi tietyn lukuvälin (esimerkiksi kaikki luvut väliltä 1–100). Myös tämä onnistuu kätevästi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukalla funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"range"}]},{"type":"text","value":" avulla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme kutsua "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"range"}]},{"type":"text","value":"-funktiota monella tavalla. Yksinkertaisin tapa on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"range(n)"}]},{"type":"text","value":", jolloin silmukka käy läpi kokonaisluvut 0:sta lukuun "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"n"}]},{"type":"text","value":"–1:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"0\n1\n2\n3\n4"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun annamme kaksi parametria, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"range(a, b)"}]},{"type":"text","value":" aloittaa luvusta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":" ja lopettaa lukuun "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":"–1:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3\n4\n5\n6"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun annamme kolme parametria, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"range(a, b, c)"}]},{"type":"text","value":" aloittaa luvusta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":", lopettaa lukuun "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":"–1 ja muuttaa lukua "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"c"}]},{"type":"text","value":":llä joka askeleella:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1\n3\n5\n7"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme myös antaa negatiivisen askeleen, jolloin luvut käydään läpi käänteisesti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"6\n5\n4\n3"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Negatiivisesta positiiviseen","tmcname":"osa04-11b_negatiivisesta_positiiviseen"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka lukee käyttäjältä positiivisen kokonaisluvun N. Ohjelma tulostaa sen jälkeen luvut väliltä -N...N "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"nollaa lukuunottamatta"}]},{"type":"text","value":". Jokainen luku tulostetaan omalle rivilleen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\n-4\n-3\n-2\n-1\n1\n2\n3\n4"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"h2","properties":{"id":"lukuvali-listaksi","style":"position:relative;"},"children":[{"type":"text","value":"Lukuväli listaksi"},{"type":"element","tagName":"a","properties":{"href":"#lukuvali-listaksi","ariaLabel":"lukuvali listaksi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"range"}]},{"type":"text","value":" palauttaa lukuvälin, joka voidaan käydä läpi listan kaltaisesti mutta joka ei kuitenkaan ole lista. Tämän näkee siitä, että jos tulostamme funktion palauttaman arvon, näemme vain kuvauksen lukuvälistä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"range(2, 7)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tutustumme asiaan tarkemmin Ohjelmoinnin jatkokurssilla, mutta on hyvä tietää, että voimme muuttaa lukuvälin listaksi funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"list"}]},{"type":"text","value":". Tällöin listaan tulevat kaikki lukuväliin kuuluvat arvot:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[2, 3, 4, 5, 6]"}]}]},{"type":"element","tagName":"h2","properties":{"id":"muistutus-tehtavien-funktioita-testaavasta-omasta-koodista","style":"position:relative;"},"children":[{"type":"text","value":"Muistutus tehtävien funktioita testaavasta omasta koodista"},{"type":"element","tagName":"a","properties":{"href":"#muistutus-tehtavien-funktioita-testaavasta-omasta-koodista","ariaLabel":"muistutus tehtavien funktioita testaavasta omasta koodista permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiotehtävien tehtäväpohjat ovat tähän asti näyttäneet seuraavilta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tee ratkaisu tänne"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# funktiota kannattaa testata kutsumalla sitä täällä seuraavasti"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n lause "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"olipa kerran kauan sitten ohjelmoija\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eka_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"toka_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vika_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tästä eteenpäin muistutusta siitä, että testikoodi on sijoitettava "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":" -lohkoon, jota ei tehtäväpohjissa enää ole. Testit kuitenkin vaativat lohkon edelleen, eli joudut lisäämään sen itse."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huomaa kuitenkin"}]},{"type":"text","value":", että jotkut tehtävät, esim. hetken kuluttua vuorossa oleva "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Palindromit"}]},{"type":"text","value":", edellyttävät funktioiden lisäksi myös funktiota kutsuvaa koodia. Tätä koodia "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei tule"}]},{"type":"text","value":" sijoittaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":" -lohkon sisälle. Testit eivät nimittäin suorita mitään kyseisen lohkon koodista."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Tähdet","tmcname":"osa04-12_tahdet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lista_tahtina"}]},{"type":"text","value":", joka saa parametriksi listan kokonaislukuja. Funktio tulostaa joukon tähtirivejä siten, että listalla olevat luvut kertovat kunkin rivin tähtimäärän."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esim. kutsuttaessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lista_tahtina([3, 7, 1, 1, 2])"}]},{"type":"text","value":" tulostus on:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"***\n*******\n*\n*\n**\n"}]}]},{"type":"comment","value":" **Huomaa** että tällä hetkellä Windowsissa on ongelmia joidenkin tehtävien testien suorittamisessa. Jos törmäät seuraavaan virheilmoitukseen\n\n\"Listan\n\nvoit suorittaa testit lähettämällä ne palvelimelle valitsemalla testien suoritusnapin oikealla puolella olevasta symbolista avautuvasta TMC-valikosta _Submit solutions_.\n\nOngelman saa korjattua menemällä laajennuksen asennusvalikkoon ja muuttamalla \"TMC Data\" -kohdassa tehtävien sijainnin johonkin toiseen sijaintiin, jonka tiedostopolku on lyhempi, allaolevassa kuvassa nappi _change path_. Siirrossa saattaa kestää hetken, joten odotathan operaation päättymistä.\n\n\"Listan\n\nOngelmaan pyritään saamaan parempi ratkaisu lähipäivinä. "}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Anagrammi","tmcname":"osa04-13_anagrammi"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"anagrammi"}]},{"type":"text","value":" joka saa parametriksi kaksi merkkijonoa. Funktio palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", jos merkkijonot ovat anagrammeja eli ne muodostuvat täsmälleen samoista kirjaimista."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi funktiota voisi käyttää näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"anagrammi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"talo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tola\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# True"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"anagrammi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"talo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lato\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# True"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"anagrammi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"talo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"olat\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# True"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"anagrammi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tammi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"mitta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# False"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"anagrammi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"java\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# False"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vihje: funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sorted"}]},{"type":"text","value":" toimii myös merkkijonoille."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Palindromit","tmcname":"osa04-14_palindromit"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"palindromi"}]},{"type":"text","value":", joka saa parametriksi merkkijonon ja palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", jos merkkijono on palindromi (eli samansisältöinen luettuna alusta loppuun tai lopusta alkuun)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee myös funktiota hyödyntävä pääohjelma, joka kyselee käyttäjältä sanoja niin kauan, kunnes käyttäjä syöttää palindromin:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna palindromi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"python"}]},{"type":"text","value":"\nei ollut palindromi\nAnna palindromi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"java"}]},{"type":"text","value":"\nei ollut palindromi\nAnna palindromi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kauppias"}]},{"type":"text","value":"\nei ollut palindromi\nAnna palindromi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"saippuakauppias"}]},{"type":"text","value":"\nsaippuakauppias on palindromi!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huomaa"}]},{"type":"text","value":", että pääohjelmaa "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule kirjoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\":"}]},{"type":"text","value":"-lohkon sisälle"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Positiivisten summa","tmcname":"osa04-15_positiivisten_summa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"positiivisten_summa"}]},{"type":"text","value":", joka saa parametriksi kokonaislukuja sisältävän listan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa listan positiivisten lukujen summan."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nvastaus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" positiivisten_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vastaus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vastaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"vastaus 9"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kertaa nyt tarvittaessa "},{"type":"element","tagName":"a","properties":{"href":"/osa-4/3-listat"},"children":[{"type":"text","value":"edellisen osion"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Lista funktion parametrina ja paluuarvona"}]},{"type":"text","value":"!"}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Parilliset","tmcname":"osa04-16_parilliset"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"parilliset"}]},{"type":"text","value":", joka saa parametriksi kokonaislukuja sisältävän listan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa uuden listan, jolla on parametrina olevan listan sisältämät parilliset luvut."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nuusi_lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" parilliset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"alkuperäinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"uusi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" uusi_lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"alkuperäinen [1, 2, 3, 4, 5]\nuusi [2, 4]"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Summalista","tmcname":"osa04-17_summalista"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa"}]},{"type":"text","value":", joka saa parametriksi kaksi kokonaislukuja sisältävää listaa. Molemmissa listoissa on sama määrä alkioita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa uuden listan, jonka alkiot muodostuvat parametreina olevien listojen alkioiden summista."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esim:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nb "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# [8, 10, 12]"}]}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Uniikit","tmcname":"osa04-18_uniikit"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"uniikit"}]},{"type":"text","value":", joka saa parametriksi kokonaislukuja sisältävän listan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa uuden listan, joka sisältää parametrina annetun listan luvut suuruusjärjestyksessä siten, että jokainen luku on listalla vain kerran."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"uniikit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# [1, 2, 3]"}]}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"parhaan-tai-huonoimman-etsiminen-listalta","style":"position:relative;"},"children":[{"type":"text","value":"Parhaan tai huonoimman etsiminen listalta"},{"type":"element","tagName":"a","properties":{"href":"#parhaan-tai-huonoimman-etsiminen-listalta","ariaLabel":"parhaan tai huonoimman etsiminen listalta permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmoinnissa tulee usein esiin tilanne, missä listalta on löydettävä jonkin kriteerin mukaan paras tai huonoin alkio. Ratkaisu onnistuu käyttämällä sopivaa apumuuttujaa, jonka avulla voidaan \"muistaa\" läpikäynnin aikana siihen mennessä löytynyt paras alkio. Tätä muistettavaa alkiota verrataan sitten yksi kerrallaan jokaiseen vastaantulevaan alkioon, ja lopulta on tiedossa koko listan paras."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Algoritmin \"luonnos\" on seuraavassa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"paras "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" alkuarvo "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# sopiva alkuarvo riippuu tilanteesta"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" alkio parempi kuin paras"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n paras "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" alkio\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# paras on nyt tiedossa!"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodin yksityiskohdat riippuvat siitä minkä tyyppisiä alkioita listalla on ja mikä parhauden/huonouden vertailukriteeri on käytössä. Joissain tilanteissa myös apumuuttujia saatetaan tarvita useampia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Harjoitellaan hieman tämän ratkaisumenetelmän käyttöä."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Listan pisimmän pituus","tmcname":"osa04-18a_listan_pimman_pituus"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pisimman_pituus"}]},{"type":"text","value":", joka saa parametriksi listan merkkijonoja. Funktio palauttaa tiedon mikä on listan pisimmän merkkijonon pituus."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kolmas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"seitsemäs\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pisimman_pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"venla\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eero\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"juhani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pisimman_pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"9\n6"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Listan lyhin","tmcname":"osa04-18b_listan_lyhin"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lyhin"}]},{"type":"text","value":", joka saa parametriksi listan merkkijonoja. Funktio palauttaa listan lyhimmän merkkijonon. Jos samanpituisia on useita (testeissä näin ei ole), voi funktio palauttaa niistä minkä vaan. Funktio voi olettaa että listalla ei ole tyhjiä eli nollan pituisia merkkijonoja."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kolmas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"seitsemäs\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lyhin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"johanna\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"venla\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eero\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lyhin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"eka\neero"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Listan pisimmät","tmcname":"osa04-19_listan_pisimmat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pisimmat"}]},{"type":"text","value":", joka saa parametriksi listan merkkijonoja. Funktio palauttaa listan, joka sisältää parametrina annetun listan pisimmän merkkijonon. Jos pisimpiä merkkijonoja on useampia, funktio palauttaa ne kaikki listassa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkkijonojen järjestyksen tuloslistassa tulee noudattaa merkkijonojen järjestystä alkuperäisessä listassa."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kolmas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"seitsemäs\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pisimmat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ['seitsemäs']"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"venla\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eero\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"juhani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pisimmat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ['emilia', 'juhani']"}]}]}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, mitä tarkoitetaan iteroinnilla
  • \n
  • Tiedät, miten for-silmukka toimii
  • \n
  • Osaat käyttää for-silmukkaa listojen ja merkkijonojen läpikäyntiin
  • \n

Voimme käydä listan alkiot läpi while-silmukalla samaan tapaan kuin olemme aiemmin käyneet läpi merkkijonon merkkejä. Esimerkiksi seuraava ohjelma tulostaa kaikki listan alkiot omille riveilleen:

lista = [3, 2, 4, 5, 2]\n\nkohta = 0\nwhile kohta < len(lista):\n    print(lista[kohta])\n    kohta += 1

3\n2\n4\n5\n2

Tämä on kuitenkin melko vaivalloinen tapa, sillä joudumme käyttämään indeksimuuttujaa kohta, joka \"muistaa\", missä kohtaa listaa ollaan menossa. Nyt on aika opetella parempi tapa listan, merkkijonon tai muun vastaavan rakenteen läpikäyntiin.

for-silmukka

Pythonin for-silmukka käy läpi annetun rakenteen sisällön. Esimerkiksi voimme käydä läpi kaikki listalla olevat alkiot vasemmalta oikealle. Ohjelmoinnissa tällaista läpikäyntiä kutsutaan myös nimellä iterointi.

Ideana on, että for-silmukka poimii yksi kerrallaan kunkin alkion ja suorittaa kaikille saman operaation. Näin ohjelmoijan ei tarvitse itse huolehtia, mistä kohdasta alkio haetaan missäkin vaiheessa. Silmukan syntaksi on seuraava:

for <muuttuja> in <rakenne>:\n    <lohko>

Kun for-silmukka käy listan läpi, se poimii vuorollaan kunkin alkion, sijoittaa sen muuttujaan ja suorittaa lohkon. Kun silmukka on käynyt kaikki alkiot läpi, ohjelman suoritus jatkuu silmukan jälkeiseltä riviltä.

\n \n

Tee ohjelma, joka pyytää käyttäjää syöttämään merkkijonon ja tulostaa sitten merkkijonon kirjaimet yksitellen allekkain.

Jokaisen kirjaimen jälkeen tulostetaan lisäksi tähti (*) omalle rivilleen.

Esimerkiksi:

Anna merkkijono: Python\nP\n*\ny\n*\nt\n*\nh\n*\no\n*\nn\n*

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Funktio range

Silmukkaa tarvitaan usein myös siihen, että haluamme toistaa jonkin asian tietyn määrän kertoja tai käydä läpi tietyn lukuvälin (esimerkiksi kaikki luvut väliltä 1–100). Myös tämä onnistuu kätevästi for-silmukalla funktion range avulla.

Voimme kutsua range-funktiota monella tavalla. Yksinkertaisin tapa on range(n), jolloin silmukka käy läpi kokonaisluvut 0:sta lukuun n–1:

for i in range(5):\n    print(i)

0\n1\n2\n3\n4

Kun annamme kaksi parametria, range(a, b) aloittaa luvusta a ja lopettaa lukuun b–1:

for i in range(3, 7):\n    print(i)

3\n4\n5\n6

Kun annamme kolme parametria, range(a, b, c) aloittaa luvusta a, lopettaa lukuun b–1 ja muuttaa lukua c:llä joka askeleella:

for i in range(1, 9, 2):\n    print(i)

1\n3\n5\n7

Voimme myös antaa negatiivisen askeleen, jolloin luvut käydään läpi käänteisesti:

for i in range(6, 2, -1):\n    print(i)

6\n5\n4\n3

Tee ohjelma, joka lukee käyttäjältä positiivisen kokonaisluvun N. Ohjelma tulostaa sen jälkeen luvut väliltä -N...N nollaa lukuunottamatta. Jokainen luku tulostetaan omalle rivilleen.

Esimerkiksi

Anna luku: 4\n-4\n-3\n-2\n-1\n1\n2\n3\n4

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Lukuväli listaksi

Funktio range palauttaa lukuvälin, joka voidaan käydä läpi listan kaltaisesti mutta joka ei kuitenkaan ole lista. Tämän näkee siitä, että jos tulostamme funktion palauttaman arvon, näemme vain kuvauksen lukuvälistä:

luvut = range(2, 7)\nprint(luvut)

range(2, 7)

Tutustumme asiaan tarkemmin Ohjelmoinnin jatkokurssilla, mutta on hyvä tietää, että voimme muuttaa lukuvälin listaksi funktiolla list. Tällöin listaan tulevat kaikki lukuväliin kuuluvat arvot:

luvut = list(range(2, 7))\nprint(luvut)

[2, 3, 4, 5, 6]

Muistutus tehtävien funktioita testaavasta omasta koodista

Funktiotehtävien tehtäväpohjat ovat tähän asti näyttäneet seuraavilta:

# tee ratkaisu tänne\n# funktiota kannattaa testata kutsumalla sitä täällä seuraavasti\nif __name__ == \"__main__\":\n    lause = \"olipa kerran kauan sitten ohjelmoija\"\n    print(eka_sana(lause))\n    print(toka_sana(lause))\n    print(vika_sana(lause))

Tästä eteenpäin muistutusta siitä, että testikoodi on sijoitettava if __name__ == \"__main__\" -lohkoon, jota ei tehtäväpohjissa enää ole. Testit kuitenkin vaativat lohkon edelleen, eli joudut lisäämään sen itse.

Huomaa kuitenkin, että jotkut tehtävät, esim. hetken kuluttua vuorossa oleva Palindromit, edellyttävät funktioiden lisäksi myös funktiota kutsuvaa koodia. Tätä koodia ei tule sijoittaa if __name__ == \"__main__\" -lohkon sisälle. Testit eivät nimittäin suorita mitään kyseisen lohkon koodista.

Tee funktio lista_tahtina, joka saa parametriksi listan kokonaislukuja. Funktio tulostaa joukon tähtirivejä siten, että listalla olevat luvut kertovat kunkin rivin tähtimäärän.

Esim. kutsuttaessa lista_tahtina([3, 7, 1, 1, 2]) tulostus on:

\n***\n*******\n*\n*\n**\n

Tee funktio anagrammi joka saa parametriksi kaksi merkkijonoa. Funktio palauttaa True, jos merkkijonot ovat anagrammeja eli ne muodostuvat täsmälleen samoista kirjaimista.

Esimerkiksi funktiota voisi käyttää näin:

print(anagrammi(\"talo\", \"tola\")) # True\nprint(anagrammi(\"talo\", \"lato\")) # True\nprint(anagrammi(\"talo\", \"olat\")) # True\nprint(anagrammi(\"tammi\", \"mitta\")) # False\nprint(anagrammi(\"python\", \"java\")) # False

Vihje: funktio sorted toimii myös merkkijonoille.

Tee funktio palindromi, joka saa parametriksi merkkijonon ja palauttaa True, jos merkkijono on palindromi (eli samansisältöinen luettuna alusta loppuun tai lopusta alkuun).

Tee myös funktiota hyödyntävä pääohjelma, joka kyselee käyttäjältä sanoja niin kauan, kunnes käyttäjä syöttää palindromin:

Anna palindromi: python\nei ollut palindromi\nAnna palindromi: java\nei ollut palindromi\nAnna palindromi: kauppias\nei ollut palindromi\nAnna palindromi: saippuakauppias\nsaippuakauppias on palindromi!

Huomaa, että pääohjelmaa ei tule kirjoittaa\nif __name__ == \"__main__\":-lohkon sisälle

Tee funktio positiivisten_summa, joka saa parametriksi kokonaislukuja sisältävän listan.

Funktio palauttaa listan positiivisten lukujen summan.

lista = [1, -2, 3, -4, 5]\nvastaus = positiivisten_summa(lista)\nprint(\"vastaus\", vastaus)

vastaus 9

Kertaa nyt tarvittaessa edellisen osion luku Lista funktion parametrina ja paluuarvona!

Tee funktio parilliset, joka saa parametriksi kokonaislukuja sisältävän listan.

Funktio palauttaa uuden listan, jolla on parametrina olevan listan sisältämät parilliset luvut.

lista = [1, 2, 3, 4, 5]\nuusi_lista = parilliset(lista)\nprint(\"alkuperäinen\", lista)\nprint(\"uusi\", uusi_lista)

alkuperäinen [1, 2, 3, 4, 5]\nuusi [2, 4]

Tee funktio summa, joka saa parametriksi kaksi kokonaislukuja sisältävää listaa. Molemmissa listoissa on sama määrä alkioita.

Funktio palauttaa uuden listan, jonka alkiot muodostuvat parametreina olevien listojen alkioiden summista.

Esim:

a = [1, 2, 3]\nb = [7, 8, 9]\nprint(summa(a, b)) # [8, 10, 12]

Tee funktio uniikit, joka saa parametriksi kokonaislukuja sisältävän listan.

Funktio palauttaa uuden listan, joka sisältää parametrina annetun listan luvut suuruusjärjestyksessä siten, että jokainen luku on listalla vain kerran.

lista = [3, 2, 2, 1, 3, 3, 1]\nprint(uniikit(lista)) # [1, 2, 3]

Parhaan tai huonoimman etsiminen listalta

Ohjelmoinnissa tulee usein esiin tilanne, missä listalta on löydettävä jonkin kriteerin mukaan paras tai huonoin alkio. Ratkaisu onnistuu käyttämällä sopivaa apumuuttujaa, jonka avulla voidaan \"muistaa\" läpikäynnin aikana siihen mennessä löytynyt paras alkio. Tätä muistettavaa alkiota verrataan sitten yksi kerrallaan jokaiseen vastaantulevaan alkioon, ja lopulta on tiedossa koko listan paras.

Algoritmin \"luonnos\" on seuraavassa:

paras = alkuarvo # sopiva alkuarvo riippuu tilanteesta\nfor alkio in lista:\n    if alkio parempi kuin paras:\n        paras = alkio\n\n# paras on nyt tiedossa!

Koodin yksityiskohdat riippuvat siitä minkä tyyppisiä alkioita listalla on ja mikä parhauden/huonouden vertailukriteeri on käytössä. Joissain tilanteissa myös apumuuttujia saatetaan tarvita useampia.

Harjoitellaan hieman tämän ratkaisumenetelmän käyttöä.

Tee funktio pisimman_pituus, joka saa parametriksi listan merkkijonoja. Funktio palauttaa tiedon mikä on listan pisimmän merkkijonon pituus.

lista = [\"eka\", \"toka\", \"kolmas\", \"seitsemäs\"]\n\ntulos = pisimman_pituus(lista)\nprint(tulos)
lista = [\"pekka\", \"emilia\", \"venla\", \"eero\", \"antti\", \"juhani\"]\n\ntulos = pisimman_pituus(lista)\nprint(tulos)

9\n6

Tee funktio lyhin, joka saa parametriksi listan merkkijonoja. Funktio palauttaa listan lyhimmän merkkijonon. Jos samanpituisia on useita (testeissä näin ei ole), voi funktio palauttaa niistä minkä vaan. Funktio voi olettaa että listalla ei ole tyhjiä eli nollan pituisia merkkijonoja.

lista = [\"eka\", \"toka\", \"kolmas\", \"seitsemäs\"]\n\ntulos = lyhin(lista)\nprint(tulos)
lista = [\"pekka\", \"emilia\", \"johanna\", \"venla\", \"eero\", \"antti\"]\n\ntulos = lyhin(lista)\nprint(tulos)

eka\neero

Tee funktio pisimmat, joka saa parametriksi listan merkkijonoja. Funktio palauttaa listan, joka sisältää parametrina annetun listan pisimmän merkkijonon. Jos pisimpiä merkkijonoja on useampia, funktio palauttaa ne kaikki listassa.

Merkkijonojen järjestyksen tuloslistassa tulee noudattaa merkkijonojen järjestystä alkuperäisessä listassa.

lista = [\"eka\", \"toka\", \"kolmas\", \"seitsemäs\"]\n\ntulos = pisimmat(lista)\nprint(tulos) # ['seitsemäs']
lista = [\"pekka\", \"emilia\", \"venla\", \"eero\", \"antti\", \"juhani\"]\n\ntulos = pisimmat(lista)\nprint(tulos) # ['emilia', 'juhani']
","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-4/4-silmukat-ja-iterointi.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-4/5-tulostuksen-muotoilu/page-data.json b/page-data/osa-4/5-tulostuksen-muotoilu/page-data.json index c57cf0008..0170c7629 100644 --- a/page-data/osa-4/5-tulostuksen-muotoilu/page-data.json +++ b/page-data/osa-4/5-tulostuksen-muotoilu/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-4/5-tulostuksen-muotoilu", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennon tulostusta saa muokattua parametrien avulla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää f-merkkijonoja tulosteen muotoilussa"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olemme tähän mennessä yhdistelleet tulostettavaa tietoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennossa kolmella eri tavalla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ensimmäinen tapa on käyttää merkkijonojen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"-operaattoria ja muodostaa näin yksittäinen merkkijono, jonka print saa parametrikseen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"text","value":"\nika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"39"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hei \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" ikäsi on \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" vuotta\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä tapa edellyttää, että kaikki yhdistettävät osat ovat merkkijonoja. Koska muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ika"}]},{"type":"text","value":" on tyypiltään kokonaisluku, se on muutettu yhdistämistä varten merkkijonoksi funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"str"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen käyttämämme tapa on eritellä tulostuksen osat pilkulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hei\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ikäsi on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vuotta\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän koodin lopputulos on sama kuin edellisen esimerkin. Näin käytettynä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":" tulostaa kaikki parametrinsa välilyönnillä eroteltuna. Etuna tässä tavassa on, että tulostettavat osat voivat olla eri tyyppisiä eli tyyppimuunnosta merkkijonoksi ei tarvita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Automaattisesta välilyönnistä pilkulla eriteltyjen osien välillä on mahdollista päästä eroon antamalla funktiolle parametri "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sep"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hei\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ikäsi on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vuotta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sep"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostus on nyt seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"HeiErkkiikäsi on39vuotta"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Parametri "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sep=\"\""}]},{"type":"text","value":" on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"nimetty parametri"}]},{"type":"text","value":", joka määrittelee, että pilkulla eroteltujen osien väliin laitetaan ainoastaan tyhjä merkkijono. Voisimme myös saada jokaisen osan tulostumaan omalle rivilleen määrittelemällä erottimeksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"\\n\""}]},{"type":"text","value":" eli rivinvaihtoa kuvaavan merkin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hei\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ikäsi on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vuotta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sep"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hei\nErkki\nikäsi on\n39\nvuotta"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oletusarvoisesti print-komento päättyy rivinvaihtoon, mutta tätä voidaan muokata parametrin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"end"}]},{"type":"text","value":" avulla. Esim. jos "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"end"}]},{"type":"text","value":" saa arvoksi tyhjän merkkijonon, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komento ei aiheuta automaattista rivinvaihtoa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" end"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kaikki!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moi kaikki!"}]}]},{"type":"element","tagName":"h2","properties":{"id":"f-merkkijonot","style":"position:relative;"},"children":[{"type":"text","value":"f-merkkijonot"},{"type":"element","tagName":"a","properties":{"href":"#f-merkkijonot","ariaLabel":"f merkkijonot permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kolmas käyttämämme tapa on f-merkkijonot. Aiempi nimen ja iän tulostava esimerkki tehtäisiin f-merkkijonojen avulla seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"text","value":"\nika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"39"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Hei "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ikäsi on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" vuotta\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olemme toistaiseksi käyttäneet f-merkkijonoja vain niiden yksinkertaisimmassa muodossa. F-merkkijonot tarjoavat kuitenkin monia muitakin mahdollisuuksia tulostuksen muotoiluun. Yksi tavallinen käyttötapa on antaa liukuluvun tulostuksessa näytettävien desimaalien määrä. Oletusarvoisesti tulostuu jokin määrä desimaaleja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Luku on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luku on 0.333333333333333"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Saamme määriteltyä tulostuvien desimaalien määrän f-merkkijonon avulla. Tulostuksen muoto määritellään lisäämällä aaltosulkeiden sisään tulostettavan muuttujan jälkeen kaksoispiste ja "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"muotoiluohje"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Luku on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","format-spec"]},"children":[{"type":"text","value":".2f"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"Luku on "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.33"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muotoiluohje "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":".2f"}]},{"type":"text","value":" siis määrittelee, että desimaaliluku tulostetaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kahden desimaalin"}]},{"type":"text","value":" tarkkuudella. Kirjain "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"f"}]},{"type":"text","value":" luvun 2 jälkeen tarkoittaa, että muotoiluohje koskee desimaalilukua eli "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"float"}]},{"type":"text","value":"-tyyppistä arvoa!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä on vielä toisenlainen esimerkki, jossa tulostetaan nimiä 15 merkin levyiseen tekstialueeseen, ensin vasemmalle sisennettynä ja sen jälkeen oikealle sisennettynä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Juha-Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maya\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","format-spec"]},"children":[{"type":"text","value":"15"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" keskellä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","format-spec"]},"children":[{"type":"text","value":">15"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"Antti keskellä Antti\nEmilia keskellä Emilia\nJuha"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"Pekka keskellä Juha"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"Pekka\nMaya keskellä Maya"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"F-merkkijonoja voi käyttää muuallakin kuin tulostuskomennossa. Niitä voi esimerkiksi sijoittaa muuttujiin ja sekä yhdistellä normaaleihin merkkijonoihin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"text","value":"\nika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"59"}]},{"type":"text","value":"\nkaupunki "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lappeenranta\""}]},{"type":"text","value":"\ntervehdys "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Hei "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", olet "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"-vuotias\""}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tervehdys "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\", asuinpaikkasi on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"kaupunki"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hei Pekka, olet 59-vuotias, asuinpaikkasi on Lappeenranta"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"F-merkkijonon voi ajatella olevan eräänlainen funktio, joka tuottaa normaalin merkkijonon aaltosuluissa olevien \"parametrien\" perusteella."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Lukulistasta merkkijonolistaksi","tmcname":"osa04-20_lukulistasta_merkkijonolistaksi"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"muotoile"}]},{"type":"text","value":", joka saa parametrikseen liukulukuja sisältävän listan. Funktio muodostaa listan perusteella uuden merkkijonoja sisältävän listan, jossa jokainen liukulukulistan alkio esitetään pyöristettynä kahden desimaalin tarkkuuteen. Listan alkioiden järjestyksen tulee säilyä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Vinkki: Käytä liukulukujen muotoiluun merkkijonoiksi f-merkkijonoa."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1.234"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.3333"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.11111"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.446"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nlista2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" muotoile"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['1.23', '0.33', '0.11', '3.45']"}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"aae62107-cdf7-5af8-9256-b057a53d522b"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, miten print-komennon tulostusta saa muokattua parametrien avulla
  • \n
  • Osaat käyttää f-merkkijonoja tulosteen muotoilussa
  • \n

Olemme tähän mennessä yhdistelleet tulostettavaa tietoa print-komennossa kolmella eri tavalla.

Ensimmäinen tapa on käyttää merkkijonojen +-operaattoria ja muodostaa näin yksittäinen merkkijono, jonka print saa parametrikseen:

nimi = \"Erkki\"\nika = 39\nprint(\"Hei \" + nimi + \" ikäsi on \" + str(ika) + \" vuotta\" )

Tämä tapa edellyttää, että kaikki yhdistettävät osat ovat merkkijonoja. Koska muuttuja ika on tyypiltään kokonaisluku, se on muutettu yhdistämistä varten merkkijonoksi funktiolla str.

Toinen käyttämämme tapa on eritellä tulostuksen osat pilkulla:

print(\"Hei\", nimi, \"ikäsi on\", ika, \"vuotta\" )

Tämän koodin lopputulos on sama kuin edellisen esimerkin. Näin käytettynä print tulostaa kaikki parametrinsa välilyönnillä eroteltuna. Etuna tässä tavassa on, että tulostettavat osat voivat olla eri tyyppisiä eli tyyppimuunnosta merkkijonoksi ei tarvita.

Automaattisesta välilyönnistä pilkulla eriteltyjen osien välillä on mahdollista päästä eroon antamalla funktiolle parametri sep:

print(\"Hei\", nimi, \"ikäsi on\", ika, \"vuotta\", sep=\"\")

Tulostus on nyt seuraava:

HeiErkkiikäsi on39vuotta

Parametri sep=\"\" on nimetty parametri, joka määrittelee, että pilkulla eroteltujen osien väliin laitetaan ainoastaan tyhjä merkkijono. Voisimme myös saada jokaisen osan tulostumaan omalle rivilleen määrittelemällä erottimeksi \"\\n\" eli rivinvaihtoa kuvaavan merkin:

print(\"Hei\", nimi, \"ikäsi on\", ika, \"vuotta\", sep=\"\\n\")

Hei\nErkki\nikäsi on\n39\nvuotta

Oletusarvoisesti print-komento päättyy rivinvaihtoon, mutta tätä voidaan muokata parametrin end avulla. Esim. jos end saa arvoksi tyhjän merkkijonon, print-komento ei aiheuta automaattista rivinvaihtoa:

print(\"Moi \", end=\"\")\nprint(\"kaikki!\")

Moi kaikki!

f-merkkijonot

Kolmas käyttämämme tapa on f-merkkijonot. Aiempi nimen ja iän tulostava esimerkki tehtäisiin f-merkkijonojen avulla seuraavasti:

nimi = \"Erkki\"\nika = 39\nprint(f\"Hei {nimi} ikäsi on {ika} vuotta\")

Olemme toistaiseksi käyttäneet f-merkkijonoja vain niiden yksinkertaisimmassa muodossa. F-merkkijonot tarjoavat kuitenkin monia muitakin mahdollisuuksia tulostuksen muotoiluun. Yksi tavallinen käyttötapa on antaa liukuluvun tulostuksessa näytettävien desimaalien määrä. Oletusarvoisesti tulostuu jokin määrä desimaaleja:

luku = 1/3\nprint(f\"Luku on {luku}\")

Luku on 0.333333333333333

Saamme määriteltyä tulostuvien desimaalien määrän f-merkkijonon avulla. Tulostuksen muoto määritellään lisäämällä aaltosulkeiden sisään tulostettavan muuttujan jälkeen kaksoispiste ja muotoiluohje:

luku = 1/3\nprint(f\"Luku on {luku:.2f}\")
Luku on 0.33

Muotoiluohje .2f siis määrittelee, että desimaaliluku tulostetaan kahden desimaalin tarkkuudella. Kirjain f luvun 2 jälkeen tarkoittaa, että muotoiluohje koskee desimaalilukua eli float-tyyppistä arvoa!

Tässä on vielä toisenlainen esimerkki, jossa tulostetaan nimiä 15 merkin levyiseen tekstialueeseen, ensin vasemmalle sisennettynä ja sen jälkeen oikealle sisennettynä:

nimet =  [ \"Antti\", \"Emilia\", \"Juha-Pekka\", \"Maya\" ]\nfor nimi in nimet:\n  print(f\"{nimi:15} keskellä {nimi:>15}\")
Antti           keskellä           Antti\nEmilia          keskellä          Emilia\nJuha-Pekka      keskellä      Juha-Pekka\nMaya            keskellä            Maya

F-merkkijonoja voi käyttää muuallakin kuin tulostuskomennossa. Niitä voi esimerkiksi sijoittaa muuttujiin ja sekä yhdistellä normaaleihin merkkijonoihin:

nimi = \"Pekka\"\nika = 59\nkaupunki = \"Lappeenranta\"\ntervehdys = f\"Hei {nimi}, olet {ika}-vuotias\"\nprint(tervehdys + f\", asuinpaikkasi on {kaupunki}\")

Hei Pekka, olet 59-vuotias, asuinpaikkasi on Lappeenranta

F-merkkijonon voi ajatella olevan eräänlainen funktio, joka tuottaa normaalin merkkijonon aaltosuluissa olevien \"parametrien\" perusteella.

Kirjoita funktio muotoile, joka saa parametrikseen liukulukuja sisältävän listan. Funktio muodostaa listan perusteella uuden merkkijonoja sisältävän listan, jossa jokainen liukulukulistan alkio esitetään pyöristettynä kahden desimaalin tarkkuuteen. Listan alkioiden järjestyksen tulee säilyä.

Vinkki: Käytä liukulukujen muotoiluun merkkijonoiksi f-merkkijonoa.

Esimerkki funktion käytöstä:

lista = [1.234, 0.3333, 0.11111, 3.446]\nlista2 = muotoile(lista)\nprint(lista2)

['1.23', '0.33', '0.11', '3.45']

","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-4/5-tulostuksen-muotoilu.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennon tulostusta saa muokattua parametrien avulla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää f-merkkijonoja tulosteen muotoilussa"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olemme tähän mennessä yhdistelleet tulostettavaa tietoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennossa kolmella eri tavalla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ensimmäinen tapa on käyttää merkkijonojen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"-operaattoria ja muodostaa näin yksittäinen merkkijono, jonka print saa parametrikseen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"text","value":"\nika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"39"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hei \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" ikäsi on \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" vuotta\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä tapa edellyttää, että kaikki yhdistettävät osat ovat merkkijonoja. Koska muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ika"}]},{"type":"text","value":" on tyypiltään kokonaisluku, se on muutettu yhdistämistä varten merkkijonoksi funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"str"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen käyttämämme tapa on eritellä tulostuksen osat pilkulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hei\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ikäsi on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vuotta\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän koodin lopputulos on sama kuin edellisen esimerkin. Näin käytettynä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":" tulostaa kaikki parametrinsa välilyönnillä eroteltuna. Etuna tässä tavassa on, että tulostettavat osat voivat olla eri tyyppisiä eli tyyppimuunnosta merkkijonoksi ei tarvita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Automaattisesta välilyönnistä pilkulla eriteltyjen osien välillä on mahdollista päästä eroon antamalla funktiolle parametri "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sep"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hei\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ikäsi on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vuotta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sep"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostus on nyt seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"HeiErkkiikäsi on39vuotta"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Parametri "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sep=\"\""}]},{"type":"text","value":" on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"nimetty parametri"}]},{"type":"text","value":", joka määrittelee, että pilkulla eroteltujen osien väliin laitetaan ainoastaan tyhjä merkkijono. Voisimme myös saada jokaisen osan tulostumaan omalle rivilleen määrittelemällä erottimeksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"\\n\""}]},{"type":"text","value":" eli rivinvaihtoa kuvaavan merkin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hei\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ikäsi on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vuotta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sep"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hei\nErkki\nikäsi on\n39\nvuotta"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oletusarvoisesti print-komento päättyy rivinvaihtoon, mutta tätä voidaan muokata parametrin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"end"}]},{"type":"text","value":" avulla. Esim. jos "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"end"}]},{"type":"text","value":" saa arvoksi tyhjän merkkijonon, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komento ei aiheuta automaattista rivinvaihtoa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" end"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kaikki!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moi kaikki!"}]}]},{"type":"element","tagName":"h2","properties":{"id":"f-merkkijonot","style":"position:relative;"},"children":[{"type":"text","value":"f-merkkijonot"},{"type":"element","tagName":"a","properties":{"href":"#f-merkkijonot","ariaLabel":"f merkkijonot permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kolmas käyttämämme tapa on f-merkkijonot. Aiempi nimen ja iän tulostava esimerkki tehtäisiin f-merkkijonojen avulla seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"text","value":"\nika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"39"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Hei "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ikäsi on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" vuotta\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olemme toistaiseksi käyttäneet f-merkkijonoja vain niiden yksinkertaisimmassa muodossa. F-merkkijonot tarjoavat kuitenkin monia muitakin mahdollisuuksia tulostuksen muotoiluun. Yksi tavallinen käyttötapa on antaa liukuluvun tulostuksessa näytettävien desimaalien määrä. Oletusarvoisesti tulostuu jokin määrä desimaaleja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Luku on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luku on 0.333333333333333"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Saamme määriteltyä tulostuvien desimaalien määrän f-merkkijonon avulla. Tulostuksen muoto määritellään lisäämällä aaltosulkeiden sisään tulostettavan muuttujan jälkeen kaksoispiste ja "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"muotoiluohje"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Luku on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","format-spec"]},"children":[{"type":"text","value":".2f"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"Luku on "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.33"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muotoiluohje "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":".2f"}]},{"type":"text","value":" siis määrittelee, että desimaaliluku tulostetaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kahden desimaalin"}]},{"type":"text","value":" tarkkuudella. Kirjain "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"f"}]},{"type":"text","value":" luvun 2 jälkeen tarkoittaa, että muotoiluohje koskee desimaalilukua eli "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"float"}]},{"type":"text","value":"-tyyppistä arvoa!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä on vielä toisenlainen esimerkki, jossa tulostetaan nimiä 15 merkin levyiseen tekstialueeseen, ensin vasemmalle sisennettynä ja sen jälkeen oikealle sisennettynä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Juha-Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maya\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","format-spec"]},"children":[{"type":"text","value":"15"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" keskellä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","format-spec"]},"children":[{"type":"text","value":">15"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"Antti keskellä Antti\nEmilia keskellä Emilia\nJuha"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"Pekka keskellä Juha"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"Pekka\nMaya keskellä Maya"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"F-merkkijonoja voi käyttää muuallakin kuin tulostuskomennossa. Niitä voi esimerkiksi sijoittaa muuttujiin ja sekä yhdistellä normaaleihin merkkijonoihin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"text","value":"\nika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"59"}]},{"type":"text","value":"\nkaupunki "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lappeenranta\""}]},{"type":"text","value":"\ntervehdys "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Hei "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", olet "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"-vuotias\""}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tervehdys "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\", asuinpaikkasi on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"kaupunki"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hei Pekka, olet 59-vuotias, asuinpaikkasi on Lappeenranta"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"F-merkkijonon voi ajatella olevan eräänlainen funktio, joka tuottaa normaalin merkkijonon aaltosuluissa olevien \"parametrien\" perusteella."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Lukulistasta merkkijonolistaksi","tmcname":"osa04-20_lukulistasta_merkkijonolistaksi"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"muotoile"}]},{"type":"text","value":", joka saa parametrikseen liukulukuja sisältävän listan. Funktio muodostaa listan perusteella uuden merkkijonoja sisältävän listan, jossa jokainen liukulukulistan alkio esitetään pyöristettynä kahden desimaalin tarkkuuteen. Listan alkioiden järjestyksen tulee säilyä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Vinkki: Käytä liukulukujen muotoiluun merkkijonoiksi f-merkkijonoa."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1.234"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.3333"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.11111"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3.446"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nlista2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" muotoile"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['1.23', '0.33', '0.11', '3.45']"}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"aae62107-cdf7-5af8-9256-b057a53d522b"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, miten print-komennon tulostusta saa muokattua parametrien avulla
  • \n
  • Osaat käyttää f-merkkijonoja tulosteen muotoilussa
  • \n

Olemme tähän mennessä yhdistelleet tulostettavaa tietoa print-komennossa kolmella eri tavalla.

Ensimmäinen tapa on käyttää merkkijonojen +-operaattoria ja muodostaa näin yksittäinen merkkijono, jonka print saa parametrikseen:

nimi = \"Erkki\"\nika = 39\nprint(\"Hei \" + nimi + \" ikäsi on \" + str(ika) + \" vuotta\" )

Tämä tapa edellyttää, että kaikki yhdistettävät osat ovat merkkijonoja. Koska muuttuja ika on tyypiltään kokonaisluku, se on muutettu yhdistämistä varten merkkijonoksi funktiolla str.

Toinen käyttämämme tapa on eritellä tulostuksen osat pilkulla:

print(\"Hei\", nimi, \"ikäsi on\", ika, \"vuotta\" )

Tämän koodin lopputulos on sama kuin edellisen esimerkin. Näin käytettynä print tulostaa kaikki parametrinsa välilyönnillä eroteltuna. Etuna tässä tavassa on, että tulostettavat osat voivat olla eri tyyppisiä eli tyyppimuunnosta merkkijonoksi ei tarvita.

Automaattisesta välilyönnistä pilkulla eriteltyjen osien välillä on mahdollista päästä eroon antamalla funktiolle parametri sep:

print(\"Hei\", nimi, \"ikäsi on\", ika, \"vuotta\", sep=\"\")

Tulostus on nyt seuraava:

HeiErkkiikäsi on39vuotta

Parametri sep=\"\" on nimetty parametri, joka määrittelee, että pilkulla eroteltujen osien väliin laitetaan ainoastaan tyhjä merkkijono. Voisimme myös saada jokaisen osan tulostumaan omalle rivilleen määrittelemällä erottimeksi \"\\n\" eli rivinvaihtoa kuvaavan merkin:

print(\"Hei\", nimi, \"ikäsi on\", ika, \"vuotta\", sep=\"\\n\")

Hei\nErkki\nikäsi on\n39\nvuotta

Oletusarvoisesti print-komento päättyy rivinvaihtoon, mutta tätä voidaan muokata parametrin end avulla. Esim. jos end saa arvoksi tyhjän merkkijonon, print-komento ei aiheuta automaattista rivinvaihtoa:

print(\"Moi \", end=\"\")\nprint(\"kaikki!\")

Moi kaikki!

f-merkkijonot

Kolmas käyttämämme tapa on f-merkkijonot. Aiempi nimen ja iän tulostava esimerkki tehtäisiin f-merkkijonojen avulla seuraavasti:

nimi = \"Erkki\"\nika = 39\nprint(f\"Hei {nimi} ikäsi on {ika} vuotta\")

Olemme toistaiseksi käyttäneet f-merkkijonoja vain niiden yksinkertaisimmassa muodossa. F-merkkijonot tarjoavat kuitenkin monia muitakin mahdollisuuksia tulostuksen muotoiluun. Yksi tavallinen käyttötapa on antaa liukuluvun tulostuksessa näytettävien desimaalien määrä. Oletusarvoisesti tulostuu jokin määrä desimaaleja:

luku = 1/3\nprint(f\"Luku on {luku}\")

Luku on 0.333333333333333

Saamme määriteltyä tulostuvien desimaalien määrän f-merkkijonon avulla. Tulostuksen muoto määritellään lisäämällä aaltosulkeiden sisään tulostettavan muuttujan jälkeen kaksoispiste ja muotoiluohje:

luku = 1/3\nprint(f\"Luku on {luku:.2f}\")
Luku on 0.33

Muotoiluohje .2f siis määrittelee, että desimaaliluku tulostetaan kahden desimaalin tarkkuudella. Kirjain f luvun 2 jälkeen tarkoittaa, että muotoiluohje koskee desimaalilukua eli float-tyyppistä arvoa!

Tässä on vielä toisenlainen esimerkki, jossa tulostetaan nimiä 15 merkin levyiseen tekstialueeseen, ensin vasemmalle sisennettynä ja sen jälkeen oikealle sisennettynä:

nimet =  [ \"Antti\", \"Emilia\", \"Juha-Pekka\", \"Maya\" ]\nfor nimi in nimet:\n  print(f\"{nimi:15} keskellä {nimi:>15}\")
Antti           keskellä           Antti\nEmilia          keskellä          Emilia\nJuha-Pekka      keskellä      Juha-Pekka\nMaya            keskellä            Maya

F-merkkijonoja voi käyttää muuallakin kuin tulostuskomennossa. Niitä voi esimerkiksi sijoittaa muuttujiin ja sekä yhdistellä normaaleihin merkkijonoihin:

nimi = \"Pekka\"\nika = 59\nkaupunki = \"Lappeenranta\"\ntervehdys = f\"Hei {nimi}, olet {ika}-vuotias\"\nprint(tervehdys + f\", asuinpaikkasi on {kaupunki}\")

Hei Pekka, olet 59-vuotias, asuinpaikkasi on Lappeenranta

F-merkkijonon voi ajatella olevan eräänlainen funktio, joka tuottaa normaalin merkkijonon aaltosuluissa olevien \"parametrien\" perusteella.

Kirjoita funktio muotoile, joka saa parametrikseen liukulukuja sisältävän listan. Funktio muodostaa listan perusteella uuden merkkijonoja sisältävän listan, jossa jokainen liukulukulistan alkio esitetään pyöristettynä kahden desimaalin tarkkuuteen. Listan alkioiden järjestyksen tulee säilyä.

Vinkki: Käytä liukulukujen muotoiluun merkkijonoiksi f-merkkijonoa.

Esimerkki funktion käytöstä:

lista = [1.234, 0.3333, 0.11111, 3.446]\nlista2 = muotoile(lista)\nprint(lista2)

['1.23', '0.33', '0.11', '3.45']

","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-4/5-tulostuksen-muotoilu.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-4/6-lisaa-rakenteista/page-data.json b/page-data/osa-4/6-lisaa-rakenteista/page-data.json index 3867f8bbf..5677ffb05 100644 --- a/page-data/osa-4/6-lisaa-rakenteista/page-data.json +++ b/page-data/osa-4/6-lisaa-rakenteista/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-4/6-lisaa-rakenteista", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tunnet lisää tapoja erottaa osia merkkijonosta tai listasta"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ymmärrät, mitä tarkoittaa merkkijonon muuttumattomuus"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää metodeita "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"count"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"replace"}]}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olemme käyttäneet aiemmin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[]"}]},{"type":"text","value":"-syntaksia merkkijonon osajonon erottamiseen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"esimerkki\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"merk"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sama syntaksi toimii myös listoissa, ja voimme erottaa sen avulla listan osan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[4, 6, 1, 2]"}]}]},{"type":"element","tagName":"h2","properties":{"id":"lisaa-erottamisesta","style":"position:relative;"},"children":[{"type":"text","value":"Lisää erottamisesta"},{"type":"element","tagName":"a","properties":{"href":"#lisaa-erottamisesta","ariaLabel":"lisaa erottamisesta permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Itse asiassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[]"}]},{"type":"text","value":"-syntaksi toimii hyvin samalla periaatteella kuin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"range"}]},{"type":"text","value":"-funktio, eli voimme antaa sille myös askeleen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"esimerkki\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"eiek\n[7, 6, 5, 4]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos emme anna jotain arvoa, oletuksena koko sisältö valitaan mukaan. Tämän avulla voimme tehdä seuraavan lyhyen ohjelman, joka kääntää merkkijonon:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kirjoita merkkijono: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"esimerkki"}]},{"type":"text","value":"\nikkremise"}]}]},{"type":"comment","value":"vastaava varoitusteksti löytyy osioista 3-4, 4-6 ja 5-1, tsekkaa kaikki jos muokkaat"},{"type":"element","tagName":"h2","properties":{"id":"varoitus-globaalin-muuttujan-kaytto-funktion-sisalla","style":"position:relative;"},"children":[{"type":"text","value":"Varoitus: globaalin muuttujan käyttö funktion sisällä"},{"type":"element","tagName":"a","properties":{"href":"#varoitus-globaalin-muuttujan-kaytto-funktion-sisalla","ariaLabel":"varoitus globaalin muuttujan kaytto funktion sisalla permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktioiden sisällä on mahdollista määritellä muuttujia, mutta tämän lisäksi funktio näkee sen ulkopuolella pääohjelmassa määritellyt muuttujat. Tälläisia muuttujia sanotaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"globaaleiksi"}]},{"type":"text","value":" muuttujiksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Globaalien muuttujien käyttämistä funktioista käsin ei useimmiten pidetä hyvänä asiana muun muassa siksi, että ne saattavat johtaa ikäviin bugeihin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on esimerkki funktiosta, joka käyttää \"vahingossa\" globaalia muuttujaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta_vaarinpain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# käytetään vahingossa parametrin sijaan globaalia muuttujaa nimilista"}]},{"type":"text","value":"\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# globaali muuttuja"}]},{"type":"text","value":"\nnimilista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Margaret\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\ntulosta_vaarinpain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulosta_vaarinpain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tupu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hupu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lupu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Margaret\nErkki\nEmilia\nAntti"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Margaret\nErkki\nEmilia\nAntti"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaikka funktiota kutsutaan oikein, se tulostaa aina globaalissa muuttujassa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"nimilista"}]},{"type":"text","value":" olevat nimet."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kaikki funktioita testaava koodi on kirjoitettava erillisen lohkon sisälle, jotta TMC-testit hyväksyisivät koodin. Edellinen esimerkki siis tulisi toteuttaa seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta_vaarinpain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# käytetään vahingossa parametrin sijaan globaalia muuttujaa nimilista"}]},{"type":"text","value":"\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" i"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kaikki funktiota testaava koodi tämän lohkon sisälle"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# globaali muuttuja"}]},{"type":"text","value":"\n nimilista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Margaret\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n tulosta_vaarinpain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tulosta_vaarinpain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tupu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hupu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lupu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt myös globaalin muuttujan määrittely on siirtynyt "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":"-lohkoon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"TMC-testit suoritetaan aina siten, että mitään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":"-lohkon sisällä olevaa koodia ei suoriteta. Tämän takia funktio ei voi edes teoriassa toimia, sillä se viittaa muuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimilista"}]},{"type":"text","value":", jota ei testejä suoritettaessa ole lainkaan olemassa."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kaikki väärinpäin","tmcname":"osa04-21_kaikki_vaarinpain"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kaikki_vaarinpain"}]},{"type":"text","value":", joka saa parametrikseen listan merkkijonoja. Funktio luo ja palauttaa uuden listan, jossa kaikki alkuperäisellä listalla olevat merkkijonot on käännetty. Myös listan alkioiden järjestys muutetaan käänteiseksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kaikki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"esimerkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vielä yksi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nlista2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kaikki_vaarinpain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['isky äleiv', 'ikkremise', 'ikkiak', 'ioM']"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"merkkijonoa-ei-voi-muuttaa","style":"position:relative;"},"children":[{"type":"text","value":"Merkkijonoa ei voi muuttaa"},{"type":"element","tagName":"a","properties":{"href":"#merkkijonoa-ei-voi-muuttaa","ariaLabel":"merkkijonoa ei voi muuttaa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkkijonoilla ja listoilla on paljon yhteistä, ja useimmat operaatiot toimivat samalla tavalla sekä merkkijonoille että listoille. Kuitenkin erona on, että merkkijonoa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei voi muuttaa"}]},{"type":"text","value":". Esimerkiksi seuraava koodi ei toimi tarkoitetulla tavalla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"esimerkki\""}]},{"type":"text","value":"\nmjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"a\""}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska merkkijonoa ei voi muuttaa, ohjelman suoritus aiheuttaa virheen:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"TypeError: 'str' object does not support item assignment"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Samankaltainen virhe seuraa, jos yritetään esimerkiksi järjestää merkkijonoa järjestykseen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sort"}]},{"type":"text","value":"-metodilla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaikka merkkijonoa ei voi muuttaa, voimme silti sijoittaa merkkijonon paikalle toisen merkkijonon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Onkin tärkeää huomata ero seuraavien esimerkkien välillä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]}]}]}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 271px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/8b07a257ace229cc26a5eedf03a60986/5fce1/4_4_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 70.43478260869564%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsTAAALEwEAmpwYAAABeUlEQVQ4y5WT66rCQAyE9337w8eT/hEfQVCs4K2iWO+1VevdyDewBxE91EDYbHZ3Opmkbj6fWxzH1uv1bDab2Xa7tTzPLUkSW61WtlgslJ9Op4bd73d7PB5f3RVFIQB8v98rebvd7HA42G63U471eDxaGXP2g202G1WwXq/l7zHn7nK5iAFMKQd2+PV61Up+MBjY6XRS6TBFCkCIAVkul6qIveNStVq1Wq2mi/1+37rdrpy42WxapVKRzoB7KXgMkM/RC5XsNYPpu+AYTHH24/FYmtIw3APRMD5C2c4/xD517fUMVoDA6puXbsor+L9dRsPRaGTD4VDUKQtt/LiwZ6TKzKDmkId+HNI0tSzLBISmOGDn87n0aP1UMqMDOOu32NFB3+FPxgTAnBVZqAaJkIL8ZDLR3g+4o+1hGFq9XtccMn+dTkdO3Gg0LAgCgdFFAACCAHJABnZIppL5MgckiCmNy74BXIYVZ61WS38Na7vd1keiKPrLs38CMo80d8OuAIYAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8b07a257ace229cc26a5eedf03a60986/a0b58/4_4_1.webp 230w","/static/8b07a257ace229cc26a5eedf03a60986/cadab/4_4_1.webp 271w"],"sizes":"(max-width: 271px) 100vw, 271px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8b07a257ace229cc26a5eedf03a60986/81c8e/4_4_1.png 230w","/static/8b07a257ace229cc26a5eedf03a60986/5fce1/4_4_1.png 271w"],"sizes":"(max-width: 271px) 100vw, 271px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/8b07a257ace229cc26a5eedf03a60986/5fce1/4_4_1.png","alt":"4 4 1","title":"4 4 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi\""}]},{"type":"text","value":"\nmjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"!\""}]}]}]}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 281px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/e24d125e0a5ab22b6d68096ab4edaa6d/6b1e2/4_4_2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 85.65217391304348%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAAAsTAAALEwEAmpwYAAABpklEQVQ4y52UWYsCQQyE+2eL/8xnQVAQHxXvA+/7vq3lC2TpHca9AmEy6e50qiozYblcqtfrqd/vazabab/f63A4qNvtqtlsajqd6nQ6CXu9Xj96oACFFouF1uu1rterHo+HFaEY6775Nxb0B9tut1qtVnbxZrMxJ8ZBejweFW63m0E8n8/WHc4CTpcUqdVqtmc+n4v98R7iy+Wi+/2uyWSi0Ol0lMvlVCgUVCqVLAl3rVbLeKxWq8pms2IfBdzG47HlYoM2g+y84e8MDkejkcEDNg5Mj8lbh0myXYDn8/npnudCIDvsOPamgm92o8A7RTnA+ndIAqMBZ41GQ4PBwMaE9uGw3W5bHmjkd7udjRhCvZvLLyqjlsN0lV1B/N9z+A4yl/vFziGxO2vWIfOFIzvvaXwSc8ARsA8UPJ1XEwU+isWi8vm8yuWyjcZwOLQb446BHOc4zJeSFCgVMp3ydfDDiDuGU4RBIP+JuFj+DGlKuUFDvV43xZkEOiKH6sT+bfOOMwEhrViycKVSUSaTsWJuFEpSkwo5LhTHHIQKN+DyTt4bgOcPk2YlBJdlLTcAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/e24d125e0a5ab22b6d68096ab4edaa6d/a0b58/4_4_2.webp 230w","/static/e24d125e0a5ab22b6d68096ab4edaa6d/f44a8/4_4_2.webp 281w"],"sizes":"(max-width: 281px) 100vw, 281px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/e24d125e0a5ab22b6d68096ab4edaa6d/81c8e/4_4_2.png 230w","/static/e24d125e0a5ab22b6d68096ab4edaa6d/6b1e2/4_4_2.png 281w"],"sizes":"(max-width: 281px) 100vw, 281px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/e24d125e0a5ab22b6d68096ab4edaa6d/6b1e2/4_4_2.png","alt":"4 4 2","title":"4 4 2","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ensimmäisessä esimerkissä listan sisältö muuttuu. Toisessa esimerkissä alkuperäinen merkkijono korvataan toisella merkkijonolla. Alkuperäinen merkkijono jää muistiin, mutta siihen ei enää ole viittausta, joten sitä ei voi enää käyttää ohjelmassa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tähän palataan tarkemmin ensi viikolla, kun viittauksia listoihin käsitellään tarkemmin."}]},{"type":"element","tagName":"h2","properties":{"id":"lisaa-metodeita","style":"position:relative;"},"children":[{"type":"text","value":"Lisää metodeita"},{"type":"element","tagName":"a","properties":{"href":"#lisaa-metodeita","ariaLabel":"lisaa metodeita permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"count"}]},{"type":"text","value":" avulla voidaan laskea osajonon esiintymien määrä. Metodi toimii samaan tapaan sekä merkkijonon että listan kanssa. Esimerkiksi näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vesihiisi sihisi hississä\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"count"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"si\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nlista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"count"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"5\n3"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"count"}]},{"type":"text","value":" ei laske päällekkäisiä esiintymiä. Esimerkiksi metodin mukaan merkkijonossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"aaaa"}]},{"type":"text","value":" esiintyy kaksi kertaa osajono "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"aa"}]},{"type":"text","value":", vaikka oikeastaan esiintymiä olisi kolme, jos päällekkäiset esiintymät sallitaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"replace"}]},{"type":"text","value":" avulla voidaan muodostaa uusi merkkijono, jossa tietty merkkijono on korvattu toisella merkkijonolla. Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi kaikki\""}]},{"type":"text","value":"\nuusi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"replace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hei\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"uusi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hei kaikki"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi korvaa kaikki merkkijonon esiintymät:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lause "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hei heilan löysin minä heinikosta hei\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"replace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hei\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"HEI\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"HEI HEIlan löysin minä HEInikosta HEI"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tyypillinen virhe "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"replace"}]},{"type":"text","value":"-metodia käytettäessä on unohtaa, että merkkijonot ovat muuttumattomia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Python on kivaa\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Korvataan alijono, muttei tallenneta tulosta mihinkään..."}]},{"type":"text","value":"\nmjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"replace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Java\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python on kivaa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos vanhaa jonoa ei tarvita, voidaan uusi jono sijoittaa samaan muuttujaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Python on kivaa\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Korvataan alijono, tallennetaan tulos samaan muuttujaan"}]},{"type":"text","value":"\nmjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"replace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Java\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Java on kivaa"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Eniten kirjaimia","tmcname":"osa04-22_eniten_kirjaimia"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"eniten_kirjainta"}]},{"type":"text","value":", joka saa parametrikseen merkkijonon. Funktio palauttaa kirjaimen, jota esiintyy eniten merkkijonossa. Jos yhtä yleisiä kirjaimia on monta, funktion tulee palauttaa niistä ensimmäisenä merkkijonossa esiintyvä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"abcbdbe\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eniten_kirjainta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntoinen_jono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"esimerkkimerkkijonokki\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eniten_kirjainta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"toinen_jono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"b\nk"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Vokaalit pois","tmcname":"osa04-23_vokaalit_pois"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ilman_vokaaleja"}]},{"type":"text","value":", joka saa parametrikseen merkkijonon. Funktio palauttaa uuden merkkijonon, jossa alkuperäisen merkkijonon vokaalit on poistettu."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa, että merkkijono koostuu pelkästään pienistä suomen kielen kirjaimista a...ö."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tämä on esimerkki\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ilman_vokaaleja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tm n smrkk"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Poista isot","tmcname":"osa04-24_poista_isot"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonin merkkijonometodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"isupper()"}]},{"type":"text","value":" palauttaa arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", jos merkkijono koostuu "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"pelkästään isoista kirjaimista"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"XYZ\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"isupper"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nonko_iso "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Abc\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"isupper"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"onko_iso"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\nFalse"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita metodia hyödyntäen funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"poista_isot"}]},{"type":"text","value":", joka saa parametrikseen listan merkkijonoja. Funktio palauttaa uuden listan, jolla on sen parametrina olevasta listasta ne merkkijonot, jotka eivät koostu kokonaan isoista kirjaimista."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ABC\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"def\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ISO\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"TOINENISO\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pieni\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toinen pieni\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Osittain Iso\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nkarsittu_lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" poista_isot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"karsittu_lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['def', 'pieni', 'toinen pieni', 'Osittain Iso']"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Naapureita listassa","tmcname":"osa04-25_naapureita_listassa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Määritellään, että listan alkiot ovat naapureita, jos niiden erotus on 1. Naapureita olisivat siis esim alkiot 1 ja 2 tai alkiot 56 ja 55."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pisin_naapurijono"}]},{"type":"text","value":", joka etsii listasta pisimmän peräkkäisiä naapureita sisältävän osalistan ja palauttaa sen pituuden."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi listassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[1, 2, 5, 4, 3, 4]"}]},{"type":"text","value":" pisin tällainen osalista olisi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[5, 4, 3, 4]"}]},{"type":"text","value":", ja sen pituus 4."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pisin_naapurijono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"laajemman-ohjelman-tekeminen","style":"position:relative;"},"children":[{"type":"text","value":"Laajemman ohjelman tekeminen"},{"type":"element","tagName":"a","properties":{"href":"#laajemman-ohjelman-tekeminen","ariaLabel":"laajemman ohjelman tekeminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osan huipentaa ensimmäinen hieman laajempi ohjelma, jota tehdessäsi pääset soveltamaan kaikkea tähän asti opeteltua."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sääntö numero yksi isompaa tai oikeastaan mitä tahansa ohjelmaa tehdessä on se, että ei kannata yrittää ratkaista kaikkia ongelmia yhtä aikaa. Ohjelma kannattaa rakentaa pienistä paloista kuten sopivista apufunktioista, ja kunkin palan toimivuus kannattaa varmistaa ennen kun alkaa rakentaa seuraavaa palaa. Jos näin ei tee, on aika varmaa että edessä on suuri kaaos."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Isompaa ohjelmaa rakentaessa on järkevää testailla ohjelman funktioita aluksi erillään pääohjelmasta. Yksi helppo tapa on tehdä myös pääohjelmasta oma funktio, esimerkiksi nimeltään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"main"}]},{"type":"text","value":", jonka ohjelman funktioiden ulkopuoleinen osa käynnistää. Esimerkiksi seuraavaa tehtävää voitaisiin ruveta lähestymään näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"main"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ohjelman koodi tänne"}]},{"type":"text","value":"\n\nmain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Näin ohjelman apufunktioita on mahdollista testata ilman pääohjelman suorittamista:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# apufunktio, joka laskee arvosanan pisteiden perusteella"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"arvosana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# koodia"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"main"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ohjelman koodi tänne"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kommentoidaan pääohjelma pois"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"#main()"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# testataan apufunktiota"}]},{"type":"text","value":"\npistemaara "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"35"}]},{"type":"text","value":"\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" arvosana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pistemaara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"tiedon-valittaminen-funktiosta-toiseen","style":"position:relative;"},"children":[{"type":"text","value":"Tiedon välittäminen funktiosta toiseen"},{"type":"element","tagName":"a","properties":{"href":"#tiedon-valittaminen-funktiosta-toiseen","ariaLabel":"tiedon valittaminen funktiosta toiseen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos ohjelma koostuu useista funktioista, nousee esiin kysymys, miten tietoa siirretään funktiosta toiseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on esimerkki ohjelmasta, joka lukee käyttäjältä joukon kokonaislukuarvoja. Sen jälkeen ohjelma tulostaa arvot ja tekee niille vielä \"analyysin\". Ohjelma on jaettu kolmeen erilliseen funktioon:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lue_kayttajalta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Syötä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" lukua:\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" luvut\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luvut ovat: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"analysoi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n keskiarvo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sum"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Lukuja yhteensä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", keskiarvo "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"keskiarvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", pienin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"min"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ja suurin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"max"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# funktioita käyttävä \"pääohjelma\""}]},{"type":"text","value":"\nsyotteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue_kayttajalta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nanalyysin_tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" analysoi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"analyysin_tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuoritus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Syötä 5 lukua:\nAnna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\nAnna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"34"}]},{"type":"text","value":"\nAnna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-32"}]},{"type":"text","value":"\nAnna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"99"}]},{"type":"text","value":"\nAnna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-53"}]},{"type":"text","value":"\nLuvut ovat:\n10\n34\n-32\n99\n-53\nLukuja yhteensä 5, keskiarvo 11.6, pienin -53 ja suurin 99"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Perusperiaatteena ohjelmassa on se, että pääohjelma \"tallentaa\" ohjelman käsittelemän tiedon eli tässä tapauksessa käyttäjän syöttämät luvut muuttujassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"syotteet"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos lukuja on tarve käsitellä jossain funktiossa, ne välitetään sinne parametrina. Näin tapahtuu funktioissa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"analysoi"}]},{"type":"text","value":". Jos taas funktio tuottaa tietoa, jota muut ohjelman osat tarvitsevat, palauttaa funktio datan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":"-komennolla. Näin tekevät käyttäjän syötteen lukeva funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lue_kayttajalta"}]},{"type":"text","value":" sekä analyysin tekevä funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"analysoi"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olisi periaatteessa mahdollista, että funktiot käyttäisivät suoraan \"pääohjelman\" globaalia muuttujaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"syotteet"}]},{"type":"text","value":". Se "},{"type":"element","tagName":"a","properties":{"href":"https://softwareengineering.stackexchange.com/questions/148108/why-is-global-state-so-evil","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"ei kuitenkaan ole järkevää"}]},{"type":"text","value":", sillä jos funktiot pystyvät muuttamaan globaalia muuttujaa, voi ohjelmassa alkaa tapahtua jotain hallitsematonta, varsinkin kun funktioiden määrä kasvaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedon välitys funktioihin ja niistä ulos on siis järkevintä hoitaa parametrien ja paluuarvojen avulla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos haluaisimme tehdä edellisen esimerkin ohjelman siten, että sen pääohjelma eriytettäisiin omaan funktioon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"main"}]},{"type":"text","value":", siirrettäisiin ohjelman käsittelemä data pääohjelmaa edustavan funktion sisäiseksi muuttujaksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# pääohjelmaa edustava funktio"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"main"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n syotteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue_kayttajalta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n analyysin_tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" analysoi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"analyysin_tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ohjelman käynnistys"}]},{"type":"text","value":"\nmain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Arvosanatilasto","tmcname":"osa04-26_arvosanatilasto"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä toteutetaan ohjelma kurssin arvosanatilastojen tulostamiseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmalle syötetään rivejä, jotka sisältävät yhden opiskelijan koepistemäärän sekä tehtyjen harjoitustehtävien määrän. Ohjelma tulostaa niiden perusteella arvosanoihin liittyviä tilastoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koepisteet ovat kokonaislukuja väliltä 0–20. Tehtyjen harjoitustehtävien lukumäärät taas kokonaislukuja väliltä 0–100."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma kyselee käyttäjältä rivejä niin kauan, kunnes käyttäjä syöttää tyhjän rivin. Voit olettaa, että kaikki rivit on syötetty \"oikein\", eli rivillä on joko kaksi kokonaislukua tai rivi on tyhjä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koepisteiden ja harjoitustehtävien syöttäminen etenee seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koepisteet ja harjoitusten määrä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"15 87"}]},{"type":"text","value":"\nKoepisteet ja harjoitusten määrä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10 55"}]},{"type":"text","value":"\nKoepisteet ja harjoitusten määrä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"11 40"}]},{"type":"text","value":"\nKoepisteet ja harjoitusten määrä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4 17"}]},{"type":"text","value":"\nKoepisteet ja harjoitusten määrä:\nTilasto:"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun käyttäjä on syöttänyt tyhjän rivin, tulostaa ohjelma tilastot."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tilastot muodostuvat seuraavasti:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtyjen harjoitustehtävien lukumäärästä saa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"harjoituspisteitä"}]},{"type":"text","value":" siten, että vähintään 10 % tehtävämäärästä tuo yhden harjoituspisteen, 20 % tuo 2 harjoituspistettä, jne., ja 100 % eli 100 harjoitustehtävää tuo 10 harjoituspistettä. Harjoitustehtävistä saatava pistemäärä on kokonaisluku."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kurssin arvosana määräytyy kokeen pistemäärän ja harjoitustehtävistä saatavien pisteiden summasta seuraavan taulukon mukaan:"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"koepisteet+harjoituspisteet"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"arvosana"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"0–14"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"0 (eli hylätty)"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"15–17"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"1"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"18–20"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"2"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"21–23"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"3"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"24–27"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"4"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"28–30"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"5"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edelliseen on kuitenkin poikkeus: jos kokeen pistemäärä on alle 10, on arvosana kokonaispistemäärästä riippumatta 0 eli hylätty."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yllä olevalla esimerkkisyötteellä ohjelma tulostaa seuraavat tilastot:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Tilasto:\nPisteiden keskiarvo: 14.5\nHyväksymisprosentti: 75.0\nArvosanajakauma:\n 5:\n 4:\n 3: *\n 2:\n 1: **\n 0: *\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Desimaaliluvut tulostetaan yhden desimaalin tarkkuudella."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon! Eli jos ohjelmasi toiminnallisuus on esim. funktiossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"main"}]},{"type":"text","value":", tulee sitä kutsuva koodi kirjoittaa normaaliin tapaan, eikä ym. if-lohkoon kuten on tehtävä niissä tehtävissä, joissa edellytetään funktioiden toteuttamista."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vihje:"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman syöte koostuu riveistä joilla on peräkkäin kaksi numeroa:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koepisteet ja harjoitusten määrä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"15 87"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Syöterivi pitää pilkkoa ensin kahtia ja muuttaa palaset kokonaisluvuksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"int"}]},{"type":"text","value":"-funktiolla. Rivin pilkkominen onnistuu samalla tavalla kun tehtävässä "},{"type":"element","tagName":"a","properties":{"href":"/osa-4/2-lisaa-funktioista"},"children":[{"type":"text","value":"Eka, toka ja vika sana"}]},{"type":"text","value":". Siihen on olemassa myös hieman helpompi keino, merkkijonojen metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"split"}]},{"type":"text","value":". Googlaa jos haluat, käytä esim. hakusanoja "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"python string split"}]},{"type":"text","value":"."}]},{"type":"comment","value":" **Huomaa** että tällä hetkellä Windowsissa on ongelmia joidenkin tehtävien testien suorittamisessa. Jos törmäät seuraavaan virheilmoitukseen\n\n\"Listan\n\nvoit suorittaa testit lähettämällä ne palvelimelle valitsemalla testien suoritusnapin oikealla puolella olevasta symbolista avautuvasta TMC-valikosta _Submit solutions_.\n\nOngelman saa korjattua menemällä laajennuksen asennusvalikkoon ja muuttamalla \"TMC Data\" -kohdassa tehtävien sijainnin johonkin toiseen sijaintiin, jonka tiedostopolku on lyhempi, allaolevassa kuvassa nappi _change path_. Siirrossa saattaa kestää hetken, joten odotathan operaation päättymistä.\n\n\"Listan\n\nOngelmaan pyritään saamaan parempi ratkaisu lähipäivinä. "}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c"},"children":[]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa lopuksi osion loppukyselyyn:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"9b354cf1-f413-5ec3-befd-992039b09100"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tunnet lisää tapoja erottaa osia merkkijonosta tai listasta
  • \n
  • Ymmärrät, mitä tarkoittaa merkkijonon muuttumattomuus
  • \n
  • Osaat käyttää metodeita count ja replace
  • \n

Olemme käyttäneet aiemmin []-syntaksia merkkijonon osajonon erottamiseen:

mjono = \"esimerkki\"\nprint(mjono[3:7])

merk

Sama syntaksi toimii myös listoissa, ja voimme erottaa sen avulla listan osan:

lista = [3,4,2,4,6,1,2,4,2]\nprint(lista[3:7])

[4, 6, 1, 2]

Lisää erottamisesta

Itse asiassa []-syntaksi toimii hyvin samalla periaatteella kuin range-funktio, eli voimme antaa sille myös askeleen:

mjono = \"esimerkki\"\nprint(mjono[0:7:2])\nlista = [1,2,3,4,5,6,7,8]\nprint(lista[6:2:-1])

eiek\n[7, 6, 5, 4]

Jos emme anna jotain arvoa, oletuksena koko sisältö valitaan mukaan. Tämän avulla voimme tehdä seuraavan lyhyen ohjelman, joka kääntää merkkijonon:

mjono = input(\"Kirjoita merkkijono: \")\nprint(mjono[::-1])

Kirjoita merkkijono: esimerkki\nikkremise

Varoitus: globaalin muuttujan käyttö funktion sisällä

Funktioiden sisällä on mahdollista määritellä muuttujia, mutta tämän lisäksi funktio näkee sen ulkopuolella pääohjelmassa määritellyt muuttujat. Tälläisia muuttujia sanotaan globaaleiksi muuttujiksi.

Globaalien muuttujien käyttämistä funktioista käsin ei useimmiten pidetä hyvänä asiana muun muassa siksi, että ne saattavat johtaa ikäviin bugeihin.

Seuraavassa on esimerkki funktiosta, joka käyttää \"vahingossa\" globaalia muuttujaa:

def tulosta_vaarinpain(nimet: list):\n    # käytetään vahingossa parametrin sijaan globaalia muuttujaa nimilista\n    i = len(nimilista) - 1\n    while i >= 0:\n        print(nimilista[i])\n        i -= 1\n\n# globaali muuttuja\nnimilista = [\"Antti\", \"Emilia\", \"Erkki\", \"Margaret\"]\ntulosta_vaarinpain(nimilista)\nprint()\ntulosta_vaarinpain([\"Tupu\", \"Hupu\", \"Lupu\"])

Margaret\nErkki\nEmilia\nAntti

Margaret\nErkki\nEmilia\nAntti

Vaikka funktiota kutsutaan oikein, se tulostaa aina globaalissa muuttujassa nimilista olevat nimet.

Kaikki funktioita testaava koodi on kirjoitettava erillisen lohkon sisälle, jotta TMC-testit hyväksyisivät koodin. Edellinen esimerkki siis tulisi toteuttaa seuraavasti:

def tulosta_vaarinpain(nimet: list):\n    # käytetään vahingossa parametrin sijaan globaalia muuttujaa nimilista\n    i = len(nimilista) - 1\n    while i>=0:\n        print(nimilista[i])\n        i -= 1\n\n# kaikki funktiota testaava koodi tämän lohkon sisälle\nif __name__ == \"__main__\":\n    # globaali muuttuja\n    nimilista = [\"Antti\", \"Emilia\", \"Erkki\", \"Margaret\"]\n    tulosta_vaarinpain(nimilista)\n    print()\n    tulosta_vaarinpain([\"Tupu\", \"Hupu\", \"Lupu\"])

Nyt myös globaalin muuttujan määrittely on siirtynyt if-lohkoon.

TMC-testit suoritetaan aina siten, että mitään if-lohkon sisällä olevaa koodia ei suoriteta. Tämän takia funktio ei voi edes teoriassa toimia, sillä se viittaa muuttujaan nimilista, jota ei testejä suoritettaessa ole lainkaan olemassa.

Kirjoita funktio kaikki_vaarinpain, joka saa parametrikseen listan merkkijonoja. Funktio luo ja palauttaa uuden listan, jossa kaikki alkuperäisellä listalla olevat merkkijonot on käännetty. Myös listan alkioiden järjestys muutetaan käänteiseksi.

Esimerkki funktion käytöstä:

lista = [\"Moi\", \"kaikki\", \"esimerkki\", \"vielä yksi\"]\nlista2 = kaikki_vaarinpain(lista)\nprint(lista2)

['isky äleiv', 'ikkremise', 'ikkiak', 'ioM']

Merkkijonoa ei voi muuttaa

Merkkijonoilla ja listoilla on paljon yhteistä, ja useimmat operaatiot toimivat samalla tavalla sekä merkkijonoille että listoille. Kuitenkin erona on, että merkkijonoa ei voi muuttaa. Esimerkiksi seuraava koodi ei toimi tarkoitetulla tavalla:

mjono = \"esimerkki\"\nmjono[0] = \"a\"

Koska merkkijonoa ei voi muuttaa, ohjelman suoritus aiheuttaa virheen:

TypeError: 'str' object does not support item assignment

Samankaltainen virhe seuraa, jos yritetään esimerkiksi järjestää merkkijonoa järjestykseen sort-metodilla.

Vaikka merkkijonoa ei voi muuttaa, voimme silti sijoittaa merkkijonon paikalle toisen merkkijonon.

Onkin tärkeää huomata ero seuraavien esimerkkien välillä:

lista = [1,2,3]\nlista[0] = 10
\n \n

Kirjoita funktio eniten_kirjainta, joka saa parametrikseen merkkijonon. Funktio palauttaa kirjaimen, jota esiintyy eniten merkkijonossa. Jos yhtä yleisiä kirjaimia on monta, funktion tulee palauttaa niistä ensimmäisenä merkkijonossa esiintyvä.

Esimerkki funktion käytöstä:

mjono = \"abcbdbe\"\nprint(eniten_kirjainta(mjono))\n\ntoinen_jono = \"esimerkkimerkkijonokki\"\nprint(eniten_kirjainta(toinen_jono))

b\nk

Kirjoita funktio ilman_vokaaleja, joka saa parametrikseen merkkijonon. Funktio palauttaa uuden merkkijonon, jossa alkuperäisen merkkijonon vokaalit on poistettu.

Voit olettaa, että merkkijono koostuu pelkästään pienistä suomen kielen kirjaimista a...ö.

Esimerkki funktion käytöstä:

mjono = \"tämä on esimerkki\"\nprint(ilman_vokaaleja(mjono))

tm n smrkk

Pythonin merkkijonometodi isupper() palauttaa arvon True, jos merkkijono koostuu pelkästään isoista kirjaimista.

Esimerkiksi:

print(\"XYZ\".isupper())\n\nonko_iso = \"Abc\".isupper()\nprint(onko_iso)

True\nFalse

Kirjoita metodia hyödyntäen funktio poista_isot, joka saa parametrikseen listan merkkijonoja. Funktio palauttaa uuden listan, jolla on sen parametrina olevasta listasta ne merkkijonot, jotka eivät koostu kokonaan isoista kirjaimista.

Esimerkki funktion käytöstä:

lista = [\"ABC\", \"def\", \"ISO\", \"TOINENISO\", \"pieni\", \"toinen pieni\", \"Osittain Iso\"]\nkarsittu_lista = poista_isot(lista)\nprint(karsittu_lista)

['def', 'pieni', 'toinen pieni', 'Osittain Iso']

Määritellään, että listan alkiot ovat naapureita, jos niiden erotus on 1. Naapureita olisivat siis esim alkiot 1 ja 2 tai alkiot 56 ja 55.

Kirjoita funktio pisin_naapurijono, joka etsii listasta pisimmän peräkkäisiä naapureita sisältävän osalistan ja palauttaa sen pituuden.

Esimerkiksi listassa [1, 2, 5, 4, 3, 4] pisin tällainen osalista olisi [5, 4, 3, 4], ja sen pituus 4.

Esimerkki funktion kutsumisesta:

lista = [1, 2, 5, 7, 6, 5, 6, 3, 4, 1, 0]\nprint(pisin_naapurijono(lista))

4

Laajemman ohjelman tekeminen

Tämän osan huipentaa ensimmäinen hieman laajempi ohjelma, jota tehdessäsi pääset soveltamaan kaikkea tähän asti opeteltua.

Sääntö numero yksi isompaa tai oikeastaan mitä tahansa ohjelmaa tehdessä on se, että ei kannata yrittää ratkaista kaikkia ongelmia yhtä aikaa. Ohjelma kannattaa rakentaa pienistä paloista kuten sopivista apufunktioista, ja kunkin palan toimivuus kannattaa varmistaa ennen kun alkaa rakentaa seuraavaa palaa. Jos näin ei tee, on aika varmaa että edessä on suuri kaaos.

Isompaa ohjelmaa rakentaessa on järkevää testailla ohjelman funktioita aluksi erillään pääohjelmasta. Yksi helppo tapa on tehdä myös pääohjelmasta oma funktio, esimerkiksi nimeltään main, jonka ohjelman funktioiden ulkopuoleinen osa käynnistää. Esimerkiksi seuraavaa tehtävää voitaisiin ruveta lähestymään näin:

def main():\n    pisteet = []\n    # ohjelman koodi tänne\n\nmain()

Näin ohjelman apufunktioita on mahdollista testata ilman pääohjelman suorittamista:

# apufunktio, joka laskee arvosanan pisteiden perusteella\ndef arvosana(pisteet):\n    # koodia\n\ndef main():\n    pisteet = []\n    # ohjelman koodi tänne\n\n# kommentoidaan pääohjelma pois\n#main()\n\n# testataan apufunktiota\npistemaara = 35\ntulos = arvosana(pistemaara)\nprint(tulos)

Tiedon välittäminen funktiosta toiseen

Jos ohjelma koostuu useista funktioista, nousee esiin kysymys, miten tietoa siirretään funktiosta toiseen.

Seuraavassa on esimerkki ohjelmasta, joka lukee käyttäjältä joukon kokonaislukuarvoja. Sen jälkeen ohjelma tulostaa arvot ja tekee niille vielä \"analyysin\". Ohjelma on jaettu kolmeen erilliseen funktioon:

def lue_kayttajalta(maara: int):\n    print(f\"Syötä {maara} lukua:\")\n    luvut = []\n\n    for i in range(maara):\n        luku = int(input(\"Anna luku: \"))\n        luvut.append(luku)\n\n    return luvut\n\ndef tulosta(luvut: list):\n    print(\"Luvut ovat: \")\n    for luku in luvut:\n        print(luku)\n\ndef analysoi(luvut: list):\n    keskiarvo = sum(luvut) / len(luvut)\n    return f\"Lukuja yhteensä {len(luvut)}, keskiarvo {keskiarvo}, pienin {min(luvut)} ja suurin {max(luvut)}\"\n\n# funktioita käyttävä \"pääohjelma\"\nsyotteet = lue_kayttajalta(5)\ntulosta(syotteet)\nanalyysin_tulos = analysoi(syotteet)\nprint(analyysin_tulos)

Esimerkkisuoritus:

Syötä 5 lukua:\nAnna luku: 10\nAnna luku: 34\nAnna luku: -32\nAnna luku: 99\nAnna luku: -53\nLuvut ovat:\n10\n34\n-32\n99\n-53\nLukuja yhteensä 5, keskiarvo 11.6, pienin -53 ja suurin 99

Perusperiaatteena ohjelmassa on se, että pääohjelma \"tallentaa\" ohjelman käsittelemän tiedon eli tässä tapauksessa käyttäjän syöttämät luvut muuttujassa syotteet.

Jos lukuja on tarve käsitellä jossain funktiossa, ne välitetään sinne parametrina. Näin tapahtuu funktioissa tulosta ja analysoi. Jos taas funktio tuottaa tietoa, jota muut ohjelman osat tarvitsevat, palauttaa funktio datan return-komennolla. Näin tekevät käyttäjän syötteen lukeva funktio lue_kayttajalta sekä analyysin tekevä funktio analysoi.

Olisi periaatteessa mahdollista, että funktiot käyttäisivät suoraan \"pääohjelman\" globaalia muuttujaa syotteet. Se ei kuitenkaan ole järkevää, sillä jos funktiot pystyvät muuttamaan globaalia muuttujaa, voi ohjelmassa alkaa tapahtua jotain hallitsematonta, varsinkin kun funktioiden määrä kasvaa.

Tiedon välitys funktioihin ja niistä ulos on siis järkevintä hoitaa parametrien ja paluuarvojen avulla.

Jos haluaisimme tehdä edellisen esimerkin ohjelman siten, että sen pääohjelma eriytettäisiin omaan funktioon main, siirrettäisiin ohjelman käsittelemä data pääohjelmaa edustavan funktion sisäiseksi muuttujaksi:

# pääohjelmaa edustava funktio\ndef main():\n    syotteet = lue_kayttajalta(5)\n    tulosta(syotteet)\n    analyysin_tulos = analysoi(syotteet)\n\n    print(analyysin_tulos)\n\n# ohjelman käynnistys\nmain()

Tässä tehtävässä toteutetaan ohjelma kurssin arvosanatilastojen tulostamiseen.

Ohjelmalle syötetään rivejä, jotka sisältävät yhden opiskelijan koepistemäärän sekä tehtyjen harjoitustehtävien määrän. Ohjelma tulostaa niiden perusteella arvosanoihin liittyviä tilastoja.

Koepisteet ovat kokonaislukuja väliltä 0–20. Tehtyjen harjoitustehtävien lukumäärät taas kokonaislukuja väliltä 0–100.

Ohjelma kyselee käyttäjältä rivejä niin kauan, kunnes käyttäjä syöttää tyhjän rivin. Voit olettaa, että kaikki rivit on syötetty \"oikein\", eli rivillä on joko kaksi kokonaislukua tai rivi on tyhjä.

Koepisteiden ja harjoitustehtävien syöttäminen etenee seuraavasti:

Koepisteet ja harjoitusten määrä: 15 87\nKoepisteet ja harjoitusten määrä: 10 55\nKoepisteet ja harjoitusten määrä: 11 40\nKoepisteet ja harjoitusten määrä: 4 17\nKoepisteet ja harjoitusten määrä:\nTilasto:

Kun käyttäjä on syöttänyt tyhjän rivin, tulostaa ohjelma tilastot.

Tilastot muodostuvat seuraavasti:

Tehtyjen harjoitustehtävien lukumäärästä saa harjoituspisteitä siten, että vähintään 10 % tehtävämäärästä tuo yhden harjoituspisteen, 20 % tuo 2 harjoituspistettä, jne., ja 100 % eli 100 harjoitustehtävää tuo 10 harjoituspistettä. Harjoitustehtävistä saatava pistemäärä on kokonaisluku.

Kurssin arvosana määräytyy kokeen pistemäärän ja harjoitustehtävistä saatavien pisteiden summasta seuraavan taulukon mukaan:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
koepisteet+harjoituspisteetarvosana
0–140 (eli hylätty)
15–171
18–202
21–233
24–274
28–305

Edelliseen on kuitenkin poikkeus: jos kokeen pistemäärä on alle 10, on arvosana kokonaispistemäärästä riippumatta 0 eli hylätty.

Yllä olevalla esimerkkisyötteellä ohjelma tulostaa seuraavat tilastot:

\nTilasto:\nPisteiden keskiarvo: 14.5\nHyväksymisprosentti: 75.0\nArvosanajakauma:\n  5:\n  4:\n  3: *\n  2:\n  1: **\n  0: *\n

Desimaaliluvut tulostetaan yhden desimaalin tarkkuudella.

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon! Eli jos ohjelmasi toiminnallisuus on esim. funktiossa main, tulee sitä kutsuva koodi kirjoittaa normaaliin tapaan, eikä ym. if-lohkoon kuten on tehtävä niissä tehtävissä, joissa edellytetään funktioiden toteuttamista.

Vihje:

Ohjelman syöte koostuu riveistä joilla on peräkkäin kaksi numeroa:

Koepisteet ja harjoitusten määrä: 15 87

Syöterivi pitää pilkkoa ensin kahtia ja muuttaa palaset kokonaisluvuksi int-funktiolla. Rivin pilkkominen onnistuu samalla tavalla kun tehtävässä Eka, toka ja vika sana. Siihen on olemassa myös hieman helpompi keino, merkkijonojen metodi split. Googlaa jos haluat, käytä esim. hakusanoja python string split.

Vastaa lopuksi osion loppukyselyyn:

","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-4/6-lisaa-rakenteista.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tunnet lisää tapoja erottaa osia merkkijonosta tai listasta"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ymmärrät, mitä tarkoittaa merkkijonon muuttumattomuus"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää metodeita "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"count"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"replace"}]}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olemme käyttäneet aiemmin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[]"}]},{"type":"text","value":"-syntaksia merkkijonon osajonon erottamiseen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"esimerkki\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"merk"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sama syntaksi toimii myös listoissa, ja voimme erottaa sen avulla listan osan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[4, 6, 1, 2]"}]}]},{"type":"element","tagName":"h2","properties":{"id":"lisaa-erottamisesta","style":"position:relative;"},"children":[{"type":"text","value":"Lisää erottamisesta"},{"type":"element","tagName":"a","properties":{"href":"#lisaa-erottamisesta","ariaLabel":"lisaa erottamisesta permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Itse asiassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[]"}]},{"type":"text","value":"-syntaksi toimii hyvin samalla periaatteella kuin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"range"}]},{"type":"text","value":"-funktio, eli voimme antaa sille myös askeleen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"esimerkki\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"eiek\n[7, 6, 5, 4]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos emme anna jotain arvoa, oletuksena koko sisältö valitaan mukaan. Tämän avulla voimme tehdä seuraavan lyhyen ohjelman, joka kääntää merkkijonon:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kirjoita merkkijono: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita merkkijono: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"esimerkki"}]},{"type":"text","value":"\nikkremise"}]}]},{"type":"comment","value":"vastaava varoitusteksti löytyy osioista 3-4, 4-6 ja 5-1, tsekkaa kaikki jos muokkaat"},{"type":"element","tagName":"h2","properties":{"id":"varoitus-globaalin-muuttujan-kaytto-funktion-sisalla","style":"position:relative;"},"children":[{"type":"text","value":"Varoitus: globaalin muuttujan käyttö funktion sisällä"},{"type":"element","tagName":"a","properties":{"href":"#varoitus-globaalin-muuttujan-kaytto-funktion-sisalla","ariaLabel":"varoitus globaalin muuttujan kaytto funktion sisalla permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktioiden sisällä on mahdollista määritellä muuttujia, mutta tämän lisäksi funktio näkee sen ulkopuolella pääohjelmassa määritellyt muuttujat. Tälläisia muuttujia sanotaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"globaaleiksi"}]},{"type":"text","value":" muuttujiksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Globaalien muuttujien käyttämistä funktioista käsin ei useimmiten pidetä hyvänä asiana muun muassa siksi, että ne saattavat johtaa ikäviin bugeihin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on esimerkki funktiosta, joka käyttää \"vahingossa\" globaalia muuttujaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta_vaarinpain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# käytetään vahingossa parametrin sijaan globaalia muuttujaa nimilista"}]},{"type":"text","value":"\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# globaali muuttuja"}]},{"type":"text","value":"\nnimilista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Margaret\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\ntulosta_vaarinpain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulosta_vaarinpain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tupu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hupu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lupu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Margaret\nErkki\nEmilia\nAntti"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Margaret\nErkki\nEmilia\nAntti"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaikka funktiota kutsutaan oikein, se tulostaa aina globaalissa muuttujassa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"nimilista"}]},{"type":"text","value":" olevat nimet."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kaikki funktioita testaava koodi on kirjoitettava erillisen lohkon sisälle, jotta TMC-testit hyväksyisivät koodin. Edellinen esimerkki siis tulisi toteuttaa seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta_vaarinpain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# käytetään vahingossa parametrin sijaan globaalia muuttujaa nimilista"}]},{"type":"text","value":"\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" i"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kaikki funktiota testaava koodi tämän lohkon sisälle"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# globaali muuttuja"}]},{"type":"text","value":"\n nimilista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Margaret\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n tulosta_vaarinpain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tulosta_vaarinpain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tupu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hupu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lupu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt myös globaalin muuttujan määrittely on siirtynyt "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":"-lohkoon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"TMC-testit suoritetaan aina siten, että mitään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":"-lohkon sisällä olevaa koodia ei suoriteta. Tämän takia funktio ei voi edes teoriassa toimia, sillä se viittaa muuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimilista"}]},{"type":"text","value":", jota ei testejä suoritettaessa ole lainkaan olemassa."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kaikki väärinpäin","tmcname":"osa04-21_kaikki_vaarinpain"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kaikki_vaarinpain"}]},{"type":"text","value":", joka saa parametrikseen listan merkkijonoja. Funktio luo ja palauttaa uuden listan, jossa kaikki alkuperäisellä listalla olevat merkkijonot on käännetty. Myös listan alkioiden järjestys muutetaan käänteiseksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kaikki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"esimerkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vielä yksi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nlista2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kaikki_vaarinpain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['isky äleiv', 'ikkremise', 'ikkiak', 'ioM']"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"merkkijonoa-ei-voi-muuttaa","style":"position:relative;"},"children":[{"type":"text","value":"Merkkijonoa ei voi muuttaa"},{"type":"element","tagName":"a","properties":{"href":"#merkkijonoa-ei-voi-muuttaa","ariaLabel":"merkkijonoa ei voi muuttaa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkkijonoilla ja listoilla on paljon yhteistä, ja useimmat operaatiot toimivat samalla tavalla sekä merkkijonoille että listoille. Kuitenkin erona on, että merkkijonoa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei voi muuttaa"}]},{"type":"text","value":". Esimerkiksi seuraava koodi ei toimi tarkoitetulla tavalla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"esimerkki\""}]},{"type":"text","value":"\nmjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"a\""}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska merkkijonoa ei voi muuttaa, ohjelman suoritus aiheuttaa virheen:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"TypeError: 'str' object does not support item assignment"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Samankaltainen virhe seuraa, jos yritetään esimerkiksi järjestää merkkijonoa järjestykseen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sort"}]},{"type":"text","value":"-metodilla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaikka merkkijonoa ei voi muuttaa, voimme silti sijoittaa merkkijonon paikalle toisen merkkijonon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Onkin tärkeää huomata ero seuraavien esimerkkien välillä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]}]}]}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 271px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/8b07a257ace229cc26a5eedf03a60986/5fce1/4_4_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 70.43478260869564%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsTAAALEwEAmpwYAAABeUlEQVQ4y5WT66rCQAyE9337w8eT/hEfQVCs4K2iWO+1VevdyDewBxE91EDYbHZ3Opmkbj6fWxzH1uv1bDab2Xa7tTzPLUkSW61WtlgslJ9Op4bd73d7PB5f3RVFIQB8v98rebvd7HA42G63U471eDxaGXP2g202G1WwXq/l7zHn7nK5iAFMKQd2+PV61Up+MBjY6XRS6TBFCkCIAVkul6qIveNStVq1Wq2mi/1+37rdrpy42WxapVKRzoB7KXgMkM/RC5XsNYPpu+AYTHH24/FYmtIw3APRMD5C2c4/xD517fUMVoDA6puXbsor+L9dRsPRaGTD4VDUKQtt/LiwZ6TKzKDmkId+HNI0tSzLBISmOGDn87n0aP1UMqMDOOu32NFB3+FPxgTAnBVZqAaJkIL8ZDLR3g+4o+1hGFq9XtccMn+dTkdO3Gg0LAgCgdFFAACCAHJABnZIppL5MgckiCmNy74BXIYVZ61WS38Na7vd1keiKPrLs38CMo80d8OuAIYAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8b07a257ace229cc26a5eedf03a60986/a0b58/4_4_1.webp 230w","/static/8b07a257ace229cc26a5eedf03a60986/cadab/4_4_1.webp 271w"],"sizes":"(max-width: 271px) 100vw, 271px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8b07a257ace229cc26a5eedf03a60986/81c8e/4_4_1.png 230w","/static/8b07a257ace229cc26a5eedf03a60986/5fce1/4_4_1.png 271w"],"sizes":"(max-width: 271px) 100vw, 271px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/8b07a257ace229cc26a5eedf03a60986/5fce1/4_4_1.png","alt":"4 4 1","title":"4 4 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi\""}]},{"type":"text","value":"\nmjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"!\""}]}]}]}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 281px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/e24d125e0a5ab22b6d68096ab4edaa6d/6b1e2/4_4_2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 85.65217391304348%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAAAsTAAALEwEAmpwYAAABpklEQVQ4y52UWYsCQQyE+2eL/8xnQVAQHxXvA+/7vq3lC2TpHca9AmEy6e50qiozYblcqtfrqd/vazabab/f63A4qNvtqtlsajqd6nQ6CXu9Xj96oACFFouF1uu1rterHo+HFaEY6775Nxb0B9tut1qtVnbxZrMxJ8ZBejweFW63m0E8n8/WHc4CTpcUqdVqtmc+n4v98R7iy+Wi+/2uyWSi0Ol0lMvlVCgUVCqVLAl3rVbLeKxWq8pms2IfBdzG47HlYoM2g+y84e8MDkejkcEDNg5Mj8lbh0myXYDn8/npnudCIDvsOPamgm92o8A7RTnA+ndIAqMBZ41GQ4PBwMaE9uGw3W5bHmjkd7udjRhCvZvLLyqjlsN0lV1B/N9z+A4yl/vFziGxO2vWIfOFIzvvaXwSc8ARsA8UPJ1XEwU+isWi8vm8yuWyjcZwOLQb446BHOc4zJeSFCgVMp3ydfDDiDuGU4RBIP+JuFj+DGlKuUFDvV43xZkEOiKH6sT+bfOOMwEhrViycKVSUSaTsWJuFEpSkwo5LhTHHIQKN+DyTt4bgOcPk2YlBJdlLTcAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/e24d125e0a5ab22b6d68096ab4edaa6d/a0b58/4_4_2.webp 230w","/static/e24d125e0a5ab22b6d68096ab4edaa6d/f44a8/4_4_2.webp 281w"],"sizes":"(max-width: 281px) 100vw, 281px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/e24d125e0a5ab22b6d68096ab4edaa6d/81c8e/4_4_2.png 230w","/static/e24d125e0a5ab22b6d68096ab4edaa6d/6b1e2/4_4_2.png 281w"],"sizes":"(max-width: 281px) 100vw, 281px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/e24d125e0a5ab22b6d68096ab4edaa6d/6b1e2/4_4_2.png","alt":"4 4 2","title":"4 4 2","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ensimmäisessä esimerkissä listan sisältö muuttuu. Toisessa esimerkissä alkuperäinen merkkijono korvataan toisella merkkijonolla. Alkuperäinen merkkijono jää muistiin, mutta siihen ei enää ole viittausta, joten sitä ei voi enää käyttää ohjelmassa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tähän palataan tarkemmin ensi viikolla, kun viittauksia listoihin käsitellään tarkemmin."}]},{"type":"element","tagName":"h2","properties":{"id":"lisaa-metodeita","style":"position:relative;"},"children":[{"type":"text","value":"Lisää metodeita"},{"type":"element","tagName":"a","properties":{"href":"#lisaa-metodeita","ariaLabel":"lisaa metodeita permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"count"}]},{"type":"text","value":" avulla voidaan laskea osajonon esiintymien määrä. Metodi toimii samaan tapaan sekä merkkijonon että listan kanssa. Esimerkiksi näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vesihiisi sihisi hississä\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"count"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"si\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nlista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"count"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"5\n3"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"count"}]},{"type":"text","value":" ei laske päällekkäisiä esiintymiä. Esimerkiksi metodin mukaan merkkijonossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"aaaa"}]},{"type":"text","value":" esiintyy kaksi kertaa osajono "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"aa"}]},{"type":"text","value":", vaikka oikeastaan esiintymiä olisi kolme, jos päällekkäiset esiintymät sallitaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"replace"}]},{"type":"text","value":" avulla voidaan muodostaa uusi merkkijono, jossa tietty merkkijono on korvattu toisella merkkijonolla. Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi kaikki\""}]},{"type":"text","value":"\nuusi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"replace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hei\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"uusi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hei kaikki"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi korvaa kaikki merkkijonon esiintymät:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lause "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hei heilan löysin minä heinikosta hei\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"replace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hei\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"HEI\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"HEI HEIlan löysin minä HEInikosta HEI"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tyypillinen virhe "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"replace"}]},{"type":"text","value":"-metodia käytettäessä on unohtaa, että merkkijonot ovat muuttumattomia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Python on kivaa\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Korvataan alijono, muttei tallenneta tulosta mihinkään..."}]},{"type":"text","value":"\nmjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"replace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Java\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python on kivaa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos vanhaa jonoa ei tarvita, voidaan uusi jono sijoittaa samaan muuttujaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Python on kivaa\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Korvataan alijono, tallennetaan tulos samaan muuttujaan"}]},{"type":"text","value":"\nmjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"replace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Java\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Java on kivaa"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Eniten kirjaimia","tmcname":"osa04-22_eniten_kirjaimia"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"eniten_kirjainta"}]},{"type":"text","value":", joka saa parametrikseen merkkijonon. Funktio palauttaa kirjaimen, jota esiintyy eniten merkkijonossa. Jos yhtä yleisiä kirjaimia on monta, funktion tulee palauttaa niistä ensimmäisenä merkkijonossa esiintyvä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"abcbdbe\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eniten_kirjainta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntoinen_jono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"esimerkkimerkkijonokki\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eniten_kirjainta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"toinen_jono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"b\nk"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Vokaalit pois","tmcname":"osa04-23_vokaalit_pois"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ilman_vokaaleja"}]},{"type":"text","value":", joka saa parametrikseen merkkijonon. Funktio palauttaa uuden merkkijonon, jossa alkuperäisen merkkijonon vokaalit on poistettu."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa, että merkkijono koostuu pelkästään pienistä suomen kielen kirjaimista a...ö."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tämä on esimerkki\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ilman_vokaaleja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tm n smrkk"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Poista isot","tmcname":"osa04-24_poista_isot"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonin merkkijonometodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"isupper()"}]},{"type":"text","value":" palauttaa arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", jos merkkijono koostuu "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"pelkästään isoista kirjaimista"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"XYZ\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"isupper"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nonko_iso "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Abc\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"isupper"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"onko_iso"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\nFalse"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita metodia hyödyntäen funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"poista_isot"}]},{"type":"text","value":", joka saa parametrikseen listan merkkijonoja. Funktio palauttaa uuden listan, jolla on sen parametrina olevasta listasta ne merkkijonot, jotka eivät koostu kokonaan isoista kirjaimista."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ABC\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"def\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ISO\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"TOINENISO\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pieni\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toinen pieni\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Osittain Iso\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nkarsittu_lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" poista_isot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"karsittu_lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['def', 'pieni', 'toinen pieni', 'Osittain Iso']"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Naapureita listassa","tmcname":"osa04-25_naapureita_listassa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Määritellään, että listan alkiot ovat naapureita, jos niiden erotus on 1. Naapureita olisivat siis esim alkiot 1 ja 2 tai alkiot 56 ja 55."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pisin_naapurijono"}]},{"type":"text","value":", joka etsii listasta pisimmän peräkkäisiä naapureita sisältävän osalistan ja palauttaa sen pituuden."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi listassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[1, 2, 5, 4, 3, 4]"}]},{"type":"text","value":" pisin tällainen osalista olisi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[5, 4, 3, 4]"}]},{"type":"text","value":", ja sen pituus 4."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pisin_naapurijono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"laajemman-ohjelman-tekeminen","style":"position:relative;"},"children":[{"type":"text","value":"Laajemman ohjelman tekeminen"},{"type":"element","tagName":"a","properties":{"href":"#laajemman-ohjelman-tekeminen","ariaLabel":"laajemman ohjelman tekeminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osan huipentaa ensimmäinen hieman laajempi ohjelma, jota tehdessäsi pääset soveltamaan kaikkea tähän asti opeteltua."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sääntö numero yksi isompaa tai oikeastaan mitä tahansa ohjelmaa tehdessä on se, että ei kannata yrittää ratkaista kaikkia ongelmia yhtä aikaa. Ohjelma kannattaa rakentaa pienistä paloista kuten sopivista apufunktioista, ja kunkin palan toimivuus kannattaa varmistaa ennen kun alkaa rakentaa seuraavaa palaa. Jos näin ei tee, on aika varmaa että edessä on suuri kaaos."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Isompaa ohjelmaa rakentaessa on järkevää testailla ohjelman funktioita aluksi erillään pääohjelmasta. Yksi helppo tapa on tehdä myös pääohjelmasta oma funktio, esimerkiksi nimeltään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"main"}]},{"type":"text","value":", jonka ohjelman funktioiden ulkopuoleinen osa käynnistää. Esimerkiksi seuraavaa tehtävää voitaisiin ruveta lähestymään näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"main"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ohjelman koodi tänne"}]},{"type":"text","value":"\n\nmain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Näin ohjelman apufunktioita on mahdollista testata ilman pääohjelman suorittamista:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# apufunktio, joka laskee arvosanan pisteiden perusteella"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"arvosana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# koodia"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"main"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ohjelman koodi tänne"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kommentoidaan pääohjelma pois"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"#main()"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# testataan apufunktiota"}]},{"type":"text","value":"\npistemaara "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"35"}]},{"type":"text","value":"\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" arvosana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pistemaara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"tiedon-valittaminen-funktiosta-toiseen","style":"position:relative;"},"children":[{"type":"text","value":"Tiedon välittäminen funktiosta toiseen"},{"type":"element","tagName":"a","properties":{"href":"#tiedon-valittaminen-funktiosta-toiseen","ariaLabel":"tiedon valittaminen funktiosta toiseen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos ohjelma koostuu useista funktioista, nousee esiin kysymys, miten tietoa siirretään funktiosta toiseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on esimerkki ohjelmasta, joka lukee käyttäjältä joukon kokonaislukuarvoja. Sen jälkeen ohjelma tulostaa arvot ja tekee niille vielä \"analyysin\". Ohjelma on jaettu kolmeen erilliseen funktioon:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lue_kayttajalta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Syötä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" lukua:\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" luvut\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luvut ovat: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"analysoi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n keskiarvo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sum"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Lukuja yhteensä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", keskiarvo "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"keskiarvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", pienin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"min"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ja suurin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"max"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# funktioita käyttävä \"pääohjelma\""}]},{"type":"text","value":"\nsyotteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue_kayttajalta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nanalyysin_tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" analysoi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"analyysin_tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuoritus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Syötä 5 lukua:\nAnna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\nAnna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"34"}]},{"type":"text","value":"\nAnna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-32"}]},{"type":"text","value":"\nAnna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"99"}]},{"type":"text","value":"\nAnna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-53"}]},{"type":"text","value":"\nLuvut ovat:\n10\n34\n-32\n99\n-53\nLukuja yhteensä 5, keskiarvo 11.6, pienin -53 ja suurin 99"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Perusperiaatteena ohjelmassa on se, että pääohjelma \"tallentaa\" ohjelman käsittelemän tiedon eli tässä tapauksessa käyttäjän syöttämät luvut muuttujassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"syotteet"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos lukuja on tarve käsitellä jossain funktiossa, ne välitetään sinne parametrina. Näin tapahtuu funktioissa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"analysoi"}]},{"type":"text","value":". Jos taas funktio tuottaa tietoa, jota muut ohjelman osat tarvitsevat, palauttaa funktio datan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":"-komennolla. Näin tekevät käyttäjän syötteen lukeva funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lue_kayttajalta"}]},{"type":"text","value":" sekä analyysin tekevä funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"analysoi"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olisi periaatteessa mahdollista, että funktiot käyttäisivät suoraan \"pääohjelman\" globaalia muuttujaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"syotteet"}]},{"type":"text","value":". Se "},{"type":"element","tagName":"a","properties":{"href":"https://softwareengineering.stackexchange.com/questions/148108/why-is-global-state-so-evil","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"ei kuitenkaan ole järkevää"}]},{"type":"text","value":", sillä jos funktiot pystyvät muuttamaan globaalia muuttujaa, voi ohjelmassa alkaa tapahtua jotain hallitsematonta, varsinkin kun funktioiden määrä kasvaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedon välitys funktioihin ja niistä ulos on siis järkevintä hoitaa parametrien ja paluuarvojen avulla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos haluaisimme tehdä edellisen esimerkin ohjelman siten, että sen pääohjelma eriytettäisiin omaan funktioon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"main"}]},{"type":"text","value":", siirrettäisiin ohjelman käsittelemä data pääohjelmaa edustavan funktion sisäiseksi muuttujaksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# pääohjelmaa edustava funktio"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"main"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n syotteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue_kayttajalta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n analyysin_tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" analysoi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"analyysin_tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ohjelman käynnistys"}]},{"type":"text","value":"\nmain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Arvosanatilasto","tmcname":"osa04-26_arvosanatilasto"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä toteutetaan ohjelma kurssin arvosanatilastojen tulostamiseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmalle syötetään rivejä, jotka sisältävät yhden opiskelijan koepistemäärän sekä tehtyjen harjoitustehtävien määrän. Ohjelma tulostaa niiden perusteella arvosanoihin liittyviä tilastoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koepisteet ovat kokonaislukuja väliltä 0–20. Tehtyjen harjoitustehtävien lukumäärät taas kokonaislukuja väliltä 0–100."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma kyselee käyttäjältä rivejä niin kauan, kunnes käyttäjä syöttää tyhjän rivin. Voit olettaa, että kaikki rivit on syötetty \"oikein\", eli rivillä on joko kaksi kokonaislukua tai rivi on tyhjä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koepisteiden ja harjoitustehtävien syöttäminen etenee seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koepisteet ja harjoitusten määrä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"15 87"}]},{"type":"text","value":"\nKoepisteet ja harjoitusten määrä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10 55"}]},{"type":"text","value":"\nKoepisteet ja harjoitusten määrä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"11 40"}]},{"type":"text","value":"\nKoepisteet ja harjoitusten määrä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4 17"}]},{"type":"text","value":"\nKoepisteet ja harjoitusten määrä:\nTilasto:"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun käyttäjä on syöttänyt tyhjän rivin, tulostaa ohjelma tilastot."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tilastot muodostuvat seuraavasti:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtyjen harjoitustehtävien lukumäärästä saa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"harjoituspisteitä"}]},{"type":"text","value":" siten, että vähintään 10 % tehtävämäärästä tuo yhden harjoituspisteen, 20 % tuo 2 harjoituspistettä, jne., ja 100 % eli 100 harjoitustehtävää tuo 10 harjoituspistettä. Harjoitustehtävistä saatava pistemäärä on kokonaisluku."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kurssin arvosana määräytyy kokeen pistemäärän ja harjoitustehtävistä saatavien pisteiden summasta seuraavan taulukon mukaan:"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"koepisteet+harjoituspisteet"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"arvosana"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"0–14"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"0 (eli hylätty)"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"15–17"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"1"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"18–20"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"2"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"21–23"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"3"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"24–27"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"4"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"28–30"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"5"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edelliseen on kuitenkin poikkeus: jos kokeen pistemäärä on alle 10, on arvosana kokonaispistemäärästä riippumatta 0 eli hylätty."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yllä olevalla esimerkkisyötteellä ohjelma tulostaa seuraavat tilastot:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Tilasto:\nPisteiden keskiarvo: 14.5\nHyväksymisprosentti: 75.0\nArvosanajakauma:\n 5:\n 4:\n 3: *\n 2:\n 1: **\n 0: *\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Desimaaliluvut tulostetaan yhden desimaalin tarkkuudella."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon! Eli jos ohjelmasi toiminnallisuus on esim. funktiossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"main"}]},{"type":"text","value":", tulee sitä kutsuva koodi kirjoittaa normaaliin tapaan, eikä ym. if-lohkoon kuten on tehtävä niissä tehtävissä, joissa edellytetään funktioiden toteuttamista."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vihje:"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman syöte koostuu riveistä joilla on peräkkäin kaksi numeroa:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koepisteet ja harjoitusten määrä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"15 87"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Syöterivi pitää pilkkoa ensin kahtia ja muuttaa palaset kokonaisluvuksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"int"}]},{"type":"text","value":"-funktiolla. Rivin pilkkominen onnistuu samalla tavalla kun tehtävässä "},{"type":"element","tagName":"a","properties":{"href":"/osa-4/2-lisaa-funktioista"},"children":[{"type":"text","value":"Eka, toka ja vika sana"}]},{"type":"text","value":". Siihen on olemassa myös hieman helpompi keino, merkkijonojen metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"split"}]},{"type":"text","value":". Googlaa jos haluat, käytä esim. hakusanoja "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"python string split"}]},{"type":"text","value":"."}]},{"type":"comment","value":" **Huomaa** että tällä hetkellä Windowsissa on ongelmia joidenkin tehtävien testien suorittamisessa. Jos törmäät seuraavaan virheilmoitukseen\n\n\"Listan\n\nvoit suorittaa testit lähettämällä ne palvelimelle valitsemalla testien suoritusnapin oikealla puolella olevasta symbolista avautuvasta TMC-valikosta _Submit solutions_.\n\nOngelman saa korjattua menemällä laajennuksen asennusvalikkoon ja muuttamalla \"TMC Data\" -kohdassa tehtävien sijainnin johonkin toiseen sijaintiin, jonka tiedostopolku on lyhempi, allaolevassa kuvassa nappi _change path_. Siirrossa saattaa kestää hetken, joten odotathan operaation päättymistä.\n\n\"Listan\n\nOngelmaan pyritään saamaan parempi ratkaisu lähipäivinä. "}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c"},"children":[]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa lopuksi osion loppukyselyyn:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"9b354cf1-f413-5ec3-befd-992039b09100"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tunnet lisää tapoja erottaa osia merkkijonosta tai listasta
  • \n
  • Ymmärrät, mitä tarkoittaa merkkijonon muuttumattomuus
  • \n
  • Osaat käyttää metodeita count ja replace
  • \n

Olemme käyttäneet aiemmin []-syntaksia merkkijonon osajonon erottamiseen:

mjono = \"esimerkki\"\nprint(mjono[3:7])

merk

Sama syntaksi toimii myös listoissa, ja voimme erottaa sen avulla listan osan:

lista = [3,4,2,4,6,1,2,4,2]\nprint(lista[3:7])

[4, 6, 1, 2]

Lisää erottamisesta

Itse asiassa []-syntaksi toimii hyvin samalla periaatteella kuin range-funktio, eli voimme antaa sille myös askeleen:

mjono = \"esimerkki\"\nprint(mjono[0:7:2])\nlista = [1,2,3,4,5,6,7,8]\nprint(lista[6:2:-1])

eiek\n[7, 6, 5, 4]

Jos emme anna jotain arvoa, oletuksena koko sisältö valitaan mukaan. Tämän avulla voimme tehdä seuraavan lyhyen ohjelman, joka kääntää merkkijonon:

mjono = input(\"Kirjoita merkkijono: \")\nprint(mjono[::-1])

Kirjoita merkkijono: esimerkki\nikkremise

Varoitus: globaalin muuttujan käyttö funktion sisällä

Funktioiden sisällä on mahdollista määritellä muuttujia, mutta tämän lisäksi funktio näkee sen ulkopuolella pääohjelmassa määritellyt muuttujat. Tälläisia muuttujia sanotaan globaaleiksi muuttujiksi.

Globaalien muuttujien käyttämistä funktioista käsin ei useimmiten pidetä hyvänä asiana muun muassa siksi, että ne saattavat johtaa ikäviin bugeihin.

Seuraavassa on esimerkki funktiosta, joka käyttää \"vahingossa\" globaalia muuttujaa:

def tulosta_vaarinpain(nimet: list):\n    # käytetään vahingossa parametrin sijaan globaalia muuttujaa nimilista\n    i = len(nimilista) - 1\n    while i >= 0:\n        print(nimilista[i])\n        i -= 1\n\n# globaali muuttuja\nnimilista = [\"Antti\", \"Emilia\", \"Erkki\", \"Margaret\"]\ntulosta_vaarinpain(nimilista)\nprint()\ntulosta_vaarinpain([\"Tupu\", \"Hupu\", \"Lupu\"])

Margaret\nErkki\nEmilia\nAntti

Margaret\nErkki\nEmilia\nAntti

Vaikka funktiota kutsutaan oikein, se tulostaa aina globaalissa muuttujassa nimilista olevat nimet.

Kaikki funktioita testaava koodi on kirjoitettava erillisen lohkon sisälle, jotta TMC-testit hyväksyisivät koodin. Edellinen esimerkki siis tulisi toteuttaa seuraavasti:

def tulosta_vaarinpain(nimet: list):\n    # käytetään vahingossa parametrin sijaan globaalia muuttujaa nimilista\n    i = len(nimilista) - 1\n    while i>=0:\n        print(nimilista[i])\n        i -= 1\n\n# kaikki funktiota testaava koodi tämän lohkon sisälle\nif __name__ == \"__main__\":\n    # globaali muuttuja\n    nimilista = [\"Antti\", \"Emilia\", \"Erkki\", \"Margaret\"]\n    tulosta_vaarinpain(nimilista)\n    print()\n    tulosta_vaarinpain([\"Tupu\", \"Hupu\", \"Lupu\"])

Nyt myös globaalin muuttujan määrittely on siirtynyt if-lohkoon.

TMC-testit suoritetaan aina siten, että mitään if-lohkon sisällä olevaa koodia ei suoriteta. Tämän takia funktio ei voi edes teoriassa toimia, sillä se viittaa muuttujaan nimilista, jota ei testejä suoritettaessa ole lainkaan olemassa.

Kirjoita funktio kaikki_vaarinpain, joka saa parametrikseen listan merkkijonoja. Funktio luo ja palauttaa uuden listan, jossa kaikki alkuperäisellä listalla olevat merkkijonot on käännetty. Myös listan alkioiden järjestys muutetaan käänteiseksi.

Esimerkki funktion käytöstä:

lista = [\"Moi\", \"kaikki\", \"esimerkki\", \"vielä yksi\"]\nlista2 = kaikki_vaarinpain(lista)\nprint(lista2)

['isky äleiv', 'ikkremise', 'ikkiak', 'ioM']

Merkkijonoa ei voi muuttaa

Merkkijonoilla ja listoilla on paljon yhteistä, ja useimmat operaatiot toimivat samalla tavalla sekä merkkijonoille että listoille. Kuitenkin erona on, että merkkijonoa ei voi muuttaa. Esimerkiksi seuraava koodi ei toimi tarkoitetulla tavalla:

mjono = \"esimerkki\"\nmjono[0] = \"a\"

Koska merkkijonoa ei voi muuttaa, ohjelman suoritus aiheuttaa virheen:

TypeError: 'str' object does not support item assignment

Samankaltainen virhe seuraa, jos yritetään esimerkiksi järjestää merkkijonoa järjestykseen sort-metodilla.

Vaikka merkkijonoa ei voi muuttaa, voimme silti sijoittaa merkkijonon paikalle toisen merkkijonon.

Onkin tärkeää huomata ero seuraavien esimerkkien välillä:

lista = [1,2,3]\nlista[0] = 10
\n \n

Kirjoita funktio eniten_kirjainta, joka saa parametrikseen merkkijonon. Funktio palauttaa kirjaimen, jota esiintyy eniten merkkijonossa. Jos yhtä yleisiä kirjaimia on monta, funktion tulee palauttaa niistä ensimmäisenä merkkijonossa esiintyvä.

Esimerkki funktion käytöstä:

mjono = \"abcbdbe\"\nprint(eniten_kirjainta(mjono))\n\ntoinen_jono = \"esimerkkimerkkijonokki\"\nprint(eniten_kirjainta(toinen_jono))

b\nk

Kirjoita funktio ilman_vokaaleja, joka saa parametrikseen merkkijonon. Funktio palauttaa uuden merkkijonon, jossa alkuperäisen merkkijonon vokaalit on poistettu.

Voit olettaa, että merkkijono koostuu pelkästään pienistä suomen kielen kirjaimista a...ö.

Esimerkki funktion käytöstä:

mjono = \"tämä on esimerkki\"\nprint(ilman_vokaaleja(mjono))

tm n smrkk

Pythonin merkkijonometodi isupper() palauttaa arvon True, jos merkkijono koostuu pelkästään isoista kirjaimista.

Esimerkiksi:

print(\"XYZ\".isupper())\n\nonko_iso = \"Abc\".isupper()\nprint(onko_iso)

True\nFalse

Kirjoita metodia hyödyntäen funktio poista_isot, joka saa parametrikseen listan merkkijonoja. Funktio palauttaa uuden listan, jolla on sen parametrina olevasta listasta ne merkkijonot, jotka eivät koostu kokonaan isoista kirjaimista.

Esimerkki funktion käytöstä:

lista = [\"ABC\", \"def\", \"ISO\", \"TOINENISO\", \"pieni\", \"toinen pieni\", \"Osittain Iso\"]\nkarsittu_lista = poista_isot(lista)\nprint(karsittu_lista)

['def', 'pieni', 'toinen pieni', 'Osittain Iso']

Määritellään, että listan alkiot ovat naapureita, jos niiden erotus on 1. Naapureita olisivat siis esim alkiot 1 ja 2 tai alkiot 56 ja 55.

Kirjoita funktio pisin_naapurijono, joka etsii listasta pisimmän peräkkäisiä naapureita sisältävän osalistan ja palauttaa sen pituuden.

Esimerkiksi listassa [1, 2, 5, 4, 3, 4] pisin tällainen osalista olisi [5, 4, 3, 4], ja sen pituus 4.

Esimerkki funktion kutsumisesta:

lista = [1, 2, 5, 7, 6, 5, 6, 3, 4, 1, 0]\nprint(pisin_naapurijono(lista))

4

Laajemman ohjelman tekeminen

Tämän osan huipentaa ensimmäinen hieman laajempi ohjelma, jota tehdessäsi pääset soveltamaan kaikkea tähän asti opeteltua.

Sääntö numero yksi isompaa tai oikeastaan mitä tahansa ohjelmaa tehdessä on se, että ei kannata yrittää ratkaista kaikkia ongelmia yhtä aikaa. Ohjelma kannattaa rakentaa pienistä paloista kuten sopivista apufunktioista, ja kunkin palan toimivuus kannattaa varmistaa ennen kun alkaa rakentaa seuraavaa palaa. Jos näin ei tee, on aika varmaa että edessä on suuri kaaos.

Isompaa ohjelmaa rakentaessa on järkevää testailla ohjelman funktioita aluksi erillään pääohjelmasta. Yksi helppo tapa on tehdä myös pääohjelmasta oma funktio, esimerkiksi nimeltään main, jonka ohjelman funktioiden ulkopuoleinen osa käynnistää. Esimerkiksi seuraavaa tehtävää voitaisiin ruveta lähestymään näin:

def main():\n    pisteet = []\n    # ohjelman koodi tänne\n\nmain()

Näin ohjelman apufunktioita on mahdollista testata ilman pääohjelman suorittamista:

# apufunktio, joka laskee arvosanan pisteiden perusteella\ndef arvosana(pisteet):\n    # koodia\n\ndef main():\n    pisteet = []\n    # ohjelman koodi tänne\n\n# kommentoidaan pääohjelma pois\n#main()\n\n# testataan apufunktiota\npistemaara = 35\ntulos = arvosana(pistemaara)\nprint(tulos)

Tiedon välittäminen funktiosta toiseen

Jos ohjelma koostuu useista funktioista, nousee esiin kysymys, miten tietoa siirretään funktiosta toiseen.

Seuraavassa on esimerkki ohjelmasta, joka lukee käyttäjältä joukon kokonaislukuarvoja. Sen jälkeen ohjelma tulostaa arvot ja tekee niille vielä \"analyysin\". Ohjelma on jaettu kolmeen erilliseen funktioon:

def lue_kayttajalta(maara: int):\n    print(f\"Syötä {maara} lukua:\")\n    luvut = []\n\n    for i in range(maara):\n        luku = int(input(\"Anna luku: \"))\n        luvut.append(luku)\n\n    return luvut\n\ndef tulosta(luvut: list):\n    print(\"Luvut ovat: \")\n    for luku in luvut:\n        print(luku)\n\ndef analysoi(luvut: list):\n    keskiarvo = sum(luvut) / len(luvut)\n    return f\"Lukuja yhteensä {len(luvut)}, keskiarvo {keskiarvo}, pienin {min(luvut)} ja suurin {max(luvut)}\"\n\n# funktioita käyttävä \"pääohjelma\"\nsyotteet = lue_kayttajalta(5)\ntulosta(syotteet)\nanalyysin_tulos = analysoi(syotteet)\nprint(analyysin_tulos)

Esimerkkisuoritus:

Syötä 5 lukua:\nAnna luku: 10\nAnna luku: 34\nAnna luku: -32\nAnna luku: 99\nAnna luku: -53\nLuvut ovat:\n10\n34\n-32\n99\n-53\nLukuja yhteensä 5, keskiarvo 11.6, pienin -53 ja suurin 99

Perusperiaatteena ohjelmassa on se, että pääohjelma \"tallentaa\" ohjelman käsittelemän tiedon eli tässä tapauksessa käyttäjän syöttämät luvut muuttujassa syotteet.

Jos lukuja on tarve käsitellä jossain funktiossa, ne välitetään sinne parametrina. Näin tapahtuu funktioissa tulosta ja analysoi. Jos taas funktio tuottaa tietoa, jota muut ohjelman osat tarvitsevat, palauttaa funktio datan return-komennolla. Näin tekevät käyttäjän syötteen lukeva funktio lue_kayttajalta sekä analyysin tekevä funktio analysoi.

Olisi periaatteessa mahdollista, että funktiot käyttäisivät suoraan \"pääohjelman\" globaalia muuttujaa syotteet. Se ei kuitenkaan ole järkevää, sillä jos funktiot pystyvät muuttamaan globaalia muuttujaa, voi ohjelmassa alkaa tapahtua jotain hallitsematonta, varsinkin kun funktioiden määrä kasvaa.

Tiedon välitys funktioihin ja niistä ulos on siis järkevintä hoitaa parametrien ja paluuarvojen avulla.

Jos haluaisimme tehdä edellisen esimerkin ohjelman siten, että sen pääohjelma eriytettäisiin omaan funktioon main, siirrettäisiin ohjelman käsittelemä data pääohjelmaa edustavan funktion sisäiseksi muuttujaksi:

# pääohjelmaa edustava funktio\ndef main():\n    syotteet = lue_kayttajalta(5)\n    tulosta(syotteet)\n    analyysin_tulos = analysoi(syotteet)\n\n    print(analyysin_tulos)\n\n# ohjelman käynnistys\nmain()

Tässä tehtävässä toteutetaan ohjelma kurssin arvosanatilastojen tulostamiseen.

Ohjelmalle syötetään rivejä, jotka sisältävät yhden opiskelijan koepistemäärän sekä tehtyjen harjoitustehtävien määrän. Ohjelma tulostaa niiden perusteella arvosanoihin liittyviä tilastoja.

Koepisteet ovat kokonaislukuja väliltä 0–20. Tehtyjen harjoitustehtävien lukumäärät taas kokonaislukuja väliltä 0–100.

Ohjelma kyselee käyttäjältä rivejä niin kauan, kunnes käyttäjä syöttää tyhjän rivin. Voit olettaa, että kaikki rivit on syötetty \"oikein\", eli rivillä on joko kaksi kokonaislukua tai rivi on tyhjä.

Koepisteiden ja harjoitustehtävien syöttäminen etenee seuraavasti:

Koepisteet ja harjoitusten määrä: 15 87\nKoepisteet ja harjoitusten määrä: 10 55\nKoepisteet ja harjoitusten määrä: 11 40\nKoepisteet ja harjoitusten määrä: 4 17\nKoepisteet ja harjoitusten määrä:\nTilasto:

Kun käyttäjä on syöttänyt tyhjän rivin, tulostaa ohjelma tilastot.

Tilastot muodostuvat seuraavasti:

Tehtyjen harjoitustehtävien lukumäärästä saa harjoituspisteitä siten, että vähintään 10 % tehtävämäärästä tuo yhden harjoituspisteen, 20 % tuo 2 harjoituspistettä, jne., ja 100 % eli 100 harjoitustehtävää tuo 10 harjoituspistettä. Harjoitustehtävistä saatava pistemäärä on kokonaisluku.

Kurssin arvosana määräytyy kokeen pistemäärän ja harjoitustehtävistä saatavien pisteiden summasta seuraavan taulukon mukaan:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
koepisteet+harjoituspisteetarvosana
0–140 (eli hylätty)
15–171
18–202
21–233
24–274
28–305

Edelliseen on kuitenkin poikkeus: jos kokeen pistemäärä on alle 10, on arvosana kokonaispistemäärästä riippumatta 0 eli hylätty.

Yllä olevalla esimerkkisyötteellä ohjelma tulostaa seuraavat tilastot:

\nTilasto:\nPisteiden keskiarvo: 14.5\nHyväksymisprosentti: 75.0\nArvosanajakauma:\n  5:\n  4:\n  3: *\n  2:\n  1: **\n  0: *\n

Desimaaliluvut tulostetaan yhden desimaalin tarkkuudella.

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon! Eli jos ohjelmasi toiminnallisuus on esim. funktiossa main, tulee sitä kutsuva koodi kirjoittaa normaaliin tapaan, eikä ym. if-lohkoon kuten on tehtävä niissä tehtävissä, joissa edellytetään funktioiden toteuttamista.

Vihje:

Ohjelman syöte koostuu riveistä joilla on peräkkäin kaksi numeroa:

Koepisteet ja harjoitusten määrä: 15 87

Syöterivi pitää pilkkoa ensin kahtia ja muuttaa palaset kokonaisluvuksi int-funktiolla. Rivin pilkkominen onnistuu samalla tavalla kun tehtävässä Eka, toka ja vika sana. Siihen on olemassa myös hieman helpompi keino, merkkijonojen metodi split. Googlaa jos haluat, käytä esim. hakusanoja python string split.

Vastaa lopuksi osion loppukyselyyn:

","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-4/6-lisaa-rakenteista.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-4/page-data.json b/page-data/osa-4/page-data.json index 3b5f1769f..f1ff8e35b 100644 --- a/page-data/osa-4/page-data.json +++ b/page-data/osa-4/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-part-overview-template-js", "path": "/osa-4", - "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-4","title":"Osa 4"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-4/index.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-4","title":"Osa 4"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-4/index.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-5/1-lisaa-listoja/page-data.json b/page-data/osa-5/1-lisaa-listoja/page-data.json index aaaf9b45d..a8384a78a 100644 --- a/page-data/osa-5/1-lisaa-listoja/page-data.json +++ b/page-data/osa-5/1-lisaa-listoja/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-5/1-lisaa-listoja", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat luoda listoja, joissa on erityyppistä tietoa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten listoja voi käyttää tiedon ryhmittelyyn"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat tallentaa matriisin kaksiulotteisena listana"}]},{"type":"text","value":"\n"}]}]},{"type":"comment","value":"vastaava teksti löytyy osioista 3-1, 5-1 ja 6-1, tsekkaa kaikki jos muokkaat tätä"},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Kurssin tehtävien tekemisestä"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmointitaidon kehittyminen edellyttää vahvaa rutiinia ja myös omaa soveltavaa oivaltamista. Tämän takia kurssilla on paljon tehtäviä. Osa tehtävistä on kohtuullisen suoraviivaisesti materiaalia hyödyntäviä ja osa taas aivan tarkoituksella haastavampia soveltavia tehtäviä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ei kannata huolestua, vaikka osa kurssin tehtävistä tuntuisikin ensiyrittämällä liian vaikealta. Kaikkia tehtäviä ei ole pakko tehdä, kuten "},{"type":"element","tagName":"a","properties":{"href":"/arvostelu-ja-kokeet"},"children":[{"type":"text","value":"arvosteluperusteet"}]},{"type":"text","value":" toteavat, "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kurssin läpipääsyyn vaaditaan vähintään 25 % jokaisen osan ohjelmointitehtävien pisteistä."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Kurssin osien tehtävät eivät etene vaikeusjärjestyksessä."}]},{"type":"text","value":" Jokaisessa aliosassa esitellään yleensä muutama uusi konsepti, joita harjoitellaan sekä helpommilla että soveltavimmilla tehtävillä. "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Jos törmäät liian haastavan tuntuiseen tehtävään, hyppää seuraavaan"}]},{"type":"text","value":". Voit palata vaikeimpiin tehtäviin osan lopuksi, jos aikaa vielä jää."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lohdutuksen sanana todettakoon, että tällä viikolla mahdottomalta vaikuttava tehtävä näyttää melko varmasti neljän viikon päästä melko helpolta."}]}]},{"type":"element","tagName":"h2","properties":{"id":"lisaa-listoista","style":"position:relative;"},"children":[{"type":"text","value":"Lisää listoista"},{"type":"element","tagName":"a","properties":{"href":"#lisaa-listoista","ariaLabel":"lisaa listoista permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Viime kerralla käsiteltiin lähes yksinomaan listoja, joissa alkiot ovat kokonaislukuja. Listoihin voi kuitenkin tallentaa minkä tahansa tyyppisiä arvoja. Esimerkiksi voimme tallentaa listaan merkkijonoja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Liisa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kalle\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Listalla nimiä:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nimet aakkosjärjestyksessä:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sort"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['Maija', 'Liisa', 'Pekka']\n['Maija', 'Liisa', 'Pekka', 'Kalle']\nListalla nimiä: 4\nNimet aakkosjärjestyksessä:\nKalle\nLiisa\nMaija\nPekka"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Samalla tavalla listalle voidaan tallentaa liukulukuja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mittaukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2.5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1.1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7.5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"14.6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"21.0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"19.2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" mittaus "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" mittaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mittaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkeskiarvo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sum"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mittaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mittaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Keskiarvo:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" keskiarvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"-2.5\n1.1\n7.5\n14.6\n21.0\n19.2\nKeskiarvo: 10.15"}]}]},{"type":"comment","value":"vastaava varoitusteksti löytyy osioista 3-4, 4-6 ja 5-1, tsekkaa kaikki jos muokkaat tätä"},{"type":"element","tagName":"h2","properties":{"id":"muistutus-globaalin-muuttujan-kayton-sudenkuoppa","style":"position:relative;"},"children":[{"type":"text","value":"Muistutus: globaalin muuttujan käytön sudenkuoppa"},{"type":"element","tagName":"a","properties":{"href":"#muistutus-globaalin-muuttujan-kayton-sudenkuoppa","ariaLabel":"muistutus globaalin muuttujan kayton sudenkuoppa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten olemme nähneet, funktioiden sisällä on mahdollista määritellä muuttujia. Kannattaa myös huomata se, että funktio näkee sen ulkopuolella, eli pääohjelmassa määritellyt muuttujat. Tälläisia muuttujia sanotaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"globaaleiksi"}]},{"type":"text","value":" muuttujiksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Globalien muuttujien käyttämistä funktioista käsin ei useimmiten pidetä hyvänä asiana muun muassa siksi, että ne saattavat johtaa ikäviin bugeihin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on esimerkki funktiosta, joka käyttää \"vahingossa\" globaalia muuttujaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta_vaarinpain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# käytetään vahingossa parametrin sijaan globaalia muuttujaa nimilista"}]},{"type":"text","value":"\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" i"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# globaali muuttuja"}]},{"type":"text","value":"\nnimilista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Margaret\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\ntulosta_vaarinpain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulosta_vaarinpain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tupu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hupu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lupu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Margaret\nErkki\nEmilia\nAntti"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Margaret\nErkki\nEmilia\nAntti"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaikka funktiota kutsutaan oikein, se tulostaa aina globaalissa muuttujassa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"nimilista"}]},{"type":"text","value":" olevat nimet."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten olemme nähneet, kaikki funktioita testaava koodi on kirjoitettava erillisen lohkon sisälle, jotta TMC-testit hyväksyisivät koodin. Edellinen esimerkki siis tulisi toteuttaa seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta_vaarinpain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# käytetään vahingossa parametrin sijaan globaalia muuttujaa nimilista"}]},{"type":"text","value":"\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" i"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kaikki funktiota testaava koodi tämän lohkon sisälle"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# globaali muuttuja"}]},{"type":"text","value":"\n nimilista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Margaret\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n tulosta_vaarinpain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tulosta_vaarinpain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tupu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hupu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lupu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt myös globaalin muuttujan määrittely on siirtynyt "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":"-lohkoon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"TMC-testit suoritetaan aina siten, että mitään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":"-lohkon sisällä olevaa koodia ei huomioida. Tämän takia funktio ei voi edes teoriassa toimia, sillä se viittaa muuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimilista"}]},{"type":"text","value":" mitä ei testejä suoritettaessa ole ollenkaan olemassa."}]},{"type":"element","tagName":"h2","properties":{"id":"varoitus-parametrin-ylikirjoittaminen-ja-liian-aikainen-return","style":"position:relative;"},"children":[{"type":"text","value":"Varoitus: parametrin ylikirjoittaminen ja liian aikainen return"},{"type":"element","tagName":"a","properties":{"href":"#varoitus-parametrin-ylikirjoittaminen-ja-liian-aikainen-return","ariaLabel":"varoitus parametrin ylikirjoittaminen ja liian aikainen return permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ennen tämän osan tehtäviin menemistä on syytä kiinnittää huomiota pariin potentiaaliseen ongelmalähteeseen. Tarkastellaan funktiota, joka kertoo löytyykö parametrina oleva luku listalta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"luku_listalla"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa jostain syystä aina "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":". Syynä tälle on se, että for-silmukka ylikirjoittaa parametrin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku"}]},{"type":"text","value":" arvon, ja tämän takia if-lauseen ehto on aina tosi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ongelmasta päästään eroon nimeämällä parametri uudelleen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"luku_listalla"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" etsittava_luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" etsittava_luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt if-lauseen ehto on kunnossa. Funktiossa on kuitenkin uusi ongelma, se ei näytä edelleenkään toimivan. Esim. seuraava kokeilu tuo esiin bugin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"on "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" luku_listalla"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"on"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tulostuu False"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vika on nyt siinä että funktiosta poistutaan liian aikaisin. Funktio tarkistaa ainoastaan ensimmäisen luvun ja riippuen sen arvosta palauttaa heti joko arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":". Lopullista tuomiota, eli tietoa siitä että luku "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei ole listalla"}]},{"type":"text","value":" ei voi kuitenkaan antaa ennen kuin kaikki luvut on tarkastettu. Komento "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"return False"}]},{"type":"text","value":" pitääkin siirtää silmukan ulkopuolelle:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"luku_listalla"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" etsittava_luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" etsittava_luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan vielä yhtä virheellistä esimerkkiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"luvut_erisuuret"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# apumuuttuja, johon kerätään ne luvut jotka on jo tarkastettu"}]},{"type":"text","value":"\n luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# joko luku on nähty?"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n\non "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" luvut_erisuuret"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"on"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tulostuu True"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio siis yrittää testata ovatko kaikki listan alkiot erisuuria. Se kuitenkin palauttaa aina arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ongelmana on jälleen se, että funktio vahingossa ylikirjottaa parametrinsa arvon. Funktio yrittää käyttää muuttujaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luvut"}]},{"type":"text","value":" pitämään kirjaa jo vastaan tulleista luvuista ja tämä ylikirjoittaa parametrin. Lääke ongelmaan on muuttujan uudelleennimeäminen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"luvut_erisuuret"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# apumuuttuja, johon kerätään ne luvut jotka on jo tarkastettu"}]},{"type":"text","value":"\n havaitut_luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# joko luku on nähty?"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" havaitut_luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n havaitut_luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n\non "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" luvut_erisuuret"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"on"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tulostuu False"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nämä kuten oikeastaan kaikki koodia vaivaavat ongelmat selviävät debuggerilla tai "},{"type":"element","tagName":"a","properties":{"href":"http://www.pythontutor.com/visualize.html#mode=edit","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"visualisaattorilla"}]},{"type":"text","value":", jonka käytön tärkeyttä ei voi olla korostamatta liikaa."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Pisin merkkijono","tmcname":"osa05-01a_pisin_merkkijono"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"HUOM:"}]},{"type":"text","value":" tämä ja seuraava tehtävä ovat väärässä järjestyksessä VS Coden sivupalkissa"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pisin(merkkijonot: list)"}]},{"type":"text","value":", joka saa parametrikseen listan merkkijonoja. Funktio etsii ja palauttaa listalta pisimmän merkkijonon. Voit olettaa, että vain yksi jonoista on pisin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkikutsu:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n jonot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"moi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"moikka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"heip\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hellurei\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"terve\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pisin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jonot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"hellurei"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"sisakkaiset-listat","style":"position:relative;"},"children":[{"type":"text","value":"Sisäkkäiset listat"},{"type":"element","tagName":"a","properties":{"href":"#sisakkaiset-listat","ariaLabel":"sisakkaiset listat permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Listan alkiot voivat olla myös listoja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[[5, 2, 3], [4, 1], [2, 2, 5, 1]]\n[4, 1]\n4"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mihin voimme käyttää listoja jonka sisällä on listoja?"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voisimme esimerkiksi esittää henkilön tiedot listana, jossa ensimmäisenä alkiona on henkilön nimi, toisena ikä ja kolmantena kengännumero:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"26"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaavasti joukko henkilöitä on lista, joka sisältää yksittäisiä henkilöä kuvaavia listoja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"26"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Petteri\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"22"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"32"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"37"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"39"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"44"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" henkilo "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n kenka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":": ikä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" vuotta, kengännumero "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"kenka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anu: ikä 10 vuotta, kengännumero 26\nPetteri: ikä 7 vuotta, kengännumero 22\nEmilia: ikä 32 vuotta, kengännumero 37\nAntti: ikä 39 vuotta, kengännumero 44"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, miten "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-lause käy läpi henkilöt yksitellen, eli toiston lohko-osassa muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"henkilo"}]},{"type":"text","value":" saa yksi kerrallaan arvokseen kutakin henkilöä esittävän listan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lista ei ole välttämättä paras Pythonin tietorakenne henkilön tietojen esittämiseen. Tutustumme pian "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"sanakirjaan"}]},{"type":"text","value":", joka on usein luontevampi tapa hoitaa vastaava tilanne."}]},{"type":"element","tagName":"h2","properties":{"id":"matriisit","style":"position:relative;"},"children":[{"type":"text","value":"Matriisit"},{"type":"element","tagName":"a","properties":{"href":"#matriisit","ariaLabel":"matriisit permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sisäkkäisten listojen avulla voidaan myös esittää "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"matriisi"}]},{"type":"text","value":" eli kaksiulotteinen taulukko."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi matriisi"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 151px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/57e8504bd70c2538405be5b5e1572347/29fe9/5_1_0.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAABw0lEQVQ4y62UyYoCQQyG+3EF38YHUPHoyYsLeFLw4smDO654UVBxAXfN8AVS1LSt4zATCJ1OUn+l8qcqKBQKMhwOpd1uq3Y6Hen3+1Iul6XZbEq323UxbHzEyCHX1pgGgEXJbDaTV/IuFrADst/vpdFouMBgMJDT6aR2r9fTyhB8xJDH4yH1el02m43+3+93CSgT2W63kkwmHeBoNHKAuVxOstmsA/RPlUgktBVPgPzsdjv9Iiw6n89qT6dTmc/nauMzwNvtpjHLo+KA5kbJZDJx4L7gI/ayhzBGk+kLO6MsqFQqyuR4PHYxbHzEyMFnMVqEBtZsyr5cLqpUwcLD4SDX61UVP198xMixfF8Dv6G+UA0AYcFHJS+PbKSs12tJpVIOxCelWq1KsViMZJkJYK0jxeZwtVpJOp2W4/HoAG1s8vm8lEqlSED6+Q3wt0dmVN4eOUwK3z+R8snYmP+jsfn3wTaW7T7TozDLy+VSSQtfPUhYLBZ61CeWuZPxeNyB+CzDfiaTeWKZFyoWi2krIl+bWq3mdvMr5PlqtVpPFQLAjNrzpRX6RzanPV8/3RTL9e1vzxf98wGtWmJGED4f0F9DhV9fOel+Sn/2BgAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/57e8504bd70c2538405be5b5e1572347/8d139/5_1_0.webp 151w"],"sizes":"(max-width: 151px) 100vw, 151px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/57e8504bd70c2538405be5b5e1572347/29fe9/5_1_0.png 151w"],"sizes":"(max-width: 151px) 100vw, 151px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/57e8504bd70c2538405be5b5e1572347/29fe9/5_1_0.png","alt":"5 1 0","title":"5 1 0","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"voitaisiin mallintaa kaksiulotteisena listana näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"matriisi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska matriisi on lista listoja, matriisin alkioihin viitataan käyttämällä peräkkäisiä hakasulkuja. Ensimmäinen indeksi viittaa riviin ja toinen sarakkeeseen. Niinpä esimerkiksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"m[0][1]"}]},{"type":"text","value":" tarkoittaa ensimmäisen rivin toista alkiota (kun muistetaan, että indeksointi alkaa nollasta)."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"matriisi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmatriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2\n[[1, 2, 3], [10, 2, 1], [4, 5, 6]]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme käydä läpi matriisin rivit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukalla. Esimerkiksi seuraava koodi tulostaa matriisin rivit allekkain:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"matriisi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" matriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 2, 3]\n[4, 5, 6]\n[7, 8, 9]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava koodi puolestaan tulostaa matriisin alkiot yksitellen kahden "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukan avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"matriisi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" matriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"uusi rivi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"uusi rivi\n1\n2\n3\nuusi rivi\n4\n5\n6\nuusi rivi\n7\n8\n9"}]}]},{"type":"element","tagName":"h2","properties":{"id":"sisakkaisia-listoja-kayttavan-koodin-visualisointi","style":"position:relative;"},"children":[{"type":"text","value":"Sisäkkäisiä listoja käyttävän koodin visualisointi"},{"type":"element","tagName":"a","properties":{"href":"#sisakkaisia-listoja-kayttavan-koodin-visualisointi","ariaLabel":"sisakkaisia listoja kayttavan koodin visualisointi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos sisäkkäisiä listoja käsittelevät ohjelmat tuntuvat hankalalta ymmärtää, kannattaa ehdottomasti havainnollistaa niitä Python Tutorin "},{"type":"element","tagName":"a","properties":{"href":"http://www.pythontutor.com/visualize.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"visualisaattorilla"}]},{"type":"text","value":". Seuraavassa kuva edellisen esimerkin visualisoinnista:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/9450893ea3ce24ad2a607cde889d3e70/769f8/5_1_0a.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 42.173913043478265%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAABYlAAAWJQFJUiTwAAABFElEQVQY03WQ207DMAyG+/7PtgtuBhMSDG1rx+jWJG0OtuMDamCIm32yLCv6fzt2Z2Yigoi10rzkY38dLq4UICIAUFUiSikRESJSQ0S00ZkZiyzLkn7JeNcBQOtLYZ6Z2RrNJSLMzKu5QiHEvu8Ph8P5PPzp/qm1lCzCpaxfbI9rrGYhNDMACGEZrz6mdWBrLmZGxK/78+6tB5IY/ZKOGW4IvUjoYnDOB+cc16pqBRhJ7jPXjMQv+6/N9iOC5jJdbk9uPqX0DHDqatsPEd3K1MJN05RS+lmOKvuIV5dYxNQy8Od1C2Wnpl3MtOSaYslz8CEMwzCOY4yRiOwBfh5ifDeDjkVZVETtMdrOdi+tgPd+Q3T8Bqyl0FSTvoR1AAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/9450893ea3ce24ad2a607cde889d3e70/a0b58/5_1_0a.webp 230w","/static/9450893ea3ce24ad2a607cde889d3e70/bc10c/5_1_0a.webp 460w","/static/9450893ea3ce24ad2a607cde889d3e70/966d8/5_1_0a.webp 920w","/static/9450893ea3ce24ad2a607cde889d3e70/445df/5_1_0a.webp 1380w","/static/9450893ea3ce24ad2a607cde889d3e70/78de1/5_1_0a.webp 1840w","/static/9450893ea3ce24ad2a607cde889d3e70/7e82b/5_1_0a.webp 1924w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/9450893ea3ce24ad2a607cde889d3e70/81c8e/5_1_0a.png 230w","/static/9450893ea3ce24ad2a607cde889d3e70/08a84/5_1_0a.png 460w","/static/9450893ea3ce24ad2a607cde889d3e70/c0255/5_1_0a.png 920w","/static/9450893ea3ce24ad2a607cde889d3e70/b1001/5_1_0a.png 1380w","/static/9450893ea3ce24ad2a607cde889d3e70/161ec/5_1_0a.png 1840w","/static/9450893ea3ce24ad2a607cde889d3e70/769f8/5_1_0a.png 1924w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/9450893ea3ce24ad2a607cde889d3e70/c0255/5_1_0a.png","alt":"5 1 0a","title":"5 1 0a","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten kuva paljastaa, 3x3-matriisi koostuu teknisesti ottaen neljästä listasta. Ensimmäinen lista edustaa koko matriisia ja sen alkioina on erillisiä rivejä edustavat listat."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuva havainnollistaa jo sitä seikkaa, josta puhumme tarkemmin "},{"type":"element","tagName":"a","properties":{"href":"/osa-5/2-viittaukset"},"children":[{"type":"text","value":"seuraavassa osassa"}]},{"type":"text","value":": moniulotteisessa listassa listat eivät ole todellisuudessa sisäkkäin, vaan matriisia edustava lista \"viittaa\" jokaista riviä edustavaan listaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuvassa tulostus on edennyt matriisin toiselle riville, johon muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rivi"}]},{"type":"text","value":" parhaillaan viittaa. Muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"alkio"}]},{"type":"text","value":" kertoo sen alkion, jonka kohdalla tulostus on menossa. Muuttujan arvo on nyt keskimmäisen rivin keskimmäinen eli 5."}]},{"type":"element","tagName":"h2","properties":{"id":"lisaa-matriisin-kasittelya","style":"position:relative;"},"children":[{"type":"text","value":"Lisää matriisin käsittelyä"},{"type":"element","tagName":"a","properties":{"href":"#lisaa-matriisin-kasittelya","ariaLabel":"lisaa matriisin kasittelya permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Matriisin yksittäisten rivien käsittely on helppoa, riittää että valitaan haluttu rivi. Esimerkiksi seuraava funktio laskee halutun rivin alkioiden summan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"rivin_alkioiden_summa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" rivi_nro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tarkasteluun valitaan yksi rivi"}]},{"type":"text","value":"\n rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" matriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"rivi_nro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" alkio\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" summa\n\nm "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivin_alkioiden_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"m"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tulostuu 33 (saadaan laskemalla 9 + 1 + 12 + 11)"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos taas haluttaisiin laskea tietyn sarakkeen eli \"pystyrivin\" alkioiden summa, tilanne olisi jo monimutkaisempi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"sarakkeen_alkioiden_summa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sarake_nro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# summaan lisätään kaikkien rivien halutussa kohdassa oleva alkio"}]},{"type":"text","value":"\n summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" matriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"sarake_nro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" summa\n\nm "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sarakkeen_alkioiden_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"m"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tulostuu 39 (saadaan laskemalla 3 + 12 + 9 + 15)"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkasteltava sarake siis koostuu "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"jokaisen rivin"}]},{"type":"text","value":" paikassa 2 olevasta alkiosta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Näidenkin ohjelmien toiminta kannattaa ehdottomasti käydä läpi "},{"type":"element","tagName":"a","properties":{"href":"http://www.pythontutor.com/visualize.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"visualisaattorilla"}]},{"type":"text","value":"!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Matriisissa olevan yksittäisen arvon vaihtaminen on helppoa. Riittää että valitaan matriisin sisältä oikea rivi ja sen sisältä sarake:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"vaihda_arvoon"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" rivi_nro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sarake_nro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# haetaan oikea rivi"}]},{"type":"text","value":"\n rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" matriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"rivi_nro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ja sen sisältä oikea kohta"}]},{"type":"text","value":"\n rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"sarake_nro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" arvo\n\nm "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"m"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nvaihda_arvoon"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"m"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"m"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[[4, 2, 3, 2], [9, 1, 12, 11], [7, 8, 9, 5], [2, 9, 15, 1]]\n[[4, 2, 3, 2], [9, 1, 12, 11], [7, 8, 9, 1000], [2, 9, 15, 1]]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mikäli halutaan muuttaa matriisin sisältöä silmukan sisällä, ei ole mahdollista käyttää \"normaalia\" for-silmukkaa, sillä muutettaessa sisältöä on pakko tietää muutettavien alkioiden indeksit."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä taas onnistuu "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":"-silmukalla tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukalla hyödyntämällä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"range"}]},{"type":"text","value":"-funktiota iteroinnissa. Esimerkiksi seuraava koodi kasvattaa jokaista matriisin alkiota yhdellä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"m "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"m"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" j "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"m"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n m"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"j"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"m"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[[2, 3, 4], [5, 6, 7], [8, 9, 10]]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ulompi silmukka käy "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"range"}]},{"type":"text","value":"-funktion avulla läpi arvot nollasta matriisin pituuteen (eli matriisin rivien määrään) ja sisempi silmukka jokaisen rivin alkiot nollasta rivin pituuteen."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Alkioiden määrä","tmcname":"osa05-01_alkoiden_maara"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"HUOM:"}]},{"type":"text","value":" tämä ja edellinen tehtävä ovat väärässä järjestyksessä VS Coden sivupalkissa"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"laske_alkiot(matriisi: list, alkio: int)"}]},{"type":"text","value":", joka saa parametrikseen kaksiulotteisen kokonaislukutaulukon. Funktio laskee, kuinka monta annetun alkion mukaista arvoa taulukosta löytyy."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"m "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"laske_alkiot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"m"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"kaksiulotteinen-taulukko-pelin-tietorakenteena","style":"position:relative;"},"children":[{"type":"text","value":"Kaksiulotteinen taulukko pelin tietorakenteena"},{"type":"element","tagName":"a","properties":{"href":"#kaksiulotteinen-taulukko-pelin-tietorakenteena","ariaLabel":"kaksiulotteinen taulukko pelin tietorakenteena permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Matriisi sopii hyvin monien pelien tietorakenteeksi. Esim. sudokun ruudukko"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 410px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/5a4d938ae5202e8db72b179ff4d76293/d68e4/5_1_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 100.43478260869566%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAABYlAAAWJQFJUiTwAAADmUlEQVQ4y0WUWXOqPACG/fX9B163vTg67dQuap2OYBfbutQFRSmQoDGQQBAQqsXd5hvLmfO915l5kndJStM0XdcBAJ7nfX5+uq5bKpUIIQghTdMAAISQfr//8vJCCNE0zbZtVVWn0ylCKAV+5bou59w0zcPhUCgUVqtVFEWKomCMV6uVYRjPz8/T6dS27c1mY1kW55wQktJ13XGc4XAYBIEsy9Pp9OLiAmMMITQMAwBgWVar1SqXy8kxx3EGg4Hv+xDClOu6+/3e933OOWOMcy6KIsY4DEP7V7vdbjKZNJvN+Xzued5+v0+OMcZSyd0kSbJtu9PpUEr//PkDIVRVFQCgqup4PK7Vag8PD4wxSZJM05QkiTGmadqRfDgcHMfxPI9SyjkXBIEQ4nnecrn8+vpar9fj8ViSpIR2OBwopaZpHt98f39fLBaz2WyhUMhkMqIonpyc5HK5q6ur29vb6+vrQqFwdnaWTqcFQchms6VSKZvN3t3dvby8pCilm80GITSZTAghEMJ8Pr/ZbGazWRRFQRB8f38DAFqtVuLwer3+322EUBiGSVoAANM0c7lcGIaEEMYYpdTzPFmWX19fk8zm8zmEcLlcHnPGGEdRhBDabreGYaxWq3w+DyG0LAv+KgxDRVFEUXRdV1VVCCFCaL1eY4z/kiGEcRxrmrZYLG5ubizLIoQYv/J9X5blSqUym80Gg0GSfxzHRzJCiFJq2/bhcMAYu66bz+fjOA6CACFECFksFrquV6vVIAgSgzDGPz8/lmWl2u12t9vtdDoY40ajIUnS6enpaDRSFKVSqdTrdcMw3t7eLi8vW61Wu92GEH58fGCMFUVJ1Wq1drstiqIsy+VyuVqtptPpcrn89PTUaDRqtdrj42Mulzs/P6/X66IottttQRAkSep0On/rGQQB59x13SiKyuVyUs/lchnHMWNsOBy+v7/PZjPf9//V03XdlKqqpmkmk5AkiVKayWRs206M0XXdNM1msykIQhAEvV6PECJJ0mQyAQCkHMfZbreO43DOKaWMsWKxuFqtwjCcz+dhGMZxbBhGUhJK6W63M03TdV1K6ZGMMR4Oh57n9Xo927az2WwS8mg0AgBgjBPydDqVZZlS2u/3Hcc5khFClmWFYcg5t22bc14qlXa73WKxiOM4GcZoNOp2u/+GkczGcZzUeDxOps8YSz6GarVqWVbSdoSQaZqKonQ6HcYYAIBSqut60qL/AD7hB6pgN21XAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/5a4d938ae5202e8db72b179ff4d76293/a0b58/5_1_1.webp 230w","/static/5a4d938ae5202e8db72b179ff4d76293/0cb6c/5_1_1.webp 410w"],"sizes":"(max-width: 410px) 100vw, 410px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/5a4d938ae5202e8db72b179ff4d76293/81c8e/5_1_1.png 230w","/static/5a4d938ae5202e8db72b179ff4d76293/d68e4/5_1_1.png 410w"],"sizes":"(max-width: 410px) 100vw, 410px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/5a4d938ae5202e8db72b179ff4d76293/d68e4/5_1_1.png","alt":"5 1 1","title":"5 1 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"voitaisiin esittää seuraavana matriisina:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sudoku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Arvolla nolla siis kuvataan tilanne, jossa ruutu on vielä tyhjä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa vielä yksinkertainen versio sudokun tulostavasta metodista:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" ruutu "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" ruutu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\" "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"ruutu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" end"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" _\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" end"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostus näyttää seuraavalta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"x"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-x"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-x"]},"children":[{"type":"text","value":"\n 9 _ _ _ 8 _ 3 _ _\n _ _ _ 2 5 _ 7 _ _\n _ 2 _ 3 _ _ _ _ 4\n _ 9 4 _ _ _ _ _ _\n _ _ _ 7 3 _ 5 6 _\n 7 _ 5 _ 6 _ 4 _ _\n _ _ 7 8 _ 3 9 _ _\n _ _ 1 _ _ _ _ _ 3\n 3 _ _ _ _ _ _ _ 2\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaavalla tavalla on mahdollista kuvata moni tuttu peli (esim. shakki, miinaharava, laivan upotus, mastermind, ...) matriisina. Pelistä riippuu, mikä on sopiva tapa \"koodata\" pelin tilanne matriisiin."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Go","tmcname":"osa05-02_go"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Go-pelissä lisätään vuorotellen mustia ja valkoisia kiviä pelilaudalle. Pelin voittaa se pelaaja, joka saa omilla kivillään rajattua enemmän aluetta pelilaudalta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kumpi_voitti(pelilauta: list)"}]},{"type":"text","value":", joka saa parametrikseen kaksiulotteisen taulukon, joka kuvaa pelilautaa. Taulukko koostuu kokonaisluvuista seuraavasti:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"0: tyhjä ruutu"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"1: pelaajan 1 nappula"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"2: pelaajan 2 nappula"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkissä pelilaudan koko voi olla mikä tahansa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa arvon 1, jos pelaaja 1 on voittanut pelin, ja arvon 2, jos pelaaja 2 on voittanut pelin. Jos molemmilla pelaajilla on yhtä paljon nappuloita laudalla, funktio palauttaa arvon 0."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sudoku: rivit oikein","tmcname":"osa05-03_sudoku_osa1"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rivi_oikein(sudoku: list, rivi_nro: int)"}]},{"type":"text","value":", joka saa parametriksi sudokuruudukkoa esittävän kaksiulotteisen taulukon ja rivin numeron kertovan kokonaisluvun (rivit on numeroitu nollasta alkaen). Metodi palauttaa tiedon, onko rivi oikein täytetty eli onko siinä kukin luvuista 1–9 korkeintaan kerran."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sudoku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi_oikein"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi_oikein"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\nFalse"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sudoku: sarakkeet oikein","tmcname":"osa05-04_sudoku_osa2"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sarake_oikein(sudoku: list, sarake_nro: int)"}]},{"type":"text","value":", joka saa parametriksi sudokuruudukkoa esittävän kaksiulotteisen taulukon ja sarakkeen (eli pystyrivin) numeron kertovan kokonaisluvun. Metodi palauttaa tiedon, onko sarake oikein täytetty eli onko siinä kukin luvuista 1–9 korkeintaan kerran."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sudoku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sarake_oikein"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sarake_oikein"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"False\nTrue"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sudoku: neliöt oikein","tmcname":"osa05-05_sudoku_osa3"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nelio_oikein(sudoku: list, rivi_nro: int, sarake_nro: int)"}]},{"type":"text","value":", joka saa parametriksi sudokuruudukkoa esittävän kaksiulotteisen taulukon sekä yhden ruudun paikan kertovat rivi- ja sarakenumerot."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio kertoo onko parametrina saadusta rivi/sarakenumerosta alkava 3x3-kokoinen neliö oikein täytetty eli onko siinä kukin luvuista 1–9 korkeintaan kerran."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että tässä tehtävässä toteutettava funktio on hieman yleiskäyttöisempi kuin sudokussa oikeasti tarvitaan. Todellisuudessahan oikeassa sudokussa tarkastellaan ainoastaan kohdista (0, 0), (0, 3), (0, 6), (3, 0), (3, 3), (3, 6), (6, 0), (6, 3) ja (6, 6) alkavia neliöitä."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sudoku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nelio_oikein"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nelio_oikein"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"False\nTrue"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ensimmäisen funktiokutsun tarkastelema kohdasta 0, 0 alkava neliö on"}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"9 0 0\n2 0 0\n0 2 0\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toisen funktiokutsun tarkastelema kohdasta riviltä 1 ja sarakkeesta 2 alkava neliö on"}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"0 2 5\n0 3 0\n4 0 0\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä neliö on siis sellainen, jota oikeassa sudokussa ei tarkasteltaisi."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sudoku: ruudukko oikein","tmcname":"osa05-06_sudoku_osa4"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sudoku_oikein(sudoku: list)"}]},{"type":"text","value":", joka saa parametriksi sudokuruudukkoa esittävän kaksiulotteisen taulukon. Funktio kertoo käyttäen edellisen kolmen tehtävän funktioita (kopioi ne tämän tehtävän koodin joukkoon), onko parametrina saatu ruudukko täytetty oikein, eli sen jokainen rivi, jokainen sarake sekä kaikki erilliset 3x3-neliöt sisältävät korkeintaan kertaalleen jokaisen luvuista 1–9."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huom: ylempänä olevaan sudokuruudukkoa esittävään kuvaan on merkitty ne 3x3-neliöt, joita sudokua ratkaistessa tulee tarkastella.\nNämä ovat siis kohdista (0, 0), (0, 3), (0, 6), (3, 0), (3, 3), (3, 6), (6, 0), (6, 3) ja (6, 6) alkavat yhdeksän neliöä."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sudoku1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku_oikein"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsudoku2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku_oikein"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"False\nTrue"}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat luoda listoja, joissa on erityyppistä tietoa
  • \n
  • Tiedät, miten listoja voi käyttää tiedon ryhmittelyyn
  • \n
  • Osaat tallentaa matriisin kaksiulotteisena listana
  • \n

Ohjelmointitaidon kehittyminen edellyttää vahvaa rutiinia ja myös omaa soveltavaa oivaltamista. Tämän takia kurssilla on paljon tehtäviä. Osa tehtävistä on kohtuullisen suoraviivaisesti materiaalia hyödyntäviä ja osa taas aivan tarkoituksella haastavampia soveltavia tehtäviä.

Ei kannata huolestua, vaikka osa kurssin tehtävistä tuntuisikin ensiyrittämällä liian vaikealta. Kaikkia tehtäviä ei ole pakko tehdä, kuten arvosteluperusteet toteavat, kurssin läpipääsyyn vaaditaan vähintään 25 % jokaisen osan ohjelmointitehtävien pisteistä.

Kurssin osien tehtävät eivät etene vaikeusjärjestyksessä. Jokaisessa aliosassa esitellään yleensä muutama uusi konsepti, joita harjoitellaan sekä helpommilla että soveltavimmilla tehtävillä. Jos törmäät liian haastavan tuntuiseen tehtävään, hyppää seuraavaan. Voit palata vaikeimpiin tehtäviin osan lopuksi, jos aikaa vielä jää.

Lohdutuksen sanana todettakoon, että tällä viikolla mahdottomalta vaikuttava tehtävä näyttää melko varmasti neljän viikon päästä melko helpolta.

Lisää listoista

Viime kerralla käsiteltiin lähes yksinomaan listoja, joissa alkiot ovat kokonaislukuja. Listoihin voi kuitenkin tallentaa minkä tahansa tyyppisiä arvoja. Esimerkiksi voimme tallentaa listaan merkkijonoja:

nimet = [\"Maija\", \"Liisa\", \"Pekka\"]\nprint(nimet)\nnimet.append(\"Kalle\")\nprint(nimet)\n\nprint(\"Listalla nimiä:\", len(nimet))\nprint(\"Nimet aakkosjärjestyksessä:\")\nnimet.sort()\nfor nimi in nimet:\n  print(nimi)

['Maija', 'Liisa', 'Pekka']\n['Maija', 'Liisa', 'Pekka', 'Kalle']\nListalla nimiä: 4\nNimet aakkosjärjestyksessä:\nKalle\nLiisa\nMaija\nPekka

Samalla tavalla listalle voidaan tallentaa liukulukuja:

mittaukset = [-2.5, 1.1, 7.5, 14.6, 21.0, 19.2]\n\nfor mittaus in mittaukset:\n    print(mittaus)\n\nkeskiarvo = sum(mittaukset) / len(mittaukset)\n\nprint(\"Keskiarvo:\", keskiarvo)

-2.5\n1.1\n7.5\n14.6\n21.0\n19.2\nKeskiarvo: 10.15

Muistutus: globaalin muuttujan käytön sudenkuoppa

Kuten olemme nähneet, funktioiden sisällä on mahdollista määritellä muuttujia. Kannattaa myös huomata se, että funktio näkee sen ulkopuolella, eli pääohjelmassa määritellyt muuttujat. Tälläisia muuttujia sanotaan globaaleiksi muuttujiksi.

Globalien muuttujien käyttämistä funktioista käsin ei useimmiten pidetä hyvänä asiana muun muassa siksi, että ne saattavat johtaa ikäviin bugeihin.

Seuraavassa on esimerkki funktiosta, joka käyttää \"vahingossa\" globaalia muuttujaa:

def tulosta_vaarinpain(nimet: list):\n    # käytetään vahingossa parametrin sijaan globaalia muuttujaa nimilista\n    i = len(nimilista) - 1\n    while i>=0:\n        print(nimilista[i])\n        i -= 1\n\n# globaali muuttuja\nnimilista = [\"Antti\", \"Emilia\", \"Erkki\", \"Margaret\"]\ntulosta_vaarinpain(nimilista)\nprint()\ntulosta_vaarinpain([\"Tupu\", \"Hupu\", \"Lupu\"])

Margaret\nErkki\nEmilia\nAntti

Margaret\nErkki\nEmilia\nAntti

Vaikka funktiota kutsutaan oikein, se tulostaa aina globaalissa muuttujassa nimilista olevat nimet.

Kuten olemme nähneet, kaikki funktioita testaava koodi on kirjoitettava erillisen lohkon sisälle, jotta TMC-testit hyväksyisivät koodin. Edellinen esimerkki siis tulisi toteuttaa seuraavasti:

def tulosta_vaarinpain(nimet: list):\n    # käytetään vahingossa parametrin sijaan globaalia muuttujaa nimilista\n    i = len(nimilista) - 1\n    while i>=0:\n        print(nimilista[i])\n        i -= 1\n\n# kaikki funktiota testaava koodi tämän lohkon sisälle\nif __name__ == \"__main__\":\n    # globaali muuttuja\n    nimilista = [\"Antti\", \"Emilia\", \"Erkki\", \"Margaret\"]\n    tulosta_vaarinpain(nimilista)\n    print()\n    tulosta_vaarinpain([\"Tupu\", \"Hupu\", \"Lupu\"])

Nyt myös globaalin muuttujan määrittely on siirtynyt if-lohkoon.

TMC-testit suoritetaan aina siten, että mitään if-lohkon sisällä olevaa koodia ei huomioida. Tämän takia funktio ei voi edes teoriassa toimia, sillä se viittaa muuttujaan nimilista mitä ei testejä suoritettaessa ole ollenkaan olemassa.

Varoitus: parametrin ylikirjoittaminen ja liian aikainen return

Ennen tämän osan tehtäviin menemistä on syytä kiinnittää huomiota pariin potentiaaliseen ongelmalähteeseen. Tarkastellaan funktiota, joka kertoo löytyykö parametrina oleva luku listalta:

def luku_listalla(luvut: list, luku: int):\n    for luku in luvut:\n        if luku == luku:\n            return True\n        else:\n            return False

Funktio palauttaa jostain syystä aina True. Syynä tälle on se, että for-silmukka ylikirjoittaa parametrin luku arvon, ja tämän takia if-lauseen ehto on aina tosi.

Ongelmasta päästään eroon nimeämällä parametri uudelleen:

def luku_listalla(luvut: list, etsittava_luku: int):\n    for luku in luvut:\n        if luku == etsittava_luku:\n            return True\n        else:\n            return False

Nyt if-lauseen ehto on kunnossa. Funktiossa on kuitenkin uusi ongelma, se ei näytä edelleenkään toimivan. Esim. seuraava kokeilu tuo esiin bugin:

on = luku_listalla([1, 2, 3, 4], 3)\nprint(on)  # tulostuu False

Vika on nyt siinä että funktiosta poistutaan liian aikaisin. Funktio tarkistaa ainoastaan ensimmäisen luvun ja riippuen sen arvosta palauttaa heti joko arvon True tai False. Lopullista tuomiota, eli tietoa siitä että luku ei ole listalla ei voi kuitenkaan antaa ennen kuin kaikki luvut on tarkastettu. Komento return False pitääkin siirtää silmukan ulkopuolelle:

def luku_listalla(luvut: list, etsittava_luku: int):\n    for luku in luvut:\n        if luku == etsittava_luku:\n            return True\n\n    return False

Tarkastellaan vielä yhtä virheellistä esimerkkiä:

def luvut_erisuuret(luvut: list):\n    # apumuuttuja, johon kerätään ne luvut jotka on jo tarkastettu\n    luvut = []\n    for luku in luvut:\n        # joko luku on nähty?\n        if luku in luvut:\n            return False\n        luvut.append(luku)\n\n    return True\n\non = luvut_erisuuret([1, 2, 2])\nprint(on)  # tulostuu True

Funktio siis yrittää testata ovatko kaikki listan alkiot erisuuria. Se kuitenkin palauttaa aina arvon True.

Ongelmana on jälleen se, että funktio vahingossa ylikirjottaa parametrinsa arvon. Funktio yrittää käyttää muuttujaa luvut pitämään kirjaa jo vastaan tulleista luvuista ja tämä ylikirjoittaa parametrin. Lääke ongelmaan on muuttujan uudelleennimeäminen:

def luvut_erisuuret(luvut: list):\n    # apumuuttuja, johon kerätään ne luvut jotka on jo tarkastettu\n    havaitut_luvut = []\n    for luku in luvut:\n        # joko luku on nähty?\n        if luku in havaitut_luvut:\n            return False\n        havaitut_luvut.append(luku)\n\n    return True\n\non = luvut_erisuuret([1, 2, 2])\nprint(on)  # tulostuu False

Nämä kuten oikeastaan kaikki koodia vaivaavat ongelmat selviävät debuggerilla tai visualisaattorilla, jonka käytön tärkeyttä ei voi olla korostamatta liikaa.

HUOM: tämä ja seuraava tehtävä ovat väärässä järjestyksessä VS Coden sivupalkissa

Tee funktio pisin(merkkijonot: list), joka saa parametrikseen listan merkkijonoja. Funktio etsii ja palauttaa listalta pisimmän merkkijonon. Voit olettaa, että vain yksi jonoista on pisin.

Esimerkkikutsu:

\nif __name__ == \"__main__\":\n    jonot = [\"moi\", \"moikka\", \"heip\", \"hellurei\", \"terve\"]\n    print(pisin(jonot))\n

hellurei

Sisäkkäiset listat

Listan alkiot voivat olla myös listoja:

lista = [[5, 2, 3], [4, 1], [2, 2, 5, 1]]\nprint(lista)\nprint(lista[1])\nprint(lista[1][0])

[[5, 2, 3], [4, 1], [2, 2, 5, 1]]\n[4, 1]\n4

Mihin voimme käyttää listoja jonka sisällä on listoja?

Voisimme esimerkiksi esittää henkilön tiedot listana, jossa ensimmäisenä alkiona on henkilön nimi, toisena ikä ja kolmantena kengännumero:

[\"Anu\", 10, 26]

Vastaavasti joukko henkilöitä on lista, joka sisältää yksittäisiä henkilöä kuvaavia listoja:

henkilot = [[\"Anu\", 10, 26], [\"Petteri\", 7, 22], [\"Emilia\", 32, 37], [\"Antti\", 39, 44]]\n\nfor henkilo in henkilot:\n  nimi = henkilo[0]\n  ika = henkilo[1]\n  kenka = henkilo[2]\n  print(f\"{nimi}: ikä {ika} vuotta, kengännumero {kenka}\")

Anu: ikä 10 vuotta, kengännumero 26\nPetteri: ikä 7 vuotta, kengännumero 22\nEmilia: ikä 32 vuotta, kengännumero 37\nAntti: ikä 39 vuotta, kengännumero 44

Huomaa, miten for-lause käy läpi henkilöt yksitellen, eli toiston lohko-osassa muuttuja henkilo saa yksi kerrallaan arvokseen kutakin henkilöä esittävän listan.

Lista ei ole välttämättä paras Pythonin tietorakenne henkilön tietojen esittämiseen. Tutustumme pian sanakirjaan, joka on usein luontevampi tapa hoitaa vastaava tilanne.

Matriisit

Sisäkkäisten listojen avulla voidaan myös esittää matriisi eli kaksiulotteinen taulukko.

Esimerkiksi matriisi

\n \n \n \n \n \n \"5\n \n \n

voitaisiin mallintaa kaksiulotteisena listana näin:

matriisi = [[1, 2, 3], [3, 2, 1], [4, 5, 6]]

Koska matriisi on lista listoja, matriisin alkioihin viitataan käyttämällä peräkkäisiä hakasulkuja. Ensimmäinen indeksi viittaa riviin ja toinen sarakkeeseen. Niinpä esimerkiksi m[0][1] tarkoittaa ensimmäisen rivin toista alkiota (kun muistetaan, että indeksointi alkaa nollasta).

matriisi = [[1, 2, 3], [3, 2, 1], [4, 5, 6]]\n\nprint(matriisi[0][1])\nmatriisi[1][0] = 10\nprint(matriisi)

2\n[[1, 2, 3], [10, 2, 1], [4, 5, 6]]

Voimme käydä läpi matriisin rivit for-silmukalla. Esimerkiksi seuraava koodi tulostaa matriisin rivit allekkain:

matriisi = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]\n\nfor rivi in matriisi:\n    print(rivi)

[1, 2, 3]\n[4, 5, 6]\n[7, 8, 9]

Seuraava koodi puolestaan tulostaa matriisin alkiot yksitellen kahden for-silmukan avulla:

matriisi = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]\n\nfor rivi in matriisi:\n    print(\"uusi rivi\")\n    for alkio in rivi:\n        print(alkio)

uusi rivi\n1\n2\n3\nuusi rivi\n4\n5\n6\nuusi rivi\n7\n8\n9

Sisäkkäisiä listoja käyttävän koodin visualisointi

Jos sisäkkäisiä listoja käsittelevät ohjelmat tuntuvat hankalalta ymmärtää, kannattaa ehdottomasti havainnollistaa niitä Python Tutorin visualisaattorilla. Seuraavassa kuva edellisen esimerkin visualisoinnista:

\n \n \n \n \n \n \"5\n \n \n

Kuten kuva paljastaa, 3x3-matriisi koostuu teknisesti ottaen neljästä listasta. Ensimmäinen lista edustaa koko matriisia ja sen alkioina on erillisiä rivejä edustavat listat.

Kuva havainnollistaa jo sitä seikkaa, josta puhumme tarkemmin seuraavassa osassa: moniulotteisessa listassa listat eivät ole todellisuudessa sisäkkäin, vaan matriisia edustava lista \"viittaa\" jokaista riviä edustavaan listaan.

Kuvassa tulostus on edennyt matriisin toiselle riville, johon muuttuja rivi parhaillaan viittaa. Muuttuja alkio kertoo sen alkion, jonka kohdalla tulostus on menossa. Muuttujan arvo on nyt keskimmäisen rivin keskimmäinen eli 5.

Lisää matriisin käsittelyä

Matriisin yksittäisten rivien käsittely on helppoa, riittää että valitaan haluttu rivi. Esimerkiksi seuraava funktio laskee halutun rivin alkioiden summan:

def rivin_alkioiden_summa(matriisi, rivi_nro: int):\n    # tarkasteluun valitaan yksi rivi\n    rivi = matriisi[rivi_nro]\n    summa = 0\n    for alkio in rivi:\n        summa += alkio\n\n    return summa\n\nm = [[4, 2, 3, 2], [9, 1, 12, 11], [7, 8, 9, 5], [2, 9, 15, 1]]\n\nsumma = rivin_alkioiden_summa(m, 1)\nprint(summa) # tulostuu 33 (saadaan laskemalla 9 + 1 + 12 + 11)

Jos taas haluttaisiin laskea tietyn sarakkeen eli \"pystyrivin\" alkioiden summa, tilanne olisi jo monimutkaisempi:

def sarakkeen_alkioiden_summa(matriisi, sarake_nro: int):\n    # summaan lisätään kaikkien rivien halutussa kohdassa oleva alkio\n    summa = 0\n    for rivi in matriisi:\n        summa += rivi[sarake_nro]\n\n    return summa\n\nm = [[4, 2, 3, 2], [9, 1, 12, 11], [7, 8, 9, 5], [2, 9, 15, 1]]\n\nsumma = sarakkeen_alkioiden_summa(m, 2)\nprint(summa) # tulostuu 39 (saadaan laskemalla 3 + 12 + 9 + 15)

Tarkasteltava sarake siis koostuu jokaisen rivin paikassa 2 olevasta alkiosta.

Näidenkin ohjelmien toiminta kannattaa ehdottomasti käydä läpi visualisaattorilla!

Matriisissa olevan yksittäisen arvon vaihtaminen on helppoa. Riittää että valitaan matriisin sisältä oikea rivi ja sen sisältä sarake:

def vaihda_arvoon(matriisi, rivi_nro: int, sarake_nro: int, arvo: int):\n    # haetaan oikea rivi\n    rivi = matriisi[rivi_nro]\n    # ja sen sisältä oikea kohta\n    rivi[sarake_nro] = arvo\n\nm = [[4, 2, 3, 2], [9, 1, 12, 11], [7, 8, 9, 5], [2, 9, 15, 1]]\n\nprint(m)\nvaihda_arvoon(m, 2, 3, 1000)\nprint(m)

[[4, 2, 3, 2], [9, 1, 12, 11], [7, 8, 9, 5], [2, 9, 15, 1]]\n[[4, 2, 3, 2], [9, 1, 12, 11], [7, 8, 9, 1000], [2, 9, 15, 1]]

Mikäli halutaan muuttaa matriisin sisältöä silmukan sisällä, ei ole mahdollista käyttää \"normaalia\" for-silmukkaa, sillä muutettaessa sisältöä on pakko tietää muutettavien alkioiden indeksit.

Tämä taas onnistuu while-silmukalla tai for-silmukalla hyödyntämällä range-funktiota iteroinnissa. Esimerkiksi seuraava koodi kasvattaa jokaista matriisin alkiota yhdellä:

m = [[1,2,3], [4,5,6], [7,8,9]]\n\nfor i in range(len(m)):\n    for j in range(len(m[i])):\n        m[i][j] += 1\n\nprint(m)

[[2, 3, 4], [5, 6, 7], [8, 9, 10]]

Ulompi silmukka käy range-funktion avulla läpi arvot nollasta matriisin pituuteen (eli matriisin rivien määrään) ja sisempi silmukka jokaisen rivin alkiot nollasta rivin pituuteen.

HUOM: tämä ja edellinen tehtävä ovat väärässä järjestyksessä VS Coden sivupalkissa

Tee funktio laske_alkiot(matriisi: list, alkio: int), joka saa parametrikseen kaksiulotteisen kokonaislukutaulukon. Funktio laskee, kuinka monta annetun alkion mukaista arvoa taulukosta löytyy.

Esimerkiksi

m = [[1, 2, 1], [0, 3, 4], [1, 0, 0]]\nprint(laske_alkiot(m, 1))

3

Kaksiulotteinen taulukko pelin tietorakenteena

Matriisi sopii hyvin monien pelien tietorakenteeksi. Esim. sudokun ruudukko

\n \n \n \n \n \n \"5\n \n \n

voitaisiin esittää seuraavana matriisina:

sudoku = [\n  [9, 0, 0, 0, 8, 0, 3, 0, 0],\n  [0, 0, 0, 2, 5, 0, 7, 0, 0],\n  [0, 2, 0, 3, 0, 0, 0, 0, 4],\n  [0, 9, 4, 0, 0, 0, 0, 0, 0],\n  [0, 0, 0, 7, 3, 0, 5, 6, 0],\n  [7, 0, 5, 0, 6, 0, 4, 0, 0],\n  [0, 0, 7, 8, 0, 3, 9, 0, 0],\n  [0, 0, 1, 0, 0, 0, 0, 0, 3],\n  [3, 0, 0, 0, 0, 0, 0, 0, 2]\n]

Arvolla nolla siis kuvataan tilanne, jossa ruutu on vielä tyhjä.

Seuraavassa vielä yksinkertainen versio sudokun tulostavasta metodista:

def tulosta(sudoku):\n    for rivi in sudoku:\n        for ruutu in rivi:\n            if ruutu > 0:\n                print(f\" {ruutu}\", end=\"\")\n            else:\n                print(\" _\", end=\"\")\n        print()\n\ntulosta(sudoku)

Tulostus näyttää seuraavalta:

\n 9 _ _ _ 8 _ 3 _ _\n _ _ _ 2 5 _ 7 _ _\n _ 2 _ 3 _ _ _ _ 4\n _ 9 4 _ _ _ _ _ _\n _ _ _ 7 3 _ 5 6 _\n 7 _ 5 _ 6 _ 4 _ _\n _ _ 7 8 _ 3 9 _ _\n _ _ 1 _ _ _ _ _ 3\n 3 _ _ _ _ _ _ _ 2\n

Vastaavalla tavalla on mahdollista kuvata moni tuttu peli (esim. shakki, miinaharava, laivan upotus, mastermind, ...) matriisina. Pelistä riippuu, mikä on sopiva tapa \"koodata\" pelin tilanne matriisiin.

Go-pelissä lisätään vuorotellen mustia ja valkoisia kiviä pelilaudalle. Pelin voittaa se pelaaja, joka saa omilla kivillään rajattua enemmän aluetta pelilaudalta.

Kirjoita funktio kumpi_voitti(pelilauta: list), joka saa parametrikseen kaksiulotteisen taulukon, joka kuvaa pelilautaa. Taulukko koostuu kokonaisluvuista seuraavasti:

    \n
  • 0: tyhjä ruutu
  • \n
  • 1: pelaajan 1 nappula
  • \n
  • 2: pelaajan 2 nappula
  • \n

Esimerkissä pelilaudan koko voi olla mikä tahansa.

Funktio palauttaa arvon 1, jos pelaaja 1 on voittanut pelin, ja arvon 2, jos pelaaja 2 on voittanut pelin. Jos molemmilla pelaajilla on yhtä paljon nappuloita laudalla, funktio palauttaa arvon 0.

Tee funktio rivi_oikein(sudoku: list, rivi_nro: int), joka saa parametriksi sudokuruudukkoa esittävän kaksiulotteisen taulukon ja rivin numeron kertovan kokonaisluvun (rivit on numeroitu nollasta alkaen). Metodi palauttaa tiedon, onko rivi oikein täytetty eli onko siinä kukin luvuista 1–9 korkeintaan kerran.

sudoku = [\n  [9, 0, 0, 0, 8, 0, 3, 0, 0],\n  [2, 0, 0, 2, 5, 0, 7, 0, 0],\n  [0, 2, 0, 3, 0, 0, 0, 0, 4],\n  [2, 9, 4, 0, 0, 0, 0, 0, 0],\n  [0, 0, 0, 7, 3, 0, 5, 6, 0],\n  [7, 0, 5, 0, 6, 0, 4, 0, 0],\n  [0, 0, 7, 8, 0, 3, 9, 0, 0],\n  [0, 0, 1, 0, 0, 0, 0, 0, 3],\n  [3, 0, 0, 0, 0, 0, 0, 0, 2]\n]\n\nprint(rivi_oikein(sudoku, 0))\nprint(rivi_oikein(sudoku, 1))

True\nFalse

Tee funktio sarake_oikein(sudoku: list, sarake_nro: int), joka saa parametriksi sudokuruudukkoa esittävän kaksiulotteisen taulukon ja sarakkeen (eli pystyrivin) numeron kertovan kokonaisluvun. Metodi palauttaa tiedon, onko sarake oikein täytetty eli onko siinä kukin luvuista 1–9 korkeintaan kerran.

sudoku = [\n  [9, 0, 0, 0, 8, 0, 3, 0, 0],\n  [2, 0, 0, 2, 5, 0, 7, 0, 0],\n  [0, 2, 0, 3, 0, 0, 0, 0, 4],\n  [2, 9, 4, 0, 0, 0, 0, 0, 0],\n  [0, 0, 0, 7, 3, 0, 5, 6, 0],\n  [7, 0, 5, 0, 6, 0, 4, 0, 0],\n  [0, 0, 7, 8, 0, 3, 9, 0, 0],\n  [0, 0, 1, 0, 0, 0, 0, 0, 3],\n  [3, 0, 0, 0, 0, 0, 0, 0, 2]\n]\n\nprint(sarake_oikein(sudoku, 0))\nprint(sarake_oikein(sudoku, 1))

False\nTrue

Tee funktio nelio_oikein(sudoku: list, rivi_nro: int, sarake_nro: int), joka saa parametriksi sudokuruudukkoa esittävän kaksiulotteisen taulukon sekä yhden ruudun paikan kertovat rivi- ja sarakenumerot.

Funktio kertoo onko parametrina saadusta rivi/sarakenumerosta alkava 3x3-kokoinen neliö oikein täytetty eli onko siinä kukin luvuista 1–9 korkeintaan kerran.

Huomaa, että tässä tehtävässä toteutettava funktio on hieman yleiskäyttöisempi kuin sudokussa oikeasti tarvitaan. Todellisuudessahan oikeassa sudokussa tarkastellaan ainoastaan kohdista (0, 0), (0, 3), (0, 6), (3, 0), (3, 3), (3, 6), (6, 0), (6, 3) ja (6, 6) alkavia neliöitä.

sudoku = [\n  [9, 0, 0, 0, 8, 0, 3, 0, 0],\n  [2, 0, 0, 2, 5, 0, 7, 0, 0],\n  [0, 2, 0, 3, 0, 0, 0, 0, 4],\n  [2, 9, 4, 0, 0, 0, 0, 0, 0],\n  [0, 0, 0, 7, 3, 0, 5, 6, 0],\n  [7, 0, 5, 0, 6, 0, 4, 0, 0],\n  [0, 0, 7, 8, 0, 3, 9, 0, 0],\n  [0, 0, 1, 0, 0, 0, 0, 0, 3],\n  [3, 0, 0, 0, 0, 0, 0, 0, 2]\n]\n\nprint(nelio_oikein(sudoku, 0, 0))\nprint(nelio_oikein(sudoku, 1, 2))

False\nTrue

Ensimmäisen funktiokutsun tarkastelema kohdasta 0, 0 alkava neliö on

\n9 0 0\n2 0 0\n0 2 0\n

Toisen funktiokutsun tarkastelema kohdasta riviltä 1 ja sarakkeesta 2 alkava neliö on

\n0 2 5\n0 3 0\n4 0 0\n

Tämä neliö on siis sellainen, jota oikeassa sudokussa ei tarkasteltaisi.

Tee funktio sudoku_oikein(sudoku: list), joka saa parametriksi sudokuruudukkoa esittävän kaksiulotteisen taulukon. Funktio kertoo käyttäen edellisen kolmen tehtävän funktioita (kopioi ne tämän tehtävän koodin joukkoon), onko parametrina saatu ruudukko täytetty oikein, eli sen jokainen rivi, jokainen sarake sekä kaikki erilliset 3x3-neliöt sisältävät korkeintaan kertaalleen jokaisen luvuista 1–9.

Huom: ylempänä olevaan sudokuruudukkoa esittävään kuvaan on merkitty ne 3x3-neliöt, joita sudokua ratkaistessa tulee tarkastella.\nNämä ovat siis kohdista (0, 0), (0, 3), (0, 6), (3, 0), (3, 3), (3, 6), (6, 0), (6, 3) ja (6, 6) alkavat yhdeksän neliöä.

sudoku1 = [\n  [9, 0, 0, 0, 8, 0, 3, 0, 0],\n  [2, 0, 0, 2, 5, 0, 7, 0, 0],\n  [0, 2, 0, 3, 0, 0, 0, 0, 4],\n  [2, 9, 4, 0, 0, 0, 0, 0, 0],\n  [0, 0, 0, 7, 3, 0, 5, 6, 0],\n  [7, 0, 5, 0, 6, 0, 4, 0, 0],\n  [0, 0, 7, 8, 0, 3, 9, 0, 0],\n  [0, 0, 1, 0, 0, 0, 0, 0, 3],\n  [3, 0, 0, 0, 0, 0, 0, 0, 2]\n]\n\nprint(sudoku_oikein(sudoku1))\n\nsudoku2 = [\n  [2, 6, 7, 8, 3, 9, 5, 0, 4],\n  [9, 0, 3, 5, 1, 0, 6, 0, 0],\n  [0, 5, 1, 6, 0, 0, 8, 3, 9],\n  [5, 1, 9, 0, 4, 6, 3, 2, 8],\n  [8, 0, 2, 1, 0, 5, 7, 0, 6],\n  [6, 7, 4, 3, 2, 0, 0, 0, 5],\n  [0, 0, 0, 4, 5, 7, 2, 6, 3],\n  [3, 2, 0, 0, 8, 0, 0, 5, 7],\n  [7, 4, 5, 0, 0, 3, 9, 0, 1]\n]\n\nprint(sudoku_oikein(sudoku2))

False\nTrue

","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-5/1-lisaa-listoista.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat luoda listoja, joissa on erityyppistä tietoa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten listoja voi käyttää tiedon ryhmittelyyn"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat tallentaa matriisin kaksiulotteisena listana"}]},{"type":"text","value":"\n"}]}]},{"type":"comment","value":"vastaava teksti löytyy osioista 3-1, 5-1 ja 6-1, tsekkaa kaikki jos muokkaat tätä"},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Kurssin tehtävien tekemisestä"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmointitaidon kehittyminen edellyttää vahvaa rutiinia ja myös omaa soveltavaa oivaltamista. Tämän takia kurssilla on paljon tehtäviä. Osa tehtävistä on kohtuullisen suoraviivaisesti materiaalia hyödyntäviä ja osa taas aivan tarkoituksella haastavampia soveltavia tehtäviä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ei kannata huolestua, vaikka osa kurssin tehtävistä tuntuisikin ensiyrittämällä liian vaikealta. Kaikkia tehtäviä ei ole pakko tehdä, kuten "},{"type":"element","tagName":"a","properties":{"href":"/arvostelu-ja-kokeet"},"children":[{"type":"text","value":"arvosteluperusteet"}]},{"type":"text","value":" toteavat, "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kurssin läpipääsyyn vaaditaan vähintään 25 % jokaisen osan ohjelmointitehtävien pisteistä."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Kurssin osien tehtävät eivät etene vaikeusjärjestyksessä."}]},{"type":"text","value":" Jokaisessa aliosassa esitellään yleensä muutama uusi konsepti, joita harjoitellaan sekä helpommilla että soveltavimmilla tehtävillä. "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Jos törmäät liian haastavan tuntuiseen tehtävään, hyppää seuraavaan"}]},{"type":"text","value":". Voit palata vaikeimpiin tehtäviin osan lopuksi, jos aikaa vielä jää."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lohdutuksen sanana todettakoon, että tällä viikolla mahdottomalta vaikuttava tehtävä näyttää melko varmasti neljän viikon päästä melko helpolta."}]}]},{"type":"element","tagName":"h2","properties":{"id":"lisaa-listoista","style":"position:relative;"},"children":[{"type":"text","value":"Lisää listoista"},{"type":"element","tagName":"a","properties":{"href":"#lisaa-listoista","ariaLabel":"lisaa listoista permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Viime kerralla käsiteltiin lähes yksinomaan listoja, joissa alkiot ovat kokonaislukuja. Listoihin voi kuitenkin tallentaa minkä tahansa tyyppisiä arvoja. Esimerkiksi voimme tallentaa listaan merkkijonoja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Liisa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kalle\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Listalla nimiä:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nimet aakkosjärjestyksessä:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sort"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['Maija', 'Liisa', 'Pekka']\n['Maija', 'Liisa', 'Pekka', 'Kalle']\nListalla nimiä: 4\nNimet aakkosjärjestyksessä:\nKalle\nLiisa\nMaija\nPekka"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Samalla tavalla listalle voidaan tallentaa liukulukuja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"mittaukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2.5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1.1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7.5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"14.6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"21.0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"19.2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" mittaus "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" mittaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mittaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkeskiarvo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sum"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mittaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mittaukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Keskiarvo:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" keskiarvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"-2.5\n1.1\n7.5\n14.6\n21.0\n19.2\nKeskiarvo: 10.15"}]}]},{"type":"comment","value":"vastaava varoitusteksti löytyy osioista 3-4, 4-6 ja 5-1, tsekkaa kaikki jos muokkaat tätä"},{"type":"element","tagName":"h2","properties":{"id":"muistutus-globaalin-muuttujan-kayton-sudenkuoppa","style":"position:relative;"},"children":[{"type":"text","value":"Muistutus: globaalin muuttujan käytön sudenkuoppa"},{"type":"element","tagName":"a","properties":{"href":"#muistutus-globaalin-muuttujan-kayton-sudenkuoppa","ariaLabel":"muistutus globaalin muuttujan kayton sudenkuoppa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten olemme nähneet, funktioiden sisällä on mahdollista määritellä muuttujia. Kannattaa myös huomata se, että funktio näkee sen ulkopuolella, eli pääohjelmassa määritellyt muuttujat. Tälläisia muuttujia sanotaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"globaaleiksi"}]},{"type":"text","value":" muuttujiksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Globalien muuttujien käyttämistä funktioista käsin ei useimmiten pidetä hyvänä asiana muun muassa siksi, että ne saattavat johtaa ikäviin bugeihin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on esimerkki funktiosta, joka käyttää \"vahingossa\" globaalia muuttujaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta_vaarinpain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# käytetään vahingossa parametrin sijaan globaalia muuttujaa nimilista"}]},{"type":"text","value":"\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" i"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# globaali muuttuja"}]},{"type":"text","value":"\nnimilista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Margaret\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\ntulosta_vaarinpain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulosta_vaarinpain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tupu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hupu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lupu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Margaret\nErkki\nEmilia\nAntti"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Margaret\nErkki\nEmilia\nAntti"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaikka funktiota kutsutaan oikein, se tulostaa aina globaalissa muuttujassa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"nimilista"}]},{"type":"text","value":" olevat nimet."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten olemme nähneet, kaikki funktioita testaava koodi on kirjoitettava erillisen lohkon sisälle, jotta TMC-testit hyväksyisivät koodin. Edellinen esimerkki siis tulisi toteuttaa seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta_vaarinpain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# käytetään vahingossa parametrin sijaan globaalia muuttujaa nimilista"}]},{"type":"text","value":"\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" i"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kaikki funktiota testaava koodi tämän lohkon sisälle"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# globaali muuttuja"}]},{"type":"text","value":"\n nimilista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Margaret\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n tulosta_vaarinpain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tulosta_vaarinpain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tupu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hupu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lupu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt myös globaalin muuttujan määrittely on siirtynyt "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":"-lohkoon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"TMC-testit suoritetaan aina siten, että mitään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":"-lohkon sisällä olevaa koodia ei huomioida. Tämän takia funktio ei voi edes teoriassa toimia, sillä se viittaa muuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimilista"}]},{"type":"text","value":" mitä ei testejä suoritettaessa ole ollenkaan olemassa."}]},{"type":"element","tagName":"h2","properties":{"id":"varoitus-parametrin-ylikirjoittaminen-ja-liian-aikainen-return","style":"position:relative;"},"children":[{"type":"text","value":"Varoitus: parametrin ylikirjoittaminen ja liian aikainen return"},{"type":"element","tagName":"a","properties":{"href":"#varoitus-parametrin-ylikirjoittaminen-ja-liian-aikainen-return","ariaLabel":"varoitus parametrin ylikirjoittaminen ja liian aikainen return permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ennen tämän osan tehtäviin menemistä on syytä kiinnittää huomiota pariin potentiaaliseen ongelmalähteeseen. Tarkastellaan funktiota, joka kertoo löytyykö parametrina oleva luku listalta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"luku_listalla"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa jostain syystä aina "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":". Syynä tälle on se, että for-silmukka ylikirjoittaa parametrin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku"}]},{"type":"text","value":" arvon, ja tämän takia if-lauseen ehto on aina tosi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ongelmasta päästään eroon nimeämällä parametri uudelleen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"luku_listalla"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" etsittava_luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" etsittava_luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt if-lauseen ehto on kunnossa. Funktiossa on kuitenkin uusi ongelma, se ei näytä edelleenkään toimivan. Esim. seuraava kokeilu tuo esiin bugin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"on "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" luku_listalla"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"on"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tulostuu False"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vika on nyt siinä että funktiosta poistutaan liian aikaisin. Funktio tarkistaa ainoastaan ensimmäisen luvun ja riippuen sen arvosta palauttaa heti joko arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":". Lopullista tuomiota, eli tietoa siitä että luku "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei ole listalla"}]},{"type":"text","value":" ei voi kuitenkaan antaa ennen kuin kaikki luvut on tarkastettu. Komento "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"return False"}]},{"type":"text","value":" pitääkin siirtää silmukan ulkopuolelle:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"luku_listalla"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" etsittava_luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" etsittava_luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan vielä yhtä virheellistä esimerkkiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"luvut_erisuuret"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# apumuuttuja, johon kerätään ne luvut jotka on jo tarkastettu"}]},{"type":"text","value":"\n luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# joko luku on nähty?"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n\non "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" luvut_erisuuret"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"on"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tulostuu True"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio siis yrittää testata ovatko kaikki listan alkiot erisuuria. Se kuitenkin palauttaa aina arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ongelmana on jälleen se, että funktio vahingossa ylikirjottaa parametrinsa arvon. Funktio yrittää käyttää muuttujaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luvut"}]},{"type":"text","value":" pitämään kirjaa jo vastaan tulleista luvuista ja tämä ylikirjoittaa parametrin. Lääke ongelmaan on muuttujan uudelleennimeäminen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"luvut_erisuuret"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# apumuuttuja, johon kerätään ne luvut jotka on jo tarkastettu"}]},{"type":"text","value":"\n havaitut_luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# joko luku on nähty?"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" havaitut_luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n havaitut_luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n\non "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" luvut_erisuuret"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"on"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tulostuu False"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nämä kuten oikeastaan kaikki koodia vaivaavat ongelmat selviävät debuggerilla tai "},{"type":"element","tagName":"a","properties":{"href":"http://www.pythontutor.com/visualize.html#mode=edit","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"visualisaattorilla"}]},{"type":"text","value":", jonka käytön tärkeyttä ei voi olla korostamatta liikaa."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Pisin merkkijono","tmcname":"osa05-01a_pisin_merkkijono"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"HUOM:"}]},{"type":"text","value":" tämä ja seuraava tehtävä ovat väärässä järjestyksessä VS Coden sivupalkissa"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pisin(merkkijonot: list)"}]},{"type":"text","value":", joka saa parametrikseen listan merkkijonoja. Funktio etsii ja palauttaa listalta pisimmän merkkijonon. Voit olettaa, että vain yksi jonoista on pisin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkikutsu:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n jonot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"moi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"moikka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"heip\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hellurei\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"terve\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pisin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jonot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"hellurei"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"sisakkaiset-listat","style":"position:relative;"},"children":[{"type":"text","value":"Sisäkkäiset listat"},{"type":"element","tagName":"a","properties":{"href":"#sisakkaiset-listat","ariaLabel":"sisakkaiset listat permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Listan alkiot voivat olla myös listoja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[[5, 2, 3], [4, 1], [2, 2, 5, 1]]\n[4, 1]\n4"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mihin voimme käyttää listoja jonka sisällä on listoja?"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voisimme esimerkiksi esittää henkilön tiedot listana, jossa ensimmäisenä alkiona on henkilön nimi, toisena ikä ja kolmantena kengännumero:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"26"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaavasti joukko henkilöitä on lista, joka sisältää yksittäisiä henkilöä kuvaavia listoja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"26"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Petteri\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"22"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"32"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"37"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"39"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"44"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" henkilo "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n kenka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":": ikä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" vuotta, kengännumero "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"kenka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anu: ikä 10 vuotta, kengännumero 26\nPetteri: ikä 7 vuotta, kengännumero 22\nEmilia: ikä 32 vuotta, kengännumero 37\nAntti: ikä 39 vuotta, kengännumero 44"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, miten "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-lause käy läpi henkilöt yksitellen, eli toiston lohko-osassa muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"henkilo"}]},{"type":"text","value":" saa yksi kerrallaan arvokseen kutakin henkilöä esittävän listan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lista ei ole välttämättä paras Pythonin tietorakenne henkilön tietojen esittämiseen. Tutustumme pian "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"sanakirjaan"}]},{"type":"text","value":", joka on usein luontevampi tapa hoitaa vastaava tilanne."}]},{"type":"element","tagName":"h2","properties":{"id":"matriisit","style":"position:relative;"},"children":[{"type":"text","value":"Matriisit"},{"type":"element","tagName":"a","properties":{"href":"#matriisit","ariaLabel":"matriisit permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sisäkkäisten listojen avulla voidaan myös esittää "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"matriisi"}]},{"type":"text","value":" eli kaksiulotteinen taulukko."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi matriisi"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 151px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/57e8504bd70c2538405be5b5e1572347/29fe9/5_1_0.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAABw0lEQVQ4y62UyYoCQQyG+3EF38YHUPHoyYsLeFLw4smDO654UVBxAXfN8AVS1LSt4zATCJ1OUn+l8qcqKBQKMhwOpd1uq3Y6Hen3+1Iul6XZbEq323UxbHzEyCHX1pgGgEXJbDaTV/IuFrADst/vpdFouMBgMJDT6aR2r9fTyhB8xJDH4yH1el02m43+3+93CSgT2W63kkwmHeBoNHKAuVxOstmsA/RPlUgktBVPgPzsdjv9Iiw6n89qT6dTmc/nauMzwNvtpjHLo+KA5kbJZDJx4L7gI/ayhzBGk+kLO6MsqFQqyuR4PHYxbHzEyMFnMVqEBtZsyr5cLqpUwcLD4SDX61UVP198xMixfF8Dv6G+UA0AYcFHJS+PbKSs12tJpVIOxCelWq1KsViMZJkJYK0jxeZwtVpJOp2W4/HoAG1s8vm8lEqlSED6+Q3wt0dmVN4eOUwK3z+R8snYmP+jsfn3wTaW7T7TozDLy+VSSQtfPUhYLBZ61CeWuZPxeNyB+CzDfiaTeWKZFyoWi2krIl+bWq3mdvMr5PlqtVpPFQLAjNrzpRX6RzanPV8/3RTL9e1vzxf98wGtWmJGED4f0F9DhV9fOel+Sn/2BgAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/57e8504bd70c2538405be5b5e1572347/8d139/5_1_0.webp 151w"],"sizes":"(max-width: 151px) 100vw, 151px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/57e8504bd70c2538405be5b5e1572347/29fe9/5_1_0.png 151w"],"sizes":"(max-width: 151px) 100vw, 151px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/57e8504bd70c2538405be5b5e1572347/29fe9/5_1_0.png","alt":"5 1 0","title":"5 1 0","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"voitaisiin mallintaa kaksiulotteisena listana näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"matriisi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska matriisi on lista listoja, matriisin alkioihin viitataan käyttämällä peräkkäisiä hakasulkuja. Ensimmäinen indeksi viittaa riviin ja toinen sarakkeeseen. Niinpä esimerkiksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"m[0][1]"}]},{"type":"text","value":" tarkoittaa ensimmäisen rivin toista alkiota (kun muistetaan, että indeksointi alkaa nollasta)."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"matriisi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmatriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2\n[[1, 2, 3], [10, 2, 1], [4, 5, 6]]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme käydä läpi matriisin rivit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukalla. Esimerkiksi seuraava koodi tulostaa matriisin rivit allekkain:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"matriisi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" matriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 2, 3]\n[4, 5, 6]\n[7, 8, 9]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava koodi puolestaan tulostaa matriisin alkiot yksitellen kahden "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukan avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"matriisi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" matriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"uusi rivi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"uusi rivi\n1\n2\n3\nuusi rivi\n4\n5\n6\nuusi rivi\n7\n8\n9"}]}]},{"type":"element","tagName":"h2","properties":{"id":"sisakkaisia-listoja-kayttavan-koodin-visualisointi","style":"position:relative;"},"children":[{"type":"text","value":"Sisäkkäisiä listoja käyttävän koodin visualisointi"},{"type":"element","tagName":"a","properties":{"href":"#sisakkaisia-listoja-kayttavan-koodin-visualisointi","ariaLabel":"sisakkaisia listoja kayttavan koodin visualisointi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos sisäkkäisiä listoja käsittelevät ohjelmat tuntuvat hankalalta ymmärtää, kannattaa ehdottomasti havainnollistaa niitä Python Tutorin "},{"type":"element","tagName":"a","properties":{"href":"http://www.pythontutor.com/visualize.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"visualisaattorilla"}]},{"type":"text","value":". Seuraavassa kuva edellisen esimerkin visualisoinnista:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/9450893ea3ce24ad2a607cde889d3e70/769f8/5_1_0a.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 42.173913043478265%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAABYlAAAWJQFJUiTwAAABFElEQVQY03WQ207DMAyG+/7PtgtuBhMSDG1rx+jWJG0OtuMDamCIm32yLCv6fzt2Z2Yigoi10rzkY38dLq4UICIAUFUiSikRESJSQ0S00ZkZiyzLkn7JeNcBQOtLYZ6Z2RrNJSLMzKu5QiHEvu8Ph8P5PPzp/qm1lCzCpaxfbI9rrGYhNDMACGEZrz6mdWBrLmZGxK/78+6tB5IY/ZKOGW4IvUjoYnDOB+cc16pqBRhJ7jPXjMQv+6/N9iOC5jJdbk9uPqX0DHDqatsPEd3K1MJN05RS+lmOKvuIV5dYxNQy8Od1C2Wnpl3MtOSaYslz8CEMwzCOY4yRiOwBfh5ifDeDjkVZVETtMdrOdi+tgPd+Q3T8Bqyl0FSTvoR1AAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/9450893ea3ce24ad2a607cde889d3e70/a0b58/5_1_0a.webp 230w","/static/9450893ea3ce24ad2a607cde889d3e70/bc10c/5_1_0a.webp 460w","/static/9450893ea3ce24ad2a607cde889d3e70/966d8/5_1_0a.webp 920w","/static/9450893ea3ce24ad2a607cde889d3e70/445df/5_1_0a.webp 1380w","/static/9450893ea3ce24ad2a607cde889d3e70/78de1/5_1_0a.webp 1840w","/static/9450893ea3ce24ad2a607cde889d3e70/7e82b/5_1_0a.webp 1924w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/9450893ea3ce24ad2a607cde889d3e70/81c8e/5_1_0a.png 230w","/static/9450893ea3ce24ad2a607cde889d3e70/08a84/5_1_0a.png 460w","/static/9450893ea3ce24ad2a607cde889d3e70/c0255/5_1_0a.png 920w","/static/9450893ea3ce24ad2a607cde889d3e70/b1001/5_1_0a.png 1380w","/static/9450893ea3ce24ad2a607cde889d3e70/161ec/5_1_0a.png 1840w","/static/9450893ea3ce24ad2a607cde889d3e70/769f8/5_1_0a.png 1924w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/9450893ea3ce24ad2a607cde889d3e70/c0255/5_1_0a.png","alt":"5 1 0a","title":"5 1 0a","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten kuva paljastaa, 3x3-matriisi koostuu teknisesti ottaen neljästä listasta. Ensimmäinen lista edustaa koko matriisia ja sen alkioina on erillisiä rivejä edustavat listat."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuva havainnollistaa jo sitä seikkaa, josta puhumme tarkemmin "},{"type":"element","tagName":"a","properties":{"href":"/osa-5/2-viittaukset"},"children":[{"type":"text","value":"seuraavassa osassa"}]},{"type":"text","value":": moniulotteisessa listassa listat eivät ole todellisuudessa sisäkkäin, vaan matriisia edustava lista \"viittaa\" jokaista riviä edustavaan listaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuvassa tulostus on edennyt matriisin toiselle riville, johon muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rivi"}]},{"type":"text","value":" parhaillaan viittaa. Muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"alkio"}]},{"type":"text","value":" kertoo sen alkion, jonka kohdalla tulostus on menossa. Muuttujan arvo on nyt keskimmäisen rivin keskimmäinen eli 5."}]},{"type":"element","tagName":"h2","properties":{"id":"lisaa-matriisin-kasittelya","style":"position:relative;"},"children":[{"type":"text","value":"Lisää matriisin käsittelyä"},{"type":"element","tagName":"a","properties":{"href":"#lisaa-matriisin-kasittelya","ariaLabel":"lisaa matriisin kasittelya permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Matriisin yksittäisten rivien käsittely on helppoa, riittää että valitaan haluttu rivi. Esimerkiksi seuraava funktio laskee halutun rivin alkioiden summan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"rivin_alkioiden_summa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" rivi_nro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tarkasteluun valitaan yksi rivi"}]},{"type":"text","value":"\n rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" matriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"rivi_nro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" alkio\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" summa\n\nm "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivin_alkioiden_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"m"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tulostuu 33 (saadaan laskemalla 9 + 1 + 12 + 11)"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos taas haluttaisiin laskea tietyn sarakkeen eli \"pystyrivin\" alkioiden summa, tilanne olisi jo monimutkaisempi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"sarakkeen_alkioiden_summa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sarake_nro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# summaan lisätään kaikkien rivien halutussa kohdassa oleva alkio"}]},{"type":"text","value":"\n summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" matriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"sarake_nro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" summa\n\nm "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nsumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sarakkeen_alkioiden_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"m"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tulostuu 39 (saadaan laskemalla 3 + 12 + 9 + 15)"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkasteltava sarake siis koostuu "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"jokaisen rivin"}]},{"type":"text","value":" paikassa 2 olevasta alkiosta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Näidenkin ohjelmien toiminta kannattaa ehdottomasti käydä läpi "},{"type":"element","tagName":"a","properties":{"href":"http://www.pythontutor.com/visualize.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"visualisaattorilla"}]},{"type":"text","value":"!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Matriisissa olevan yksittäisen arvon vaihtaminen on helppoa. Riittää että valitaan matriisin sisältä oikea rivi ja sen sisältä sarake:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"vaihda_arvoon"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" rivi_nro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sarake_nro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# haetaan oikea rivi"}]},{"type":"text","value":"\n rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" matriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"rivi_nro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ja sen sisältä oikea kohta"}]},{"type":"text","value":"\n rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"sarake_nro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" arvo\n\nm "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"m"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nvaihda_arvoon"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"m"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"m"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[[4, 2, 3, 2], [9, 1, 12, 11], [7, 8, 9, 5], [2, 9, 15, 1]]\n[[4, 2, 3, 2], [9, 1, 12, 11], [7, 8, 9, 1000], [2, 9, 15, 1]]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mikäli halutaan muuttaa matriisin sisältöä silmukan sisällä, ei ole mahdollista käyttää \"normaalia\" for-silmukkaa, sillä muutettaessa sisältöä on pakko tietää muutettavien alkioiden indeksit."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä taas onnistuu "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":"-silmukalla tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukalla hyödyntämällä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"range"}]},{"type":"text","value":"-funktiota iteroinnissa. Esimerkiksi seuraava koodi kasvattaa jokaista matriisin alkiota yhdellä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"m "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"m"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" j "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"m"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n m"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"j"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"m"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[[2, 3, 4], [5, 6, 7], [8, 9, 10]]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ulompi silmukka käy "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"range"}]},{"type":"text","value":"-funktion avulla läpi arvot nollasta matriisin pituuteen (eli matriisin rivien määrään) ja sisempi silmukka jokaisen rivin alkiot nollasta rivin pituuteen."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Alkioiden määrä","tmcname":"osa05-01_alkoiden_maara"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"HUOM:"}]},{"type":"text","value":" tämä ja edellinen tehtävä ovat väärässä järjestyksessä VS Coden sivupalkissa"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"laske_alkiot(matriisi: list, alkio: int)"}]},{"type":"text","value":", joka saa parametrikseen kaksiulotteisen kokonaislukutaulukon. Funktio laskee, kuinka monta annetun alkion mukaista arvoa taulukosta löytyy."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"m "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"laske_alkiot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"m"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"kaksiulotteinen-taulukko-pelin-tietorakenteena","style":"position:relative;"},"children":[{"type":"text","value":"Kaksiulotteinen taulukko pelin tietorakenteena"},{"type":"element","tagName":"a","properties":{"href":"#kaksiulotteinen-taulukko-pelin-tietorakenteena","ariaLabel":"kaksiulotteinen taulukko pelin tietorakenteena permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Matriisi sopii hyvin monien pelien tietorakenteeksi. Esim. sudokun ruudukko"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 410px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/5a4d938ae5202e8db72b179ff4d76293/d68e4/5_1_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 100.43478260869566%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAABYlAAAWJQFJUiTwAAADmUlEQVQ4y0WUWXOqPACG/fX9B163vTg67dQuap2OYBfbutQFRSmQoDGQQBAQqsXd5hvLmfO915l5kndJStM0XdcBAJ7nfX5+uq5bKpUIIQghTdMAAISQfr//8vJCCNE0zbZtVVWn0ylCKAV+5bou59w0zcPhUCgUVqtVFEWKomCMV6uVYRjPz8/T6dS27c1mY1kW55wQktJ13XGc4XAYBIEsy9Pp9OLiAmMMITQMAwBgWVar1SqXy8kxx3EGg4Hv+xDClOu6+/3e933OOWOMcy6KIsY4DEP7V7vdbjKZNJvN+Xzued5+v0+OMcZSyd0kSbJtu9PpUEr//PkDIVRVFQCgqup4PK7Vag8PD4wxSZJM05QkiTGmadqRfDgcHMfxPI9SyjkXBIEQ4nnecrn8+vpar9fj8ViSpIR2OBwopaZpHt98f39fLBaz2WyhUMhkMqIonpyc5HK5q6ur29vb6+vrQqFwdnaWTqcFQchms6VSKZvN3t3dvby8pCilm80GITSZTAghEMJ8Pr/ZbGazWRRFQRB8f38DAFqtVuLwer3+322EUBiGSVoAANM0c7lcGIaEEMYYpdTzPFmWX19fk8zm8zmEcLlcHnPGGEdRhBDabreGYaxWq3w+DyG0LAv+KgxDRVFEUXRdV1VVCCFCaL1eY4z/kiGEcRxrmrZYLG5ubizLIoQYv/J9X5blSqUym80Gg0GSfxzHRzJCiFJq2/bhcMAYu66bz+fjOA6CACFECFksFrquV6vVIAgSgzDGPz8/lmWl2u12t9vtdDoY40ajIUnS6enpaDRSFKVSqdTrdcMw3t7eLi8vW61Wu92GEH58fGCMFUVJ1Wq1drstiqIsy+VyuVqtptPpcrn89PTUaDRqtdrj42Mulzs/P6/X66IottttQRAkSep0On/rGQQB59x13SiKyuVyUs/lchnHMWNsOBy+v7/PZjPf9//V03XdlKqqpmkmk5AkiVKayWRs206M0XXdNM1msykIQhAEvV6PECJJ0mQyAQCkHMfZbreO43DOKaWMsWKxuFqtwjCcz+dhGMZxbBhGUhJK6W63M03TdV1K6ZGMMR4Oh57n9Xo927az2WwS8mg0AgBgjBPydDqVZZlS2u/3Hcc5khFClmWFYcg5t22bc14qlXa73WKxiOM4GcZoNOp2u/+GkczGcZzUeDxOps8YSz6GarVqWVbSdoSQaZqKonQ6HcYYAIBSqut60qL/AD7hB6pgN21XAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/5a4d938ae5202e8db72b179ff4d76293/a0b58/5_1_1.webp 230w","/static/5a4d938ae5202e8db72b179ff4d76293/0cb6c/5_1_1.webp 410w"],"sizes":"(max-width: 410px) 100vw, 410px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/5a4d938ae5202e8db72b179ff4d76293/81c8e/5_1_1.png 230w","/static/5a4d938ae5202e8db72b179ff4d76293/d68e4/5_1_1.png 410w"],"sizes":"(max-width: 410px) 100vw, 410px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/5a4d938ae5202e8db72b179ff4d76293/d68e4/5_1_1.png","alt":"5 1 1","title":"5 1 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"voitaisiin esittää seuraavana matriisina:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sudoku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Arvolla nolla siis kuvataan tilanne, jossa ruutu on vielä tyhjä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa vielä yksinkertainen versio sudokun tulostavasta metodista:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" ruutu "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" ruutu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\" "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"ruutu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" end"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" _\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" end"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostus näyttää seuraavalta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"x"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-x"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-x"]},"children":[{"type":"text","value":"\n 9 _ _ _ 8 _ 3 _ _\n _ _ _ 2 5 _ 7 _ _\n _ 2 _ 3 _ _ _ _ 4\n _ 9 4 _ _ _ _ _ _\n _ _ _ 7 3 _ 5 6 _\n 7 _ 5 _ 6 _ 4 _ _\n _ _ 7 8 _ 3 9 _ _\n _ _ 1 _ _ _ _ _ 3\n 3 _ _ _ _ _ _ _ 2\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaavalla tavalla on mahdollista kuvata moni tuttu peli (esim. shakki, miinaharava, laivan upotus, mastermind, ...) matriisina. Pelistä riippuu, mikä on sopiva tapa \"koodata\" pelin tilanne matriisiin."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Go","tmcname":"osa05-02_go"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Go-pelissä lisätään vuorotellen mustia ja valkoisia kiviä pelilaudalle. Pelin voittaa se pelaaja, joka saa omilla kivillään rajattua enemmän aluetta pelilaudalta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kumpi_voitti(pelilauta: list)"}]},{"type":"text","value":", joka saa parametrikseen kaksiulotteisen taulukon, joka kuvaa pelilautaa. Taulukko koostuu kokonaisluvuista seuraavasti:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"0: tyhjä ruutu"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"1: pelaajan 1 nappula"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"2: pelaajan 2 nappula"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkissä pelilaudan koko voi olla mikä tahansa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa arvon 1, jos pelaaja 1 on voittanut pelin, ja arvon 2, jos pelaaja 2 on voittanut pelin. Jos molemmilla pelaajilla on yhtä paljon nappuloita laudalla, funktio palauttaa arvon 0."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sudoku: rivit oikein","tmcname":"osa05-03_sudoku_osa1"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rivi_oikein(sudoku: list, rivi_nro: int)"}]},{"type":"text","value":", joka saa parametriksi sudokuruudukkoa esittävän kaksiulotteisen taulukon ja rivin numeron kertovan kokonaisluvun (rivit on numeroitu nollasta alkaen). Metodi palauttaa tiedon, onko rivi oikein täytetty eli onko siinä kukin luvuista 1–9 korkeintaan kerran."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sudoku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi_oikein"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi_oikein"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\nFalse"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sudoku: sarakkeet oikein","tmcname":"osa05-04_sudoku_osa2"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sarake_oikein(sudoku: list, sarake_nro: int)"}]},{"type":"text","value":", joka saa parametriksi sudokuruudukkoa esittävän kaksiulotteisen taulukon ja sarakkeen (eli pystyrivin) numeron kertovan kokonaisluvun. Metodi palauttaa tiedon, onko sarake oikein täytetty eli onko siinä kukin luvuista 1–9 korkeintaan kerran."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sudoku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sarake_oikein"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sarake_oikein"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"False\nTrue"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sudoku: neliöt oikein","tmcname":"osa05-05_sudoku_osa3"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nelio_oikein(sudoku: list, rivi_nro: int, sarake_nro: int)"}]},{"type":"text","value":", joka saa parametriksi sudokuruudukkoa esittävän kaksiulotteisen taulukon sekä yhden ruudun paikan kertovat rivi- ja sarakenumerot."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio kertoo onko parametrina saadusta rivi/sarakenumerosta alkava 3x3-kokoinen neliö oikein täytetty eli onko siinä kukin luvuista 1–9 korkeintaan kerran."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että tässä tehtävässä toteutettava funktio on hieman yleiskäyttöisempi kuin sudokussa oikeasti tarvitaan. Todellisuudessahan oikeassa sudokussa tarkastellaan ainoastaan kohdista (0, 0), (0, 3), (0, 6), (3, 0), (3, 3), (3, 6), (6, 0), (6, 3) ja (6, 6) alkavia neliöitä."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sudoku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nelio_oikein"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nelio_oikein"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"False\nTrue"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ensimmäisen funktiokutsun tarkastelema kohdasta 0, 0 alkava neliö on"}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"9 0 0\n2 0 0\n0 2 0\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toisen funktiokutsun tarkastelema kohdasta riviltä 1 ja sarakkeesta 2 alkava neliö on"}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"0 2 5\n0 3 0\n4 0 0\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä neliö on siis sellainen, jota oikeassa sudokussa ei tarkasteltaisi."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sudoku: ruudukko oikein","tmcname":"osa05-06_sudoku_osa4"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sudoku_oikein(sudoku: list)"}]},{"type":"text","value":", joka saa parametriksi sudokuruudukkoa esittävän kaksiulotteisen taulukon. Funktio kertoo käyttäen edellisen kolmen tehtävän funktioita (kopioi ne tämän tehtävän koodin joukkoon), onko parametrina saatu ruudukko täytetty oikein, eli sen jokainen rivi, jokainen sarake sekä kaikki erilliset 3x3-neliöt sisältävät korkeintaan kertaalleen jokaisen luvuista 1–9."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huom: ylempänä olevaan sudokuruudukkoa esittävään kuvaan on merkitty ne 3x3-neliöt, joita sudokua ratkaistessa tulee tarkastella.\nNämä ovat siis kohdista (0, 0), (0, 3), (0, 6), (3, 0), (3, 3), (3, 6), (6, 0), (6, 3) ja (6, 6) alkavat yhdeksän neliöä."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sudoku1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku_oikein"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsudoku2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku_oikein"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"False\nTrue"}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat luoda listoja, joissa on erityyppistä tietoa
  • \n
  • Tiedät, miten listoja voi käyttää tiedon ryhmittelyyn
  • \n
  • Osaat tallentaa matriisin kaksiulotteisena listana
  • \n

Ohjelmointitaidon kehittyminen edellyttää vahvaa rutiinia ja myös omaa soveltavaa oivaltamista. Tämän takia kurssilla on paljon tehtäviä. Osa tehtävistä on kohtuullisen suoraviivaisesti materiaalia hyödyntäviä ja osa taas aivan tarkoituksella haastavampia soveltavia tehtäviä.

Ei kannata huolestua, vaikka osa kurssin tehtävistä tuntuisikin ensiyrittämällä liian vaikealta. Kaikkia tehtäviä ei ole pakko tehdä, kuten arvosteluperusteet toteavat, kurssin läpipääsyyn vaaditaan vähintään 25 % jokaisen osan ohjelmointitehtävien pisteistä.

Kurssin osien tehtävät eivät etene vaikeusjärjestyksessä. Jokaisessa aliosassa esitellään yleensä muutama uusi konsepti, joita harjoitellaan sekä helpommilla että soveltavimmilla tehtävillä. Jos törmäät liian haastavan tuntuiseen tehtävään, hyppää seuraavaan. Voit palata vaikeimpiin tehtäviin osan lopuksi, jos aikaa vielä jää.

Lohdutuksen sanana todettakoon, että tällä viikolla mahdottomalta vaikuttava tehtävä näyttää melko varmasti neljän viikon päästä melko helpolta.

Lisää listoista

Viime kerralla käsiteltiin lähes yksinomaan listoja, joissa alkiot ovat kokonaislukuja. Listoihin voi kuitenkin tallentaa minkä tahansa tyyppisiä arvoja. Esimerkiksi voimme tallentaa listaan merkkijonoja:

nimet = [\"Maija\", \"Liisa\", \"Pekka\"]\nprint(nimet)\nnimet.append(\"Kalle\")\nprint(nimet)\n\nprint(\"Listalla nimiä:\", len(nimet))\nprint(\"Nimet aakkosjärjestyksessä:\")\nnimet.sort()\nfor nimi in nimet:\n  print(nimi)

['Maija', 'Liisa', 'Pekka']\n['Maija', 'Liisa', 'Pekka', 'Kalle']\nListalla nimiä: 4\nNimet aakkosjärjestyksessä:\nKalle\nLiisa\nMaija\nPekka

Samalla tavalla listalle voidaan tallentaa liukulukuja:

mittaukset = [-2.5, 1.1, 7.5, 14.6, 21.0, 19.2]\n\nfor mittaus in mittaukset:\n    print(mittaus)\n\nkeskiarvo = sum(mittaukset) / len(mittaukset)\n\nprint(\"Keskiarvo:\", keskiarvo)

-2.5\n1.1\n7.5\n14.6\n21.0\n19.2\nKeskiarvo: 10.15

Muistutus: globaalin muuttujan käytön sudenkuoppa

Kuten olemme nähneet, funktioiden sisällä on mahdollista määritellä muuttujia. Kannattaa myös huomata se, että funktio näkee sen ulkopuolella, eli pääohjelmassa määritellyt muuttujat. Tälläisia muuttujia sanotaan globaaleiksi muuttujiksi.

Globalien muuttujien käyttämistä funktioista käsin ei useimmiten pidetä hyvänä asiana muun muassa siksi, että ne saattavat johtaa ikäviin bugeihin.

Seuraavassa on esimerkki funktiosta, joka käyttää \"vahingossa\" globaalia muuttujaa:

def tulosta_vaarinpain(nimet: list):\n    # käytetään vahingossa parametrin sijaan globaalia muuttujaa nimilista\n    i = len(nimilista) - 1\n    while i>=0:\n        print(nimilista[i])\n        i -= 1\n\n# globaali muuttuja\nnimilista = [\"Antti\", \"Emilia\", \"Erkki\", \"Margaret\"]\ntulosta_vaarinpain(nimilista)\nprint()\ntulosta_vaarinpain([\"Tupu\", \"Hupu\", \"Lupu\"])

Margaret\nErkki\nEmilia\nAntti

Margaret\nErkki\nEmilia\nAntti

Vaikka funktiota kutsutaan oikein, se tulostaa aina globaalissa muuttujassa nimilista olevat nimet.

Kuten olemme nähneet, kaikki funktioita testaava koodi on kirjoitettava erillisen lohkon sisälle, jotta TMC-testit hyväksyisivät koodin. Edellinen esimerkki siis tulisi toteuttaa seuraavasti:

def tulosta_vaarinpain(nimet: list):\n    # käytetään vahingossa parametrin sijaan globaalia muuttujaa nimilista\n    i = len(nimilista) - 1\n    while i>=0:\n        print(nimilista[i])\n        i -= 1\n\n# kaikki funktiota testaava koodi tämän lohkon sisälle\nif __name__ == \"__main__\":\n    # globaali muuttuja\n    nimilista = [\"Antti\", \"Emilia\", \"Erkki\", \"Margaret\"]\n    tulosta_vaarinpain(nimilista)\n    print()\n    tulosta_vaarinpain([\"Tupu\", \"Hupu\", \"Lupu\"])

Nyt myös globaalin muuttujan määrittely on siirtynyt if-lohkoon.

TMC-testit suoritetaan aina siten, että mitään if-lohkon sisällä olevaa koodia ei huomioida. Tämän takia funktio ei voi edes teoriassa toimia, sillä se viittaa muuttujaan nimilista mitä ei testejä suoritettaessa ole ollenkaan olemassa.

Varoitus: parametrin ylikirjoittaminen ja liian aikainen return

Ennen tämän osan tehtäviin menemistä on syytä kiinnittää huomiota pariin potentiaaliseen ongelmalähteeseen. Tarkastellaan funktiota, joka kertoo löytyykö parametrina oleva luku listalta:

def luku_listalla(luvut: list, luku: int):\n    for luku in luvut:\n        if luku == luku:\n            return True\n        else:\n            return False

Funktio palauttaa jostain syystä aina True. Syynä tälle on se, että for-silmukka ylikirjoittaa parametrin luku arvon, ja tämän takia if-lauseen ehto on aina tosi.

Ongelmasta päästään eroon nimeämällä parametri uudelleen:

def luku_listalla(luvut: list, etsittava_luku: int):\n    for luku in luvut:\n        if luku == etsittava_luku:\n            return True\n        else:\n            return False

Nyt if-lauseen ehto on kunnossa. Funktiossa on kuitenkin uusi ongelma, se ei näytä edelleenkään toimivan. Esim. seuraava kokeilu tuo esiin bugin:

on = luku_listalla([1, 2, 3, 4], 3)\nprint(on)  # tulostuu False

Vika on nyt siinä että funktiosta poistutaan liian aikaisin. Funktio tarkistaa ainoastaan ensimmäisen luvun ja riippuen sen arvosta palauttaa heti joko arvon True tai False. Lopullista tuomiota, eli tietoa siitä että luku ei ole listalla ei voi kuitenkaan antaa ennen kuin kaikki luvut on tarkastettu. Komento return False pitääkin siirtää silmukan ulkopuolelle:

def luku_listalla(luvut: list, etsittava_luku: int):\n    for luku in luvut:\n        if luku == etsittava_luku:\n            return True\n\n    return False

Tarkastellaan vielä yhtä virheellistä esimerkkiä:

def luvut_erisuuret(luvut: list):\n    # apumuuttuja, johon kerätään ne luvut jotka on jo tarkastettu\n    luvut = []\n    for luku in luvut:\n        # joko luku on nähty?\n        if luku in luvut:\n            return False\n        luvut.append(luku)\n\n    return True\n\non = luvut_erisuuret([1, 2, 2])\nprint(on)  # tulostuu True

Funktio siis yrittää testata ovatko kaikki listan alkiot erisuuria. Se kuitenkin palauttaa aina arvon True.

Ongelmana on jälleen se, että funktio vahingossa ylikirjottaa parametrinsa arvon. Funktio yrittää käyttää muuttujaa luvut pitämään kirjaa jo vastaan tulleista luvuista ja tämä ylikirjoittaa parametrin. Lääke ongelmaan on muuttujan uudelleennimeäminen:

def luvut_erisuuret(luvut: list):\n    # apumuuttuja, johon kerätään ne luvut jotka on jo tarkastettu\n    havaitut_luvut = []\n    for luku in luvut:\n        # joko luku on nähty?\n        if luku in havaitut_luvut:\n            return False\n        havaitut_luvut.append(luku)\n\n    return True\n\non = luvut_erisuuret([1, 2, 2])\nprint(on)  # tulostuu False

Nämä kuten oikeastaan kaikki koodia vaivaavat ongelmat selviävät debuggerilla tai visualisaattorilla, jonka käytön tärkeyttä ei voi olla korostamatta liikaa.

HUOM: tämä ja seuraava tehtävä ovat väärässä järjestyksessä VS Coden sivupalkissa

Tee funktio pisin(merkkijonot: list), joka saa parametrikseen listan merkkijonoja. Funktio etsii ja palauttaa listalta pisimmän merkkijonon. Voit olettaa, että vain yksi jonoista on pisin.

Esimerkkikutsu:

\nif __name__ == \"__main__\":\n    jonot = [\"moi\", \"moikka\", \"heip\", \"hellurei\", \"terve\"]\n    print(pisin(jonot))\n

hellurei

Sisäkkäiset listat

Listan alkiot voivat olla myös listoja:

lista = [[5, 2, 3], [4, 1], [2, 2, 5, 1]]\nprint(lista)\nprint(lista[1])\nprint(lista[1][0])

[[5, 2, 3], [4, 1], [2, 2, 5, 1]]\n[4, 1]\n4

Mihin voimme käyttää listoja jonka sisällä on listoja?

Voisimme esimerkiksi esittää henkilön tiedot listana, jossa ensimmäisenä alkiona on henkilön nimi, toisena ikä ja kolmantena kengännumero:

[\"Anu\", 10, 26]

Vastaavasti joukko henkilöitä on lista, joka sisältää yksittäisiä henkilöä kuvaavia listoja:

henkilot = [[\"Anu\", 10, 26], [\"Petteri\", 7, 22], [\"Emilia\", 32, 37], [\"Antti\", 39, 44]]\n\nfor henkilo in henkilot:\n  nimi = henkilo[0]\n  ika = henkilo[1]\n  kenka = henkilo[2]\n  print(f\"{nimi}: ikä {ika} vuotta, kengännumero {kenka}\")

Anu: ikä 10 vuotta, kengännumero 26\nPetteri: ikä 7 vuotta, kengännumero 22\nEmilia: ikä 32 vuotta, kengännumero 37\nAntti: ikä 39 vuotta, kengännumero 44

Huomaa, miten for-lause käy läpi henkilöt yksitellen, eli toiston lohko-osassa muuttuja henkilo saa yksi kerrallaan arvokseen kutakin henkilöä esittävän listan.

Lista ei ole välttämättä paras Pythonin tietorakenne henkilön tietojen esittämiseen. Tutustumme pian sanakirjaan, joka on usein luontevampi tapa hoitaa vastaava tilanne.

Matriisit

Sisäkkäisten listojen avulla voidaan myös esittää matriisi eli kaksiulotteinen taulukko.

Esimerkiksi matriisi

\n \n \n \n \n \n \"5\n \n \n

voitaisiin mallintaa kaksiulotteisena listana näin:

matriisi = [[1, 2, 3], [3, 2, 1], [4, 5, 6]]

Koska matriisi on lista listoja, matriisin alkioihin viitataan käyttämällä peräkkäisiä hakasulkuja. Ensimmäinen indeksi viittaa riviin ja toinen sarakkeeseen. Niinpä esimerkiksi m[0][1] tarkoittaa ensimmäisen rivin toista alkiota (kun muistetaan, että indeksointi alkaa nollasta).

matriisi = [[1, 2, 3], [3, 2, 1], [4, 5, 6]]\n\nprint(matriisi[0][1])\nmatriisi[1][0] = 10\nprint(matriisi)

2\n[[1, 2, 3], [10, 2, 1], [4, 5, 6]]

Voimme käydä läpi matriisin rivit for-silmukalla. Esimerkiksi seuraava koodi tulostaa matriisin rivit allekkain:

matriisi = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]\n\nfor rivi in matriisi:\n    print(rivi)

[1, 2, 3]\n[4, 5, 6]\n[7, 8, 9]

Seuraava koodi puolestaan tulostaa matriisin alkiot yksitellen kahden for-silmukan avulla:

matriisi = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]\n\nfor rivi in matriisi:\n    print(\"uusi rivi\")\n    for alkio in rivi:\n        print(alkio)

uusi rivi\n1\n2\n3\nuusi rivi\n4\n5\n6\nuusi rivi\n7\n8\n9

Sisäkkäisiä listoja käyttävän koodin visualisointi

Jos sisäkkäisiä listoja käsittelevät ohjelmat tuntuvat hankalalta ymmärtää, kannattaa ehdottomasti havainnollistaa niitä Python Tutorin visualisaattorilla. Seuraavassa kuva edellisen esimerkin visualisoinnista:

\n \n \n \n \n \n \"5\n \n \n

Kuten kuva paljastaa, 3x3-matriisi koostuu teknisesti ottaen neljästä listasta. Ensimmäinen lista edustaa koko matriisia ja sen alkioina on erillisiä rivejä edustavat listat.

Kuva havainnollistaa jo sitä seikkaa, josta puhumme tarkemmin seuraavassa osassa: moniulotteisessa listassa listat eivät ole todellisuudessa sisäkkäin, vaan matriisia edustava lista \"viittaa\" jokaista riviä edustavaan listaan.

Kuvassa tulostus on edennyt matriisin toiselle riville, johon muuttuja rivi parhaillaan viittaa. Muuttuja alkio kertoo sen alkion, jonka kohdalla tulostus on menossa. Muuttujan arvo on nyt keskimmäisen rivin keskimmäinen eli 5.

Lisää matriisin käsittelyä

Matriisin yksittäisten rivien käsittely on helppoa, riittää että valitaan haluttu rivi. Esimerkiksi seuraava funktio laskee halutun rivin alkioiden summan:

def rivin_alkioiden_summa(matriisi, rivi_nro: int):\n    # tarkasteluun valitaan yksi rivi\n    rivi = matriisi[rivi_nro]\n    summa = 0\n    for alkio in rivi:\n        summa += alkio\n\n    return summa\n\nm = [[4, 2, 3, 2], [9, 1, 12, 11], [7, 8, 9, 5], [2, 9, 15, 1]]\n\nsumma = rivin_alkioiden_summa(m, 1)\nprint(summa) # tulostuu 33 (saadaan laskemalla 9 + 1 + 12 + 11)

Jos taas haluttaisiin laskea tietyn sarakkeen eli \"pystyrivin\" alkioiden summa, tilanne olisi jo monimutkaisempi:

def sarakkeen_alkioiden_summa(matriisi, sarake_nro: int):\n    # summaan lisätään kaikkien rivien halutussa kohdassa oleva alkio\n    summa = 0\n    for rivi in matriisi:\n        summa += rivi[sarake_nro]\n\n    return summa\n\nm = [[4, 2, 3, 2], [9, 1, 12, 11], [7, 8, 9, 5], [2, 9, 15, 1]]\n\nsumma = sarakkeen_alkioiden_summa(m, 2)\nprint(summa) # tulostuu 39 (saadaan laskemalla 3 + 12 + 9 + 15)

Tarkasteltava sarake siis koostuu jokaisen rivin paikassa 2 olevasta alkiosta.

Näidenkin ohjelmien toiminta kannattaa ehdottomasti käydä läpi visualisaattorilla!

Matriisissa olevan yksittäisen arvon vaihtaminen on helppoa. Riittää että valitaan matriisin sisältä oikea rivi ja sen sisältä sarake:

def vaihda_arvoon(matriisi, rivi_nro: int, sarake_nro: int, arvo: int):\n    # haetaan oikea rivi\n    rivi = matriisi[rivi_nro]\n    # ja sen sisältä oikea kohta\n    rivi[sarake_nro] = arvo\n\nm = [[4, 2, 3, 2], [9, 1, 12, 11], [7, 8, 9, 5], [2, 9, 15, 1]]\n\nprint(m)\nvaihda_arvoon(m, 2, 3, 1000)\nprint(m)

[[4, 2, 3, 2], [9, 1, 12, 11], [7, 8, 9, 5], [2, 9, 15, 1]]\n[[4, 2, 3, 2], [9, 1, 12, 11], [7, 8, 9, 1000], [2, 9, 15, 1]]

Mikäli halutaan muuttaa matriisin sisältöä silmukan sisällä, ei ole mahdollista käyttää \"normaalia\" for-silmukkaa, sillä muutettaessa sisältöä on pakko tietää muutettavien alkioiden indeksit.

Tämä taas onnistuu while-silmukalla tai for-silmukalla hyödyntämällä range-funktiota iteroinnissa. Esimerkiksi seuraava koodi kasvattaa jokaista matriisin alkiota yhdellä:

m = [[1,2,3], [4,5,6], [7,8,9]]\n\nfor i in range(len(m)):\n    for j in range(len(m[i])):\n        m[i][j] += 1\n\nprint(m)

[[2, 3, 4], [5, 6, 7], [8, 9, 10]]

Ulompi silmukka käy range-funktion avulla läpi arvot nollasta matriisin pituuteen (eli matriisin rivien määrään) ja sisempi silmukka jokaisen rivin alkiot nollasta rivin pituuteen.

HUOM: tämä ja edellinen tehtävä ovat väärässä järjestyksessä VS Coden sivupalkissa

Tee funktio laske_alkiot(matriisi: list, alkio: int), joka saa parametrikseen kaksiulotteisen kokonaislukutaulukon. Funktio laskee, kuinka monta annetun alkion mukaista arvoa taulukosta löytyy.

Esimerkiksi

m = [[1, 2, 1], [0, 3, 4], [1, 0, 0]]\nprint(laske_alkiot(m, 1))

3

Kaksiulotteinen taulukko pelin tietorakenteena

Matriisi sopii hyvin monien pelien tietorakenteeksi. Esim. sudokun ruudukko

\n \n \n \n \n \n \"5\n \n \n

voitaisiin esittää seuraavana matriisina:

sudoku = [\n  [9, 0, 0, 0, 8, 0, 3, 0, 0],\n  [0, 0, 0, 2, 5, 0, 7, 0, 0],\n  [0, 2, 0, 3, 0, 0, 0, 0, 4],\n  [0, 9, 4, 0, 0, 0, 0, 0, 0],\n  [0, 0, 0, 7, 3, 0, 5, 6, 0],\n  [7, 0, 5, 0, 6, 0, 4, 0, 0],\n  [0, 0, 7, 8, 0, 3, 9, 0, 0],\n  [0, 0, 1, 0, 0, 0, 0, 0, 3],\n  [3, 0, 0, 0, 0, 0, 0, 0, 2]\n]

Arvolla nolla siis kuvataan tilanne, jossa ruutu on vielä tyhjä.

Seuraavassa vielä yksinkertainen versio sudokun tulostavasta metodista:

def tulosta(sudoku):\n    for rivi in sudoku:\n        for ruutu in rivi:\n            if ruutu > 0:\n                print(f\" {ruutu}\", end=\"\")\n            else:\n                print(\" _\", end=\"\")\n        print()\n\ntulosta(sudoku)

Tulostus näyttää seuraavalta:

\n 9 _ _ _ 8 _ 3 _ _\n _ _ _ 2 5 _ 7 _ _\n _ 2 _ 3 _ _ _ _ 4\n _ 9 4 _ _ _ _ _ _\n _ _ _ 7 3 _ 5 6 _\n 7 _ 5 _ 6 _ 4 _ _\n _ _ 7 8 _ 3 9 _ _\n _ _ 1 _ _ _ _ _ 3\n 3 _ _ _ _ _ _ _ 2\n

Vastaavalla tavalla on mahdollista kuvata moni tuttu peli (esim. shakki, miinaharava, laivan upotus, mastermind, ...) matriisina. Pelistä riippuu, mikä on sopiva tapa \"koodata\" pelin tilanne matriisiin.

Go-pelissä lisätään vuorotellen mustia ja valkoisia kiviä pelilaudalle. Pelin voittaa se pelaaja, joka saa omilla kivillään rajattua enemmän aluetta pelilaudalta.

Kirjoita funktio kumpi_voitti(pelilauta: list), joka saa parametrikseen kaksiulotteisen taulukon, joka kuvaa pelilautaa. Taulukko koostuu kokonaisluvuista seuraavasti:

    \n
  • 0: tyhjä ruutu
  • \n
  • 1: pelaajan 1 nappula
  • \n
  • 2: pelaajan 2 nappula
  • \n

Esimerkissä pelilaudan koko voi olla mikä tahansa.

Funktio palauttaa arvon 1, jos pelaaja 1 on voittanut pelin, ja arvon 2, jos pelaaja 2 on voittanut pelin. Jos molemmilla pelaajilla on yhtä paljon nappuloita laudalla, funktio palauttaa arvon 0.

Tee funktio rivi_oikein(sudoku: list, rivi_nro: int), joka saa parametriksi sudokuruudukkoa esittävän kaksiulotteisen taulukon ja rivin numeron kertovan kokonaisluvun (rivit on numeroitu nollasta alkaen). Metodi palauttaa tiedon, onko rivi oikein täytetty eli onko siinä kukin luvuista 1–9 korkeintaan kerran.

sudoku = [\n  [9, 0, 0, 0, 8, 0, 3, 0, 0],\n  [2, 0, 0, 2, 5, 0, 7, 0, 0],\n  [0, 2, 0, 3, 0, 0, 0, 0, 4],\n  [2, 9, 4, 0, 0, 0, 0, 0, 0],\n  [0, 0, 0, 7, 3, 0, 5, 6, 0],\n  [7, 0, 5, 0, 6, 0, 4, 0, 0],\n  [0, 0, 7, 8, 0, 3, 9, 0, 0],\n  [0, 0, 1, 0, 0, 0, 0, 0, 3],\n  [3, 0, 0, 0, 0, 0, 0, 0, 2]\n]\n\nprint(rivi_oikein(sudoku, 0))\nprint(rivi_oikein(sudoku, 1))

True\nFalse

Tee funktio sarake_oikein(sudoku: list, sarake_nro: int), joka saa parametriksi sudokuruudukkoa esittävän kaksiulotteisen taulukon ja sarakkeen (eli pystyrivin) numeron kertovan kokonaisluvun. Metodi palauttaa tiedon, onko sarake oikein täytetty eli onko siinä kukin luvuista 1–9 korkeintaan kerran.

sudoku = [\n  [9, 0, 0, 0, 8, 0, 3, 0, 0],\n  [2, 0, 0, 2, 5, 0, 7, 0, 0],\n  [0, 2, 0, 3, 0, 0, 0, 0, 4],\n  [2, 9, 4, 0, 0, 0, 0, 0, 0],\n  [0, 0, 0, 7, 3, 0, 5, 6, 0],\n  [7, 0, 5, 0, 6, 0, 4, 0, 0],\n  [0, 0, 7, 8, 0, 3, 9, 0, 0],\n  [0, 0, 1, 0, 0, 0, 0, 0, 3],\n  [3, 0, 0, 0, 0, 0, 0, 0, 2]\n]\n\nprint(sarake_oikein(sudoku, 0))\nprint(sarake_oikein(sudoku, 1))

False\nTrue

Tee funktio nelio_oikein(sudoku: list, rivi_nro: int, sarake_nro: int), joka saa parametriksi sudokuruudukkoa esittävän kaksiulotteisen taulukon sekä yhden ruudun paikan kertovat rivi- ja sarakenumerot.

Funktio kertoo onko parametrina saadusta rivi/sarakenumerosta alkava 3x3-kokoinen neliö oikein täytetty eli onko siinä kukin luvuista 1–9 korkeintaan kerran.

Huomaa, että tässä tehtävässä toteutettava funktio on hieman yleiskäyttöisempi kuin sudokussa oikeasti tarvitaan. Todellisuudessahan oikeassa sudokussa tarkastellaan ainoastaan kohdista (0, 0), (0, 3), (0, 6), (3, 0), (3, 3), (3, 6), (6, 0), (6, 3) ja (6, 6) alkavia neliöitä.

sudoku = [\n  [9, 0, 0, 0, 8, 0, 3, 0, 0],\n  [2, 0, 0, 2, 5, 0, 7, 0, 0],\n  [0, 2, 0, 3, 0, 0, 0, 0, 4],\n  [2, 9, 4, 0, 0, 0, 0, 0, 0],\n  [0, 0, 0, 7, 3, 0, 5, 6, 0],\n  [7, 0, 5, 0, 6, 0, 4, 0, 0],\n  [0, 0, 7, 8, 0, 3, 9, 0, 0],\n  [0, 0, 1, 0, 0, 0, 0, 0, 3],\n  [3, 0, 0, 0, 0, 0, 0, 0, 2]\n]\n\nprint(nelio_oikein(sudoku, 0, 0))\nprint(nelio_oikein(sudoku, 1, 2))

False\nTrue

Ensimmäisen funktiokutsun tarkastelema kohdasta 0, 0 alkava neliö on

\n9 0 0\n2 0 0\n0 2 0\n

Toisen funktiokutsun tarkastelema kohdasta riviltä 1 ja sarakkeesta 2 alkava neliö on

\n0 2 5\n0 3 0\n4 0 0\n

Tämä neliö on siis sellainen, jota oikeassa sudokussa ei tarkasteltaisi.

Tee funktio sudoku_oikein(sudoku: list), joka saa parametriksi sudokuruudukkoa esittävän kaksiulotteisen taulukon. Funktio kertoo käyttäen edellisen kolmen tehtävän funktioita (kopioi ne tämän tehtävän koodin joukkoon), onko parametrina saatu ruudukko täytetty oikein, eli sen jokainen rivi, jokainen sarake sekä kaikki erilliset 3x3-neliöt sisältävät korkeintaan kertaalleen jokaisen luvuista 1–9.

Huom: ylempänä olevaan sudokuruudukkoa esittävään kuvaan on merkitty ne 3x3-neliöt, joita sudokua ratkaistessa tulee tarkastella.\nNämä ovat siis kohdista (0, 0), (0, 3), (0, 6), (3, 0), (3, 3), (3, 6), (6, 0), (6, 3) ja (6, 6) alkavat yhdeksän neliöä.

sudoku1 = [\n  [9, 0, 0, 0, 8, 0, 3, 0, 0],\n  [2, 0, 0, 2, 5, 0, 7, 0, 0],\n  [0, 2, 0, 3, 0, 0, 0, 0, 4],\n  [2, 9, 4, 0, 0, 0, 0, 0, 0],\n  [0, 0, 0, 7, 3, 0, 5, 6, 0],\n  [7, 0, 5, 0, 6, 0, 4, 0, 0],\n  [0, 0, 7, 8, 0, 3, 9, 0, 0],\n  [0, 0, 1, 0, 0, 0, 0, 0, 3],\n  [3, 0, 0, 0, 0, 0, 0, 0, 2]\n]\n\nprint(sudoku_oikein(sudoku1))\n\nsudoku2 = [\n  [2, 6, 7, 8, 3, 9, 5, 0, 4],\n  [9, 0, 3, 5, 1, 0, 6, 0, 0],\n  [0, 5, 1, 6, 0, 0, 8, 3, 9],\n  [5, 1, 9, 0, 4, 6, 3, 2, 8],\n  [8, 0, 2, 1, 0, 5, 7, 0, 6],\n  [6, 7, 4, 3, 2, 0, 0, 0, 5],\n  [0, 0, 0, 4, 5, 7, 2, 6, 3],\n  [3, 2, 0, 0, 8, 0, 0, 5, 7],\n  [7, 4, 5, 0, 0, 3, 9, 0, 1]\n]\n\nprint(sudoku_oikein(sudoku2))

False\nTrue

","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-5/1-lisaa-listoista.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-5/2-viittaukset/page-data.json b/page-data/osa-5/2-viittaukset/page-data.json index a1eacb1f4..902fa67a5 100644 --- a/page-data/osa-5/2-viittaukset/page-data.json +++ b/page-data/osa-5/2-viittaukset/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-5/2-viittaukset", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä tarkoitetaan viittaustyyppisellä muuttujalla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, että samaan olioon voi olla useampia viittauksia"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää listoja funktioiden parametreina"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä tarkoitetaan funktion sivuvaikutuksella"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olemme tähän asti ajatelleet, että muuttuja on eräänlainen \"laatikko\", joka sisältää muuttujan arvon. Teknisesti ottaen tämä ei pidä paikkaansa Pythonissa: muuttujat eivät sisällä arvoa vaan ne "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"viittaavat"}]},{"type":"text","value":" arvona olevaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"olioon"}]},{"type":"text","value":", kuten lukuun, merkkijonoon tai listaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käytännössä tämä tarkoittaa, että muuttujaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei tallenneta"}]},{"type":"text","value":" arvoa, vaan tieto siitä paikasta, mistä muuttujan arvo löytyy."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Viittausta voidaan kuvata nuolena muuttujasta sen varsinaiseen arvoon:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 261px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/8687855d3e59d8151e4fce49ec9669b0/edf96/5_2_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 30.869565217391305%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA1ElEQVQY041ROQ6EQAyb7/MBfsA/aCgoEHQcDQ2XOMQlxI1XzgqKbdhIljzJ2JNk1DiOKIoCdV1jnmfEcYymaZBlmSBJEjDO88R1Xa9Qx3FgWRYRMUHTaZoE5Kwx/2+om7yJ+AA7b9tWprl5VVXCu66TiaRDgoY3v8FI0xR93z8idlyWpRhxAtaZZ5imCUXXKIpkj77vCyeCIECe59A0Dbquyw7XdX0m4e750L7vgm3b4Lrut0MeeJGiXwzDIAb8LM/zEIYhbNuG4zjCLcuSPOuGYeADgRnJTrwaxUwAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8687855d3e59d8151e4fce49ec9669b0/a0b58/5_2_1.webp 230w","/static/8687855d3e59d8151e4fce49ec9669b0/ad293/5_2_1.webp 261w"],"sizes":"(max-width: 261px) 100vw, 261px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8687855d3e59d8151e4fce49ec9669b0/81c8e/5_2_1.png 230w","/static/8687855d3e59d8151e4fce49ec9669b0/edf96/5_2_1.png 261w"],"sizes":"(max-width: 261px) 100vw, 261px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/8687855d3e59d8151e4fce49ec9669b0/edf96/5_2_1.png","alt":"5 2 1","title":"5 2 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Viittaus siis kertoo, mistä varsinainen arvo löytyy. Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"id"}]},{"type":"text","value":" kertoo, mihin muuttuja viittaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"id"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nb "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tämäkin on viittaus\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"id"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4538357072\n4537788912"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Viittaus eli muuttujan id on kokonaisluku, jonka voi ajatella olevan muuttujan arvon sijainnin osoite tietokoneen muistissa. Huomaa, että jos suoritat yllä olevan koodin omalla koneellasi, tulos on luultavasti erilainen, koska muuttujilla on eri viitteet."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten jo "},{"type":"element","tagName":"a","properties":{"href":"/osa-5/1-lisaa-listoja#sisakkaisia-listoja-kayttavan-koodin-visualisointi"},"children":[{"type":"text","value":"edellisen osan"}]},{"type":"text","value":" esimerkistä näimme, Python Tutorin visualisaattori näyttää viitteet \"nuolina\" varsinaiseen sisältöön. Visualisaattori kuitenkin \"huijaa\" merkkijonojen tapauksessa ja näyttää ne ikään kuin merkkijonon sisältö olisi tallennettu muuttujan sisälle:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/9d19433a6bc55bf386a8fbcc572dba74/94cea/5_2_1a.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 29.565217391304348%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA2klEQVQY00VQ207EIBDt//+ZzxoT48boBsEs2wKlMMBcMFLbPQ/nYeZcMjP1f0jvnYhDiBkKsxzzTkRhYNs2GCAiZhaR6RQx87yE67e18yryMCPiPM/OeQBgZiKSASI6zCKQkzFaqS+AlNJWaz02jyCAzEyttZyrSJ/2GEbEAj7Eq7J3F1trxLwbakNjw8999bHdfK7IUHLKtvcyRbcsi3POneqzkEdnyvXlYp7f9dunff24xUxQVx+eAC4TIRIRIhpjtNaDtFLKey/y9whmqZWgVCgtl7ZfsfMv95hb032qZjcAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/9d19433a6bc55bf386a8fbcc572dba74/a0b58/5_2_1a.webp 230w","/static/9d19433a6bc55bf386a8fbcc572dba74/bc10c/5_2_1a.webp 460w","/static/9d19433a6bc55bf386a8fbcc572dba74/966d8/5_2_1a.webp 920w","/static/9d19433a6bc55bf386a8fbcc572dba74/445df/5_2_1a.webp 1380w","/static/9d19433a6bc55bf386a8fbcc572dba74/78de1/5_2_1a.webp 1840w","/static/9d19433a6bc55bf386a8fbcc572dba74/0dc73/5_2_1a.webp 1940w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/9d19433a6bc55bf386a8fbcc572dba74/81c8e/5_2_1a.png 230w","/static/9d19433a6bc55bf386a8fbcc572dba74/08a84/5_2_1a.png 460w","/static/9d19433a6bc55bf386a8fbcc572dba74/c0255/5_2_1a.png 920w","/static/9d19433a6bc55bf386a8fbcc572dba74/b1001/5_2_1a.png 1380w","/static/9d19433a6bc55bf386a8fbcc572dba74/161ec/5_2_1a.png 1840w","/static/9d19433a6bc55bf386a8fbcc572dba74/94cea/5_2_1a.png 1940w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/9d19433a6bc55bf386a8fbcc572dba74/c0255/5_2_1a.png","alt":"5 2 1a","title":"5 2 1a","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Näin ei kuitaan ole todellisuudessa, vaan merkkijonotkin käsitellään Pythonin sisäisissä rakenteissa samaan tapaan kuin listat."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Monet Pythonin sisäänrakennetut tyypit, kuten "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"str"}]},{"type":"text","value":", ovat "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"muuttumattomia"}]},{"type":"text","value":". Tämä tarkoittaa, että olion arvo ei voi koskaan muuttua. Sen sijaan arvo voidaan korvata uudella arvolla:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 281px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/e24d125e0a5ab22b6d68096ab4edaa6d/6b1e2/5_2_2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 85.65217391304348%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAAAsTAAALEwEAmpwYAAABpklEQVQ4y52UWYsCQQyE+2eL/8xnQVAQHxXvA+/7vq3lC2TpHca9AmEy6e50qiozYblcqtfrqd/vazabab/f63A4qNvtqtlsajqd6nQ6CXu9Xj96oACFFouF1uu1rterHo+HFaEY6775Nxb0B9tut1qtVnbxZrMxJ8ZBejweFW63m0E8n8/WHc4CTpcUqdVqtmc+n4v98R7iy+Wi+/2uyWSi0Ol0lMvlVCgUVCqVLAl3rVbLeKxWq8pms2IfBdzG47HlYoM2g+y84e8MDkejkcEDNg5Mj8lbh0myXYDn8/npnudCIDvsOPamgm92o8A7RTnA+ndIAqMBZ41GQ4PBwMaE9uGw3W5bHmjkd7udjRhCvZvLLyqjlsN0lV1B/N9z+A4yl/vFziGxO2vWIfOFIzvvaXwSc8ARsA8UPJ1XEwU+isWi8vm8yuWyjcZwOLQb446BHOc4zJeSFCgVMp3ydfDDiDuGU4RBIP+JuFj+DGlKuUFDvV43xZkEOiKH6sT+bfOOMwEhrViycKVSUSaTsWJuFEpSkwo5LhTHHIQKN+DyTt4bgOcPk2YlBJdlLTcAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/e24d125e0a5ab22b6d68096ab4edaa6d/a0b58/5_2_2.webp 230w","/static/e24d125e0a5ab22b6d68096ab4edaa6d/f44a8/5_2_2.webp 281w"],"sizes":"(max-width: 281px) 100vw, 281px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/e24d125e0a5ab22b6d68096ab4edaa6d/81c8e/5_2_2.png 230w","/static/e24d125e0a5ab22b6d68096ab4edaa6d/6b1e2/5_2_2.png 281w"],"sizes":"(max-width: 281px) 100vw, 281px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/e24d125e0a5ab22b6d68096ab4edaa6d/6b1e2/5_2_2.png","alt":"5 2 2","title":"5 2 2","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa on myös tyyppejä, jotka ovat muuttuvia. Esimerkiksi listan sisältö voi muuttua ilman, että tarvitsee luoda kokonaan uusi lista:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 271px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/8b07a257ace229cc26a5eedf03a60986/5fce1/5_2_3.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 70.43478260869564%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsTAAALEwEAmpwYAAABeUlEQVQ4y5WT66rCQAyE9337w8eT/hEfQVCs4K2iWO+1VevdyDewBxE91EDYbHZ3Opmkbj6fWxzH1uv1bDab2Xa7tTzPLUkSW61WtlgslJ9Op4bd73d7PB5f3RVFIQB8v98rebvd7HA42G63U471eDxaGXP2g202G1WwXq/l7zHn7nK5iAFMKQd2+PV61Up+MBjY6XRS6TBFCkCIAVkul6qIveNStVq1Wq2mi/1+37rdrpy42WxapVKRzoB7KXgMkM/RC5XsNYPpu+AYTHH24/FYmtIw3APRMD5C2c4/xD517fUMVoDA6puXbsor+L9dRsPRaGTD4VDUKQtt/LiwZ6TKzKDmkId+HNI0tSzLBISmOGDn87n0aP1UMqMDOOu32NFB3+FPxgTAnBVZqAaJkIL8ZDLR3g+4o+1hGFq9XtccMn+dTkdO3Gg0LAgCgdFFAACCAHJABnZIppL5MgckiCmNy74BXIYVZ61WS38Na7vd1keiKPrLs38CMo80d8OuAIYAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8b07a257ace229cc26a5eedf03a60986/a0b58/5_2_3.webp 230w","/static/8b07a257ace229cc26a5eedf03a60986/cadab/5_2_3.webp 271w"],"sizes":"(max-width: 271px) 100vw, 271px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8b07a257ace229cc26a5eedf03a60986/81c8e/5_2_3.png 230w","/static/8b07a257ace229cc26a5eedf03a60986/5fce1/5_2_3.png 271w"],"sizes":"(max-width: 271px) 100vw, 271px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/8b07a257ace229cc26a5eedf03a60986/5fce1/5_2_3.png","alt":"5 2 3","title":"5 2 3","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hieman yllättäen myös lukuja ja totuusarvoja edustavat perustietotyypit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"int"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"float"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"bool"}]},{"type":"text","value":" ovat muuttumattomia. Tarkastellaan esimerkkinä seuraavaa koodia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaikka vaikuttaa siltä, että koodi muuttaa lukua, teknisesti ottaen ei näin ole, vaan jokainen komento luo uuden luvun."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavan ohjelman tulostus on mielenkiintoinen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"id"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"id"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\na "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"id"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4535856912\n4535856944\n4535856912"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aluksi muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku"}]},{"type":"text","value":" viittaa paikkaan 4535856912, ja kun muuttujan arvo muuttuu, se alkaa viitata paikkaan 4535856944. Kun muuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":" sijoitetaan arvo 1, se alkaa viitata samaan paikkaan kuin mihin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku"}]},{"type":"text","value":" viittasi, kun sen arvo oli 1."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaikuttaakin siltä, että Python on tallentanut luvun 1 paikkaan 4535856912 ja aina kun jonkin muuttujan arvona on 1, muuttuja "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"viittaa"}]},{"type":"text","value":" tuohon paikkaan \"tietokoneen muistissa\"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaikka perustietotyypit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"int"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"float"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"bool"}]},{"type":"text","value":" ovat viittauksia, ohjelmoijan ei oikeastaan tarvitse välittää asiasta."}]},{"type":"element","tagName":"h2","properties":{"id":"useampi-viittaus-samaan-listaan","style":"position:relative;"},"children":[{"type":"text","value":"Useampi viittaus samaan listaan"},{"type":"element","tagName":"a","properties":{"href":"#useampi-viittaus-samaan-listaan","ariaLabel":"useampi viittaus samaan listaan permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkinä listamuuttujan arvon kopiointia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nb "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" a\nb"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sijoitus "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b = a"}]},{"type":"text","value":" kopioi muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":" arvon muuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":". On tärkeä kuitenkin huomata, että muuttujan arvona "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei ole lista"}]},{"type":"text","value":" vaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"viittaus listaan"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sijoitus "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b = a"}]},{"type":"text","value":" siis kopioi viittauksen, minkä seurauksena kopioinnin jälkeen samaan listaan on kaksi viittausta:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 271px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/73c7fae5118d6e5b03c576f1a9d14c3f/5fce1/5_2_4.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 129.99999999999997%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAaCAYAAAC3g3x9AAAACXBIWXMAAAsTAAALEwEAmpwYAAACN0lEQVRIx52VV64qQQxEZ60sgC2wJvhhFXwhkMg555zx07FU3FHf0QVeS1aHoctlu9xE4/HYlsulbbdbm06nNpvNjDPm4XBoj8fDGM/n8yOLdrudX8KOx6MDbzYbOxwOvtc3fvzJiOyLsVqtbL1ee0SLxeLXmu8OeLvd7H6/OxNmGfvT6WSdTscul4ungv18PncQ1gCSHiJi74C1Ws0Gg4H1+32rVCq+xxqNhhWLRUun09Zutz0FXCRNXAZIZ5PJ5CdkMQwTzLher26wxSGXR6ORm4AoHk4IO4on+6/E801s/rIo6WI4f1phD5kw9vu9S4WchCAh8FsdojtydD6fHTQJ8CuGSSEnFYcZ6cggABGtdR594p0KogKkQyV7vZ4ba+SGTiVwZ1iv1730fCiXy67BZrNp1WrV8vm8pVIpB0N7qjSs6AydAfYKmQPoarBvtVoODjBag2G32/U8wwqDFXqksAC+Wk/NT4FgS7eo4qEOYSTNwVJrMXXAUqnkLPCEl/jQa/NVlWm9pEthF32kQ/UqplcGB9i7dkxkSEWpIFUmF0o6r/d/dUr8HdQIXx7tk9IQrr96sXlgiYACskbYrJEOxeThdUD9hyhkGbJAX9ls9vV4sGeme3hUkBpgzETigIgXj3hSPhF2oVCwXC5nmUzGv3OR/MIKzSFsgcLOcxhWkT2XKRYOVG0GOoUZ5zgFiDVOiOAVMh4Jl9ai3QCM61JF4Sz+hyb9xs9fIZMX6IddEj5j73T4DynC3t7bOJziAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/73c7fae5118d6e5b03c576f1a9d14c3f/a0b58/5_2_4.webp 230w","/static/73c7fae5118d6e5b03c576f1a9d14c3f/cadab/5_2_4.webp 271w"],"sizes":"(max-width: 271px) 100vw, 271px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/73c7fae5118d6e5b03c576f1a9d14c3f/81c8e/5_2_4.png 230w","/static/73c7fae5118d6e5b03c576f1a9d14c3f/5fce1/5_2_4.png 271w"],"sizes":"(max-width: 271px) 100vw, 271px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/73c7fae5118d6e5b03c576f1a9d14c3f/5fce1/5_2_4.png","alt":"5 2 4","title":"5 2 4","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Listaa voidaan käsitellä kumman tahansa viittauksen avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nlista2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lista\n\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\nlista2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[10, 20, 3, 4]\n[10, 20, 3, 4]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mikäli samaan listaan on useampia viittauksia, sitä voidaan käsitellä minkä tahansa viittauksen kautta samalla tavalla. Toisaalta yhden viittauksen kautta tehtävä muutos heijastuu myös muihin viittauksiin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Visualisaattori näyttää jälleen selkeästi mitä ohjelmassa tapahtuu:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/cf84b632e91094d24c611bd9d800a737/c6720/5_2_4a.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 32.608695652173914%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA30lEQVQY03WQwW7DIAyG8/7vtcsm7bLTTu0ydQmFMMC4CWCbKUyjUaV9Bw6WP/4fhnogpew95FyOQxEBgBBCjPHWSClxY+hLRDR+qtM4T8qu68rMfT5Ns1JXACh/iMij7J1DjIhIRCLSk9u5R4lwzvk3lojuMjMbs2htELGb+6XMLuDXbCDeiOjb2Vq51n3hLqecrF2M0Yjx+OZC/D4uz2/niwbcNutevX+K8UUEB9nLCDGXUpRxp/G62NDb7o1EXEwfFx3X3DJg21zOQYQHa60xxnvfhEpcWerDb9d/+AGpwZhBrvAmDQAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/cf84b632e91094d24c611bd9d800a737/a0b58/5_2_4a.webp 230w","/static/cf84b632e91094d24c611bd9d800a737/bc10c/5_2_4a.webp 460w","/static/cf84b632e91094d24c611bd9d800a737/966d8/5_2_4a.webp 920w","/static/cf84b632e91094d24c611bd9d800a737/445df/5_2_4a.webp 1380w","/static/cf84b632e91094d24c611bd9d800a737/78de1/5_2_4a.webp 1840w","/static/cf84b632e91094d24c611bd9d800a737/da98d/5_2_4a.webp 1922w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/cf84b632e91094d24c611bd9d800a737/81c8e/5_2_4a.png 230w","/static/cf84b632e91094d24c611bd9d800a737/08a84/5_2_4a.png 460w","/static/cf84b632e91094d24c611bd9d800a737/c0255/5_2_4a.png 920w","/static/cf84b632e91094d24c611bd9d800a737/b1001/5_2_4a.png 1380w","/static/cf84b632e91094d24c611bd9d800a737/161ec/5_2_4a.png 1840w","/static/cf84b632e91094d24c611bd9d800a737/c6720/5_2_4a.png 1922w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/cf84b632e91094d24c611bd9d800a737/c0255/5_2_4a.png","alt":"5 2 4a","title":"5 2 4a","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"h2","properties":{"id":"listan-kopiointi","style":"position:relative;"},"children":[{"type":"text","value":"Listan kopiointi"},{"type":"element","tagName":"a","properties":{"href":"#listan-kopiointi","ariaLabel":"listan kopiointi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos haluamme tehdä listasta erillisen kopion, voimme luoda uuden listan ja lisätä siihen jokaisen aluperäisen listan alkion:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nkopio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n kopio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkopio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\nkopio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lista\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kopio\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kopio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"lista [1, 2, 3, 3, 5]\nkopio [10, 2, 3, 3, 5, 6]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Visualisaattorilla tarkastellen kopiointi näyttää seuraavalta:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/66b9f72bbac2f55cd8fac4539ba92dba/e431d/5_2_4b.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 43.04347826086957%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAABYlAAAWJQFJUiTwAAABGElEQVQoz32RzW7DIBCE/f4v1kY99NBTFFWtZMcQ29iADRjvD5WhcXJpPyEOLLM7mq3SHeZkZzdOFpDSEwDg7vgMAFCmOj45H1qpWjlqs4Tgmbm8bxlALBpEJCJmBoCHeJ6ttQZgI0RAfHLEef7GzDFuMW5ETMSImMWcKK5uWW5dd+s6KW/GmEPsQ5S9/q4FIjm3OG9Sgny4OnpP09Q0zfV6XZalGCu+rYsfF/F+blwkF5S1J61frH1lXh+2lVJ13Qgh+r4fxzEb2gkRL3V//pIR2IXZhxpgINr2yQB7EiUGpb3SPqxwpFV8MTPRvoIQtDFv6/pZStU4TcMweO9TSnsD+hXyE+kPqlJTSrVtK6UstxDiWOY/4h8FSwu1d8EohwAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/66b9f72bbac2f55cd8fac4539ba92dba/a0b58/5_2_4b.webp 230w","/static/66b9f72bbac2f55cd8fac4539ba92dba/bc10c/5_2_4b.webp 460w","/static/66b9f72bbac2f55cd8fac4539ba92dba/966d8/5_2_4b.webp 920w","/static/66b9f72bbac2f55cd8fac4539ba92dba/445df/5_2_4b.webp 1380w","/static/66b9f72bbac2f55cd8fac4539ba92dba/78de1/5_2_4b.webp 1840w","/static/66b9f72bbac2f55cd8fac4539ba92dba/609ff/5_2_4b.webp 1882w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/66b9f72bbac2f55cd8fac4539ba92dba/81c8e/5_2_4b.png 230w","/static/66b9f72bbac2f55cd8fac4539ba92dba/08a84/5_2_4b.png 460w","/static/66b9f72bbac2f55cd8fac4539ba92dba/c0255/5_2_4b.png 920w","/static/66b9f72bbac2f55cd8fac4539ba92dba/b1001/5_2_4b.png 1380w","/static/66b9f72bbac2f55cd8fac4539ba92dba/161ec/5_2_4b.png 1840w","/static/66b9f72bbac2f55cd8fac4539ba92dba/e431d/5_2_4b.png 1882w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/66b9f72bbac2f55cd8fac4539ba92dba/c0255/5_2_4b.png","alt":"5 2 4b","title":"5 2 4b","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kopio"}]},{"type":"text","value":" siis viittaa nyt eri listaan kuin muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lista"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Helpompi tapa listan kopioimiseen on hyödyntää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[]"}]},{"type":"text","value":"-operaattoria, johon tutustuimme aiemmin kurssilla. Merkintä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[:]"}]},{"type":"text","value":" tarkoittaa, että listalta valitaan kaikki alkiot, ja tämän sivuvaikutuksena syntyy kopio listasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nkopio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\nkopio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kopio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[10, 2, 3, 4]\n[1, 20, 3, 4]"}]}]},{"type":"element","tagName":"h2","properties":{"id":"lista-funktion-parametrina","style":"position:relative;"},"children":[{"type":"text","value":"Lista funktion parametrina"},{"type":"element","tagName":"a","properties":{"href":"#lista-funktion-parametrina","ariaLabel":"lista funktion parametrina permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun lista välitetään parametrina funktiolle, välitetään viittaus listaan. Tämä tarkoittaa, että funktio voi muuttaa parametrinaan saamaansa listaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraava funktio lisää uuden alkion parametrinaan saamaansa listaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_alkio"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n uusi_alkio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"uusi_alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nlista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"text","value":"\n[1, 2, 3]\n[1, 2, 3, 10]\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_alkio"}]},{"type":"text","value":" ei palauta mitään, vaan muuttaa parametrinaan saamaansa listaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Visualisaattori havainnollistaa tilanteen seuraavasti:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/9be11dea0a28e2151e4f4f7101f82472/764d0/5_2_4c.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 35.65217391304348%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA+UlEQVQY01WO226DMBAF+f9/62P7UFVKq0BCMdgLOOs1e6sITdTO45FGZxp/oKZY6NwN5y6UUlXVzNzdzOZ5jjHmnG93aq1mJiLNYZrqVimm1Lbd5dqP47Qui6oespnpHXcXkWNh5ofMzERrXodhiDGWUojo+WxmtVZEVFUAEOFjbJ7ZiNh1bd9fc17dzf8AAG3bIqK7r+st54KIe7Y9ICKA+dJPMWVmOSKPZ2aBeaFaN1ZYPhDfVIu7NzhDShBjJCJ3Z/GNj95fzP3UTS+vX21YVK1QX8rJrO6ybBsziwgAjGOIcZqmMYSQUlJVkT3hOi7vn98hrf6fH4cdljeAKLvbAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/9be11dea0a28e2151e4f4f7101f82472/a0b58/5_2_4c.webp 230w","/static/9be11dea0a28e2151e4f4f7101f82472/bc10c/5_2_4c.webp 460w","/static/9be11dea0a28e2151e4f4f7101f82472/966d8/5_2_4c.webp 920w","/static/9be11dea0a28e2151e4f4f7101f82472/445df/5_2_4c.webp 1380w","/static/9be11dea0a28e2151e4f4f7101f82472/78de1/5_2_4c.webp 1840w","/static/9be11dea0a28e2151e4f4f7101f82472/b4500/5_2_4c.webp 1898w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/9be11dea0a28e2151e4f4f7101f82472/81c8e/5_2_4c.png 230w","/static/9be11dea0a28e2151e4f4f7101f82472/08a84/5_2_4c.png 460w","/static/9be11dea0a28e2151e4f4f7101f82472/c0255/5_2_4c.png 920w","/static/9be11dea0a28e2151e4f4f7101f82472/b1001/5_2_4c.png 1380w","/static/9be11dea0a28e2151e4f4f7101f82472/161ec/5_2_4c.png 1840w","/static/9be11dea0a28e2151e4f4f7101f82472/764d0/5_2_4c.png 1898w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/9be11dea0a28e2151e4f4f7101f82472/c0255/5_2_4c.png","alt":"5 2 4c","title":"5 2 4c","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Global frame"}]},{"type":"text","value":" tarkoittaa pääohjelman muuttujia ja sinisellä oleva laatikko "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"lisaa_alkio"}]},{"type":"text","value":" taas funktion parametreja ja muuttujia. Kuten visualisaatio havainnollistaa, funktio viittaa samaan listaan mihin pääohjelmakin viittaa, eli funktiossa listalle tehtävät muutokset näkyvät pääohjelmaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen tapa olisi luoda uusi lista ja palauttaa se:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_alkio"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n uusi_alkio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n kopio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n kopio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"uusi_alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" kopio\n\nluvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nluvut2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lisaa_alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Alkuperäinen lista:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Uusi lista:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luvut2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Alkuperäinen lista: [1, 2, 3]\nUusi lista: [1, 2, 3, 10]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos et ole 100% varma mitä koodissa tapahtuu, käy sen toiminta läpi visualisaattorilla!"}]},{"type":"element","tagName":"h2","properties":{"id":"parametrina-olevan-listan-muokkaaminen","style":"position:relative;"},"children":[{"type":"text","value":"Parametrina olevan listan muokkaaminen"},{"type":"element","tagName":"a","properties":{"href":"#parametrina-olevan-listan-muokkaaminen","ariaLabel":"parametrina olevan listan muokkaaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on yritys tehdä funktio, joka kasvattaa parametrina saamansa listan jokaista alkiota kymmenellä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kasvata_kaikkia"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n uusilista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n uusilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" uusilista\n\nluvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"alussa \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkasvata_kaikkia"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"funktion jälkeen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"alussa: [1, 2, 3]\nfunktion jälkeen: [1, 2, 3]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jostain syystä funktio ei kuitenkaan näytä toimivan. Mistä on kyse?"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiolle on välitetty parametrina "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"viite"}]},{"type":"text","value":" muutettavaan listaan. Sijoitus "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lista = uusilista"}]},{"type":"text","value":" saa aikaan sen, että parametriin talletettu viite muuttaa arvoaan funktion sisällä eli se alkaa viitata funktion sisällä luotuun uuteen listaan. Sijoitus ei kuitenkaan vaikuta funktion ulkopuolelle, siellä viitataan edelleen alkuperäiseen listaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava kuvasarja havainnollistaa, mihin eri muuttujat viittaavat ohjelman suorituksen aikana:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 442px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/1dd6dd7dab6b2cff3cdbe11741d2b26a/e03bf/5_2_6.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 157.82608695652175%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAgCAYAAAASYli2AAAACXBIWXMAAAsTAAALEwEAmpwYAAACUElEQVRIx5WWx47DMAxE/f9/ldxSEeQQpPfee0+4eAS40BqSkxVAWJat8ZBDUo4kNt7vt/d+NBpJOp2WwWDgfc9G5Nv8er3UuMeYb7dbWS6Xstls5Pl8BkG9gLPZTMbjsZzPZwWaTCYK1u12dX69Xn/fj4NGSS67c2ONhcITZOh++XQ6KeP1eq1scXmxWCh7H2j0SRQ2FwoFyeVyUi6XJZ/PSzablel06gf0sYLNfD5XdsfjUfb7vVwuF12DZaLLLpApizuAmcKAIRKAfOx+v/8SCLocyisGLAFKCo2X4XA4lE6no2xarZasVitlezgc/oTFDVMiIEzYTMyoDABZi4MlAUehnENFYvVpeFX2Ke2CU2qu2ZolubsvmNj2Mm6Th1gmk5FSqSTFYlFSqZTUarX/AbpG/SIQdrvdwi7HgRhs6Pf7KhD5SLXAlLjSIHa7XbBUo1BTsBZlg26D8QFjGGwOIVFsTqXQFOLPgmljC9RppVKRXq+nid1sNjUnzcWv0iakLiAYLtrAVe5NnI+J7TYJmFarVVUXEGqZvkh5Ihhni+8o8KoMICAmAGYdiBBglCSA8VL82GC/GV6XfWpTy3QexCEHOaCoDkTD9Uajoe67exIZ4hJA7XZbgQGp1+t6T4ITY9pdENDAACLvyL/H46HC2FGA8qwluhwXBVdRFEAEoQT5gKkMsFvvXoafxLByjIMkMsQVawSWd6Em+1XpsRmXUBMj8O5vx9el53uAqvaHQMzs/4Y1jlOucdeD3QYhyD3SA3UxADDSiAOMq6/0fgAgpcds34kgXgAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/1dd6dd7dab6b2cff3cdbe11741d2b26a/a0b58/5_2_6.webp 230w","/static/1dd6dd7dab6b2cff3cdbe11741d2b26a/3fa5c/5_2_6.webp 442w"],"sizes":"(max-width: 442px) 100vw, 442px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/1dd6dd7dab6b2cff3cdbe11741d2b26a/81c8e/5_2_6.png 230w","/static/1dd6dd7dab6b2cff3cdbe11741d2b26a/e03bf/5_2_6.png 442w"],"sizes":"(max-width: 442px) 100vw, 442px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/1dd6dd7dab6b2cff3cdbe11741d2b26a/e03bf/5_2_6.png","alt":"5 2 6","title":"5 2 6","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion sisällä muutettu lista siis \"kadotetaan\" kun funktiosta palataan, ja muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luvut"}]},{"type":"text","value":" viittaa koko ajan alkuperäiseen listaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Visualisaattori on tässäkin tapauksessa ystävä: se näyttää selkeästi, miten funktio ei koske alkuperäiseen listaan ollenkaan vaan luo uuden listan, johon muutokset tehdään:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/19d3606e35d311c11edb9891cf40eeeb/75d3b/5_2_4d.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 41.30434782608695%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAABYlAAAWJQFJUiTwAAABLklEQVQY01WQ227bMBBE/f/fFgRFAhQwEECuK9GWaZCWRHGXe20UJW1znvblDGb24B+oKCKkPJ9+j+GaEFtrzczcHRFzzsuyAAARMbOZiYiZHT5l1VLK+Xy+Xq8xxnVdAUBE3H2PEBEiMrM9VFW/ZFNuqGYppRhjCGGeZyJqrbk7MwNirRURVTWlTMTywS4bE6Wcp2kqpQCA/wc2jLfbJYTW0Mzm+bGu8571WZuZh2Houm4YhtPptNfeCzfiqUBMU1m30FKOtb66q7sfmBoiAoCqNJJ7Xqfyb5W7L5V+HPvnn79CqhVpKT1iZ1Y2uU4bj8cDAJi3McxMRNshYqoF5diNzy9v4V5EdV7epumptcsm/92Wcx7Hse/7EEKMsdZqGwokOa+3yz0v337xLv8BaHfNshxTjQQAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/19d3606e35d311c11edb9891cf40eeeb/a0b58/5_2_4d.webp 230w","/static/19d3606e35d311c11edb9891cf40eeeb/bc10c/5_2_4d.webp 460w","/static/19d3606e35d311c11edb9891cf40eeeb/966d8/5_2_4d.webp 920w","/static/19d3606e35d311c11edb9891cf40eeeb/445df/5_2_4d.webp 1380w","/static/19d3606e35d311c11edb9891cf40eeeb/78de1/5_2_4d.webp 1840w","/static/19d3606e35d311c11edb9891cf40eeeb/ee81e/5_2_4d.webp 1966w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/19d3606e35d311c11edb9891cf40eeeb/81c8e/5_2_4d.png 230w","/static/19d3606e35d311c11edb9891cf40eeeb/08a84/5_2_4d.png 460w","/static/19d3606e35d311c11edb9891cf40eeeb/c0255/5_2_4d.png 920w","/static/19d3606e35d311c11edb9891cf40eeeb/b1001/5_2_4d.png 1380w","/static/19d3606e35d311c11edb9891cf40eeeb/161ec/5_2_4d.png 1840w","/static/19d3606e35d311c11edb9891cf40eeeb/75d3b/5_2_4d.png 1966w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/19d3606e35d311c11edb9891cf40eeeb/c0255/5_2_4d.png","alt":"5 2 4d","title":"5 2 4d","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yksi tapa korjata ongelma on kopioida uuden listan kaikki alkiot takaisin vanhaan listaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kasvata_kaikkia"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n uusilista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n uusilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kopioidaan vanhaan listaan uuden listan arvot"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" uusilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa on olemassa myös ovela tapa sijoittaa monta alkiota kerrallaan listaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" lista\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkissä siis sijoitetaan \"osalistaan\" eli listan kohtiin 1 ja 2 taulukollinen alkioita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Osalistaksi voidaan myös valita koko lista:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"99"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"98"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"97"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" lista\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"99"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"98"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"97"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eli näin tulee korvatuksi koko vanhan listan sisältö. Siispä eräs toimiva versio funktiosta näyttää seuraavalta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kasvata_kaikkia"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n uusilista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n uusilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" uusilista"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"...tai ilman listan kopiontia yksinkertaisesti sijoittamalla uudet arvot heti vanhaan listaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kasvata_kaikkia"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Alkiot tuplana","tmcname":"osa05-06a_alkiot_tuplana"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tuplaa_alkiot(luvut: list)"}]},{"type":"text","value":", joka saa parametrikseen lukuja sisältävän listan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa uuden listan, jossa alkuperäisen listan alkiot on kerrottu kahdella. Funkto "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" saa muuttaa alkuperäistä listaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n tuplaluvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tuplaa_alkiot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"alkuperäinen:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tuplattu:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tuplaluvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"alkuperäinen: [2, 4, 5, 3, 11, -4]\ntuplattu: [4, 8, 10, 6, 22, -8]"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Poista pienin","tmcname":"osa05-06b_poista_pienin"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"poista_pienin(luvut: list)"}]},{"type":"text","value":", joka saa parametrikseen lukuja sisältävän listan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio etsii ja poistaa listasta pienimmän alkion. Voit olettaa, että pienin alkio esiintyy listassa vain kerran."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio ei siis palauta mitään, vaan muokkaa parametrinaan saamaansa listaa!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n poista_pienin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[2, 4, 6, 3, 5]"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sudoku: ruudukon tulostus ja luvun lisäys","tmcname":"osa05-07_sudoku_osa5"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä toteutetaan vielä kaksi funktiota sudokua varten: "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisays"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta"}]},{"type":"text","value":" saa parametriksi sudokuruudukkoa esittävän kaksiulotteisen listan ja tulostaa sen alla olevan esimerkkitulostuksen mukaisessa muodossa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisays(sudoku: list, rivi_nro: int, sarake_nro: int, luku:int)"}]},{"type":"text","value":" saa parametriksi sudokuruudukkoa esittävän kaksiulotteisen listan, rivi- ja sarakenumerot sekä luvun väliltä 1–9. Funktio lisää luvun parametrien ilmoittamaan kohtaan sudokuruudukkoa."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sudoku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\ntulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kolme numeroa lisätty:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n\nKolme numeroa lisätty:\n\n2 _ _ _ _ _ _ _ _\n_ _ 7 _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ 3 _\n\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vihje"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Saatat tässä tehtävässä hyötyä siitä, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komentoa on mahdollista käyttää myös siten, että se ei aiheuta rivinvaihtoa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"merkkejä \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" end"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ilman välejä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" end"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"merkkejä ilman välejä"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joskus taas tarvitaan pelkkää rivinvaihtoa, ja se onnistuu seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sudoku: luvun lisäys ruudukon kopioon","tmcname":"osa05-08_sudoku_osa6"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Viimeisessä sudokua käsittelevässä tehtävässä toteutetaan hieman erilainen versio funktiosta, jonka avulla sudokuruudukkoon lisätään uusia lukuja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kopioi_ja_lisaa(sudoku: list, rivi_nro: int, sarake_nro: int, luku:int)"}]},{"type":"text","value":" saa parametreikseen sudokuruudukkoa esittävän kaksiulotteisen listan, rivinumeron, sarakenumeron sekä luvun väliltä 1–9. Funktio "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"palauttaa"}]},{"type":"text","value":" parametrina saadusta sudokuruudukosta "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kopion"}]},{"type":"text","value":", johon on lisätty parametrina saatu luku parametrina saatuun sijaintiin sijoitettuna. Funktio "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei saa muuttaa"}]},{"type":"text","value":" parametrina annettua sudokuruudukkoa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on edellisen tehtävän funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta"}]},{"type":"text","value":" hyödyntävä käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sudoku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nkopio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kopioi_ja_lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Alkuperäinen:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kopio:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kopio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Alkuperäinen:\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n\nKopio:\n2 _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vihje"}]},{"type":"text","value":" tässä tehtävässä pitää olla tarkkana mitä kaikkea tulee kopioida, ja mihin lisäys lopulta kohdistuu. Kuten yleensäkin, "},{"type":"element","tagName":"a","properties":{"href":"http://www.pythontutor.com/visualize.html#mode=edit","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"visualisaattori"}]},{"type":"text","value":" auttaa myös nyt. Sudokuruudukon koon takia näkymä tosin on hieman normaalia sekavampi."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Ristinolla","tmcname":"osa05-09_ristinolla"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ristinollaa pelataan 3 x 3 -kokoisella ruudukolla, johon pelaajat merkitsevät vuorotellen ristin tai nollan. Pelin voittaa se pelaaja, joka saa ensimmäisenä kolme merkkiä pystyyn, vaakaan tai kulmittain. Peli päättyy tasapeliin, jos kumpikaan pelaaja ei saa kolmen sarjaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pelaa_siirto(lauta: list, x: int, y: int, nappula: str)"}]},{"type":"text","value":", jossa sijoitetaan annettu pelinappula annettuihin koordinaatteihin pelilaudalla. Koordinaattien arvot ovat väliltä 0..2."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huomaa"}]},{"type":"text","value":" että tässä tehtävässä parametrit ovat eri päin kuin sudokussa, ensin annetaan saraketta kuvaava "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":" ja sen jälkeen riviä kuvaava "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"y"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelilauta koostuu merkkijonoista seuraavasti:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":": tyhjä ruutu"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"X\""}]},{"type":"text","value":": pelaajan 1 merkki"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"O\""}]},{"type":"text","value":": pelaajan 2 merkki"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", jos nappula saatiin sijoitettua laudalle (eli jos paikka oli tyhjä), ja arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":", jos paikka oli varattu TAI jos koordinaatin arvo oli liian pieni tai suuri (eli ei väliltä 0..2)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lauta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pelaa_siirto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lauta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"X\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lauta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\n[['', '', 'X'], ['', '', ''], ['', '', '']]"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Matriisin kääntö","tmcname":"osa05-10_matriisin_kaanto"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"transponoi(matriisi: list)"}]},{"type":"text","value":", joka saa parametrikseen kaksiulotteisen kokonaislukuja sisältävän taulukon eli matriisin. Funktio "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"transponoi"}]},{"type":"text","value":" matriisin eli muuntaa rivit sarakkeiksi ja päinvastoin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa, että matriisissa on yhtä monta riviä kuin sarakettakin (eli matriisi on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"neliömatriisi"}]},{"type":"text","value":")."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi matriisista"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tulisi transponoinnin jälkeen tällainen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio ei palauta mitään, vaan muokkaa parametrinaan saamaansa matriisia."}]}]},{"type":"element","tagName":"h2","properties":{"id":"funktioiden-sivuvaikutukset","style":"position:relative;"},"children":[{"type":"text","value":"Funktioiden sivuvaikutukset"},{"type":"element","tagName":"a","properties":{"href":"#funktioiden-sivuvaikutukset","ariaLabel":"funktioiden sivuvaikutukset permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska funktio saa parametrinaan viittauksen listaan, se voi muuttaa tätä listaa. Jos funktion varsinaisena tarkoituksena ei ole muuttaa listaa, muutokset voivat aiheuttaa ongelmia toisaalla ohjelmassa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkinä funktiota, jonka tarkoituksena on etsiä listan toiseksi pienin alkio:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"toiseksi_pienin"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# järjestetyn listan toiseksi pienin alkio on kohdassa 1"}]},{"type":"text","value":"\n lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sort"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nluvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"toiseksi_pienin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"text","value":"\n2\n[1, 2, 3, 4, 4, 5, 6, 7]\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio kyllä etsii ja löytää toiseksi pienimmän alkion, mutta sen lisäksi se muuttaa listan alkioiden järjestyksen. Jos järjestyksellä on merkitystä muualla ohjelmassa, funktion kutsuminen voi aiheuttaa virheitä. Esimerkin kaltaista muutosta viittauksena saatuun olioon kutsutaan funktion "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"sivuvaikutukseksi"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme toteuttaa funktion ilman sivuvaikutuksia näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"toiseksi_pienin"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n kopio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" kopio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nluvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"toiseksi_pienin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2\n[1, 4, 2, 5, 3, 6, 4, 7]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sorted"}]},{"type":"text","value":" palauttaa uuden järjestetyn listan, toiseksi pienimmän alkion etsiminen ei enää sotke listan alkuperäistä järjestystä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Usein pidetään hyvänä asiana, että funktiot eivät aiheuta sivuvaikutuksia, sillä sivuvaikutukset voivat hankaloittaa ohjelmien toimivuuden varmistamista."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sivuvaikutuksettomia funktioita kutsutaan myös "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"puhtaiksi funktioiksi"}]},{"type":"text","value":" ja erityisesti funktionaalista ohjelmointityyliä käytettäessä funktiot pyritään rakentamaan näin. Palaamme aiheeseen tarkemmin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Ohjelmoinnin jatkokurssilla"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"7384687a-fe87-53d4-be99-05a98f5e467e"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, mitä tarkoitetaan viittaustyyppisellä muuttujalla
  • \n
  • Tiedät, että samaan olioon voi olla useampia viittauksia
  • \n
  • Osaat käyttää listoja funktioiden parametreina
  • \n
  • Tiedät, mitä tarkoitetaan funktion sivuvaikutuksella
  • \n

Olemme tähän asti ajatelleet, että muuttuja on eräänlainen \"laatikko\", joka sisältää muuttujan arvon. Teknisesti ottaen tämä ei pidä paikkaansa Pythonissa: muuttujat eivät sisällä arvoa vaan ne viittaavat arvona olevaan olioon, kuten lukuun, merkkijonoon tai listaan.

Käytännössä tämä tarkoittaa, että muuttujaan ei tallenneta arvoa, vaan tieto siitä paikasta, mistä muuttujan arvo löytyy.

Viittausta voidaan kuvata nuolena muuttujasta sen varsinaiseen arvoon:

\n \n \n \n \n \n \"5\n \n \n

Listaa voidaan käsitellä kumman tahansa viittauksen avulla:

lista = [1, 2, 3, 4]\nlista2 = lista\n\nlista[0] = 10\nlista2[1] = 20\n\nprint(lista)\nprint(lista2)

[10, 20, 3, 4]\n[10, 20, 3, 4]

Mikäli samaan listaan on useampia viittauksia, sitä voidaan käsitellä minkä tahansa viittauksen kautta samalla tavalla. Toisaalta yhden viittauksen kautta tehtävä muutos heijastuu myös muihin viittauksiin.

Visualisaattori näyttää jälleen selkeästi mitä ohjelmassa tapahtuu:

\n \n \n \n \n \n \"5\n \n \n

Listan kopiointi

Jos haluamme tehdä listasta erillisen kopion, voimme luoda uuden listan ja lisätä siihen jokaisen aluperäisen listan alkion:

lista = [1, 2, 3, 3, 5]\n\nkopio = []\nfor alkio in lista:\n    kopio.append(alkio)\n\nkopio[0] = 10\nkopio.append(6)\nprint(\"lista\", lista)\nprint(\"kopio\", kopio)

lista [1, 2, 3, 3, 5]\nkopio [10, 2, 3, 3, 5, 6]

Visualisaattorilla tarkastellen kopiointi näyttää seuraavalta:

\n \n \n \n \n \n \"5\n \n \n

Muuttuja kopio siis viittaa nyt eri listaan kuin muuttuja lista.

Helpompi tapa listan kopioimiseen on hyödyntää []-operaattoria, johon tutustuimme aiemmin kurssilla. Merkintä [:] tarkoittaa, että listalta valitaan kaikki alkiot, ja tämän sivuvaikutuksena syntyy kopio listasta:

lista = [1,2,3,4]\nkopio = lista[:]\n\nlista[0] = 10\nkopio[1] = 20\n\nprint(lista)\nprint(kopio)

[10, 2, 3, 4]\n[1, 20, 3, 4]

Lista funktion parametrina

Kun lista välitetään parametrina funktiolle, välitetään viittaus listaan. Tämä tarkoittaa, että funktio voi muuttaa parametrinaan saamaansa listaa.

Esimerkiksi seuraava funktio lisää uuden alkion parametrinaan saamaansa listaan:

def lisaa_alkio(lista: list):\n    uusi_alkio = 10\n    lista.append(uusi_alkio)\n\nlista = [1,2,3]\nprint(lista)\nlisaa_alkio(lista)\nprint(lista)
\n[1, 2, 3]\n[1, 2, 3, 10]\n

Huomaa, että funktio lisaa_alkio ei palauta mitään, vaan muuttaa parametrinaan saamaansa listaa.

Visualisaattori havainnollistaa tilanteen seuraavasti:

\n \n \n \n \n \n \"5\n \n \n

Global frame tarkoittaa pääohjelman muuttujia ja sinisellä oleva laatikko lisaa_alkio taas funktion parametreja ja muuttujia. Kuten visualisaatio havainnollistaa, funktio viittaa samaan listaan mihin pääohjelmakin viittaa, eli funktiossa listalle tehtävät muutokset näkyvät pääohjelmaan.

Toinen tapa olisi luoda uusi lista ja palauttaa se:

def lisaa_alkio(lista: list) -> list:\n    uusi_alkio = 10\n    kopio = lista[:]\n    kopio.append(uusi_alkio)\n    return kopio\n\nluvut = [1, 2, 3]\nluvut2 = lisaa_alkio(luvut)\n\nprint(\"Alkuperäinen lista:\", luvut)\nprint(\"Uusi lista:\", luvut2)

Alkuperäinen lista: [1, 2, 3]\nUusi lista: [1, 2, 3, 10]

Jos et ole 100% varma mitä koodissa tapahtuu, käy sen toiminta läpi visualisaattorilla!

Parametrina olevan listan muokkaaminen

Seuraavassa on yritys tehdä funktio, joka kasvattaa parametrina saamansa listan jokaista alkiota kymmenellä:

def kasvata_kaikkia(lista: list):\n    uusilista = []\n    for alkio in lista:\n        uusilista.append(alkio + 10)\n    lista = uusilista\n\nluvut = [1, 2, 3]\nprint(\"alussa \",luvut)\nkasvata_kaikkia(luvut)\nprint(\"funktion jälkeen\", luvut)

alussa: [1, 2, 3]\nfunktion jälkeen: [1, 2, 3]

Jostain syystä funktio ei kuitenkaan näytä toimivan. Mistä on kyse?

Funktiolle on välitetty parametrina viite muutettavaan listaan. Sijoitus lista = uusilista saa aikaan sen, että parametriin talletettu viite muuttaa arvoaan funktion sisällä eli se alkaa viitata funktion sisällä luotuun uuteen listaan. Sijoitus ei kuitenkaan vaikuta funktion ulkopuolelle, siellä viitataan edelleen alkuperäiseen listaan.

Seuraava kuvasarja havainnollistaa, mihin eri muuttujat viittaavat ohjelman suorituksen aikana:

\n \n \n \n \n \n \"5\n \n \n

Funktion sisällä muutettu lista siis \"kadotetaan\" kun funktiosta palataan, ja muuttuja luvut viittaa koko ajan alkuperäiseen listaan.

Visualisaattori on tässäkin tapauksessa ystävä: se näyttää selkeästi, miten funktio ei koske alkuperäiseen listaan ollenkaan vaan luo uuden listan, johon muutokset tehdään:

\n \n

Tee funktio tuplaa_alkiot(luvut: list), joka saa parametrikseen lukuja sisältävän listan.

Funktio palauttaa uuden listan, jossa alkuperäisen listan alkiot on kerrottu kahdella. Funkto ei saa muuttaa alkuperäistä listaa.

Esimerkki funktion kutsumisesta:

if __name__ == \"__main__\":\n    luvut = [2, 4, 5, 3, 11, -4]\n    tuplaluvut = tuplaa_alkiot(luvut)\n    print(\"alkuperäinen:\", luvut)\n    print(\"tuplattu:\", tuplaluvut)

alkuperäinen: [2, 4, 5, 3, 11, -4]\ntuplattu: [4, 8, 10, 6, 22, -8]

Tee funktio poista_pienin(luvut: list), joka saa parametrikseen lukuja sisältävän listan.

Funktio etsii ja poistaa listasta pienimmän alkion. Voit olettaa, että pienin alkio esiintyy listassa vain kerran.

Funktio ei siis palauta mitään, vaan muokkaa parametrinaan saamaansa listaa!

Esimerkki funktion kutsumisesta:

if __name__ == \"__main__\":\n    luvut = [2, 4, 6, 1, 3, 5]\n    poista_pienin(luvut)\n    print(luvut)

[2, 4, 6, 3, 5]

Tässä tehtävässä toteutetaan vielä kaksi funktiota sudokua varten: tulosta ja lisays.

Funktio tulosta saa parametriksi sudokuruudukkoa esittävän kaksiulotteisen listan ja tulostaa sen alla olevan esimerkkitulostuksen mukaisessa muodossa.

Funktio lisays(sudoku: list, rivi_nro: int, sarake_nro: int, luku:int) saa parametriksi sudokuruudukkoa esittävän kaksiulotteisen listan, rivi- ja sarakenumerot sekä luvun väliltä 1–9. Funktio lisää luvun parametrien ilmoittamaan kohtaan sudokuruudukkoa.

sudoku  = [\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0]\n]\n\ntulosta(sudoku)\nlisays(sudoku, 0, 0, 2)\nlisays(sudoku, 1, 2, 7)\nlisays(sudoku, 5, 7, 3)\nprint()\nprint(\"Kolme numeroa lisätty:\")\nprint()\ntulosta(sudoku)
\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n\nKolme numeroa lisätty:\n\n2 _ _  _ _ _  _ _ _\n_ _ 7  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ 3 _\n\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n\n

Vihje

Saatat tässä tehtävässä hyötyä siitä, että print-komentoa on mahdollista käyttää myös siten, että se ei aiheuta rivinvaihtoa:

print(\"merkkejä \", end=\"\")\nprint(\"ilman välejä\", end=\"\")

merkkejä ilman välejä

Joskus taas tarvitaan pelkkää rivinvaihtoa, ja se onnistuu seuraavasti:

print()

Viimeisessä sudokua käsittelevässä tehtävässä toteutetaan hieman erilainen versio funktiosta, jonka avulla sudokuruudukkoon lisätään uusia lukuja.

Funktio kopioi_ja_lisaa(sudoku: list, rivi_nro: int, sarake_nro: int, luku:int) saa parametreikseen sudokuruudukkoa esittävän kaksiulotteisen listan, rivinumeron, sarakenumeron sekä luvun väliltä 1–9. Funktio palauttaa parametrina saadusta sudokuruudukosta kopion, johon on lisätty parametrina saatu luku parametrina saatuun sijaintiin sijoitettuna. Funktio ei saa muuttaa parametrina annettua sudokuruudukkoa.

Seuraavassa on edellisen tehtävän funktiota tulosta hyödyntävä käyttöesimerkki:

sudoku  = [\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0]\n]\n\nkopio = kopioi_ja_lisaa(sudoku, 0, 0, 2)\nprint(\"Alkuperäinen:\")\ntulosta(sudoku)\nprint()\nprint(\"Kopio:\")\ntulosta(kopio)
\nAlkuperäinen:\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n\nKopio:\n2 _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n\n

Vihje tässä tehtävässä pitää olla tarkkana mitä kaikkea tulee kopioida, ja mihin lisäys lopulta kohdistuu. Kuten yleensäkin, visualisaattori auttaa myös nyt. Sudokuruudukon koon takia näkymä tosin on hieman normaalia sekavampi.

Ristinollaa pelataan 3 x 3 -kokoisella ruudukolla, johon pelaajat merkitsevät vuorotellen ristin tai nollan. Pelin voittaa se pelaaja, joka saa ensimmäisenä kolme merkkiä pystyyn, vaakaan tai kulmittain. Peli päättyy tasapeliin, jos kumpikaan pelaaja ei saa kolmen sarjaa.

Kirjoita funktio pelaa_siirto(lauta: list, x: int, y: int, nappula: str), jossa sijoitetaan annettu pelinappula annettuihin koordinaatteihin pelilaudalla. Koordinaattien arvot ovat väliltä 0..2.

Huomaa että tässä tehtävässä parametrit ovat eri päin kuin sudokussa, ensin annetaan saraketta kuvaava x ja sen jälkeen riviä kuvaava y.

Pelilauta koostuu merkkijonoista seuraavasti:

    \n
  • \"\": tyhjä ruutu
  • \n
  • \"X\": pelaajan 1 merkki
  • \n
  • \"O\": pelaajan 2 merkki
  • \n

Funktio palauttaa arvon True, jos nappula saatiin sijoitettua laudalle (eli jos paikka oli tyhjä), ja arvon False, jos paikka oli varattu TAI jos koordinaatin arvo oli liian pieni tai suuri (eli ei väliltä 0..2).

Esimerkiksi:

lauta = [[\"\", \"\", \"\"], [\"\", \"\", \"\"], [\"\", \"\", \"\"]]\nprint(pelaa_siirto(lauta, 2, 0, \"X\"))\nprint(lauta)

True\n[['', '', 'X'], ['', '', ''], ['', '', '']]

Kirjoita funktio transponoi(matriisi: list), joka saa parametrikseen kaksiulotteisen kokonaislukuja sisältävän taulukon eli matriisin. Funktio transponoi matriisin eli muuntaa rivit sarakkeiksi ja päinvastoin.

Voit olettaa, että matriisissa on yhtä monta riviä kuin sarakettakin (eli matriisi on neliömatriisi).

Esimerkiksi matriisista

1 2 3\n4 5 6\n7 8 9

tulisi transponoinnin jälkeen tällainen:

1 4 7\n2 5 8\n3 6 9

Funktio ei palauta mitään, vaan muokkaa parametrinaan saamaansa matriisia.

Funktioiden sivuvaikutukset

Koska funktio saa parametrinaan viittauksen listaan, se voi muuttaa tätä listaa. Jos funktion varsinaisena tarkoituksena ei ole muuttaa listaa, muutokset voivat aiheuttaa ongelmia toisaalla ohjelmassa.

Tarkastellaan esimerkkinä funktiota, jonka tarkoituksena on etsiä listan toiseksi pienin alkio:

def toiseksi_pienin(lista: list) -> int:\n    # järjestetyn listan toiseksi pienin alkio on kohdassa 1\n    lista.sort()\n    return lista[1]\n\nluvut = [1, 4, 2, 5, 3, 6, 4, 7]\nprint(toiseksi_pienin(luvut))\nprint(luvut)
\n2\n[1, 2, 3, 4, 4, 5, 6, 7]\n

Funktio kyllä etsii ja löytää toiseksi pienimmän alkion, mutta sen lisäksi se muuttaa listan alkioiden järjestyksen. Jos järjestyksellä on merkitystä muualla ohjelmassa, funktion kutsuminen voi aiheuttaa virheitä. Esimerkin kaltaista muutosta viittauksena saatuun olioon kutsutaan funktion sivuvaikutukseksi.

Voimme toteuttaa funktion ilman sivuvaikutuksia näin:

def toiseksi_pienin(lista: list) -> int:\n    kopio = sorted(lista)\n    return kopio[1]\n\nluvut = [1, 4, 2, 5, 3, 6, 4, 7]\nprint(toiseksi_pienin(luvut))\nprint(luvut)

2\n[1, 4, 2, 5, 3, 6, 4, 7]

Koska funktio sorted palauttaa uuden järjestetyn listan, toiseksi pienimmän alkion etsiminen ei enää sotke listan alkuperäistä järjestystä.

Usein pidetään hyvänä asiana, että funktiot eivät aiheuta sivuvaikutuksia, sillä sivuvaikutukset voivat hankaloittaa ohjelmien toimivuuden varmistamista.

Sivuvaikutuksettomia funktioita kutsutaan myös puhtaiksi funktioiksi ja erityisesti funktionaalista ohjelmointityyliä käytettäessä funktiot pyritään rakentamaan näin. Palaamme aiheeseen tarkemmin Ohjelmoinnin jatkokurssilla.

","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-5/2-viittaukset.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä tarkoitetaan viittaustyyppisellä muuttujalla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, että samaan olioon voi olla useampia viittauksia"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää listoja funktioiden parametreina"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä tarkoitetaan funktion sivuvaikutuksella"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olemme tähän asti ajatelleet, että muuttuja on eräänlainen \"laatikko\", joka sisältää muuttujan arvon. Teknisesti ottaen tämä ei pidä paikkaansa Pythonissa: muuttujat eivät sisällä arvoa vaan ne "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"viittaavat"}]},{"type":"text","value":" arvona olevaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"olioon"}]},{"type":"text","value":", kuten lukuun, merkkijonoon tai listaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käytännössä tämä tarkoittaa, että muuttujaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei tallenneta"}]},{"type":"text","value":" arvoa, vaan tieto siitä paikasta, mistä muuttujan arvo löytyy."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Viittausta voidaan kuvata nuolena muuttujasta sen varsinaiseen arvoon:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 261px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/8687855d3e59d8151e4fce49ec9669b0/edf96/5_2_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 30.869565217391305%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA1ElEQVQY041ROQ6EQAyb7/MBfsA/aCgoEHQcDQ2XOMQlxI1XzgqKbdhIljzJ2JNk1DiOKIoCdV1jnmfEcYymaZBlmSBJEjDO88R1Xa9Qx3FgWRYRMUHTaZoE5Kwx/2+om7yJ+AA7b9tWprl5VVXCu66TiaRDgoY3v8FI0xR93z8idlyWpRhxAtaZZ5imCUXXKIpkj77vCyeCIECe59A0Dbquyw7XdX0m4e750L7vgm3b4Lrut0MeeJGiXwzDIAb8LM/zEIYhbNuG4zjCLcuSPOuGYeADgRnJTrwaxUwAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8687855d3e59d8151e4fce49ec9669b0/a0b58/5_2_1.webp 230w","/static/8687855d3e59d8151e4fce49ec9669b0/ad293/5_2_1.webp 261w"],"sizes":"(max-width: 261px) 100vw, 261px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8687855d3e59d8151e4fce49ec9669b0/81c8e/5_2_1.png 230w","/static/8687855d3e59d8151e4fce49ec9669b0/edf96/5_2_1.png 261w"],"sizes":"(max-width: 261px) 100vw, 261px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/8687855d3e59d8151e4fce49ec9669b0/edf96/5_2_1.png","alt":"5 2 1","title":"5 2 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Viittaus siis kertoo, mistä varsinainen arvo löytyy. Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"id"}]},{"type":"text","value":" kertoo, mihin muuttuja viittaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"id"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nb "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tämäkin on viittaus\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"id"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4538357072\n4537788912"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Viittaus eli muuttujan id on kokonaisluku, jonka voi ajatella olevan muuttujan arvon sijainnin osoite tietokoneen muistissa. Huomaa, että jos suoritat yllä olevan koodin omalla koneellasi, tulos on luultavasti erilainen, koska muuttujilla on eri viitteet."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten jo "},{"type":"element","tagName":"a","properties":{"href":"/osa-5/1-lisaa-listoja#sisakkaisia-listoja-kayttavan-koodin-visualisointi"},"children":[{"type":"text","value":"edellisen osan"}]},{"type":"text","value":" esimerkistä näimme, Python Tutorin visualisaattori näyttää viitteet \"nuolina\" varsinaiseen sisältöön. Visualisaattori kuitenkin \"huijaa\" merkkijonojen tapauksessa ja näyttää ne ikään kuin merkkijonon sisältö olisi tallennettu muuttujan sisälle:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/9d19433a6bc55bf386a8fbcc572dba74/94cea/5_2_1a.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 29.565217391304348%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA2klEQVQY00VQ207EIBDt//+ZzxoT48boBsEs2wKlMMBcMFLbPQ/nYeZcMjP1f0jvnYhDiBkKsxzzTkRhYNs2GCAiZhaR6RQx87yE67e18yryMCPiPM/OeQBgZiKSASI6zCKQkzFaqS+AlNJWaz02jyCAzEyttZyrSJ/2GEbEAj7Eq7J3F1trxLwbakNjw8999bHdfK7IUHLKtvcyRbcsi3POneqzkEdnyvXlYp7f9dunff24xUxQVx+eAC4TIRIRIhpjtNaDtFLKey/y9whmqZWgVCgtl7ZfsfMv95hb032qZjcAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/9d19433a6bc55bf386a8fbcc572dba74/a0b58/5_2_1a.webp 230w","/static/9d19433a6bc55bf386a8fbcc572dba74/bc10c/5_2_1a.webp 460w","/static/9d19433a6bc55bf386a8fbcc572dba74/966d8/5_2_1a.webp 920w","/static/9d19433a6bc55bf386a8fbcc572dba74/445df/5_2_1a.webp 1380w","/static/9d19433a6bc55bf386a8fbcc572dba74/78de1/5_2_1a.webp 1840w","/static/9d19433a6bc55bf386a8fbcc572dba74/0dc73/5_2_1a.webp 1940w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/9d19433a6bc55bf386a8fbcc572dba74/81c8e/5_2_1a.png 230w","/static/9d19433a6bc55bf386a8fbcc572dba74/08a84/5_2_1a.png 460w","/static/9d19433a6bc55bf386a8fbcc572dba74/c0255/5_2_1a.png 920w","/static/9d19433a6bc55bf386a8fbcc572dba74/b1001/5_2_1a.png 1380w","/static/9d19433a6bc55bf386a8fbcc572dba74/161ec/5_2_1a.png 1840w","/static/9d19433a6bc55bf386a8fbcc572dba74/94cea/5_2_1a.png 1940w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/9d19433a6bc55bf386a8fbcc572dba74/c0255/5_2_1a.png","alt":"5 2 1a","title":"5 2 1a","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Näin ei kuitaan ole todellisuudessa, vaan merkkijonotkin käsitellään Pythonin sisäisissä rakenteissa samaan tapaan kuin listat."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Monet Pythonin sisäänrakennetut tyypit, kuten "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"str"}]},{"type":"text","value":", ovat "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"muuttumattomia"}]},{"type":"text","value":". Tämä tarkoittaa, että olion arvo ei voi koskaan muuttua. Sen sijaan arvo voidaan korvata uudella arvolla:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 281px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/e24d125e0a5ab22b6d68096ab4edaa6d/6b1e2/5_2_2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 85.65217391304348%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAAAsTAAALEwEAmpwYAAABpklEQVQ4y52UWYsCQQyE+2eL/8xnQVAQHxXvA+/7vq3lC2TpHca9AmEy6e50qiozYblcqtfrqd/vazabab/f63A4qNvtqtlsajqd6nQ6CXu9Xj96oACFFouF1uu1rterHo+HFaEY6775Nxb0B9tut1qtVnbxZrMxJ8ZBejweFW63m0E8n8/WHc4CTpcUqdVqtmc+n4v98R7iy+Wi+/2uyWSi0Ol0lMvlVCgUVCqVLAl3rVbLeKxWq8pms2IfBdzG47HlYoM2g+y84e8MDkejkcEDNg5Mj8lbh0myXYDn8/npnudCIDvsOPamgm92o8A7RTnA+ndIAqMBZ41GQ4PBwMaE9uGw3W5bHmjkd7udjRhCvZvLLyqjlsN0lV1B/N9z+A4yl/vFziGxO2vWIfOFIzvvaXwSc8ARsA8UPJ1XEwU+isWi8vm8yuWyjcZwOLQb446BHOc4zJeSFCgVMp3ydfDDiDuGU4RBIP+JuFj+DGlKuUFDvV43xZkEOiKH6sT+bfOOMwEhrViycKVSUSaTsWJuFEpSkwo5LhTHHIQKN+DyTt4bgOcPk2YlBJdlLTcAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/e24d125e0a5ab22b6d68096ab4edaa6d/a0b58/5_2_2.webp 230w","/static/e24d125e0a5ab22b6d68096ab4edaa6d/f44a8/5_2_2.webp 281w"],"sizes":"(max-width: 281px) 100vw, 281px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/e24d125e0a5ab22b6d68096ab4edaa6d/81c8e/5_2_2.png 230w","/static/e24d125e0a5ab22b6d68096ab4edaa6d/6b1e2/5_2_2.png 281w"],"sizes":"(max-width: 281px) 100vw, 281px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/e24d125e0a5ab22b6d68096ab4edaa6d/6b1e2/5_2_2.png","alt":"5 2 2","title":"5 2 2","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa on myös tyyppejä, jotka ovat muuttuvia. Esimerkiksi listan sisältö voi muuttua ilman, että tarvitsee luoda kokonaan uusi lista:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 271px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/8b07a257ace229cc26a5eedf03a60986/5fce1/5_2_3.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 70.43478260869564%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsTAAALEwEAmpwYAAABeUlEQVQ4y5WT66rCQAyE9337w8eT/hEfQVCs4K2iWO+1VevdyDewBxE91EDYbHZ3Opmkbj6fWxzH1uv1bDab2Xa7tTzPLUkSW61WtlgslJ9Op4bd73d7PB5f3RVFIQB8v98rebvd7HA42G63U471eDxaGXP2g202G1WwXq/l7zHn7nK5iAFMKQd2+PV61Up+MBjY6XRS6TBFCkCIAVkul6qIveNStVq1Wq2mi/1+37rdrpy42WxapVKRzoB7KXgMkM/RC5XsNYPpu+AYTHH24/FYmtIw3APRMD5C2c4/xD517fUMVoDA6puXbsor+L9dRsPRaGTD4VDUKQtt/LiwZ6TKzKDmkId+HNI0tSzLBISmOGDn87n0aP1UMqMDOOu32NFB3+FPxgTAnBVZqAaJkIL8ZDLR3g+4o+1hGFq9XtccMn+dTkdO3Gg0LAgCgdFFAACCAHJABnZIppL5MgckiCmNy74BXIYVZ61WS38Na7vd1keiKPrLs38CMo80d8OuAIYAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8b07a257ace229cc26a5eedf03a60986/a0b58/5_2_3.webp 230w","/static/8b07a257ace229cc26a5eedf03a60986/cadab/5_2_3.webp 271w"],"sizes":"(max-width: 271px) 100vw, 271px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/8b07a257ace229cc26a5eedf03a60986/81c8e/5_2_3.png 230w","/static/8b07a257ace229cc26a5eedf03a60986/5fce1/5_2_3.png 271w"],"sizes":"(max-width: 271px) 100vw, 271px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/8b07a257ace229cc26a5eedf03a60986/5fce1/5_2_3.png","alt":"5 2 3","title":"5 2 3","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hieman yllättäen myös lukuja ja totuusarvoja edustavat perustietotyypit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"int"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"float"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"bool"}]},{"type":"text","value":" ovat muuttumattomia. Tarkastellaan esimerkkinä seuraavaa koodia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaikka vaikuttaa siltä, että koodi muuttaa lukua, teknisesti ottaen ei näin ole, vaan jokainen komento luo uuden luvun."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavan ohjelman tulostus on mielenkiintoinen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"id"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"id"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\na "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"id"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4535856912\n4535856944\n4535856912"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aluksi muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku"}]},{"type":"text","value":" viittaa paikkaan 4535856912, ja kun muuttujan arvo muuttuu, se alkaa viitata paikkaan 4535856944. Kun muuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":" sijoitetaan arvo 1, se alkaa viitata samaan paikkaan kuin mihin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku"}]},{"type":"text","value":" viittasi, kun sen arvo oli 1."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaikuttaakin siltä, että Python on tallentanut luvun 1 paikkaan 4535856912 ja aina kun jonkin muuttujan arvona on 1, muuttuja "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"viittaa"}]},{"type":"text","value":" tuohon paikkaan \"tietokoneen muistissa\"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaikka perustietotyypit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"int"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"float"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"bool"}]},{"type":"text","value":" ovat viittauksia, ohjelmoijan ei oikeastaan tarvitse välittää asiasta."}]},{"type":"element","tagName":"h2","properties":{"id":"useampi-viittaus-samaan-listaan","style":"position:relative;"},"children":[{"type":"text","value":"Useampi viittaus samaan listaan"},{"type":"element","tagName":"a","properties":{"href":"#useampi-viittaus-samaan-listaan","ariaLabel":"useampi viittaus samaan listaan permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkinä listamuuttujan arvon kopiointia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nb "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" a\nb"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sijoitus "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b = a"}]},{"type":"text","value":" kopioi muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":" arvon muuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":". On tärkeä kuitenkin huomata, että muuttujan arvona "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei ole lista"}]},{"type":"text","value":" vaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"viittaus listaan"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sijoitus "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b = a"}]},{"type":"text","value":" siis kopioi viittauksen, minkä seurauksena kopioinnin jälkeen samaan listaan on kaksi viittausta:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 271px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/73c7fae5118d6e5b03c576f1a9d14c3f/5fce1/5_2_4.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 129.99999999999997%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAaCAYAAAC3g3x9AAAACXBIWXMAAAsTAAALEwEAmpwYAAACN0lEQVRIx52VV64qQQxEZ60sgC2wJvhhFXwhkMg555zx07FU3FHf0QVeS1aHoctlu9xE4/HYlsulbbdbm06nNpvNjDPm4XBoj8fDGM/n8yOLdrudX8KOx6MDbzYbOxwOvtc3fvzJiOyLsVqtbL1ee0SLxeLXmu8OeLvd7H6/OxNmGfvT6WSdTscul4ungv18PncQ1gCSHiJi74C1Ws0Gg4H1+32rVCq+xxqNhhWLRUun09Zutz0FXCRNXAZIZ5PJ5CdkMQwTzLher26wxSGXR6ORm4AoHk4IO4on+6/E801s/rIo6WI4f1phD5kw9vu9S4WchCAh8FsdojtydD6fHTQJ8CuGSSEnFYcZ6cggABGtdR594p0KogKkQyV7vZ4ba+SGTiVwZ1iv1730fCiXy67BZrNp1WrV8vm8pVIpB0N7qjSs6AydAfYKmQPoarBvtVoODjBag2G32/U8wwqDFXqksAC+Wk/NT4FgS7eo4qEOYSTNwVJrMXXAUqnkLPCEl/jQa/NVlWm9pEthF32kQ/UqplcGB9i7dkxkSEWpIFUmF0o6r/d/dUr8HdQIXx7tk9IQrr96sXlgiYACskbYrJEOxeThdUD9hyhkGbJAX9ls9vV4sGeme3hUkBpgzETigIgXj3hSPhF2oVCwXC5nmUzGv3OR/MIKzSFsgcLOcxhWkT2XKRYOVG0GOoUZ5zgFiDVOiOAVMh4Jl9ai3QCM61JF4Sz+hyb9xs9fIZMX6IddEj5j73T4DynC3t7bOJziAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/73c7fae5118d6e5b03c576f1a9d14c3f/a0b58/5_2_4.webp 230w","/static/73c7fae5118d6e5b03c576f1a9d14c3f/cadab/5_2_4.webp 271w"],"sizes":"(max-width: 271px) 100vw, 271px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/73c7fae5118d6e5b03c576f1a9d14c3f/81c8e/5_2_4.png 230w","/static/73c7fae5118d6e5b03c576f1a9d14c3f/5fce1/5_2_4.png 271w"],"sizes":"(max-width: 271px) 100vw, 271px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/73c7fae5118d6e5b03c576f1a9d14c3f/5fce1/5_2_4.png","alt":"5 2 4","title":"5 2 4","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Listaa voidaan käsitellä kumman tahansa viittauksen avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nlista2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lista\n\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\nlista2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[10, 20, 3, 4]\n[10, 20, 3, 4]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mikäli samaan listaan on useampia viittauksia, sitä voidaan käsitellä minkä tahansa viittauksen kautta samalla tavalla. Toisaalta yhden viittauksen kautta tehtävä muutos heijastuu myös muihin viittauksiin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Visualisaattori näyttää jälleen selkeästi mitä ohjelmassa tapahtuu:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/cf84b632e91094d24c611bd9d800a737/c6720/5_2_4a.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 32.608695652173914%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA30lEQVQY03WQwW7DIAyG8/7vtcsm7bLTTu0ydQmFMMC4CWCbKUyjUaV9Bw6WP/4fhnogpew95FyOQxEBgBBCjPHWSClxY+hLRDR+qtM4T8qu68rMfT5Ns1JXACh/iMij7J1DjIhIRCLSk9u5R4lwzvk3lojuMjMbs2htELGb+6XMLuDXbCDeiOjb2Vq51n3hLqecrF2M0Yjx+OZC/D4uz2/niwbcNutevX+K8UUEB9nLCDGXUpRxp/G62NDb7o1EXEwfFx3X3DJg21zOQYQHa60xxnvfhEpcWerDb9d/+AGpwZhBrvAmDQAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/cf84b632e91094d24c611bd9d800a737/a0b58/5_2_4a.webp 230w","/static/cf84b632e91094d24c611bd9d800a737/bc10c/5_2_4a.webp 460w","/static/cf84b632e91094d24c611bd9d800a737/966d8/5_2_4a.webp 920w","/static/cf84b632e91094d24c611bd9d800a737/445df/5_2_4a.webp 1380w","/static/cf84b632e91094d24c611bd9d800a737/78de1/5_2_4a.webp 1840w","/static/cf84b632e91094d24c611bd9d800a737/da98d/5_2_4a.webp 1922w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/cf84b632e91094d24c611bd9d800a737/81c8e/5_2_4a.png 230w","/static/cf84b632e91094d24c611bd9d800a737/08a84/5_2_4a.png 460w","/static/cf84b632e91094d24c611bd9d800a737/c0255/5_2_4a.png 920w","/static/cf84b632e91094d24c611bd9d800a737/b1001/5_2_4a.png 1380w","/static/cf84b632e91094d24c611bd9d800a737/161ec/5_2_4a.png 1840w","/static/cf84b632e91094d24c611bd9d800a737/c6720/5_2_4a.png 1922w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/cf84b632e91094d24c611bd9d800a737/c0255/5_2_4a.png","alt":"5 2 4a","title":"5 2 4a","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"h2","properties":{"id":"listan-kopiointi","style":"position:relative;"},"children":[{"type":"text","value":"Listan kopiointi"},{"type":"element","tagName":"a","properties":{"href":"#listan-kopiointi","ariaLabel":"listan kopiointi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos haluamme tehdä listasta erillisen kopion, voimme luoda uuden listan ja lisätä siihen jokaisen aluperäisen listan alkion:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nkopio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n kopio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkopio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\nkopio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lista\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kopio\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kopio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"lista [1, 2, 3, 3, 5]\nkopio [10, 2, 3, 3, 5, 6]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Visualisaattorilla tarkastellen kopiointi näyttää seuraavalta:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/66b9f72bbac2f55cd8fac4539ba92dba/e431d/5_2_4b.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 43.04347826086957%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAABYlAAAWJQFJUiTwAAABGElEQVQoz32RzW7DIBCE/f4v1kY99NBTFFWtZMcQ29iADRjvD5WhcXJpPyEOLLM7mq3SHeZkZzdOFpDSEwDg7vgMAFCmOj45H1qpWjlqs4Tgmbm8bxlALBpEJCJmBoCHeJ6ttQZgI0RAfHLEef7GzDFuMW5ETMSImMWcKK5uWW5dd+s6KW/GmEPsQ5S9/q4FIjm3OG9Sgny4OnpP09Q0zfV6XZalGCu+rYsfF/F+blwkF5S1J61frH1lXh+2lVJ13Qgh+r4fxzEb2gkRL3V//pIR2IXZhxpgINr2yQB7EiUGpb3SPqxwpFV8MTPRvoIQtDFv6/pZStU4TcMweO9TSnsD+hXyE+kPqlJTSrVtK6UstxDiWOY/4h8FSwu1d8EohwAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/66b9f72bbac2f55cd8fac4539ba92dba/a0b58/5_2_4b.webp 230w","/static/66b9f72bbac2f55cd8fac4539ba92dba/bc10c/5_2_4b.webp 460w","/static/66b9f72bbac2f55cd8fac4539ba92dba/966d8/5_2_4b.webp 920w","/static/66b9f72bbac2f55cd8fac4539ba92dba/445df/5_2_4b.webp 1380w","/static/66b9f72bbac2f55cd8fac4539ba92dba/78de1/5_2_4b.webp 1840w","/static/66b9f72bbac2f55cd8fac4539ba92dba/609ff/5_2_4b.webp 1882w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/66b9f72bbac2f55cd8fac4539ba92dba/81c8e/5_2_4b.png 230w","/static/66b9f72bbac2f55cd8fac4539ba92dba/08a84/5_2_4b.png 460w","/static/66b9f72bbac2f55cd8fac4539ba92dba/c0255/5_2_4b.png 920w","/static/66b9f72bbac2f55cd8fac4539ba92dba/b1001/5_2_4b.png 1380w","/static/66b9f72bbac2f55cd8fac4539ba92dba/161ec/5_2_4b.png 1840w","/static/66b9f72bbac2f55cd8fac4539ba92dba/e431d/5_2_4b.png 1882w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/66b9f72bbac2f55cd8fac4539ba92dba/c0255/5_2_4b.png","alt":"5 2 4b","title":"5 2 4b","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kopio"}]},{"type":"text","value":" siis viittaa nyt eri listaan kuin muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lista"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Helpompi tapa listan kopioimiseen on hyödyntää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[]"}]},{"type":"text","value":"-operaattoria, johon tutustuimme aiemmin kurssilla. Merkintä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[:]"}]},{"type":"text","value":" tarkoittaa, että listalta valitaan kaikki alkiot, ja tämän sivuvaikutuksena syntyy kopio listasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nkopio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\nkopio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kopio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[10, 2, 3, 4]\n[1, 20, 3, 4]"}]}]},{"type":"element","tagName":"h2","properties":{"id":"lista-funktion-parametrina","style":"position:relative;"},"children":[{"type":"text","value":"Lista funktion parametrina"},{"type":"element","tagName":"a","properties":{"href":"#lista-funktion-parametrina","ariaLabel":"lista funktion parametrina permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun lista välitetään parametrina funktiolle, välitetään viittaus listaan. Tämä tarkoittaa, että funktio voi muuttaa parametrinaan saamaansa listaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraava funktio lisää uuden alkion parametrinaan saamaansa listaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_alkio"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n uusi_alkio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"uusi_alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nlista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"text","value":"\n[1, 2, 3]\n[1, 2, 3, 10]\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_alkio"}]},{"type":"text","value":" ei palauta mitään, vaan muuttaa parametrinaan saamaansa listaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Visualisaattori havainnollistaa tilanteen seuraavasti:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/9be11dea0a28e2151e4f4f7101f82472/764d0/5_2_4c.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 35.65217391304348%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA+UlEQVQY01WO226DMBAF+f9/62P7UFVKq0BCMdgLOOs1e6sITdTO45FGZxp/oKZY6NwN5y6UUlXVzNzdzOZ5jjHmnG93aq1mJiLNYZrqVimm1Lbd5dqP47Qui6oespnpHXcXkWNh5ofMzERrXodhiDGWUojo+WxmtVZEVFUAEOFjbJ7ZiNh1bd9fc17dzf8AAG3bIqK7r+st54KIe7Y9ICKA+dJPMWVmOSKPZ2aBeaFaN1ZYPhDfVIu7NzhDShBjJCJ3Z/GNj95fzP3UTS+vX21YVK1QX8rJrO6ybBsziwgAjGOIcZqmMYSQUlJVkT3hOi7vn98hrf6fH4cdljeAKLvbAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/9be11dea0a28e2151e4f4f7101f82472/a0b58/5_2_4c.webp 230w","/static/9be11dea0a28e2151e4f4f7101f82472/bc10c/5_2_4c.webp 460w","/static/9be11dea0a28e2151e4f4f7101f82472/966d8/5_2_4c.webp 920w","/static/9be11dea0a28e2151e4f4f7101f82472/445df/5_2_4c.webp 1380w","/static/9be11dea0a28e2151e4f4f7101f82472/78de1/5_2_4c.webp 1840w","/static/9be11dea0a28e2151e4f4f7101f82472/b4500/5_2_4c.webp 1898w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/9be11dea0a28e2151e4f4f7101f82472/81c8e/5_2_4c.png 230w","/static/9be11dea0a28e2151e4f4f7101f82472/08a84/5_2_4c.png 460w","/static/9be11dea0a28e2151e4f4f7101f82472/c0255/5_2_4c.png 920w","/static/9be11dea0a28e2151e4f4f7101f82472/b1001/5_2_4c.png 1380w","/static/9be11dea0a28e2151e4f4f7101f82472/161ec/5_2_4c.png 1840w","/static/9be11dea0a28e2151e4f4f7101f82472/764d0/5_2_4c.png 1898w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/9be11dea0a28e2151e4f4f7101f82472/c0255/5_2_4c.png","alt":"5 2 4c","title":"5 2 4c","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Global frame"}]},{"type":"text","value":" tarkoittaa pääohjelman muuttujia ja sinisellä oleva laatikko "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"lisaa_alkio"}]},{"type":"text","value":" taas funktion parametreja ja muuttujia. Kuten visualisaatio havainnollistaa, funktio viittaa samaan listaan mihin pääohjelmakin viittaa, eli funktiossa listalle tehtävät muutokset näkyvät pääohjelmaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen tapa olisi luoda uusi lista ja palauttaa se:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_alkio"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n uusi_alkio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n kopio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n kopio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"uusi_alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" kopio\n\nluvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nluvut2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lisaa_alkio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Alkuperäinen lista:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Uusi lista:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luvut2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Alkuperäinen lista: [1, 2, 3]\nUusi lista: [1, 2, 3, 10]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos et ole 100% varma mitä koodissa tapahtuu, käy sen toiminta läpi visualisaattorilla!"}]},{"type":"element","tagName":"h2","properties":{"id":"parametrina-olevan-listan-muokkaaminen","style":"position:relative;"},"children":[{"type":"text","value":"Parametrina olevan listan muokkaaminen"},{"type":"element","tagName":"a","properties":{"href":"#parametrina-olevan-listan-muokkaaminen","ariaLabel":"parametrina olevan listan muokkaaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on yritys tehdä funktio, joka kasvattaa parametrina saamansa listan jokaista alkiota kymmenellä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kasvata_kaikkia"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n uusilista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n uusilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" uusilista\n\nluvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"alussa \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkasvata_kaikkia"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"funktion jälkeen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"alussa: [1, 2, 3]\nfunktion jälkeen: [1, 2, 3]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jostain syystä funktio ei kuitenkaan näytä toimivan. Mistä on kyse?"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiolle on välitetty parametrina "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"viite"}]},{"type":"text","value":" muutettavaan listaan. Sijoitus "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lista = uusilista"}]},{"type":"text","value":" saa aikaan sen, että parametriin talletettu viite muuttaa arvoaan funktion sisällä eli se alkaa viitata funktion sisällä luotuun uuteen listaan. Sijoitus ei kuitenkaan vaikuta funktion ulkopuolelle, siellä viitataan edelleen alkuperäiseen listaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava kuvasarja havainnollistaa, mihin eri muuttujat viittaavat ohjelman suorituksen aikana:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 442px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/1dd6dd7dab6b2cff3cdbe11741d2b26a/e03bf/5_2_6.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 157.82608695652175%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAgCAYAAAASYli2AAAACXBIWXMAAAsTAAALEwEAmpwYAAACUElEQVRIx5WWx47DMAxE/f9/ldxSEeQQpPfee0+4eAS40BqSkxVAWJat8ZBDUo4kNt7vt/d+NBpJOp2WwWDgfc9G5Nv8er3UuMeYb7dbWS6Xstls5Pl8BkG9gLPZTMbjsZzPZwWaTCYK1u12dX69Xn/fj4NGSS67c2ONhcITZOh++XQ6KeP1eq1scXmxWCh7H2j0SRQ2FwoFyeVyUi6XJZ/PSzablel06gf0sYLNfD5XdsfjUfb7vVwuF12DZaLLLpApizuAmcKAIRKAfOx+v/8SCLocyisGLAFKCo2X4XA4lE6no2xarZasVitlezgc/oTFDVMiIEzYTMyoDABZi4MlAUehnENFYvVpeFX2Ke2CU2qu2ZolubsvmNj2Mm6Th1gmk5FSqSTFYlFSqZTUarX/AbpG/SIQdrvdwi7HgRhs6Pf7KhD5SLXAlLjSIHa7XbBUo1BTsBZlg26D8QFjGGwOIVFsTqXQFOLPgmljC9RppVKRXq+nid1sNjUnzcWv0iakLiAYLtrAVe5NnI+J7TYJmFarVVUXEGqZvkh5Ihhni+8o8KoMICAmAGYdiBBglCSA8VL82GC/GV6XfWpTy3QexCEHOaCoDkTD9Uajoe67exIZ4hJA7XZbgQGp1+t6T4ITY9pdENDAACLvyL/H46HC2FGA8qwluhwXBVdRFEAEoQT5gKkMsFvvXoafxLByjIMkMsQVawSWd6Em+1XpsRmXUBMj8O5vx9el53uAqvaHQMzs/4Y1jlOucdeD3QYhyD3SA3UxADDSiAOMq6/0fgAgpcds34kgXgAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/1dd6dd7dab6b2cff3cdbe11741d2b26a/a0b58/5_2_6.webp 230w","/static/1dd6dd7dab6b2cff3cdbe11741d2b26a/3fa5c/5_2_6.webp 442w"],"sizes":"(max-width: 442px) 100vw, 442px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/1dd6dd7dab6b2cff3cdbe11741d2b26a/81c8e/5_2_6.png 230w","/static/1dd6dd7dab6b2cff3cdbe11741d2b26a/e03bf/5_2_6.png 442w"],"sizes":"(max-width: 442px) 100vw, 442px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/1dd6dd7dab6b2cff3cdbe11741d2b26a/e03bf/5_2_6.png","alt":"5 2 6","title":"5 2 6","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion sisällä muutettu lista siis \"kadotetaan\" kun funktiosta palataan, ja muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luvut"}]},{"type":"text","value":" viittaa koko ajan alkuperäiseen listaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Visualisaattori on tässäkin tapauksessa ystävä: se näyttää selkeästi, miten funktio ei koske alkuperäiseen listaan ollenkaan vaan luo uuden listan, johon muutokset tehdään:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/19d3606e35d311c11edb9891cf40eeeb/75d3b/5_2_4d.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 41.30434782608695%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAABYlAAAWJQFJUiTwAAABLklEQVQY01WQ227bMBBE/f/fFgRFAhQwEECuK9GWaZCWRHGXe20UJW1znvblDGb24B+oKCKkPJ9+j+GaEFtrzczcHRFzzsuyAAARMbOZiYiZHT5l1VLK+Xy+Xq8xxnVdAUBE3H2PEBEiMrM9VFW/ZFNuqGYppRhjCGGeZyJqrbk7MwNirRURVTWlTMTywS4bE6Wcp2kqpQCA/wc2jLfbJYTW0Mzm+bGu8571WZuZh2Houm4YhtPptNfeCzfiqUBMU1m30FKOtb66q7sfmBoiAoCqNJJ7Xqfyb5W7L5V+HPvnn79CqhVpKT1iZ1Y2uU4bj8cDAJi3McxMRNshYqoF5diNzy9v4V5EdV7epumptcsm/92Wcx7Hse/7EEKMsdZqGwokOa+3yz0v337xLv8BaHfNshxTjQQAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/19d3606e35d311c11edb9891cf40eeeb/a0b58/5_2_4d.webp 230w","/static/19d3606e35d311c11edb9891cf40eeeb/bc10c/5_2_4d.webp 460w","/static/19d3606e35d311c11edb9891cf40eeeb/966d8/5_2_4d.webp 920w","/static/19d3606e35d311c11edb9891cf40eeeb/445df/5_2_4d.webp 1380w","/static/19d3606e35d311c11edb9891cf40eeeb/78de1/5_2_4d.webp 1840w","/static/19d3606e35d311c11edb9891cf40eeeb/ee81e/5_2_4d.webp 1966w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/19d3606e35d311c11edb9891cf40eeeb/81c8e/5_2_4d.png 230w","/static/19d3606e35d311c11edb9891cf40eeeb/08a84/5_2_4d.png 460w","/static/19d3606e35d311c11edb9891cf40eeeb/c0255/5_2_4d.png 920w","/static/19d3606e35d311c11edb9891cf40eeeb/b1001/5_2_4d.png 1380w","/static/19d3606e35d311c11edb9891cf40eeeb/161ec/5_2_4d.png 1840w","/static/19d3606e35d311c11edb9891cf40eeeb/75d3b/5_2_4d.png 1966w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/19d3606e35d311c11edb9891cf40eeeb/c0255/5_2_4d.png","alt":"5 2 4d","title":"5 2 4d","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yksi tapa korjata ongelma on kopioida uuden listan kaikki alkiot takaisin vanhaan listaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kasvata_kaikkia"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n uusilista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n uusilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kopioidaan vanhaan listaan uuden listan arvot"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" uusilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa on olemassa myös ovela tapa sijoittaa monta alkiota kerrallaan listaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" lista\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkissä siis sijoitetaan \"osalistaan\" eli listan kohtiin 1 ja 2 taulukollinen alkioita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Osalistaksi voidaan myös valita koko lista:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"99"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"98"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"97"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" lista\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"99"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"98"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"97"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eli näin tulee korvatuksi koko vanhan listan sisältö. Siispä eräs toimiva versio funktiosta näyttää seuraavalta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kasvata_kaikkia"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n uusilista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" alkio "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n uusilista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"alkio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" uusilista"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"...tai ilman listan kopiontia yksinkertaisesti sijoittamalla uudet arvot heti vanhaan listaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kasvata_kaikkia"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Alkiot tuplana","tmcname":"osa05-06a_alkiot_tuplana"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tuplaa_alkiot(luvut: list)"}]},{"type":"text","value":", joka saa parametrikseen lukuja sisältävän listan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa uuden listan, jossa alkuperäisen listan alkiot on kerrottu kahdella. Funkto "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" saa muuttaa alkuperäistä listaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n tuplaluvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tuplaa_alkiot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"alkuperäinen:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tuplattu:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tuplaluvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"alkuperäinen: [2, 4, 5, 3, 11, -4]\ntuplattu: [4, 8, 10, 6, 22, -8]"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Poista pienin","tmcname":"osa05-06b_poista_pienin"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"poista_pienin(luvut: list)"}]},{"type":"text","value":", joka saa parametrikseen lukuja sisältävän listan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio etsii ja poistaa listasta pienimmän alkion. Voit olettaa, että pienin alkio esiintyy listassa vain kerran."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio ei siis palauta mitään, vaan muokkaa parametrinaan saamaansa listaa!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n poista_pienin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[2, 4, 6, 3, 5]"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sudoku: ruudukon tulostus ja luvun lisäys","tmcname":"osa05-07_sudoku_osa5"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä toteutetaan vielä kaksi funktiota sudokua varten: "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisays"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta"}]},{"type":"text","value":" saa parametriksi sudokuruudukkoa esittävän kaksiulotteisen listan ja tulostaa sen alla olevan esimerkkitulostuksen mukaisessa muodossa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisays(sudoku: list, rivi_nro: int, sarake_nro: int, luku:int)"}]},{"type":"text","value":" saa parametriksi sudokuruudukkoa esittävän kaksiulotteisen listan, rivi- ja sarakenumerot sekä luvun väliltä 1–9. Funktio lisää luvun parametrien ilmoittamaan kohtaan sudokuruudukkoa."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sudoku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\ntulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kolme numeroa lisätty:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n\nKolme numeroa lisätty:\n\n2 _ _ _ _ _ _ _ _\n_ _ 7 _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ 3 _\n\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vihje"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Saatat tässä tehtävässä hyötyä siitä, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komentoa on mahdollista käyttää myös siten, että se ei aiheuta rivinvaihtoa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"merkkejä \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" end"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ilman välejä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" end"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"merkkejä ilman välejä"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joskus taas tarvitaan pelkkää rivinvaihtoa, ja se onnistuu seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sudoku: luvun lisäys ruudukon kopioon","tmcname":"osa05-08_sudoku_osa6"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Viimeisessä sudokua käsittelevässä tehtävässä toteutetaan hieman erilainen versio funktiosta, jonka avulla sudokuruudukkoon lisätään uusia lukuja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kopioi_ja_lisaa(sudoku: list, rivi_nro: int, sarake_nro: int, luku:int)"}]},{"type":"text","value":" saa parametreikseen sudokuruudukkoa esittävän kaksiulotteisen listan, rivinumeron, sarakenumeron sekä luvun väliltä 1–9. Funktio "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"palauttaa"}]},{"type":"text","value":" parametrina saadusta sudokuruudukosta "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kopion"}]},{"type":"text","value":", johon on lisätty parametrina saatu luku parametrina saatuun sijaintiin sijoitettuna. Funktio "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei saa muuttaa"}]},{"type":"text","value":" parametrina annettua sudokuruudukkoa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on edellisen tehtävän funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta"}]},{"type":"text","value":" hyödyntävä käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sudoku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nkopio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kopioi_ja_lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Alkuperäinen:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sudoku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kopio:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kopio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Alkuperäinen:\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n\nKopio:\n2 _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n_ _ _ _ _ _ _ _ _\n\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vihje"}]},{"type":"text","value":" tässä tehtävässä pitää olla tarkkana mitä kaikkea tulee kopioida, ja mihin lisäys lopulta kohdistuu. Kuten yleensäkin, "},{"type":"element","tagName":"a","properties":{"href":"http://www.pythontutor.com/visualize.html#mode=edit","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"visualisaattori"}]},{"type":"text","value":" auttaa myös nyt. Sudokuruudukon koon takia näkymä tosin on hieman normaalia sekavampi."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Ristinolla","tmcname":"osa05-09_ristinolla"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ristinollaa pelataan 3 x 3 -kokoisella ruudukolla, johon pelaajat merkitsevät vuorotellen ristin tai nollan. Pelin voittaa se pelaaja, joka saa ensimmäisenä kolme merkkiä pystyyn, vaakaan tai kulmittain. Peli päättyy tasapeliin, jos kumpikaan pelaaja ei saa kolmen sarjaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pelaa_siirto(lauta: list, x: int, y: int, nappula: str)"}]},{"type":"text","value":", jossa sijoitetaan annettu pelinappula annettuihin koordinaatteihin pelilaudalla. Koordinaattien arvot ovat väliltä 0..2."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huomaa"}]},{"type":"text","value":" että tässä tehtävässä parametrit ovat eri päin kuin sudokussa, ensin annetaan saraketta kuvaava "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":" ja sen jälkeen riviä kuvaava "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"y"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelilauta koostuu merkkijonoista seuraavasti:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":": tyhjä ruutu"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"X\""}]},{"type":"text","value":": pelaajan 1 merkki"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"O\""}]},{"type":"text","value":": pelaajan 2 merkki"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", jos nappula saatiin sijoitettua laudalle (eli jos paikka oli tyhjä), ja arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":", jos paikka oli varattu TAI jos koordinaatin arvo oli liian pieni tai suuri (eli ei väliltä 0..2)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lauta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pelaa_siirto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lauta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"X\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lauta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\n[['', '', 'X'], ['', '', ''], ['', '', '']]"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Matriisin kääntö","tmcname":"osa05-10_matriisin_kaanto"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"transponoi(matriisi: list)"}]},{"type":"text","value":", joka saa parametrikseen kaksiulotteisen kokonaislukuja sisältävän taulukon eli matriisin. Funktio "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"transponoi"}]},{"type":"text","value":" matriisin eli muuntaa rivit sarakkeiksi ja päinvastoin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa, että matriisissa on yhtä monta riviä kuin sarakettakin (eli matriisi on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"neliömatriisi"}]},{"type":"text","value":")."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi matriisista"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tulisi transponoinnin jälkeen tällainen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio ei palauta mitään, vaan muokkaa parametrinaan saamaansa matriisia."}]}]},{"type":"element","tagName":"h2","properties":{"id":"funktioiden-sivuvaikutukset","style":"position:relative;"},"children":[{"type":"text","value":"Funktioiden sivuvaikutukset"},{"type":"element","tagName":"a","properties":{"href":"#funktioiden-sivuvaikutukset","ariaLabel":"funktioiden sivuvaikutukset permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska funktio saa parametrinaan viittauksen listaan, se voi muuttaa tätä listaa. Jos funktion varsinaisena tarkoituksena ei ole muuttaa listaa, muutokset voivat aiheuttaa ongelmia toisaalla ohjelmassa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkinä funktiota, jonka tarkoituksena on etsiä listan toiseksi pienin alkio:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"toiseksi_pienin"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# järjestetyn listan toiseksi pienin alkio on kohdassa 1"}]},{"type":"text","value":"\n lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sort"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nluvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"toiseksi_pienin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"text","value":"\n2\n[1, 2, 3, 4, 4, 5, 6, 7]\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio kyllä etsii ja löytää toiseksi pienimmän alkion, mutta sen lisäksi se muuttaa listan alkioiden järjestyksen. Jos järjestyksellä on merkitystä muualla ohjelmassa, funktion kutsuminen voi aiheuttaa virheitä. Esimerkin kaltaista muutosta viittauksena saatuun olioon kutsutaan funktion "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"sivuvaikutukseksi"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme toteuttaa funktion ilman sivuvaikutuksia näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"toiseksi_pienin"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n kopio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" kopio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nluvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"toiseksi_pienin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2\n[1, 4, 2, 5, 3, 6, 4, 7]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sorted"}]},{"type":"text","value":" palauttaa uuden järjestetyn listan, toiseksi pienimmän alkion etsiminen ei enää sotke listan alkuperäistä järjestystä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Usein pidetään hyvänä asiana, että funktiot eivät aiheuta sivuvaikutuksia, sillä sivuvaikutukset voivat hankaloittaa ohjelmien toimivuuden varmistamista."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sivuvaikutuksettomia funktioita kutsutaan myös "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"puhtaiksi funktioiksi"}]},{"type":"text","value":" ja erityisesti funktionaalista ohjelmointityyliä käytettäessä funktiot pyritään rakentamaan näin. Palaamme aiheeseen tarkemmin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Ohjelmoinnin jatkokurssilla"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"7384687a-fe87-53d4-be99-05a98f5e467e"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, mitä tarkoitetaan viittaustyyppisellä muuttujalla
  • \n
  • Tiedät, että samaan olioon voi olla useampia viittauksia
  • \n
  • Osaat käyttää listoja funktioiden parametreina
  • \n
  • Tiedät, mitä tarkoitetaan funktion sivuvaikutuksella
  • \n

Olemme tähän asti ajatelleet, että muuttuja on eräänlainen \"laatikko\", joka sisältää muuttujan arvon. Teknisesti ottaen tämä ei pidä paikkaansa Pythonissa: muuttujat eivät sisällä arvoa vaan ne viittaavat arvona olevaan olioon, kuten lukuun, merkkijonoon tai listaan.

Käytännössä tämä tarkoittaa, että muuttujaan ei tallenneta arvoa, vaan tieto siitä paikasta, mistä muuttujan arvo löytyy.

Viittausta voidaan kuvata nuolena muuttujasta sen varsinaiseen arvoon:

\n \n \n \n \n \n \"5\n \n \n

Listaa voidaan käsitellä kumman tahansa viittauksen avulla:

lista = [1, 2, 3, 4]\nlista2 = lista\n\nlista[0] = 10\nlista2[1] = 20\n\nprint(lista)\nprint(lista2)

[10, 20, 3, 4]\n[10, 20, 3, 4]

Mikäli samaan listaan on useampia viittauksia, sitä voidaan käsitellä minkä tahansa viittauksen kautta samalla tavalla. Toisaalta yhden viittauksen kautta tehtävä muutos heijastuu myös muihin viittauksiin.

Visualisaattori näyttää jälleen selkeästi mitä ohjelmassa tapahtuu:

\n \n \n \n \n \n \"5\n \n \n

Listan kopiointi

Jos haluamme tehdä listasta erillisen kopion, voimme luoda uuden listan ja lisätä siihen jokaisen aluperäisen listan alkion:

lista = [1, 2, 3, 3, 5]\n\nkopio = []\nfor alkio in lista:\n    kopio.append(alkio)\n\nkopio[0] = 10\nkopio.append(6)\nprint(\"lista\", lista)\nprint(\"kopio\", kopio)

lista [1, 2, 3, 3, 5]\nkopio [10, 2, 3, 3, 5, 6]

Visualisaattorilla tarkastellen kopiointi näyttää seuraavalta:

\n \n \n \n \n \n \"5\n \n \n

Muuttuja kopio siis viittaa nyt eri listaan kuin muuttuja lista.

Helpompi tapa listan kopioimiseen on hyödyntää []-operaattoria, johon tutustuimme aiemmin kurssilla. Merkintä [:] tarkoittaa, että listalta valitaan kaikki alkiot, ja tämän sivuvaikutuksena syntyy kopio listasta:

lista = [1,2,3,4]\nkopio = lista[:]\n\nlista[0] = 10\nkopio[1] = 20\n\nprint(lista)\nprint(kopio)

[10, 2, 3, 4]\n[1, 20, 3, 4]

Lista funktion parametrina

Kun lista välitetään parametrina funktiolle, välitetään viittaus listaan. Tämä tarkoittaa, että funktio voi muuttaa parametrinaan saamaansa listaa.

Esimerkiksi seuraava funktio lisää uuden alkion parametrinaan saamaansa listaan:

def lisaa_alkio(lista: list):\n    uusi_alkio = 10\n    lista.append(uusi_alkio)\n\nlista = [1,2,3]\nprint(lista)\nlisaa_alkio(lista)\nprint(lista)
\n[1, 2, 3]\n[1, 2, 3, 10]\n

Huomaa, että funktio lisaa_alkio ei palauta mitään, vaan muuttaa parametrinaan saamaansa listaa.

Visualisaattori havainnollistaa tilanteen seuraavasti:

\n \n \n \n \n \n \"5\n \n \n

Global frame tarkoittaa pääohjelman muuttujia ja sinisellä oleva laatikko lisaa_alkio taas funktion parametreja ja muuttujia. Kuten visualisaatio havainnollistaa, funktio viittaa samaan listaan mihin pääohjelmakin viittaa, eli funktiossa listalle tehtävät muutokset näkyvät pääohjelmaan.

Toinen tapa olisi luoda uusi lista ja palauttaa se:

def lisaa_alkio(lista: list) -> list:\n    uusi_alkio = 10\n    kopio = lista[:]\n    kopio.append(uusi_alkio)\n    return kopio\n\nluvut = [1, 2, 3]\nluvut2 = lisaa_alkio(luvut)\n\nprint(\"Alkuperäinen lista:\", luvut)\nprint(\"Uusi lista:\", luvut2)

Alkuperäinen lista: [1, 2, 3]\nUusi lista: [1, 2, 3, 10]

Jos et ole 100% varma mitä koodissa tapahtuu, käy sen toiminta läpi visualisaattorilla!

Parametrina olevan listan muokkaaminen

Seuraavassa on yritys tehdä funktio, joka kasvattaa parametrina saamansa listan jokaista alkiota kymmenellä:

def kasvata_kaikkia(lista: list):\n    uusilista = []\n    for alkio in lista:\n        uusilista.append(alkio + 10)\n    lista = uusilista\n\nluvut = [1, 2, 3]\nprint(\"alussa \",luvut)\nkasvata_kaikkia(luvut)\nprint(\"funktion jälkeen\", luvut)

alussa: [1, 2, 3]\nfunktion jälkeen: [1, 2, 3]

Jostain syystä funktio ei kuitenkaan näytä toimivan. Mistä on kyse?

Funktiolle on välitetty parametrina viite muutettavaan listaan. Sijoitus lista = uusilista saa aikaan sen, että parametriin talletettu viite muuttaa arvoaan funktion sisällä eli se alkaa viitata funktion sisällä luotuun uuteen listaan. Sijoitus ei kuitenkaan vaikuta funktion ulkopuolelle, siellä viitataan edelleen alkuperäiseen listaan.

Seuraava kuvasarja havainnollistaa, mihin eri muuttujat viittaavat ohjelman suorituksen aikana:

\n \n \n \n \n \n \"5\n \n \n

Funktion sisällä muutettu lista siis \"kadotetaan\" kun funktiosta palataan, ja muuttuja luvut viittaa koko ajan alkuperäiseen listaan.

Visualisaattori on tässäkin tapauksessa ystävä: se näyttää selkeästi, miten funktio ei koske alkuperäiseen listaan ollenkaan vaan luo uuden listan, johon muutokset tehdään:

\n \n

Tee funktio tuplaa_alkiot(luvut: list), joka saa parametrikseen lukuja sisältävän listan.

Funktio palauttaa uuden listan, jossa alkuperäisen listan alkiot on kerrottu kahdella. Funkto ei saa muuttaa alkuperäistä listaa.

Esimerkki funktion kutsumisesta:

if __name__ == \"__main__\":\n    luvut = [2, 4, 5, 3, 11, -4]\n    tuplaluvut = tuplaa_alkiot(luvut)\n    print(\"alkuperäinen:\", luvut)\n    print(\"tuplattu:\", tuplaluvut)

alkuperäinen: [2, 4, 5, 3, 11, -4]\ntuplattu: [4, 8, 10, 6, 22, -8]

Tee funktio poista_pienin(luvut: list), joka saa parametrikseen lukuja sisältävän listan.

Funktio etsii ja poistaa listasta pienimmän alkion. Voit olettaa, että pienin alkio esiintyy listassa vain kerran.

Funktio ei siis palauta mitään, vaan muokkaa parametrinaan saamaansa listaa!

Esimerkki funktion kutsumisesta:

if __name__ == \"__main__\":\n    luvut = [2, 4, 6, 1, 3, 5]\n    poista_pienin(luvut)\n    print(luvut)

[2, 4, 6, 3, 5]

Tässä tehtävässä toteutetaan vielä kaksi funktiota sudokua varten: tulosta ja lisays.

Funktio tulosta saa parametriksi sudokuruudukkoa esittävän kaksiulotteisen listan ja tulostaa sen alla olevan esimerkkitulostuksen mukaisessa muodossa.

Funktio lisays(sudoku: list, rivi_nro: int, sarake_nro: int, luku:int) saa parametriksi sudokuruudukkoa esittävän kaksiulotteisen listan, rivi- ja sarakenumerot sekä luvun väliltä 1–9. Funktio lisää luvun parametrien ilmoittamaan kohtaan sudokuruudukkoa.

sudoku  = [\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0]\n]\n\ntulosta(sudoku)\nlisays(sudoku, 0, 0, 2)\nlisays(sudoku, 1, 2, 7)\nlisays(sudoku, 5, 7, 3)\nprint()\nprint(\"Kolme numeroa lisätty:\")\nprint()\ntulosta(sudoku)
\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n\nKolme numeroa lisätty:\n\n2 _ _  _ _ _  _ _ _\n_ _ 7  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ 3 _\n\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n\n

Vihje

Saatat tässä tehtävässä hyötyä siitä, että print-komentoa on mahdollista käyttää myös siten, että se ei aiheuta rivinvaihtoa:

print(\"merkkejä \", end=\"\")\nprint(\"ilman välejä\", end=\"\")

merkkejä ilman välejä

Joskus taas tarvitaan pelkkää rivinvaihtoa, ja se onnistuu seuraavasti:

print()

Viimeisessä sudokua käsittelevässä tehtävässä toteutetaan hieman erilainen versio funktiosta, jonka avulla sudokuruudukkoon lisätään uusia lukuja.

Funktio kopioi_ja_lisaa(sudoku: list, rivi_nro: int, sarake_nro: int, luku:int) saa parametreikseen sudokuruudukkoa esittävän kaksiulotteisen listan, rivinumeron, sarakenumeron sekä luvun väliltä 1–9. Funktio palauttaa parametrina saadusta sudokuruudukosta kopion, johon on lisätty parametrina saatu luku parametrina saatuun sijaintiin sijoitettuna. Funktio ei saa muuttaa parametrina annettua sudokuruudukkoa.

Seuraavassa on edellisen tehtävän funktiota tulosta hyödyntävä käyttöesimerkki:

sudoku  = [\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0],\n    [0, 0, 0, 0, 0, 0, 0, 0, 0]\n]\n\nkopio = kopioi_ja_lisaa(sudoku, 0, 0, 2)\nprint(\"Alkuperäinen:\")\ntulosta(sudoku)\nprint()\nprint(\"Kopio:\")\ntulosta(kopio)
\nAlkuperäinen:\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n\nKopio:\n2 _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n_ _ _  _ _ _  _ _ _\n\n

Vihje tässä tehtävässä pitää olla tarkkana mitä kaikkea tulee kopioida, ja mihin lisäys lopulta kohdistuu. Kuten yleensäkin, visualisaattori auttaa myös nyt. Sudokuruudukon koon takia näkymä tosin on hieman normaalia sekavampi.

Ristinollaa pelataan 3 x 3 -kokoisella ruudukolla, johon pelaajat merkitsevät vuorotellen ristin tai nollan. Pelin voittaa se pelaaja, joka saa ensimmäisenä kolme merkkiä pystyyn, vaakaan tai kulmittain. Peli päättyy tasapeliin, jos kumpikaan pelaaja ei saa kolmen sarjaa.

Kirjoita funktio pelaa_siirto(lauta: list, x: int, y: int, nappula: str), jossa sijoitetaan annettu pelinappula annettuihin koordinaatteihin pelilaudalla. Koordinaattien arvot ovat väliltä 0..2.

Huomaa että tässä tehtävässä parametrit ovat eri päin kuin sudokussa, ensin annetaan saraketta kuvaava x ja sen jälkeen riviä kuvaava y.

Pelilauta koostuu merkkijonoista seuraavasti:

    \n
  • \"\": tyhjä ruutu
  • \n
  • \"X\": pelaajan 1 merkki
  • \n
  • \"O\": pelaajan 2 merkki
  • \n

Funktio palauttaa arvon True, jos nappula saatiin sijoitettua laudalle (eli jos paikka oli tyhjä), ja arvon False, jos paikka oli varattu TAI jos koordinaatin arvo oli liian pieni tai suuri (eli ei väliltä 0..2).

Esimerkiksi:

lauta = [[\"\", \"\", \"\"], [\"\", \"\", \"\"], [\"\", \"\", \"\"]]\nprint(pelaa_siirto(lauta, 2, 0, \"X\"))\nprint(lauta)

True\n[['', '', 'X'], ['', '', ''], ['', '', '']]

Kirjoita funktio transponoi(matriisi: list), joka saa parametrikseen kaksiulotteisen kokonaislukuja sisältävän taulukon eli matriisin. Funktio transponoi matriisin eli muuntaa rivit sarakkeiksi ja päinvastoin.

Voit olettaa, että matriisissa on yhtä monta riviä kuin sarakettakin (eli matriisi on neliömatriisi).

Esimerkiksi matriisista

1 2 3\n4 5 6\n7 8 9

tulisi transponoinnin jälkeen tällainen:

1 4 7\n2 5 8\n3 6 9

Funktio ei palauta mitään, vaan muokkaa parametrinaan saamaansa matriisia.

Funktioiden sivuvaikutukset

Koska funktio saa parametrinaan viittauksen listaan, se voi muuttaa tätä listaa. Jos funktion varsinaisena tarkoituksena ei ole muuttaa listaa, muutokset voivat aiheuttaa ongelmia toisaalla ohjelmassa.

Tarkastellaan esimerkkinä funktiota, jonka tarkoituksena on etsiä listan toiseksi pienin alkio:

def toiseksi_pienin(lista: list) -> int:\n    # järjestetyn listan toiseksi pienin alkio on kohdassa 1\n    lista.sort()\n    return lista[1]\n\nluvut = [1, 4, 2, 5, 3, 6, 4, 7]\nprint(toiseksi_pienin(luvut))\nprint(luvut)
\n2\n[1, 2, 3, 4, 4, 5, 6, 7]\n

Funktio kyllä etsii ja löytää toiseksi pienimmän alkion, mutta sen lisäksi se muuttaa listan alkioiden järjestyksen. Jos järjestyksellä on merkitystä muualla ohjelmassa, funktion kutsuminen voi aiheuttaa virheitä. Esimerkin kaltaista muutosta viittauksena saatuun olioon kutsutaan funktion sivuvaikutukseksi.

Voimme toteuttaa funktion ilman sivuvaikutuksia näin:

def toiseksi_pienin(lista: list) -> int:\n    kopio = sorted(lista)\n    return kopio[1]\n\nluvut = [1, 4, 2, 5, 3, 6, 4, 7]\nprint(toiseksi_pienin(luvut))\nprint(luvut)

2\n[1, 4, 2, 5, 3, 6, 4, 7]

Koska funktio sorted palauttaa uuden järjestetyn listan, toiseksi pienimmän alkion etsiminen ei enää sotke listan alkuperäistä järjestystä.

Usein pidetään hyvänä asiana, että funktiot eivät aiheuta sivuvaikutuksia, sillä sivuvaikutukset voivat hankaloittaa ohjelmien toimivuuden varmistamista.

Sivuvaikutuksettomia funktioita kutsutaan myös puhtaiksi funktioiksi ja erityisesti funktionaalista ohjelmointityyliä käytettäessä funktiot pyritään rakentamaan näin. Palaamme aiheeseen tarkemmin Ohjelmoinnin jatkokurssilla.

","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-5/2-viittaukset.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-5/3-dictionary/page-data.json b/page-data/osa-5/3-dictionary/page-data.json index f82df3b7a..ca99c7884 100644 --- a/page-data/osa-5/3-dictionary/page-data.json +++ b/page-data/osa-5/3-dictionary/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-5/3-dictionary", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, millainen tietorakenne on sanakirja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää sanakirjaa erityyppisten avainten ja arvojen kanssa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käydä läpi sanakirjan sisällön"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tunnet joitakin sanakirjan käyttötarkoituksia ohjelmoinnissa"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lista on kätevä tietorakenne, mutta sen rajoituksena on, että alkiot ovat indekseissä 0, 1, 2, jne. Tämä hankaloittaa alkioiden etsimistä listalta: jotta löydämme tietyn alkion, on pahimmassa tapauksessa käytävä läpi koko lista."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tutustumme seuraavaksi "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"sanakirjaan"}]},{"type":"text","value":", (englanniksi "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"dictionary"}]},{"type":"text","value":") joka on listan lisäksi toinen Pythonin perustietorakenne. Sanakirjassa jokainen alkio koostuu "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"avaimesta"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"arvosta"}]},{"type":"text","value":", ja voimme etsiä ja muuttaa tietoa avaimen perusteella."}]},{"type":"element","tagName":"h2","properties":{"id":"sanakirjan-kayttaminen","style":"position:relative;"},"children":[{"type":"text","value":"Sanakirjan käyttäminen"},{"type":"element","tagName":"a","properties":{"href":"#sanakirjan-kayttaminen","ariaLabel":"sanakirjan kayttaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma näyttää esimerkin sanakirjan käyttämisestä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sanakirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\nsanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"apina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"monkey\""}]},{"type":"text","value":"\nsanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banana\""}]},{"type":"text","value":"\nsanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"cembalo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"harpsichord\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"apina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3\n{'apina': 'monkey', 'banaani': 'banana', 'cembalo': 'harpsichord'}\nmonkey"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkintä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"{}"}]},{"type":"text","value":" luo tyhjän sanakirjan, minkä jälkeen voimme lisätä sanakirjaan sisältöä. Tässä tapauksessa lisäämme kolme avainta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"apina\""}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"cembalo\""}]},{"type":"text","value":", joita vastaavat arvot "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"monkey\""}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"banana\""}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"harpsichord\""}]},{"type":"text","value":". Lopuksi tulostamme koko sanakirjan sisällön ja sitten avaimen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"apina\""}]},{"type":"text","value":" arvon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voisimme käyttää tätä sanakirjaa vaikka seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna sana: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Käännös:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sanaa ei löytynyt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä käytössä on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":"-operaattori, joka sanakirjan tapauksessa tarkastaa, onko siinä tiettyä avainta. Mahdollisia ohjelman tulostuksia:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"apina"}]},{"type":"text","value":"\nKäännös: monkey"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pöllö"}]},{"type":"text","value":"\nSanaa ei löytynyt"}]}]},{"type":"element","tagName":"h2","properties":{"id":"mita-sanakirjassa-voi-olla","style":"position:relative;"},"children":[{"type":"text","value":"Mitä sanakirjassa voi olla?"},{"type":"element","tagName":"a","properties":{"href":"#mita-sanakirjassa-voi-olla","ariaLabel":"mita sanakirjassa voi olla permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaikka tietorakenteen nimi on sanakirja, siinä ei ole usein sanakirjaa vaan jotain muuta tietoa. Esimerkiksi seuraavassa sanakirjassa avaimet ovat merkkijonoja ja arvot ovat kokonaislukuja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tulokset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\ntulokset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\ntulokset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Liisa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\ntulokset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kalle\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa sanakirjassa puolestaan avaimet ovat kokonaislukuja ja arvot ovat listoja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"listat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\nlistat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nlistat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"42"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nlistat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"avaimista-ja-arvoista","style":"position:relative;"},"children":[{"type":"text","value":"Avaimista ja arvoista"},{"type":"element","tagName":"a","properties":{"href":"#avaimista-ja-arvoista","ariaLabel":"avaimista ja arvoista permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tietty avain voi esiintyä sanakirjassa enintään kerran. Jos asetamme samalle avaimelle uuden arvon, korvaa uusi arvo vanhan arvon:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"suuri\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"big\""}]},{"type":"text","value":"\nsanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"suuri\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"large\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"suuri\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"large"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanakirjan avaimen vaatimuksena on, että sen tulee olla muuttumaton. Tämän vuoksi emme voi käyttää listaa avaimena, koska lista voi muuttua. Esimerkiksi seuraava koodi ei toimi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"TypeError: unhashable type: 'list'"}]}]},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Hajautustaulu"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python tallentaa sanakirjan sisällön sisäisesti tietorakenteena nimeltä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"hajautustaulu"}]},{"type":"text","value":" ("},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"hash table"}]},{"type":"text","value":"). Ideana on laskea avaimelle "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"hajautusarvo"}]},{"type":"text","value":" ("},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"hash value"}]},{"type":"text","value":"), jonka avulla määräytyy avaimen paikka muistissa. Yllä oleva virheilmoitus ilmaisee, että listalle ei voida laskea hajautusarvoa, joten se ei kelpaa sanakirjan avaimeksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kurssilla "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Tietorakenteet ja algoritmit"}]},{"type":"text","value":" tutustutaan tarkemmin hajautustauluihin, eli sanakirjojen pellin alla olevaan mekanismiin."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että sanakirjassa olevaa avainta vastaavan arvon ei tarvitse olla muuttumaton, vaan voimme tallentaa mitä tahansa tietoa arvoiksi. Sama arvo voi myös esiintyä samassa hakemistossa enemmän kuin yhden kerran."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kertaa kymmenen","tmcname":"osa05-10b_kertaa_kymmenen"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kertaa_kymmenen(alku: int, loppu: int)"}]},{"type":"text","value":", joka muodostaa ja palauttaa uuden sanakirjan. Sanakirjassa on avaimina luvut väliltä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"alku"}]},{"type":"text","value":".."},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"loppu"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jokaisen avaimen arvona on avain kerrottuna kymmenellä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"d "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kertaa_kymmenen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"d"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"{3: 30, 4: 40, 5: 50, 6: 60}"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kertomat","tmcname":"osa05-11_kertomat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kertomat(n: int)"}]},{"type":"text","value":", joka palauttaa lukujen 1.."},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"n"}]},{"type":"text","value":" kertomat sanakirjassa siten, että luku on avain ja luvun kertoma arvo, johon avain viittaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muistutuksena: luvun "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"n"}]},{"type":"text","value":" kertoma "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"n"}]},{"type":"text","value":"! lasketaan kertomalla luku kaikilla itseään pienemmillä positiivisilla kokonaisluvuilla. Luvun 4 kertoma on siis 4 * 3 * 2 * 1 = 24."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kertomat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1\n6\n120"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"sanakirjan-lapikaynti","style":"position:relative;"},"children":[{"type":"text","value":"Sanakirjan läpikäynti"},{"type":"element","tagName":"a","properties":{"href":"#sanakirjan-lapikaynti","ariaLabel":"sanakirjan lapikaynti permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanakirjan läpikäyntiin voidaan käyttää tuttuun tapaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukkaa. Rakenne "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for avain in sanakirja"}]},{"type":"text","value":" käy läpi kaikki sanakirjan avaimet yksi kerrallaan. Esimerkiksi seuraava koodi tulostaa kaikki sanakirjan avaimet ja niiden arvot:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sanakirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\nsanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"apina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"monkey\""}]},{"type":"text","value":"\nsanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banana\""}]},{"type":"text","value":"\nsanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"cembalo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"harpsichord\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" avain "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"avain:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" avain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"arvo:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"avain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"avain: apina\narvo: monkey\navain: banaani\narvo: banana\navain: cembalo\narvo: harpsichord"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python tarjoaa myös mahdollisuuden käydä läpi samaan aikaan sekä avaimet että vastaavat arvot. Tämä onnistuu käyttämällä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"items"}]},{"type":"text","value":"-metodia, joka palauttaa kaikki avaimet ja arvot yksi kerrallaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" avain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvo "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"items"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"avain:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" avain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"arvo:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että läpikäynnissä avaimet tulevat samassa järjestyksessä kuin ne on lisätty sanakirjaan. Sanakirjan avainten järjestyksellä ei kuitenkaan yleensä ole merkitystä sovelluksissa."}]},{"type":"element","tagName":"h2","properties":{"id":"sanakirjan-edistyneempi-kaytto","style":"position:relative;"},"children":[{"type":"text","value":"Sanakirjan edistyneempi käyttö"},{"type":"element","tagName":"a","properties":{"href":"#sanakirjan-edistyneempi-kaytto","ariaLabel":"sanakirjan edistyneempi kaytto permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan tilannetta, jossa listassa on joukko sanoja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sanalista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"maito\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"olut\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"juusto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"piimä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"mehu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"makkara\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tomaatti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kurkku\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"voi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"margariini\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"juusto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"makkara\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"olut\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"piimä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"piimä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"voi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"olut\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"suklaa\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Haluamme analysoida sanalistaa eri tavoin, kuten selvittää, montako kertaa kukin sana listalla esiintyy."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanakirja sopii tähän tilanteeseen hyvin. Ideana on käydä listan sanat läpi yksi kerrallaan ja ylläpitää sanakirjassa tietoa sanojen esiintymiskerroista:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lukumaarat"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n sanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# jos sana ei ole vielä tullut vastaan, alusta avaimen arvo"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kasvata sanan esiintymislukumäärää"}]},{"type":"text","value":"\n sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" sanat\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kutsutaan funktiota"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lukumaarat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostus on seuraavassa:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"{'banaani': 1, 'maito': 1, 'olut': 3, 'juusto': 2, 'piimä': 3, 'mehu': 1, 'makkara': 2, 'tomaatti': 1, 'kurkku': 1, 'voi': 2, 'margariini': 1, 'suklaa': 1}"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehdään vielä toinen sanalistaa käsittelevä metodi, joka jaottelee listalla olevat sanat niiden alkukirjaimen mukaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"alkukirjaimen_mukaan"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n ryhmat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n alkukirjain "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# alusta alkukirjaimeen liittyvä lista kun kirjain tulee vastaan 1. kerran"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" alkukirjain "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" ryhmat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n ryhmat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"alkukirjain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# lisää sana alkukirjainta vastaavalle listalle"}]},{"type":"text","value":"\n ryhmat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"alkukirjain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" ryhmat\n\nryhmat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" alkukirjaimen_mukaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" avain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvo "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" ryhmat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"items"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"kirjaimella "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"avain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" alkavat sanat: \""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii pitkälti saman periaatteen mukaan kuin edellisen esimerkin funktio. Tällä kertaa kuitenkin sanakirjassa avaimiin (eli alkukirjaimiin) liittyvät arvot ovat listoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostus on seuraavassa:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"kirjaimella b alkavat sanat:\nbanaani\nkirjaimella m alkavat sanat:\nmaito\nmehu\nmakkara\nmargariini\nmakkara\nkirjaimella o alkavat sanat:\nolut\nolut\nolut\nkirjaimella j alkavat sanat:\njuusto\njuusto\nkirjaimella p alkavat sanat:\npiimä\npiimä\npiimä\nkirjaimella t alkavat sanat:\ntomaatti\nkirjaimella k alkavat sanat:\nkurkku\nkirjaimella v alkavat sanat:\nvoi\nvoi\nkirjaimella s alkavat sanat:\nsuklaa"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Histogrammi","tmcname":"osa05-12_histogrammi"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"histogrammi"}]},{"type":"text","value":", joka saa parametrina merkkijonon ja tulostaa merkkijonon eri kirjainten lukumäärää kuvaavan histogrammin, jossa kirjaimen jokaista esiintymää kohti tulostuu yksi tähti kirjaimen riville."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi kutsuttaessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"histogrammi(\"abba\")"}]},{"type":"text","value":" tulostus on:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"a **\nb **\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaavasti kutsuttaessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"histogrammi(\"saippuakauppias\")"}]},{"type":"text","value":" tulostus on:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"s **\na ****\ni **\np ****\nu **\nk *\n"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Puhelinluettelo, versio 1","tmcname":"osa05-13_puhelinluettelo_versio1"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee puhelinluettelo, joka toimii seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pekka"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"040-5466745"}]},{"type":"text","value":"\nok!\nkomento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"emilia"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"045-1212344"}]},{"type":"text","value":"\nok!\nkomento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pekka"}]},{"type":"text","value":"\n040-5466745\nkomento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"maija"}]},{"type":"text","value":"\nei numeroa\nkomento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pekka"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"09-22223333"}]},{"type":"text","value":"\nok!\nkomento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pekka"}]},{"type":"text","value":"\n09-22223333\nkomento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nlopetetaan..."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että jokaiseen nimeen voi liittyä vain yksi puhelinnumero. Jos samalle henkilölle lisätään uusi numero, se korvaa aiemmin lisätyn numeron."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Puhelinluettelo, versio 2","tmcname":"osa05-14_puhelinluettelo_versio2"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee puhelinluettelosta paranneltu versio, missä jokaisella henkilöllä voi olla useampia puhelinnumeroita. Ohjelma toimii kuten edellisessä tehtävässä, mutta nyt se listaa jokaisen numeron:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pekka"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"040-5466745"}]},{"type":"text","value":"\nok!\nkomento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"emilia"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"045-1212344"}]},{"type":"text","value":"\nok!\nkomento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pekka"}]},{"type":"text","value":"\n040-5466745\nkomento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"maija"}]},{"type":"text","value":"\nei numeroa\nkomento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pekka"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"09-22223333"}]},{"type":"text","value":"\nok!\nkomento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pekka"}]},{"type":"text","value":"\n040-5466745\n09-22223333\nkomento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nlopetetaan..."}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"avaimien-poistaminen-sanakirjasta","style":"position:relative;"},"children":[{"type":"text","value":"Avaimien poistaminen sanakirjasta"},{"type":"element","tagName":"a","properties":{"href":"#avaimien-poistaminen-sanakirjasta","ariaLabel":"avaimien poistaminen sanakirjasta permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanakirjasta on mahdollista myös poistaa avain-arvo-pareja. Menetelmiä tähän on kaksi. Ensimmäinen näistä on komento "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"del"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilokunta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lehtori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"professori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lehtori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"del"}]},{"type":"text","value":" henkilokunta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"henkilokunta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"{'Antti': 'lehtori', 'Emilia': 'professori'}"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos komentoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"del"}]},{"type":"text","value":" kutsutaan avaimille, joita sanakirjassa ei ole, seurauksena on virhe:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilokunta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lehtori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"professori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lehtori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"del"}]},{"type":"text","value":" henkilokunta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jukka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":">>> del henkilokunta[\"Jukka\"]\nTraceback (most recent call last):\n File \""},{"type":"element","tagName":"stdin","properties":{},"children":[{"type":"text","value":"\", line 1, in "},{"type":"element","tagName":"module","properties":{},"children":[{"type":"text","value":"\nKeyError: 'Jukka'\n"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ennen poistoa on siis syytä tarkistaa, että poistettava avain löytyy sanakirjasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilokunta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lehtori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"professori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lehtori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jukka\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" henkilokunta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"del"}]},{"type":"text","value":" henkilokunta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jukka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Poistettiin\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Poistettavaa henkilöä ei löytynyt henkilökunnasta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen vaihtoehto alkion poistamiseen on metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pop"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilokunta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lehtori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"professori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lehtori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\npoistettu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" henkilokunta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pop"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"henkilokunta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Poistettiin\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" poistettu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"{'Antti': 'lehtori', 'Emilia': 'professori'}\nPoistettiin lehtori"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pop"}]},{"type":"text","value":" siis myös palauttaa poistettua avainta vastaavan arvon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oletusarvoisesti myös "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pop"}]},{"type":"text","value":" aiheuttaa virheen, jos sanakirjasta yritetään poistaa avain, jota siellä ei ole. Metodille on kuitenkin mahdollista antaa toisena parametrina "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"oletusarvoinen paluuarvo"}]},{"type":"text","value":", joka palautetaan siinä tilanteessa, kun poistettavaa ei löydy. Esimerkiksi arvo "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"None"}]},{"type":"text","value":", joka tarkoittaa \"ei mitään\", sopii hyvin tälläisiin tilanteisiin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilokunta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lehtori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"professori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lehtori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\npoistettu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" henkilokunta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pop"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jukka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"None"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" poistettu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"None"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Poistettavaa henkilöä ei löytynyt henkilökunnasta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Poistettiin\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" poistettu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Poistettavaa henkilöä ei löytynyt henkilökunnasta"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kannattaa huomata, että jos on tarvetta poistaa koko sanakirjan sisältö:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilokunta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lehtori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"professori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lehtori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" avain "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" henkilokunta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"del"}]},{"type":"text","value":" henkilokunta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"avain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"seurauksena on virheilmoitus"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"RuntimeError: dictionary changed size during iteration"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Syynä on se, että käytäessä läpi rakennetta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-lauseella, ei sen sisältöä saa muuttaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koko sanakirjan tyhjennys onnistuu komennolla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilokunta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"clear"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sanakirjan kääntö","tmcname":"osa05-15_sanakirjan_kaanto"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kaanna(sanakirja: dict)"}]},{"type":"text","value":", joka saa parametrikseen sanakirjan ja kääntää sen niin, että arvoista tulee avaimia ja päinvastoin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"s "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kolmas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"neljas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\nkaanna"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"s"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"s"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"{\"eka\": 1, \"toka\": 2, \"kolmas\": 3, \"neljas\": 4}"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huomaa"}]},{"type":"text","value":", että "},{"type":"element","tagName":"a","properties":{"href":"/osa-5/2-viittaukset#parametrina-olevan-listan-muokkaaminen"},"children":[{"type":"text","value":"tämä"}]},{"type":"text","value":" pitää paikkansa myös parametrina oleville sanakirjoille!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos kohtaat tehtävässä ongelmia, katso "},{"type":"element","tagName":"a","properties":{"href":"http://www.pythontutor.com/visualize.html#mode=edit","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"visualisaattorilla"}]},{"type":"text","value":" mitä koodisi tekee."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Luvut sanoina","tmcname":"osa05-16_luvut_sanoina"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lukukirja()"}]},{"type":"text","value":", joka palauttaa uuden sanakirjan. Palautettu rakenne sisältää avaimina luvut nollasta 99:ään. Sanakirjan arvoina ovat luvut kirjaimin kirjoitettuna. Katso esimerkkiä alla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lukukirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"45"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"99"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"kaksi\nyksitoista\nneljäkymmentäviisi\nyhdensänkymmentäyhdeksän\nnolla"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"HUOM! Älä muodosta jokaista lukusanaa yksitellen, vaan mieti, miten voisit hyödyntää silmukoita ja sanakirjaa jotenkin ratkaisussasi!"}]}]},{"type":"element","tagName":"h2","properties":{"id":"sanakirja-tiedon-ryhmittelyssa","style":"position:relative;"},"children":[{"type":"text","value":"Sanakirja tiedon ryhmittelyssä"},{"type":"element","tagName":"a","properties":{"href":"#sanakirja-tiedon-ryhmittelyssa","ariaLabel":"sanakirja tiedon ryhmittelyssa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme käyttää sanakirjaa myös tiedon ryhmittelyssä. Esimerkiksi seuraava koodi luo sanakirjan, jossa on tietoa henkilöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pirjo Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pituus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"154"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"paino\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"61"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ikä:\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"44"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä tarkoittaa, että henkilön nimi on Pirjo Python, pituus on 154, paino on 61 ja ikä on 44.\nHuomaa, että olisimme voineet tallentaa tiedot myös näin muuttujiin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pirjo Python\""}]},{"type":"text","value":"\npituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"154"}]},{"type":"text","value":"\npaino "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"61"}]},{"type":"text","value":"\nika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"44"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanakirjan etuna on kuitenkin, että se kokoaa kaikki samaan asiaan liittyvät tiedot yhteisen nimen alle, jonka kautta voimme viitata tietoihin. Periaatteessa lista tarjoaa saman edun:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pirjo Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"153"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"61"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"44"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Listan huono puoli on kuitenkin, että ohjelmoijan on muistettava, mihin kohtaan listaa mikäkin arvo tallennetaan. Pitää siis muistaa esimerkiksi, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"henkilo[2]"}]},{"type":"text","value":" tarkoittaa painoa ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"henkilo[3]"}]},{"type":"text","value":" ikää. Sanakirjassa tätä ongelmaa ei ole, sillä kaikki sanakirjassa olevat erilliset tiedot on tallennettu selkeästi nimetyn avaimen taakse."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi voimme käsitellä henkilöitä näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilo1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pirjo Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pituus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"154"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"paino\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"61"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ikä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"44"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\nhenkilo2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Pythonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pituus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"174"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"paino\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"103"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ikä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"31"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\nhenkilo3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pedro Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pituus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"191"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"paino\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"71"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ikä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"14"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\nhenkilot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"henkilo1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" henkilo2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" henkilo3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" henkilo "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nyhteispituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" henkilo "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n yhteispituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pituus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Keskipituus on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" yhteispituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pirjo Python\nPekka Pythonen\nPedro Python\nKeskipituus on 173.0"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Elokuvarekisteri","tmcname":"osa05-17_elokuvarekisteri"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_elokuva(rekisteri: list, nimi: str, ohjaaja: str, vuosi: int, pituus: int)"}]},{"type":"text","value":", joka lisää yhden elokuvaolion elokuvarekisteriin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rekisteri on toteutettu listana, ja jokainen listan alkio on yksi sanakirja. Sanakirjassa on seuraavat avaimet:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"ohjaaja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"vuosi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"pituus"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Arvot tulevat metodin parametreina."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"rekisteri "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nlisaa_elokuva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rekisteri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pythonin viemää\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2017"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"116"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_elokuva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rekisteri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Python lentokoneessa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Renny Pytholin\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2001"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"94"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rekisteri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[{\"nimi\": \"Pythonin viemää\", \"ohjaaja\": \"Pekka Python\", \"vuosi\": 2017, \"pituus\": 116}, {\"nimi\": \"Python lentokoneessa\", \"ohjaaja\": \"Renny Pytholin\", \"vuosi\": 2001, \"pituus\": 94}]"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Etsi elokuvat","tmcname":"osa05-17b_etsi_elokuvat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"etsi_elokuvat(rekisteri: list, hakusana: str)"}]},{"type":"text","value":", joka käsittelee edellisessä tehtävässä luotua elokuvarekisteriä. Funktio muodostaa uuden listan, jolle kopioidaan rekisteristä ne elokuvat, joiden nimestä löytyy hakusana. Pienet ja isot kirjaimet eivät merkitse haussa, joten hakusanalla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"paj"}]},{"type":"text","value":" pitää löytyä sekä elokuva "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tappajahai"}]},{"type":"text","value":" että elokuva "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pajatoiminnan historia"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"rekisteri "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pythonin viemää\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ohjaaja\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vuosi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2017"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pituus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"116"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Python lentokoneessa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ohjaaja\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Renny Pythonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vuosi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2001"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pituus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"94"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Koodaajien yö\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ohjaaja\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"M. Night Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vuosi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2011"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pituus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"101"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nlista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" etsi_elokuvat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rekisteri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[{\"nimi\": \"Pythonin viemää\", \"ohjaaja\": \"Pekka Python\", \"vuosi\": 2017, \"pituus\": 116}, {\"nimi\": \"Python lentokoneessa\", \"ohjaaja\": \"Renny Pythonen\", \"vuosi\": 2001, \"pituus\": 94}]"}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, millainen tietorakenne on sanakirja
  • \n
  • Osaat käyttää sanakirjaa erityyppisten avainten ja arvojen kanssa
  • \n
  • Osaat käydä läpi sanakirjan sisällön
  • \n
  • Tunnet joitakin sanakirjan käyttötarkoituksia ohjelmoinnissa
  • \n

Lista on kätevä tietorakenne, mutta sen rajoituksena on, että alkiot ovat indekseissä 0, 1, 2, jne. Tämä hankaloittaa alkioiden etsimistä listalta: jotta löydämme tietyn alkion, on pahimmassa tapauksessa käytävä läpi koko lista.

Tutustumme seuraavaksi sanakirjaan, (englanniksi dictionary) joka on listan lisäksi toinen Pythonin perustietorakenne. Sanakirjassa jokainen alkio koostuu avaimesta ja arvosta, ja voimme etsiä ja muuttaa tietoa avaimen perusteella.

Sanakirjan käyttäminen

Seuraava ohjelma näyttää esimerkin sanakirjan käyttämisestä:

sanakirja = {}\n\nsanakirja[\"apina\"] = \"monkey\"\nsanakirja[\"banaani\"] = \"banana\"\nsanakirja[\"cembalo\"] = \"harpsichord\"\n\nprint(len(sanakirja))\nprint(sanakirja)\nprint(sanakirja[\"apina\"])

3\n{'apina': 'monkey', 'banaani': 'banana', 'cembalo': 'harpsichord'}\nmonkey

Merkintä {} luo tyhjän sanakirjan, minkä jälkeen voimme lisätä sanakirjaan sisältöä. Tässä tapauksessa lisäämme kolme avainta \"apina\", \"banaani\" ja \"cembalo\", joita vastaavat arvot \"monkey\", \"banana\" ja \"harpsichord\". Lopuksi tulostamme koko sanakirjan sisällön ja sitten avaimen \"apina\" arvon.

Voisimme käyttää tätä sanakirjaa vaikka seuraavasti:

sana = input(\"Anna sana: \")\nif sana in sanakirja:\n    print(\"Käännös:\", sanakirja[sana])\nelse:\n    print(\"Sanaa ei löytynyt\")

Tässä käytössä on in-operaattori, joka sanakirjan tapauksessa tarkastaa, onko siinä tiettyä avainta. Mahdollisia ohjelman tulostuksia:

Anna sana: apina\nKäännös: monkey

Anna sana: pöllö\nSanaa ei löytynyt

Mitä sanakirjassa voi olla?

Vaikka tietorakenteen nimi on sanakirja, siinä ei ole usein sanakirjaa vaan jotain muuta tietoa. Esimerkiksi seuraavassa sanakirjassa avaimet ovat merkkijonoja ja arvot ovat kokonaislukuja:

tulokset = {}\ntulokset[\"Maija\"] = 4\ntulokset[\"Liisa\"] = 5\ntulokset[\"Kalle\"] = 2

Seuraavassa sanakirjassa puolestaan avaimet ovat kokonaislukuja ja arvot ovat listoja:

listat = {}\nlistat[5] = [1, 2, 3]\nlistat[42] = [5, 4, 5, 4, 5]\nlistat[100] = [5, 2, 3]

Avaimista ja arvoista

Tietty avain voi esiintyä sanakirjassa enintään kerran. Jos asetamme samalle avaimelle uuden arvon, korvaa uusi arvo vanhan arvon:

sanakirja[\"suuri\"] = \"big\"\nsanakirja[\"suuri\"] = \"large\"\nprint(sanakirja[\"suuri\"])

large

Sanakirjan avaimen vaatimuksena on, että sen tulee olla muuttumaton. Tämän vuoksi emme voi käyttää listaa avaimena, koska lista voi muuttua. Esimerkiksi seuraava koodi ei toimi:

sanakirja[[1, 2, 3]] = 5

TypeError: unhashable type: 'list'

Python tallentaa sanakirjan sisällön sisäisesti tietorakenteena nimeltä hajautustaulu (hash table). Ideana on laskea avaimelle hajautusarvo (hash value), jonka avulla määräytyy avaimen paikka muistissa. Yllä oleva virheilmoitus ilmaisee, että listalle ei voida laskea hajautusarvoa, joten se ei kelpaa sanakirjan avaimeksi.

Kurssilla Tietorakenteet ja algoritmit tutustutaan tarkemmin hajautustauluihin, eli sanakirjojen pellin alla olevaan mekanismiin.

Huomaa, että sanakirjassa olevaa avainta vastaavan arvon ei tarvitse olla muuttumaton, vaan voimme tallentaa mitä tahansa tietoa arvoiksi. Sama arvo voi myös esiintyä samassa hakemistossa enemmän kuin yhden kerran.

Tee funktio kertaa_kymmenen(alku: int, loppu: int), joka muodostaa ja palauttaa uuden sanakirjan. Sanakirjassa on avaimina luvut väliltä alku..loppu.

Jokaisen avaimen arvona on avain kerrottuna kymmenellä.

Esimerkiksi:

d = kertaa_kymmenen(3, 6)\nprint(d)

{3: 30, 4: 40, 5: 50, 6: 60}

Tee funktio kertomat(n: int), joka palauttaa lukujen 1..n kertomat sanakirjassa siten, että luku on avain ja luvun kertoma arvo, johon avain viittaa.

Muistutuksena: luvun n kertoma n! lasketaan kertomalla luku kaikilla itseään pienemmillä positiivisilla kokonaisluvuilla. Luvun 4 kertoma on siis 4 * 3 * 2 * 1 = 24.

Esimerkki käytöstä:

k = kertomat(5)\nprint(k[1])\nprint(k[3])\nprint(k[5])

1\n6\n120

Sanakirjan läpikäynti

Sanakirjan läpikäyntiin voidaan käyttää tuttuun tapaan for-silmukkaa. Rakenne for avain in sanakirja käy läpi kaikki sanakirjan avaimet yksi kerrallaan. Esimerkiksi seuraava koodi tulostaa kaikki sanakirjan avaimet ja niiden arvot:

sanakirja = {}\n\nsanakirja[\"apina\"] = \"monkey\"\nsanakirja[\"banaani\"] = \"banana\"\nsanakirja[\"cembalo\"] = \"harpsichord\"\n\nfor avain in sanakirja:\n    print(\"avain:\", avain)\n    print(\"arvo:\", sanakirja[avain])

avain: apina\narvo: monkey\navain: banaani\narvo: banana\navain: cembalo\narvo: harpsichord

Python tarjoaa myös mahdollisuuden käydä läpi samaan aikaan sekä avaimet että vastaavat arvot. Tämä onnistuu käyttämällä items-metodia, joka palauttaa kaikki avaimet ja arvot yksi kerrallaan:

\nfor avain, arvo in sanakirja.items():\n    print(\"avain:\", avain)\n    print(\"arvo:\", arvo)

Huomaa, että läpikäynnissä avaimet tulevat samassa järjestyksessä kuin ne on lisätty sanakirjaan. Sanakirjan avainten järjestyksellä ei kuitenkaan yleensä ole merkitystä sovelluksissa.

Sanakirjan edistyneempi käyttö

Tarkastellaan tilannetta, jossa listassa on joukko sanoja:

sanalista = [\n  \"banaani\", \"maito\", \"olut\", \"juusto\", \"piimä\", \"mehu\", \"makkara\",\n  \"tomaatti\", \"kurkku\", \"voi\", \"margariini\", \"juusto\", \"makkara\",\n  \"olut\", \"piimä\", \"piimä\", \"voi\", \"olut\", \"suklaa\"\n]

Haluamme analysoida sanalistaa eri tavoin, kuten selvittää, montako kertaa kukin sana listalla esiintyy.

Sanakirja sopii tähän tilanteeseen hyvin. Ideana on käydä listan sanat läpi yksi kerrallaan ja ylläpitää sanakirjassa tietoa sanojen esiintymiskerroista:

def lukumaarat(lista):\n    sanat = {}\n    for sana in lista:\n        # jos sana ei ole vielä tullut vastaan, alusta avaimen arvo\n        if sana not in sanat:\n            sanat[sana] = 0\n        # kasvata sanan esiintymislukumäärää\n        sanat[sana] += 1\n    return sanat\n\n# kutsutaan funktiota\nprint(lukumaarat(sanalista))

Ohjelman tulostus on seuraavassa:

{'banaani': 1, 'maito': 1, 'olut': 3, 'juusto': 2, 'piimä': 3, 'mehu': 1, 'makkara': 2, 'tomaatti': 1, 'kurkku': 1, 'voi': 2, 'margariini': 1, 'suklaa': 1}

Tehdään vielä toinen sanalistaa käsittelevä metodi, joka jaottelee listalla olevat sanat niiden alkukirjaimen mukaan:

def alkukirjaimen_mukaan(lista):\n    ryhmat = {}\n    for sana in lista:\n        alkukirjain = sana[0]\n        # alusta alkukirjaimeen liittyvä lista kun kirjain tulee vastaan 1. kerran\n        if alkukirjain not in ryhmat:\n            ryhmat[alkukirjain] = []\n        # lisää sana alkukirjainta vastaavalle listalle\n        ryhmat[alkukirjain].append(sana)\n    return ryhmat\n\nryhmat = alkukirjaimen_mukaan(sanalista)\n\nfor avain, arvo in ryhmat.items():\n    print(f\"kirjaimella {avain} alkavat sanat: \")\n    for sana in arvo:\n        print(sana)

Funktio toimii pitkälti saman periaatteen mukaan kuin edellisen esimerkin funktio. Tällä kertaa kuitenkin sanakirjassa avaimiin (eli alkukirjaimiin) liittyvät arvot ovat listoja.

Ohjelman tulostus on seuraavassa:

kirjaimella b alkavat sanat:\nbanaani\nkirjaimella m alkavat sanat:\nmaito\nmehu\nmakkara\nmargariini\nmakkara\nkirjaimella o alkavat sanat:\nolut\nolut\nolut\nkirjaimella j alkavat sanat:\njuusto\njuusto\nkirjaimella p alkavat sanat:\npiimä\npiimä\npiimä\nkirjaimella t alkavat sanat:\ntomaatti\nkirjaimella k alkavat sanat:\nkurkku\nkirjaimella v alkavat sanat:\nvoi\nvoi\nkirjaimella s alkavat sanat:\nsuklaa

Tee funktio histogrammi, joka saa parametrina merkkijonon ja tulostaa merkkijonon eri kirjainten lukumäärää kuvaavan histogrammin, jossa kirjaimen jokaista esiintymää kohti tulostuu yksi tähti kirjaimen riville.

Esimerkiksi kutsuttaessa histogrammi(\"abba\") tulostus on:

\na **\nb **\n

Vastaavasti kutsuttaessa histogrammi(\"saippuakauppias\") tulostus on:

\ns **\na ****\ni **\np ****\nu **\nk *\n

Tee puhelinluettelo, joka toimii seuraavasti:

komento (1 hae, 2 lisää, 3 lopeta): 2\nnimi: pekka\nnumero: 040-5466745\nok!\nkomento (1 hae, 2 lisää, 3 lopeta): 2\nnimi: emilia\nnumero: 045-1212344\nok!\nkomento (1 hae, 2 lisää, 3 lopeta): 1\nnimi: pekka\n040-5466745\nkomento (1 hae, 2 lisää, 3 lopeta): 1\nnimi: maija\nei numeroa\nkomento (1 hae, 2 lisää, 3 lopeta): 2\nnimi: pekka\nnumero: 09-22223333\nok!\nkomento (1 hae, 2 lisää, 3 lopeta): 1\nnimi: pekka\n09-22223333\nkomento (1 hae, 2 lisää, 3 lopeta): 3\nlopetetaan...

Huomaa, että jokaiseen nimeen voi liittyä vain yksi puhelinnumero. Jos samalle henkilölle lisätään uusi numero, se korvaa aiemmin lisätyn numeron.

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Tee puhelinluettelosta paranneltu versio, missä jokaisella henkilöllä voi olla useampia puhelinnumeroita. Ohjelma toimii kuten edellisessä tehtävässä, mutta nyt se listaa jokaisen numeron:

komento (1 hae, 2 lisää, 3 lopeta): 2\nnimi: pekka\nnumero: 040-5466745\nok!\nkomento (1 hae, 2 lisää, 3 lopeta): 2\nnimi: emilia\nnumero: 045-1212344\nok!\nkomento (1 hae, 2 lisää, 3 lopeta): 1\nnimi: pekka\n040-5466745\nkomento (1 hae, 2 lisää, 3 lopeta): 1\nnimi: maija\nei numeroa\nkomento (1 hae, 2 lisää, 3 lopeta): 2\nnimi: pekka\nnumero: 09-22223333\nok!\nkomento (1 hae, 2 lisää, 3 lopeta): 1\nnimi: pekka\n040-5466745\n09-22223333\nkomento (1 hae, 2 lisää, 3 lopeta): 3\nlopetetaan...

Avaimien poistaminen sanakirjasta

Sanakirjasta on mahdollista myös poistaa avain-arvo-pareja. Menetelmiä tähän on kaksi. Ensimmäinen näistä on komento del:

henkilokunta = {\"Antti\": \"lehtori\", \"Emilia\": \"professori\", \"Arto\": \"Lehtori\"}\ndel henkilokunta[\"Arto\"]\nprint(henkilokunta)

{'Antti': 'lehtori', 'Emilia': 'professori'}

Jos komentoa del kutsutaan avaimille, joita sanakirjassa ei ole, seurauksena on virhe:

henkilokunta = {\"Antti\": \"lehtori\", \"Emilia\": \"professori\", \"Arto\": \"lehtori\"}\ndel henkilokunta[\"Jukka\"]
\n>>> del henkilokunta[\"Jukka\"]\nTraceback (most recent call last):\n  File \"\", line 1, in \nKeyError: 'Jukka'\n

Ennen poistoa on siis syytä tarkistaa, että poistettava avain löytyy sanakirjasta:

henkilokunta = {\"Antti\": \"lehtori\", \"Emilia\": \"professori\", \"Arto\": \"lehtori\"}\nif \"Jukka\" in henkilokunta:\n  del henkilokunta[\"Jukka\"]\n  print(\"Poistettiin\")\nelse:\n  print(\"Poistettavaa henkilöä ei löytynyt henkilökunnasta\")

Toinen vaihtoehto alkion poistamiseen on metodi pop:

henkilokunta = {\"Antti\": \"lehtori\", \"Emilia\": \"professori\", \"Arto\": \"lehtori\"}\npoistettu = henkilokunta.pop(\"Arto\")\nprint(henkilokunta)\nprint(\"Poistettiin\", poistettu)

{'Antti': 'lehtori', 'Emilia': 'professori'}\nPoistettiin lehtori

Metodi pop siis myös palauttaa poistettua avainta vastaavan arvon.

Oletusarvoisesti myös pop aiheuttaa virheen, jos sanakirjasta yritetään poistaa avain, jota siellä ei ole. Metodille on kuitenkin mahdollista antaa toisena parametrina oletusarvoinen paluuarvo, joka palautetaan siinä tilanteessa, kun poistettavaa ei löydy. Esimerkiksi arvo None, joka tarkoittaa \"ei mitään\", sopii hyvin tälläisiin tilanteisiin:

henkilokunta = {\"Antti\": \"lehtori\", \"Emilia\": \"professori\", \"Arto\": \"lehtori\"}\npoistettu = henkilokunta.pop(\"Jukka\", None)\nif poistettu == None:\n  print(\"Poistettavaa henkilöä ei löytynyt henkilökunnasta\")\nelse:\n  print(\"Poistettiin\", poistettu)

Poistettavaa henkilöä ei löytynyt henkilökunnasta

Kannattaa huomata, että jos on tarvetta poistaa koko sanakirjan sisältö:

henkilokunta = {\"Antti\": \"lehtori\", \"Emilia\": \"professori\", \"Arto\": \"lehtori\"}\nfor avain in henkilokunta:\n  del henkilokunta[avain]

seurauksena on virheilmoitus

RuntimeError: dictionary changed size during iteration

Syynä on se, että käytäessä läpi rakennetta for-lauseella, ei sen sisältöä saa muuttaa.

Koko sanakirjan tyhjennys onnistuu komennolla:

henkilokunta.clear()

Kirjoita funktio kaanna(sanakirja: dict), joka saa parametrikseen sanakirjan ja kääntää sen niin, että arvoista tulee avaimia ja päinvastoin.

Esimerkki funktion käytöstä:

s = {1: \"eka\", 2: \"toka\", 3: \"kolmas\", 4: \"neljas\"}\nkaanna(s)\nprint(s)

{\"eka\": 1, \"toka\": 2, \"kolmas\": 3, \"neljas\": 4}

Huomaa, että tämä pitää paikkansa myös parametrina oleville sanakirjoille!

Jos kohtaat tehtävässä ongelmia, katso visualisaattorilla mitä koodisi tekee.

Kirjoita funktio lukukirja(), joka palauttaa uuden sanakirjan. Palautettu rakenne sisältää avaimina luvut nollasta 99:ään. Sanakirjan arvoina ovat luvut kirjaimin kirjoitettuna. Katso esimerkkiä alla:

luvut = lukukirja()\nprint(luvut[2])\nprint(luvut[11])\nprint(luvut[45])\nprint(luvut[99])\nprint(luvut[0])

kaksi\nyksitoista\nneljäkymmentäviisi\nyhdensänkymmentäyhdeksän\nnolla

HUOM! Älä muodosta jokaista lukusanaa yksitellen, vaan mieti, miten voisit hyödyntää silmukoita ja sanakirjaa jotenkin ratkaisussasi!

Sanakirja tiedon ryhmittelyssä

Voimme käyttää sanakirjaa myös tiedon ryhmittelyssä. Esimerkiksi seuraava koodi luo sanakirjan, jossa on tietoa henkilöstä:

henkilo = {\"nimi\": \"Pirjo Python\", \"pituus\": 154, \"paino\": 61, \"ikä:\" 44}

Tämä tarkoittaa, että henkilön nimi on Pirjo Python, pituus on 154, paino on 61 ja ikä on 44.\nHuomaa, että olisimme voineet tallentaa tiedot myös näin muuttujiin:

nimi = \"Pirjo Python\"\npituus = 154\npaino = 61\nika = 44

Sanakirjan etuna on kuitenkin, että se kokoaa kaikki samaan asiaan liittyvät tiedot yhteisen nimen alle, jonka kautta voimme viitata tietoihin. Periaatteessa lista tarjoaa saman edun:

henkilo = [\"Pirjo Python\", 153, 61, 44]

Listan huono puoli on kuitenkin, että ohjelmoijan on muistettava, mihin kohtaan listaa mikäkin arvo tallennetaan. Pitää siis muistaa esimerkiksi, että henkilo[2] tarkoittaa painoa ja henkilo[3] ikää. Sanakirjassa tätä ongelmaa ei ole, sillä kaikki sanakirjassa olevat erilliset tiedot on tallennettu selkeästi nimetyn avaimen taakse.

Esimerkiksi voimme käsitellä henkilöitä näin:

henkilo1 = {\"nimi\": \"Pirjo Python\", \"pituus\": 154, \"paino\": 61, \"ikä\": 44}\nhenkilo2 = {\"nimi\": \"Pekka Pythonen\", \"pituus\": 174, \"paino\": 103, \"ikä\": 31}\nhenkilo3 = {\"nimi\": \"Pedro Python\", \"pituus\": 191, \"paino\": 71, \"ikä\": 14}\n\nhenkilot = [henkilo1, henkilo2, henkilo3]\n\nfor henkilo in henkilot:\n    print(henkilo[\"nimi\"])\n\nyhteispituus = 0\nfor henkilo in henkilot:\n    yhteispituus += henkilo[\"pituus\"]\n\nprint(\"Keskipituus on\", yhteispituus / len(henkilot))

Pirjo Python\nPekka Pythonen\nPedro Python\nKeskipituus on 173.0

Kirjoita funktio lisaa_elokuva(rekisteri: list, nimi: str, ohjaaja: str, vuosi: int, pituus: int), joka lisää yhden elokuvaolion elokuvarekisteriin.

Rekisteri on toteutettu listana, ja jokainen listan alkio on yksi sanakirja. Sanakirjassa on seuraavat avaimet:

    \n
  • nimi
  • \n
  • ohjaaja
  • \n
  • vuosi
  • \n
  • pituus
  • \n

Arvot tulevat metodin parametreina.

Esimerkki:

rekisteri = []\nlisaa_elokuva(rekisteri, \"Pythonin viemää\", \"Pekka Python\", 2017, 116)\nlisaa_elokuva(rekisteri, \"Python lentokoneessa\", \"Renny Pytholin\", 2001, 94)\nprint(rekisteri)

[{\"nimi\": \"Pythonin viemää\", \"ohjaaja\": \"Pekka Python\", \"vuosi\": 2017, \"pituus\": 116}, {\"nimi\": \"Python lentokoneessa\", \"ohjaaja\": \"Renny Pytholin\", \"vuosi\": 2001, \"pituus\": 94}]

Kirjoita funktio etsi_elokuvat(rekisteri: list, hakusana: str), joka käsittelee edellisessä tehtävässä luotua elokuvarekisteriä. Funktio muodostaa uuden listan, jolle kopioidaan rekisteristä ne elokuvat, joiden nimestä löytyy hakusana. Pienet ja isot kirjaimet eivät merkitse haussa, joten hakusanalla paj pitää löytyä sekä elokuva Tappajahai että elokuva Pajatoiminnan historia.

Esimerkki:

rekisteri = [{\"nimi\": \"Pythonin viemää\", \"ohjaaja\": \"Pekka Python\", \"vuosi\": 2017, \"pituus\": 116},\n{\"nimi\": \"Python lentokoneessa\", \"ohjaaja\": \"Renny Pythonen\", \"vuosi\": 2001, \"pituus\": 94},\n{\"nimi\": \"Koodaajien yö\", \"ohjaaja\": \"M. Night Python\", \"vuosi\": 2011, \"pituus\": 101}]\n\nlista = etsi_elokuvat(rekisteri, \"python\")\nprint(lista)

[{\"nimi\": \"Pythonin viemää\", \"ohjaaja\": \"Pekka Python\", \"vuosi\": 2017, \"pituus\": 116}, {\"nimi\": \"Python lentokoneessa\", \"ohjaaja\": \"Renny Pythonen\", \"vuosi\": 2001, \"pituus\": 94}]

","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-5/3-dictionary.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, millainen tietorakenne on sanakirja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää sanakirjaa erityyppisten avainten ja arvojen kanssa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käydä läpi sanakirjan sisällön"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tunnet joitakin sanakirjan käyttötarkoituksia ohjelmoinnissa"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lista on kätevä tietorakenne, mutta sen rajoituksena on, että alkiot ovat indekseissä 0, 1, 2, jne. Tämä hankaloittaa alkioiden etsimistä listalta: jotta löydämme tietyn alkion, on pahimmassa tapauksessa käytävä läpi koko lista."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tutustumme seuraavaksi "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"sanakirjaan"}]},{"type":"text","value":", (englanniksi "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"dictionary"}]},{"type":"text","value":") joka on listan lisäksi toinen Pythonin perustietorakenne. Sanakirjassa jokainen alkio koostuu "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"avaimesta"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"arvosta"}]},{"type":"text","value":", ja voimme etsiä ja muuttaa tietoa avaimen perusteella."}]},{"type":"element","tagName":"h2","properties":{"id":"sanakirjan-kayttaminen","style":"position:relative;"},"children":[{"type":"text","value":"Sanakirjan käyttäminen"},{"type":"element","tagName":"a","properties":{"href":"#sanakirjan-kayttaminen","ariaLabel":"sanakirjan kayttaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma näyttää esimerkin sanakirjan käyttämisestä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sanakirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\nsanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"apina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"monkey\""}]},{"type":"text","value":"\nsanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banana\""}]},{"type":"text","value":"\nsanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"cembalo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"harpsichord\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"apina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3\n{'apina': 'monkey', 'banaani': 'banana', 'cembalo': 'harpsichord'}\nmonkey"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkintä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"{}"}]},{"type":"text","value":" luo tyhjän sanakirjan, minkä jälkeen voimme lisätä sanakirjaan sisältöä. Tässä tapauksessa lisäämme kolme avainta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"apina\""}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"cembalo\""}]},{"type":"text","value":", joita vastaavat arvot "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"monkey\""}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"banana\""}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"harpsichord\""}]},{"type":"text","value":". Lopuksi tulostamme koko sanakirjan sisällön ja sitten avaimen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"apina\""}]},{"type":"text","value":" arvon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voisimme käyttää tätä sanakirjaa vaikka seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna sana: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Käännös:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sanaa ei löytynyt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä käytössä on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":"-operaattori, joka sanakirjan tapauksessa tarkastaa, onko siinä tiettyä avainta. Mahdollisia ohjelman tulostuksia:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"apina"}]},{"type":"text","value":"\nKäännös: monkey"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pöllö"}]},{"type":"text","value":"\nSanaa ei löytynyt"}]}]},{"type":"element","tagName":"h2","properties":{"id":"mita-sanakirjassa-voi-olla","style":"position:relative;"},"children":[{"type":"text","value":"Mitä sanakirjassa voi olla?"},{"type":"element","tagName":"a","properties":{"href":"#mita-sanakirjassa-voi-olla","ariaLabel":"mita sanakirjassa voi olla permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaikka tietorakenteen nimi on sanakirja, siinä ei ole usein sanakirjaa vaan jotain muuta tietoa. Esimerkiksi seuraavassa sanakirjassa avaimet ovat merkkijonoja ja arvot ovat kokonaislukuja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tulokset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\ntulokset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\ntulokset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Liisa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\ntulokset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kalle\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa sanakirjassa puolestaan avaimet ovat kokonaislukuja ja arvot ovat listoja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"listat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\nlistat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nlistat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"42"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nlistat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"avaimista-ja-arvoista","style":"position:relative;"},"children":[{"type":"text","value":"Avaimista ja arvoista"},{"type":"element","tagName":"a","properties":{"href":"#avaimista-ja-arvoista","ariaLabel":"avaimista ja arvoista permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tietty avain voi esiintyä sanakirjassa enintään kerran. Jos asetamme samalle avaimelle uuden arvon, korvaa uusi arvo vanhan arvon:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"suuri\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"big\""}]},{"type":"text","value":"\nsanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"suuri\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"large\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"suuri\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"large"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanakirjan avaimen vaatimuksena on, että sen tulee olla muuttumaton. Tämän vuoksi emme voi käyttää listaa avaimena, koska lista voi muuttua. Esimerkiksi seuraava koodi ei toimi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"TypeError: unhashable type: 'list'"}]}]},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Hajautustaulu"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python tallentaa sanakirjan sisällön sisäisesti tietorakenteena nimeltä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"hajautustaulu"}]},{"type":"text","value":" ("},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"hash table"}]},{"type":"text","value":"). Ideana on laskea avaimelle "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"hajautusarvo"}]},{"type":"text","value":" ("},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"hash value"}]},{"type":"text","value":"), jonka avulla määräytyy avaimen paikka muistissa. Yllä oleva virheilmoitus ilmaisee, että listalle ei voida laskea hajautusarvoa, joten se ei kelpaa sanakirjan avaimeksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kurssilla "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Tietorakenteet ja algoritmit"}]},{"type":"text","value":" tutustutaan tarkemmin hajautustauluihin, eli sanakirjojen pellin alla olevaan mekanismiin."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että sanakirjassa olevaa avainta vastaavan arvon ei tarvitse olla muuttumaton, vaan voimme tallentaa mitä tahansa tietoa arvoiksi. Sama arvo voi myös esiintyä samassa hakemistossa enemmän kuin yhden kerran."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kertaa kymmenen","tmcname":"osa05-10b_kertaa_kymmenen"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kertaa_kymmenen(alku: int, loppu: int)"}]},{"type":"text","value":", joka muodostaa ja palauttaa uuden sanakirjan. Sanakirjassa on avaimina luvut väliltä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"alku"}]},{"type":"text","value":".."},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"loppu"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jokaisen avaimen arvona on avain kerrottuna kymmenellä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"d "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kertaa_kymmenen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"d"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"{3: 30, 4: 40, 5: 50, 6: 60}"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kertomat","tmcname":"osa05-11_kertomat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kertomat(n: int)"}]},{"type":"text","value":", joka palauttaa lukujen 1.."},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"n"}]},{"type":"text","value":" kertomat sanakirjassa siten, että luku on avain ja luvun kertoma arvo, johon avain viittaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muistutuksena: luvun "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"n"}]},{"type":"text","value":" kertoma "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"n"}]},{"type":"text","value":"! lasketaan kertomalla luku kaikilla itseään pienemmillä positiivisilla kokonaisluvuilla. Luvun 4 kertoma on siis 4 * 3 * 2 * 1 = 24."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kertomat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"k"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1\n6\n120"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"sanakirjan-lapikaynti","style":"position:relative;"},"children":[{"type":"text","value":"Sanakirjan läpikäynti"},{"type":"element","tagName":"a","properties":{"href":"#sanakirjan-lapikaynti","ariaLabel":"sanakirjan lapikaynti permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanakirjan läpikäyntiin voidaan käyttää tuttuun tapaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukkaa. Rakenne "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for avain in sanakirja"}]},{"type":"text","value":" käy läpi kaikki sanakirjan avaimet yksi kerrallaan. Esimerkiksi seuraava koodi tulostaa kaikki sanakirjan avaimet ja niiden arvot:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sanakirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\nsanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"apina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"monkey\""}]},{"type":"text","value":"\nsanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banana\""}]},{"type":"text","value":"\nsanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"cembalo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"harpsichord\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" avain "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"avain:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" avain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"arvo:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"avain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"avain: apina\narvo: monkey\navain: banaani\narvo: banana\navain: cembalo\narvo: harpsichord"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python tarjoaa myös mahdollisuuden käydä läpi samaan aikaan sekä avaimet että vastaavat arvot. Tämä onnistuu käyttämällä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"items"}]},{"type":"text","value":"-metodia, joka palauttaa kaikki avaimet ja arvot yksi kerrallaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" avain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvo "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"items"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"avain:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" avain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"arvo:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että läpikäynnissä avaimet tulevat samassa järjestyksessä kuin ne on lisätty sanakirjaan. Sanakirjan avainten järjestyksellä ei kuitenkaan yleensä ole merkitystä sovelluksissa."}]},{"type":"element","tagName":"h2","properties":{"id":"sanakirjan-edistyneempi-kaytto","style":"position:relative;"},"children":[{"type":"text","value":"Sanakirjan edistyneempi käyttö"},{"type":"element","tagName":"a","properties":{"href":"#sanakirjan-edistyneempi-kaytto","ariaLabel":"sanakirjan edistyneempi kaytto permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan tilannetta, jossa listassa on joukko sanoja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sanalista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"maito\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"olut\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"juusto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"piimä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"mehu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"makkara\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tomaatti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kurkku\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"voi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"margariini\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"juusto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"makkara\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"olut\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"piimä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"piimä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"voi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"olut\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"suklaa\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Haluamme analysoida sanalistaa eri tavoin, kuten selvittää, montako kertaa kukin sana listalla esiintyy."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanakirja sopii tähän tilanteeseen hyvin. Ideana on käydä listan sanat läpi yksi kerrallaan ja ylläpitää sanakirjassa tietoa sanojen esiintymiskerroista:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lukumaarat"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n sanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# jos sana ei ole vielä tullut vastaan, alusta avaimen arvo"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kasvata sanan esiintymislukumäärää"}]},{"type":"text","value":"\n sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" sanat\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kutsutaan funktiota"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lukumaarat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostus on seuraavassa:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"{'banaani': 1, 'maito': 1, 'olut': 3, 'juusto': 2, 'piimä': 3, 'mehu': 1, 'makkara': 2, 'tomaatti': 1, 'kurkku': 1, 'voi': 2, 'margariini': 1, 'suklaa': 1}"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehdään vielä toinen sanalistaa käsittelevä metodi, joka jaottelee listalla olevat sanat niiden alkukirjaimen mukaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"alkukirjaimen_mukaan"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n ryhmat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n alkukirjain "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# alusta alkukirjaimeen liittyvä lista kun kirjain tulee vastaan 1. kerran"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" alkukirjain "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" ryhmat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n ryhmat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"alkukirjain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# lisää sana alkukirjainta vastaavalle listalle"}]},{"type":"text","value":"\n ryhmat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"alkukirjain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" ryhmat\n\nryhmat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" alkukirjaimen_mukaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" avain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvo "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" ryhmat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"items"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"kirjaimella "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"avain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" alkavat sanat: \""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii pitkälti saman periaatteen mukaan kuin edellisen esimerkin funktio. Tällä kertaa kuitenkin sanakirjassa avaimiin (eli alkukirjaimiin) liittyvät arvot ovat listoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostus on seuraavassa:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"kirjaimella b alkavat sanat:\nbanaani\nkirjaimella m alkavat sanat:\nmaito\nmehu\nmakkara\nmargariini\nmakkara\nkirjaimella o alkavat sanat:\nolut\nolut\nolut\nkirjaimella j alkavat sanat:\njuusto\njuusto\nkirjaimella p alkavat sanat:\npiimä\npiimä\npiimä\nkirjaimella t alkavat sanat:\ntomaatti\nkirjaimella k alkavat sanat:\nkurkku\nkirjaimella v alkavat sanat:\nvoi\nvoi\nkirjaimella s alkavat sanat:\nsuklaa"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Histogrammi","tmcname":"osa05-12_histogrammi"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"histogrammi"}]},{"type":"text","value":", joka saa parametrina merkkijonon ja tulostaa merkkijonon eri kirjainten lukumäärää kuvaavan histogrammin, jossa kirjaimen jokaista esiintymää kohti tulostuu yksi tähti kirjaimen riville."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi kutsuttaessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"histogrammi(\"abba\")"}]},{"type":"text","value":" tulostus on:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"a **\nb **\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaavasti kutsuttaessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"histogrammi(\"saippuakauppias\")"}]},{"type":"text","value":" tulostus on:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"s **\na ****\ni **\np ****\nu **\nk *\n"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Puhelinluettelo, versio 1","tmcname":"osa05-13_puhelinluettelo_versio1"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee puhelinluettelo, joka toimii seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pekka"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"040-5466745"}]},{"type":"text","value":"\nok!\nkomento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"emilia"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"045-1212344"}]},{"type":"text","value":"\nok!\nkomento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pekka"}]},{"type":"text","value":"\n040-5466745\nkomento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"maija"}]},{"type":"text","value":"\nei numeroa\nkomento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pekka"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"09-22223333"}]},{"type":"text","value":"\nok!\nkomento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pekka"}]},{"type":"text","value":"\n09-22223333\nkomento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nlopetetaan..."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että jokaiseen nimeen voi liittyä vain yksi puhelinnumero. Jos samalle henkilölle lisätään uusi numero, se korvaa aiemmin lisätyn numeron."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Puhelinluettelo, versio 2","tmcname":"osa05-14_puhelinluettelo_versio2"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee puhelinluettelosta paranneltu versio, missä jokaisella henkilöllä voi olla useampia puhelinnumeroita. Ohjelma toimii kuten edellisessä tehtävässä, mutta nyt se listaa jokaisen numeron:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"komento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pekka"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"040-5466745"}]},{"type":"text","value":"\nok!\nkomento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"emilia"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"045-1212344"}]},{"type":"text","value":"\nok!\nkomento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pekka"}]},{"type":"text","value":"\n040-5466745\nkomento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"maija"}]},{"type":"text","value":"\nei numeroa\nkomento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pekka"}]},{"type":"text","value":"\nnumero: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"09-22223333"}]},{"type":"text","value":"\nok!\nkomento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nnimi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pekka"}]},{"type":"text","value":"\n040-5466745\n09-22223333\nkomento (1 hae, 2 lisää, 3 lopeta): "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nlopetetaan..."}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"avaimien-poistaminen-sanakirjasta","style":"position:relative;"},"children":[{"type":"text","value":"Avaimien poistaminen sanakirjasta"},{"type":"element","tagName":"a","properties":{"href":"#avaimien-poistaminen-sanakirjasta","ariaLabel":"avaimien poistaminen sanakirjasta permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanakirjasta on mahdollista myös poistaa avain-arvo-pareja. Menetelmiä tähän on kaksi. Ensimmäinen näistä on komento "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"del"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilokunta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lehtori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"professori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lehtori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"del"}]},{"type":"text","value":" henkilokunta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"henkilokunta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"{'Antti': 'lehtori', 'Emilia': 'professori'}"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos komentoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"del"}]},{"type":"text","value":" kutsutaan avaimille, joita sanakirjassa ei ole, seurauksena on virhe:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilokunta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lehtori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"professori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lehtori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"del"}]},{"type":"text","value":" henkilokunta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jukka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":">>> del henkilokunta[\"Jukka\"]\nTraceback (most recent call last):\n File \""},{"type":"element","tagName":"stdin","properties":{},"children":[{"type":"text","value":"\", line 1, in "},{"type":"element","tagName":"module","properties":{},"children":[{"type":"text","value":"\nKeyError: 'Jukka'\n"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ennen poistoa on siis syytä tarkistaa, että poistettava avain löytyy sanakirjasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilokunta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lehtori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"professori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lehtori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jukka\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" henkilokunta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"del"}]},{"type":"text","value":" henkilokunta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jukka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Poistettiin\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Poistettavaa henkilöä ei löytynyt henkilökunnasta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen vaihtoehto alkion poistamiseen on metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pop"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilokunta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lehtori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"professori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lehtori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\npoistettu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" henkilokunta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pop"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"henkilokunta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Poistettiin\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" poistettu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"{'Antti': 'lehtori', 'Emilia': 'professori'}\nPoistettiin lehtori"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pop"}]},{"type":"text","value":" siis myös palauttaa poistettua avainta vastaavan arvon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oletusarvoisesti myös "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pop"}]},{"type":"text","value":" aiheuttaa virheen, jos sanakirjasta yritetään poistaa avain, jota siellä ei ole. Metodille on kuitenkin mahdollista antaa toisena parametrina "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"oletusarvoinen paluuarvo"}]},{"type":"text","value":", joka palautetaan siinä tilanteessa, kun poistettavaa ei löydy. Esimerkiksi arvo "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"None"}]},{"type":"text","value":", joka tarkoittaa \"ei mitään\", sopii hyvin tälläisiin tilanteisiin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilokunta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lehtori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"professori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lehtori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\npoistettu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" henkilokunta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pop"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jukka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"None"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" poistettu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"None"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Poistettavaa henkilöä ei löytynyt henkilökunnasta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Poistettiin\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" poistettu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Poistettavaa henkilöä ei löytynyt henkilökunnasta"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kannattaa huomata, että jos on tarvetta poistaa koko sanakirjan sisältö:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilokunta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lehtori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"professori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lehtori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" avain "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" henkilokunta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"del"}]},{"type":"text","value":" henkilokunta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"avain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"seurauksena on virheilmoitus"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"RuntimeError: dictionary changed size during iteration"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Syynä on se, että käytäessä läpi rakennetta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-lauseella, ei sen sisältöä saa muuttaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koko sanakirjan tyhjennys onnistuu komennolla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilokunta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"clear"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sanakirjan kääntö","tmcname":"osa05-15_sanakirjan_kaanto"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kaanna(sanakirja: dict)"}]},{"type":"text","value":", joka saa parametrikseen sanakirjan ja kääntää sen niin, että arvoista tulee avaimia ja päinvastoin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"s "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"eka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"toka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kolmas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"neljas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\nkaanna"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"s"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"s"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"{\"eka\": 1, \"toka\": 2, \"kolmas\": 3, \"neljas\": 4}"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huomaa"}]},{"type":"text","value":", että "},{"type":"element","tagName":"a","properties":{"href":"/osa-5/2-viittaukset#parametrina-olevan-listan-muokkaaminen"},"children":[{"type":"text","value":"tämä"}]},{"type":"text","value":" pitää paikkansa myös parametrina oleville sanakirjoille!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos kohtaat tehtävässä ongelmia, katso "},{"type":"element","tagName":"a","properties":{"href":"http://www.pythontutor.com/visualize.html#mode=edit","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"visualisaattorilla"}]},{"type":"text","value":" mitä koodisi tekee."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Luvut sanoina","tmcname":"osa05-16_luvut_sanoina"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lukukirja()"}]},{"type":"text","value":", joka palauttaa uuden sanakirjan. Palautettu rakenne sisältää avaimina luvut nollasta 99:ään. Sanakirjan arvoina ovat luvut kirjaimin kirjoitettuna. Katso esimerkkiä alla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lukukirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"45"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"99"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"kaksi\nyksitoista\nneljäkymmentäviisi\nyhdensänkymmentäyhdeksän\nnolla"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"HUOM! Älä muodosta jokaista lukusanaa yksitellen, vaan mieti, miten voisit hyödyntää silmukoita ja sanakirjaa jotenkin ratkaisussasi!"}]}]},{"type":"element","tagName":"h2","properties":{"id":"sanakirja-tiedon-ryhmittelyssa","style":"position:relative;"},"children":[{"type":"text","value":"Sanakirja tiedon ryhmittelyssä"},{"type":"element","tagName":"a","properties":{"href":"#sanakirja-tiedon-ryhmittelyssa","ariaLabel":"sanakirja tiedon ryhmittelyssa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme käyttää sanakirjaa myös tiedon ryhmittelyssä. Esimerkiksi seuraava koodi luo sanakirjan, jossa on tietoa henkilöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pirjo Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pituus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"154"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"paino\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"61"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ikä:\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"44"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä tarkoittaa, että henkilön nimi on Pirjo Python, pituus on 154, paino on 61 ja ikä on 44.\nHuomaa, että olisimme voineet tallentaa tiedot myös näin muuttujiin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pirjo Python\""}]},{"type":"text","value":"\npituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"154"}]},{"type":"text","value":"\npaino "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"61"}]},{"type":"text","value":"\nika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"44"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanakirjan etuna on kuitenkin, että se kokoaa kaikki samaan asiaan liittyvät tiedot yhteisen nimen alle, jonka kautta voimme viitata tietoihin. Periaatteessa lista tarjoaa saman edun:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pirjo Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"153"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"61"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"44"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Listan huono puoli on kuitenkin, että ohjelmoijan on muistettava, mihin kohtaan listaa mikäkin arvo tallennetaan. Pitää siis muistaa esimerkiksi, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"henkilo[2]"}]},{"type":"text","value":" tarkoittaa painoa ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"henkilo[3]"}]},{"type":"text","value":" ikää. Sanakirjassa tätä ongelmaa ei ole, sillä kaikki sanakirjassa olevat erilliset tiedot on tallennettu selkeästi nimetyn avaimen taakse."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi voimme käsitellä henkilöitä näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilo1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pirjo Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pituus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"154"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"paino\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"61"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ikä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"44"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\nhenkilo2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Pythonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pituus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"174"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"paino\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"103"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ikä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"31"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\nhenkilo3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pedro Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pituus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"191"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"paino\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"71"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ikä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"14"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\nhenkilot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"henkilo1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" henkilo2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" henkilo3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" henkilo "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nyhteispituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" henkilo "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n yhteispituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pituus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Keskipituus on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" yhteispituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pirjo Python\nPekka Pythonen\nPedro Python\nKeskipituus on 173.0"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Elokuvarekisteri","tmcname":"osa05-17_elokuvarekisteri"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_elokuva(rekisteri: list, nimi: str, ohjaaja: str, vuosi: int, pituus: int)"}]},{"type":"text","value":", joka lisää yhden elokuvaolion elokuvarekisteriin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rekisteri on toteutettu listana, ja jokainen listan alkio on yksi sanakirja. Sanakirjassa on seuraavat avaimet:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"ohjaaja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"vuosi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"pituus"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Arvot tulevat metodin parametreina."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"rekisteri "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nlisaa_elokuva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rekisteri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pythonin viemää\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2017"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"116"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_elokuva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rekisteri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Python lentokoneessa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Renny Pytholin\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2001"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"94"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rekisteri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[{\"nimi\": \"Pythonin viemää\", \"ohjaaja\": \"Pekka Python\", \"vuosi\": 2017, \"pituus\": 116}, {\"nimi\": \"Python lentokoneessa\", \"ohjaaja\": \"Renny Pytholin\", \"vuosi\": 2001, \"pituus\": 94}]"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Etsi elokuvat","tmcname":"osa05-17b_etsi_elokuvat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"etsi_elokuvat(rekisteri: list, hakusana: str)"}]},{"type":"text","value":", joka käsittelee edellisessä tehtävässä luotua elokuvarekisteriä. Funktio muodostaa uuden listan, jolle kopioidaan rekisteristä ne elokuvat, joiden nimestä löytyy hakusana. Pienet ja isot kirjaimet eivät merkitse haussa, joten hakusanalla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"paj"}]},{"type":"text","value":" pitää löytyä sekä elokuva "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tappajahai"}]},{"type":"text","value":" että elokuva "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pajatoiminnan historia"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"rekisteri "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pythonin viemää\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ohjaaja\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vuosi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2017"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pituus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"116"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Python lentokoneessa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ohjaaja\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Renny Pythonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vuosi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2001"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pituus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"94"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Koodaajien yö\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ohjaaja\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"M. Night Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vuosi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2011"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pituus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"101"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nlista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" etsi_elokuvat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rekisteri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[{\"nimi\": \"Pythonin viemää\", \"ohjaaja\": \"Pekka Python\", \"vuosi\": 2017, \"pituus\": 116}, {\"nimi\": \"Python lentokoneessa\", \"ohjaaja\": \"Renny Pythonen\", \"vuosi\": 2001, \"pituus\": 94}]"}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, millainen tietorakenne on sanakirja
  • \n
  • Osaat käyttää sanakirjaa erityyppisten avainten ja arvojen kanssa
  • \n
  • Osaat käydä läpi sanakirjan sisällön
  • \n
  • Tunnet joitakin sanakirjan käyttötarkoituksia ohjelmoinnissa
  • \n

Lista on kätevä tietorakenne, mutta sen rajoituksena on, että alkiot ovat indekseissä 0, 1, 2, jne. Tämä hankaloittaa alkioiden etsimistä listalta: jotta löydämme tietyn alkion, on pahimmassa tapauksessa käytävä läpi koko lista.

Tutustumme seuraavaksi sanakirjaan, (englanniksi dictionary) joka on listan lisäksi toinen Pythonin perustietorakenne. Sanakirjassa jokainen alkio koostuu avaimesta ja arvosta, ja voimme etsiä ja muuttaa tietoa avaimen perusteella.

Sanakirjan käyttäminen

Seuraava ohjelma näyttää esimerkin sanakirjan käyttämisestä:

sanakirja = {}\n\nsanakirja[\"apina\"] = \"monkey\"\nsanakirja[\"banaani\"] = \"banana\"\nsanakirja[\"cembalo\"] = \"harpsichord\"\n\nprint(len(sanakirja))\nprint(sanakirja)\nprint(sanakirja[\"apina\"])

3\n{'apina': 'monkey', 'banaani': 'banana', 'cembalo': 'harpsichord'}\nmonkey

Merkintä {} luo tyhjän sanakirjan, minkä jälkeen voimme lisätä sanakirjaan sisältöä. Tässä tapauksessa lisäämme kolme avainta \"apina\", \"banaani\" ja \"cembalo\", joita vastaavat arvot \"monkey\", \"banana\" ja \"harpsichord\". Lopuksi tulostamme koko sanakirjan sisällön ja sitten avaimen \"apina\" arvon.

Voisimme käyttää tätä sanakirjaa vaikka seuraavasti:

sana = input(\"Anna sana: \")\nif sana in sanakirja:\n    print(\"Käännös:\", sanakirja[sana])\nelse:\n    print(\"Sanaa ei löytynyt\")

Tässä käytössä on in-operaattori, joka sanakirjan tapauksessa tarkastaa, onko siinä tiettyä avainta. Mahdollisia ohjelman tulostuksia:

Anna sana: apina\nKäännös: monkey

Anna sana: pöllö\nSanaa ei löytynyt

Mitä sanakirjassa voi olla?

Vaikka tietorakenteen nimi on sanakirja, siinä ei ole usein sanakirjaa vaan jotain muuta tietoa. Esimerkiksi seuraavassa sanakirjassa avaimet ovat merkkijonoja ja arvot ovat kokonaislukuja:

tulokset = {}\ntulokset[\"Maija\"] = 4\ntulokset[\"Liisa\"] = 5\ntulokset[\"Kalle\"] = 2

Seuraavassa sanakirjassa puolestaan avaimet ovat kokonaislukuja ja arvot ovat listoja:

listat = {}\nlistat[5] = [1, 2, 3]\nlistat[42] = [5, 4, 5, 4, 5]\nlistat[100] = [5, 2, 3]

Avaimista ja arvoista

Tietty avain voi esiintyä sanakirjassa enintään kerran. Jos asetamme samalle avaimelle uuden arvon, korvaa uusi arvo vanhan arvon:

sanakirja[\"suuri\"] = \"big\"\nsanakirja[\"suuri\"] = \"large\"\nprint(sanakirja[\"suuri\"])

large

Sanakirjan avaimen vaatimuksena on, että sen tulee olla muuttumaton. Tämän vuoksi emme voi käyttää listaa avaimena, koska lista voi muuttua. Esimerkiksi seuraava koodi ei toimi:

sanakirja[[1, 2, 3]] = 5

TypeError: unhashable type: 'list'

Python tallentaa sanakirjan sisällön sisäisesti tietorakenteena nimeltä hajautustaulu (hash table). Ideana on laskea avaimelle hajautusarvo (hash value), jonka avulla määräytyy avaimen paikka muistissa. Yllä oleva virheilmoitus ilmaisee, että listalle ei voida laskea hajautusarvoa, joten se ei kelpaa sanakirjan avaimeksi.

Kurssilla Tietorakenteet ja algoritmit tutustutaan tarkemmin hajautustauluihin, eli sanakirjojen pellin alla olevaan mekanismiin.

Huomaa, että sanakirjassa olevaa avainta vastaavan arvon ei tarvitse olla muuttumaton, vaan voimme tallentaa mitä tahansa tietoa arvoiksi. Sama arvo voi myös esiintyä samassa hakemistossa enemmän kuin yhden kerran.

Tee funktio kertaa_kymmenen(alku: int, loppu: int), joka muodostaa ja palauttaa uuden sanakirjan. Sanakirjassa on avaimina luvut väliltä alku..loppu.

Jokaisen avaimen arvona on avain kerrottuna kymmenellä.

Esimerkiksi:

d = kertaa_kymmenen(3, 6)\nprint(d)

{3: 30, 4: 40, 5: 50, 6: 60}

Tee funktio kertomat(n: int), joka palauttaa lukujen 1..n kertomat sanakirjassa siten, että luku on avain ja luvun kertoma arvo, johon avain viittaa.

Muistutuksena: luvun n kertoma n! lasketaan kertomalla luku kaikilla itseään pienemmillä positiivisilla kokonaisluvuilla. Luvun 4 kertoma on siis 4 * 3 * 2 * 1 = 24.

Esimerkki käytöstä:

k = kertomat(5)\nprint(k[1])\nprint(k[3])\nprint(k[5])

1\n6\n120

Sanakirjan läpikäynti

Sanakirjan läpikäyntiin voidaan käyttää tuttuun tapaan for-silmukkaa. Rakenne for avain in sanakirja käy läpi kaikki sanakirjan avaimet yksi kerrallaan. Esimerkiksi seuraava koodi tulostaa kaikki sanakirjan avaimet ja niiden arvot:

sanakirja = {}\n\nsanakirja[\"apina\"] = \"monkey\"\nsanakirja[\"banaani\"] = \"banana\"\nsanakirja[\"cembalo\"] = \"harpsichord\"\n\nfor avain in sanakirja:\n    print(\"avain:\", avain)\n    print(\"arvo:\", sanakirja[avain])

avain: apina\narvo: monkey\navain: banaani\narvo: banana\navain: cembalo\narvo: harpsichord

Python tarjoaa myös mahdollisuuden käydä läpi samaan aikaan sekä avaimet että vastaavat arvot. Tämä onnistuu käyttämällä items-metodia, joka palauttaa kaikki avaimet ja arvot yksi kerrallaan:

\nfor avain, arvo in sanakirja.items():\n    print(\"avain:\", avain)\n    print(\"arvo:\", arvo)

Huomaa, että läpikäynnissä avaimet tulevat samassa järjestyksessä kuin ne on lisätty sanakirjaan. Sanakirjan avainten järjestyksellä ei kuitenkaan yleensä ole merkitystä sovelluksissa.

Sanakirjan edistyneempi käyttö

Tarkastellaan tilannetta, jossa listassa on joukko sanoja:

sanalista = [\n  \"banaani\", \"maito\", \"olut\", \"juusto\", \"piimä\", \"mehu\", \"makkara\",\n  \"tomaatti\", \"kurkku\", \"voi\", \"margariini\", \"juusto\", \"makkara\",\n  \"olut\", \"piimä\", \"piimä\", \"voi\", \"olut\", \"suklaa\"\n]

Haluamme analysoida sanalistaa eri tavoin, kuten selvittää, montako kertaa kukin sana listalla esiintyy.

Sanakirja sopii tähän tilanteeseen hyvin. Ideana on käydä listan sanat läpi yksi kerrallaan ja ylläpitää sanakirjassa tietoa sanojen esiintymiskerroista:

def lukumaarat(lista):\n    sanat = {}\n    for sana in lista:\n        # jos sana ei ole vielä tullut vastaan, alusta avaimen arvo\n        if sana not in sanat:\n            sanat[sana] = 0\n        # kasvata sanan esiintymislukumäärää\n        sanat[sana] += 1\n    return sanat\n\n# kutsutaan funktiota\nprint(lukumaarat(sanalista))

Ohjelman tulostus on seuraavassa:

{'banaani': 1, 'maito': 1, 'olut': 3, 'juusto': 2, 'piimä': 3, 'mehu': 1, 'makkara': 2, 'tomaatti': 1, 'kurkku': 1, 'voi': 2, 'margariini': 1, 'suklaa': 1}

Tehdään vielä toinen sanalistaa käsittelevä metodi, joka jaottelee listalla olevat sanat niiden alkukirjaimen mukaan:

def alkukirjaimen_mukaan(lista):\n    ryhmat = {}\n    for sana in lista:\n        alkukirjain = sana[0]\n        # alusta alkukirjaimeen liittyvä lista kun kirjain tulee vastaan 1. kerran\n        if alkukirjain not in ryhmat:\n            ryhmat[alkukirjain] = []\n        # lisää sana alkukirjainta vastaavalle listalle\n        ryhmat[alkukirjain].append(sana)\n    return ryhmat\n\nryhmat = alkukirjaimen_mukaan(sanalista)\n\nfor avain, arvo in ryhmat.items():\n    print(f\"kirjaimella {avain} alkavat sanat: \")\n    for sana in arvo:\n        print(sana)

Funktio toimii pitkälti saman periaatteen mukaan kuin edellisen esimerkin funktio. Tällä kertaa kuitenkin sanakirjassa avaimiin (eli alkukirjaimiin) liittyvät arvot ovat listoja.

Ohjelman tulostus on seuraavassa:

kirjaimella b alkavat sanat:\nbanaani\nkirjaimella m alkavat sanat:\nmaito\nmehu\nmakkara\nmargariini\nmakkara\nkirjaimella o alkavat sanat:\nolut\nolut\nolut\nkirjaimella j alkavat sanat:\njuusto\njuusto\nkirjaimella p alkavat sanat:\npiimä\npiimä\npiimä\nkirjaimella t alkavat sanat:\ntomaatti\nkirjaimella k alkavat sanat:\nkurkku\nkirjaimella v alkavat sanat:\nvoi\nvoi\nkirjaimella s alkavat sanat:\nsuklaa

Tee funktio histogrammi, joka saa parametrina merkkijonon ja tulostaa merkkijonon eri kirjainten lukumäärää kuvaavan histogrammin, jossa kirjaimen jokaista esiintymää kohti tulostuu yksi tähti kirjaimen riville.

Esimerkiksi kutsuttaessa histogrammi(\"abba\") tulostus on:

\na **\nb **\n

Vastaavasti kutsuttaessa histogrammi(\"saippuakauppias\") tulostus on:

\ns **\na ****\ni **\np ****\nu **\nk *\n

Tee puhelinluettelo, joka toimii seuraavasti:

komento (1 hae, 2 lisää, 3 lopeta): 2\nnimi: pekka\nnumero: 040-5466745\nok!\nkomento (1 hae, 2 lisää, 3 lopeta): 2\nnimi: emilia\nnumero: 045-1212344\nok!\nkomento (1 hae, 2 lisää, 3 lopeta): 1\nnimi: pekka\n040-5466745\nkomento (1 hae, 2 lisää, 3 lopeta): 1\nnimi: maija\nei numeroa\nkomento (1 hae, 2 lisää, 3 lopeta): 2\nnimi: pekka\nnumero: 09-22223333\nok!\nkomento (1 hae, 2 lisää, 3 lopeta): 1\nnimi: pekka\n09-22223333\nkomento (1 hae, 2 lisää, 3 lopeta): 3\nlopetetaan...

Huomaa, että jokaiseen nimeen voi liittyä vain yksi puhelinnumero. Jos samalle henkilölle lisätään uusi numero, se korvaa aiemmin lisätyn numeron.

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Tee puhelinluettelosta paranneltu versio, missä jokaisella henkilöllä voi olla useampia puhelinnumeroita. Ohjelma toimii kuten edellisessä tehtävässä, mutta nyt se listaa jokaisen numeron:

komento (1 hae, 2 lisää, 3 lopeta): 2\nnimi: pekka\nnumero: 040-5466745\nok!\nkomento (1 hae, 2 lisää, 3 lopeta): 2\nnimi: emilia\nnumero: 045-1212344\nok!\nkomento (1 hae, 2 lisää, 3 lopeta): 1\nnimi: pekka\n040-5466745\nkomento (1 hae, 2 lisää, 3 lopeta): 1\nnimi: maija\nei numeroa\nkomento (1 hae, 2 lisää, 3 lopeta): 2\nnimi: pekka\nnumero: 09-22223333\nok!\nkomento (1 hae, 2 lisää, 3 lopeta): 1\nnimi: pekka\n040-5466745\n09-22223333\nkomento (1 hae, 2 lisää, 3 lopeta): 3\nlopetetaan...

Avaimien poistaminen sanakirjasta

Sanakirjasta on mahdollista myös poistaa avain-arvo-pareja. Menetelmiä tähän on kaksi. Ensimmäinen näistä on komento del:

henkilokunta = {\"Antti\": \"lehtori\", \"Emilia\": \"professori\", \"Arto\": \"Lehtori\"}\ndel henkilokunta[\"Arto\"]\nprint(henkilokunta)

{'Antti': 'lehtori', 'Emilia': 'professori'}

Jos komentoa del kutsutaan avaimille, joita sanakirjassa ei ole, seurauksena on virhe:

henkilokunta = {\"Antti\": \"lehtori\", \"Emilia\": \"professori\", \"Arto\": \"lehtori\"}\ndel henkilokunta[\"Jukka\"]
\n>>> del henkilokunta[\"Jukka\"]\nTraceback (most recent call last):\n  File \"\", line 1, in \nKeyError: 'Jukka'\n

Ennen poistoa on siis syytä tarkistaa, että poistettava avain löytyy sanakirjasta:

henkilokunta = {\"Antti\": \"lehtori\", \"Emilia\": \"professori\", \"Arto\": \"lehtori\"}\nif \"Jukka\" in henkilokunta:\n  del henkilokunta[\"Jukka\"]\n  print(\"Poistettiin\")\nelse:\n  print(\"Poistettavaa henkilöä ei löytynyt henkilökunnasta\")

Toinen vaihtoehto alkion poistamiseen on metodi pop:

henkilokunta = {\"Antti\": \"lehtori\", \"Emilia\": \"professori\", \"Arto\": \"lehtori\"}\npoistettu = henkilokunta.pop(\"Arto\")\nprint(henkilokunta)\nprint(\"Poistettiin\", poistettu)

{'Antti': 'lehtori', 'Emilia': 'professori'}\nPoistettiin lehtori

Metodi pop siis myös palauttaa poistettua avainta vastaavan arvon.

Oletusarvoisesti myös pop aiheuttaa virheen, jos sanakirjasta yritetään poistaa avain, jota siellä ei ole. Metodille on kuitenkin mahdollista antaa toisena parametrina oletusarvoinen paluuarvo, joka palautetaan siinä tilanteessa, kun poistettavaa ei löydy. Esimerkiksi arvo None, joka tarkoittaa \"ei mitään\", sopii hyvin tälläisiin tilanteisiin:

henkilokunta = {\"Antti\": \"lehtori\", \"Emilia\": \"professori\", \"Arto\": \"lehtori\"}\npoistettu = henkilokunta.pop(\"Jukka\", None)\nif poistettu == None:\n  print(\"Poistettavaa henkilöä ei löytynyt henkilökunnasta\")\nelse:\n  print(\"Poistettiin\", poistettu)

Poistettavaa henkilöä ei löytynyt henkilökunnasta

Kannattaa huomata, että jos on tarvetta poistaa koko sanakirjan sisältö:

henkilokunta = {\"Antti\": \"lehtori\", \"Emilia\": \"professori\", \"Arto\": \"lehtori\"}\nfor avain in henkilokunta:\n  del henkilokunta[avain]

seurauksena on virheilmoitus

RuntimeError: dictionary changed size during iteration

Syynä on se, että käytäessä läpi rakennetta for-lauseella, ei sen sisältöä saa muuttaa.

Koko sanakirjan tyhjennys onnistuu komennolla:

henkilokunta.clear()

Kirjoita funktio kaanna(sanakirja: dict), joka saa parametrikseen sanakirjan ja kääntää sen niin, että arvoista tulee avaimia ja päinvastoin.

Esimerkki funktion käytöstä:

s = {1: \"eka\", 2: \"toka\", 3: \"kolmas\", 4: \"neljas\"}\nkaanna(s)\nprint(s)

{\"eka\": 1, \"toka\": 2, \"kolmas\": 3, \"neljas\": 4}

Huomaa, että tämä pitää paikkansa myös parametrina oleville sanakirjoille!

Jos kohtaat tehtävässä ongelmia, katso visualisaattorilla mitä koodisi tekee.

Kirjoita funktio lukukirja(), joka palauttaa uuden sanakirjan. Palautettu rakenne sisältää avaimina luvut nollasta 99:ään. Sanakirjan arvoina ovat luvut kirjaimin kirjoitettuna. Katso esimerkkiä alla:

luvut = lukukirja()\nprint(luvut[2])\nprint(luvut[11])\nprint(luvut[45])\nprint(luvut[99])\nprint(luvut[0])

kaksi\nyksitoista\nneljäkymmentäviisi\nyhdensänkymmentäyhdeksän\nnolla

HUOM! Älä muodosta jokaista lukusanaa yksitellen, vaan mieti, miten voisit hyödyntää silmukoita ja sanakirjaa jotenkin ratkaisussasi!

Sanakirja tiedon ryhmittelyssä

Voimme käyttää sanakirjaa myös tiedon ryhmittelyssä. Esimerkiksi seuraava koodi luo sanakirjan, jossa on tietoa henkilöstä:

henkilo = {\"nimi\": \"Pirjo Python\", \"pituus\": 154, \"paino\": 61, \"ikä:\" 44}

Tämä tarkoittaa, että henkilön nimi on Pirjo Python, pituus on 154, paino on 61 ja ikä on 44.\nHuomaa, että olisimme voineet tallentaa tiedot myös näin muuttujiin:

nimi = \"Pirjo Python\"\npituus = 154\npaino = 61\nika = 44

Sanakirjan etuna on kuitenkin, että se kokoaa kaikki samaan asiaan liittyvät tiedot yhteisen nimen alle, jonka kautta voimme viitata tietoihin. Periaatteessa lista tarjoaa saman edun:

henkilo = [\"Pirjo Python\", 153, 61, 44]

Listan huono puoli on kuitenkin, että ohjelmoijan on muistettava, mihin kohtaan listaa mikäkin arvo tallennetaan. Pitää siis muistaa esimerkiksi, että henkilo[2] tarkoittaa painoa ja henkilo[3] ikää. Sanakirjassa tätä ongelmaa ei ole, sillä kaikki sanakirjassa olevat erilliset tiedot on tallennettu selkeästi nimetyn avaimen taakse.

Esimerkiksi voimme käsitellä henkilöitä näin:

henkilo1 = {\"nimi\": \"Pirjo Python\", \"pituus\": 154, \"paino\": 61, \"ikä\": 44}\nhenkilo2 = {\"nimi\": \"Pekka Pythonen\", \"pituus\": 174, \"paino\": 103, \"ikä\": 31}\nhenkilo3 = {\"nimi\": \"Pedro Python\", \"pituus\": 191, \"paino\": 71, \"ikä\": 14}\n\nhenkilot = [henkilo1, henkilo2, henkilo3]\n\nfor henkilo in henkilot:\n    print(henkilo[\"nimi\"])\n\nyhteispituus = 0\nfor henkilo in henkilot:\n    yhteispituus += henkilo[\"pituus\"]\n\nprint(\"Keskipituus on\", yhteispituus / len(henkilot))

Pirjo Python\nPekka Pythonen\nPedro Python\nKeskipituus on 173.0

Kirjoita funktio lisaa_elokuva(rekisteri: list, nimi: str, ohjaaja: str, vuosi: int, pituus: int), joka lisää yhden elokuvaolion elokuvarekisteriin.

Rekisteri on toteutettu listana, ja jokainen listan alkio on yksi sanakirja. Sanakirjassa on seuraavat avaimet:

    \n
  • nimi
  • \n
  • ohjaaja
  • \n
  • vuosi
  • \n
  • pituus
  • \n

Arvot tulevat metodin parametreina.

Esimerkki:

rekisteri = []\nlisaa_elokuva(rekisteri, \"Pythonin viemää\", \"Pekka Python\", 2017, 116)\nlisaa_elokuva(rekisteri, \"Python lentokoneessa\", \"Renny Pytholin\", 2001, 94)\nprint(rekisteri)

[{\"nimi\": \"Pythonin viemää\", \"ohjaaja\": \"Pekka Python\", \"vuosi\": 2017, \"pituus\": 116}, {\"nimi\": \"Python lentokoneessa\", \"ohjaaja\": \"Renny Pytholin\", \"vuosi\": 2001, \"pituus\": 94}]

Kirjoita funktio etsi_elokuvat(rekisteri: list, hakusana: str), joka käsittelee edellisessä tehtävässä luotua elokuvarekisteriä. Funktio muodostaa uuden listan, jolle kopioidaan rekisteristä ne elokuvat, joiden nimestä löytyy hakusana. Pienet ja isot kirjaimet eivät merkitse haussa, joten hakusanalla paj pitää löytyä sekä elokuva Tappajahai että elokuva Pajatoiminnan historia.

Esimerkki:

rekisteri = [{\"nimi\": \"Pythonin viemää\", \"ohjaaja\": \"Pekka Python\", \"vuosi\": 2017, \"pituus\": 116},\n{\"nimi\": \"Python lentokoneessa\", \"ohjaaja\": \"Renny Pythonen\", \"vuosi\": 2001, \"pituus\": 94},\n{\"nimi\": \"Koodaajien yö\", \"ohjaaja\": \"M. Night Python\", \"vuosi\": 2011, \"pituus\": 101}]\n\nlista = etsi_elokuvat(rekisteri, \"python\")\nprint(lista)

[{\"nimi\": \"Pythonin viemää\", \"ohjaaja\": \"Pekka Python\", \"vuosi\": 2017, \"pituus\": 116}, {\"nimi\": \"Python lentokoneessa\", \"ohjaaja\": \"Renny Pythonen\", \"vuosi\": 2001, \"pituus\": 94}]

","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-5/3-dictionary.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-5/4-tuple/page-data.json b/page-data/osa-5/4-tuple/page-data.json index de1c677f8..7e5d4e676 100644 --- a/page-data/osa-5/4-tuple/page-data.json +++ b/page-data/osa-5/4-tuple/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-5/4-tuple", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, millainen tietorakenne on tuple"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat muodostaa tuplen erityyppisistä arvoista"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä eroa on tuplella ja listalla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät esimerkkejä tyypillisistä tavoista käyttää tuplea"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tuple eli monikko on listan tapainen tietorakenne. Sen olennaiset erot listaan ovat:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tuple merkitään kaarisuluilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":", lista merkitään hakasuluilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"]"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tuple on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"muuttumaton"}]},{"type":"text","value":", kun taas listan sisältö voi muuttua"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraava koodi luo tuplen, jossa on pisteen koordinaatit:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"piste "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tuplen sisällä oleviin alkioihin viitataan samalla tavalla kuin listassa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"piste "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"x-koordinaatti:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"y-koordinaatti:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"x-koordinaatti: 10\ny-koordinaatti: 20"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tuplen määrittelyn jälkeen sen arvoa ei kuitenkaan voi muuttaa, eli seuraava koodi "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" toimi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"piste "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npiste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"TypeError: 'tuple' object does not support item assignment"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Muodosta tuple","tmcname":"osa05-17c_muodosta_tuple"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tee_tuple(x: int, y: int, z: int)"}]},{"type":"text","value":", joka muodostaa ja palauttaa parametrinaan saamistaan kokonaisluvuista tuplen seuraavien sääntöjen mukaaan:"}]},{"type":"element","tagName":"ol","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tuplen ensimmäinen alkio on parametreista pienin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tuplen toinen alkio on parametreista suurin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tuplen kolmas alkio on parametrien summa"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tee_tuple"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"(-1, 5, 7)"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Vanhin henkilöistä","tmcname":"osa05-18_vanhin_henkiloista"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vanhin(henkilot: list)"}]},{"type":"text","value":", joka saa parametrikseen listan henkilöitä esittäviä tupleja. Funktio etsii ja palauttaa vanhimman henkilön nimen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Henkilötuplessa on ensin henkilön nimi merkkijonona ja toisena alkiona henkilön "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"syntymävuosi"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"h1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1977"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nh2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Einari\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1985"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nh3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1953"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nh4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Essi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1997"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhlista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"h1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" h2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" h3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" h4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vanhin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"hlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Maija"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Vanhemmat henkilöt","tmcname":"osa05-19_vanhemmat_henkilot"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oletetaan, että meillä on edelleen käytössä edellisessä tehtävässä esitellyt henkilö-tuplet."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vanhemmat(henkilot: list, vuosi: int)"}]},{"type":"text","value":", joka palauttaa uuden listan, jolle on tallennettu kaikki "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ennen"}]},{"type":"text","value":" annettua vuotta syntyneet henkilöiden nimet parametrina saadulta henkilöiden listalta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"h1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1977"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nh2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Einari\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1985"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nh3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1953"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nh4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Essi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1997"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhlista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"h1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" h2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" h3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" h4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nvanhemmat_henkilot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" vanhemmat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"hlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1979"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vanhemmat_henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[ 'Arto', Maija' ]"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"miksi-tuple-on-olemassa","style":"position:relative;"},"children":[{"type":"text","value":"Miksi tuple on olemassa?"},{"type":"element","tagName":"a","properties":{"href":"#miksi-tuple-on-olemassa","ariaLabel":"miksi tuple on olemassa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tuplen ideana on tallentaa jokin kiinteä kokoelma arvoja, jotka liittyvät toisiinsa. Esimerkiksi kun tallennamme pisteen, jossa on x- ja y-koordinaatti, tuple on luonteva valinta, koska pisteeseen kuuluu aina kaksi arvoa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"piste "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voisimme sinänsä tallentaa pisteen myös listana:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"piste "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä ei kuitenkaan tuntuisi yhtä hyvältä ratkaisulta, koska lista sisältää peräkkäisiä alkioita jossakin järjestyksessä ja sen koko voi muuttua. Kun tallennamme pisteen, haluamme tallentaa nimenomaan x- ja y-koordinaatin eikä listaa koordinaateista."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska tuple on muuttumaton, sitä voidaan käyttää sanakirjan avaimena (toisin kuin listaa).\nEsimerkiksi seuraava ohjelma luo sanakirjan, jonka avaimet ovat pisteitä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\npisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"apina\""}]},{"type":"text","value":"\npisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"text","value":"\npisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"cembalo\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"text","value":"\napina\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaava koodi "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" toimisi, jos käyttäisimme listoja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\npisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"apina\""}]},{"type":"text","value":"\npisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"text","value":"\npisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"cembalo\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"TypeError: unhashable type: 'list'"}]}]},{"type":"element","tagName":"h2","properties":{"id":"tuple-ilman-sulkuja","style":"position:relative;"},"children":[{"type":"text","value":"Tuple ilman sulkuja"},{"type":"element","tagName":"a","properties":{"href":"#tuple-ilman-sulkuja","ariaLabel":"tuple ilman sulkuja permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tuplen määrittelyssä ei ole pakko antaa sulkuja. Esimerkiksi seuraavat koodit toimivat samalla tavalla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän ansiosta voimme tehdä luontevasti funktion, joka palauttaa useita arvoja tuplena. Tarkastellaan seuraavaa esimerkkiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"minmax"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"min"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"max"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nlista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"33"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"21"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"88"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"312"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\npienin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" suurin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" minmax"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Pienin luku on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pienin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ja suurin on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"suurin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pienin luku on 5 ja suurin on 312"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä funktio palauttaa kaksi arvoa tuplena, ja funktion paluuarvo vastaanotetaan \"yhtä aikaa\" kahteen muuttujaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"pienin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" suurin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" minmax"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tapauksessa sijoitusoperaation vasemmalla puolella on tuple, jonka sisällä oleviin muuttujiin asetetaan funktion palauttaman tuplen sisältämät arvot:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pienin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" suurin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" minmax"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanakirjojen yhteydessä esiteltiin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"items"}]},{"type":"text","value":"-metodiin perustuvaa tapaa käydä läpi sanakirjan kaikki avaimet ja arvot:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sanakirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\nsanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"apina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"monkey\""}]},{"type":"text","value":"\nsanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banana\""}]},{"type":"text","value":"\nsanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"cembalo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"harpsichord\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" avain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvo "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"items"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"avain:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" avain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"arvo:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässäkin Python käyttää taustalla tupleja: "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sanakirja.items()"}]},{"type":"text","value":" palauttaa yksi kerrallaan avain-arvo-parit tuplena, jonka ensimmäinen alkio on avain ja toinen arvo."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vielä yksi tuplen käyttötarkoitus on kahden muuttujan arvon vaihtaminen keskenään:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luku2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" luku2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luku1"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yllä oleva koodi vaihtaa keskenään muuttujien "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku1"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku2"}]},{"type":"text","value":" arvot, eli koodi toimii samoin kuin seuraava, apumuuttujaa käyttävä koodi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"apu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" luku1\nluku1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" luku2\nluku2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" apu"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Opiskelijarekisteri","tmcname":"osa05-20_opiskelijarekisteri"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtäväsarjassa toteutetaan yksinkertainen opiskelijarekisteri. Ennen ohjelmoinnin aloittamista kannattanee hetki miettiä, minkälaisen tietorakenteen tarvitset ohjelman tallentamien tietojen organisointiin."}]},{"type":"element","tagName":"h4","properties":{"id":"opiskelijoiden-lisays","style":"position:relative;"},"children":[{"type":"text","value":"opiskelijoiden lisäys"},{"type":"element","tagName":"a","properties":{"href":"#opiskelijoiden-lisays","ariaLabel":"opiskelijoiden lisays permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta ensin funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_opiskelija"}]},{"type":"text","value":" uuden opiskelijan lisäämiseen sekä ensimmäinen versio funktiosta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta"}]},{"type":"text","value":", joka tulostaa yhden opiskelijan tiedot."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktioita käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"opiskelijat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\nlisaa_opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Liisa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Liisa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jukka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma tulostaa tässä vaiheessa"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Pekka:\n ei suorituksia\nLiisa:\n ei suorituksia\nei löytynyt ketään nimellä Jukka\n"}]}]},{"type":"element","tagName":"h4","properties":{"id":"suoritusten-lisays","style":"position:relative;"},"children":[{"type":"text","value":"suoritusten lisäys"},{"type":"element","tagName":"a","properties":{"href":"#suoritusten-lisays","ariaLabel":"suoritusten lisays permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_suoritus"}]},{"type":"text","value":", jonka avulla opiskelijalle voidaan lisätä kurssin suoritus. Suoritus on tuple, joka koostuu kurssin nimestä ja arvosanasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"opiskelijat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\nlisaa_opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohpe\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tira\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Opiskelijan tietojen tulostus muuttuu, kun suorituksia on lisätty:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Pekka:\n suorituksia 2 kurssilta:\n Ohpe 3\n Tira 2\n keskiarvo 2.5\n"}]}]},{"type":"element","tagName":"h4","properties":{"id":"arvosanojen-korotus","style":"position:relative;"},"children":[{"type":"text","value":"arvosanojen korotus"},{"type":"element","tagName":"a","properties":{"href":"#arvosanojen-korotus","ariaLabel":"arvosanojen korotus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Suorituksen lisäämisen pitää toimia siten, että se jättää arvosanan 0 suoritukset huomiotta eikä alenna kurssilla ennestään olevaa arvosanaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"opiskelijat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\nlisaa_opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohpe\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tira\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lama\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohpe\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Pekka:\n suorituksia 2 kurssilta:\n Ohpe 3\n Tira 2\n keskiarvo 2.5\n"}]}]},{"type":"element","tagName":"h4","properties":{"id":"kooste-opiskelijoista","style":"position:relative;"},"children":[{"type":"text","value":"kooste opiskelijoista"},{"type":"element","tagName":"a","properties":{"href":"#kooste-opiskelijoista","ariaLabel":"kooste opiskelijoista permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kooste"}]},{"type":"text","value":", joka tulostaa koosteen opiskelijoiden suorituksista. Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"opiskelijat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\nlisaa_opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Liisa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lama\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohpe\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tira\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Liisa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohpe\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Liisa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jtkt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkooste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tulostus näyttää seuraavalta"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"opiskelijoita 2\neniten suorituksia 3 Pekka\nparas keskiarvo 4.5 Liisa\n"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kirjainruudukko","tmcname":"osa05-21_kirjainruudukko"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osan huipentaa suhteellisen haastava ongelmanratkaisua vaativa tehtävä, jonka voi ratkaista monella eri tavalla. Vaikka tehtävä on tupleja käsittelevässä luvussa, tupleja tässä tuskin kannattaa käyttää."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka tulostaa kirjainruudukon oheisten esimerkkien mukaisesti. Voit olettaa, että kerroksia on enintään 26."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kerrokset: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"CCCCC\nCBBBC\nCBABC\nCBBBC\nCCCCC\n"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kerrokset: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"DDDDDDD\nDCCCCCD\nDCBBBCD\nDCBABCD\nDCBBBCD\nDCCCCCD\nDDDDDDD\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"80966e29-402a-55c4-a555-49ec9f14d65c"},"children":[]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa lopuksi osion loppukyselyyn:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, millainen tietorakenne on tuple
  • \n
  • Osaat muodostaa tuplen erityyppisistä arvoista
  • \n
  • Tiedät, mitä eroa on tuplella ja listalla
  • \n
  • Tiedät esimerkkejä tyypillisistä tavoista käyttää tuplea
  • \n

Tuple eli monikko on listan tapainen tietorakenne. Sen olennaiset erot listaan ovat:

    \n
  • Tuple merkitään kaarisuluilla ( ja ), lista merkitään hakasuluilla [ ja ]
  • \n
  • Tuple on muuttumaton, kun taas listan sisältö voi muuttua
  • \n

Esimerkiksi seuraava koodi luo tuplen, jossa on pisteen koordinaatit:

piste = (10, 20)

Tuplen sisällä oleviin alkioihin viitataan samalla tavalla kuin listassa:

piste = (10, 20)\nprint(\"x-koordinaatti:\", piste[0])\nprint(\"y-koordinaatti:\", piste[1])

x-koordinaatti: 10\ny-koordinaatti: 20

Tuplen määrittelyn jälkeen sen arvoa ei kuitenkaan voi muuttaa, eli seuraava koodi ei toimi:

piste = (10, 20)\npiste[0] = 15

TypeError: 'tuple' object does not support item assignment

Tee funktio tee_tuple(x: int, y: int, z: int), joka muodostaa ja palauttaa parametrinaan saamistaan kokonaisluvuista tuplen seuraavien sääntöjen mukaaan:

    \n
  1. Tuplen ensimmäinen alkio on parametreista pienin
  2. \n
  3. Tuplen toinen alkio on parametreista suurin
  4. \n
  5. Tuplen kolmas alkio on parametrien summa
  6. \n

Esimerkki funktion kutsumisesta:

\nif __name__ == \"__main__\":\n    print(tee_tuple(5, 3, -1))\n

(-1, 5, 7)

Tee funktio vanhin(henkilot: list), joka saa parametrikseen listan henkilöitä esittäviä tupleja. Funktio etsii ja palauttaa vanhimman henkilön nimen.

Henkilötuplessa on ensin henkilön nimi merkkijonona ja toisena alkiona henkilön syntymävuosi.

Esimerkiksi:

h1 = (\"Arto\", 1977)\nh2 = (\"Einari\", 1985)\nh3 = (\"Maija\", 1953)\nh4 = (\"Essi\", 1997)\nhlista = [h1, h2, h3, h4]\n\nprint(vanhin(hlista))

Maija

Oletetaan, että meillä on edelleen käytössä edellisessä tehtävässä esitellyt henkilö-tuplet.

Kirjoita funktio vanhemmat(henkilot: list, vuosi: int), joka palauttaa uuden listan, jolle on tallennettu kaikki ennen annettua vuotta syntyneet henkilöiden nimet parametrina saadulta henkilöiden listalta.

Esimerkiksi:

h1 = (\"Arto\", 1977)\nh2 = (\"Einari\", 1985)\nh3 = (\"Maija\", 1953)\nh4 = (\"Essi\", 1997)\nhlista = [h1, h2, h3, h4]\n\nvanhemmat_henkilot = vanhemmat(hlista, 1979)\nprint(vanhemmat_henkilot)

[ 'Arto', Maija' ]

Miksi tuple on olemassa?

Tuplen ideana on tallentaa jokin kiinteä kokoelma arvoja, jotka liittyvät toisiinsa. Esimerkiksi kun tallennamme pisteen, jossa on x- ja y-koordinaatti, tuple on luonteva valinta, koska pisteeseen kuuluu aina kaksi arvoa:

piste = (10, 20)

Voisimme sinänsä tallentaa pisteen myös listana:

piste = [10, 20]

Tämä ei kuitenkaan tuntuisi yhtä hyvältä ratkaisulta, koska lista sisältää peräkkäisiä alkioita jossakin järjestyksessä ja sen koko voi muuttua. Kun tallennamme pisteen, haluamme tallentaa nimenomaan x- ja y-koordinaatin eikä listaa koordinaateista.

Koska tuple on muuttumaton, sitä voidaan käyttää sanakirjan avaimena (toisin kuin listaa).\nEsimerkiksi seuraava ohjelma luo sanakirjan, jonka avaimet ovat pisteitä:

pisteet = {}\npisteet[(3, 5)] = \"apina\"\npisteet[(5, 0)] = \"banaani\"\npisteet[(1, 2)] = \"cembalo\"\nprint(pisteet[(3, 5)])
\napina\n

Vastaava koodi ei toimisi, jos käyttäisimme listoja:

pisteet = {}\npisteet[[3, 5]] = \"apina\"\npisteet[[5, 0]] = \"banaani\"\npisteet[[1, 2]] = \"cembalo\"\nprint(pisteet[[3, 5]])

TypeError: unhashable type: 'list'

Tuple ilman sulkuja

Tuplen määrittelyssä ei ole pakko antaa sulkuja. Esimerkiksi seuraavat koodit toimivat samalla tavalla:

luvut = (1, 2, 3)
luvut = 1, 2, 3

Tämän ansiosta voimme tehdä luontevasti funktion, joka palauttaa useita arvoja tuplena. Tarkastellaan seuraavaa esimerkkiä:

def minmax(lista):\n  return min(lista), max(lista)\n\nlista = [33, 5, 21, 7, 88, 312, 5]\n\npienin, suurin = minmax(lista)\nprint(f\"Pienin luku on {pienin} ja suurin on {suurin}\")

Pienin luku on 5 ja suurin on 312

Tämä funktio palauttaa kaksi arvoa tuplena, ja funktion paluuarvo vastaanotetaan \"yhtä aikaa\" kahteen muuttujaan:

pienin, suurin = minmax(lista)

Tässä tapauksessa sijoitusoperaation vasemmalla puolella on tuple, jonka sisällä oleviin muuttujiin asetetaan funktion palauttaman tuplen sisältämät arvot:

(pienin, suurin) = minmax(lista)

Sanakirjojen yhteydessä esiteltiin items-metodiin perustuvaa tapaa käydä läpi sanakirjan kaikki avaimet ja arvot:

sanakirja = {}\n\nsanakirja[\"apina\"] = \"monkey\"\nsanakirja[\"banaani\"] = \"banana\"\nsanakirja[\"cembalo\"] = \"harpsichord\"\n\nfor avain, arvo in sanakirja.items():\n    print(\"avain:\", avain)\n    print(\"arvo:\", arvo)

Tässäkin Python käyttää taustalla tupleja: sanakirja.items() palauttaa yksi kerrallaan avain-arvo-parit tuplena, jonka ensimmäinen alkio on avain ja toinen arvo.

Vielä yksi tuplen käyttötarkoitus on kahden muuttujan arvon vaihtaminen keskenään:

luku1, luku2 = luku2, luku1

Yllä oleva koodi vaihtaa keskenään muuttujien luku1 ja luku2 arvot, eli koodi toimii samoin kuin seuraava, apumuuttujaa käyttävä koodi:

apu = luku1\nluku1 = luku2\nluku2 = apu

Tässä tehtäväsarjassa toteutetaan yksinkertainen opiskelijarekisteri. Ennen ohjelmoinnin aloittamista kannattanee hetki miettiä, minkälaisen tietorakenteen tarvitset ohjelman tallentamien tietojen organisointiin.

opiskelijoiden lisäys

Toteuta ensin funktio lisaa_opiskelija uuden opiskelijan lisäämiseen sekä ensimmäinen versio funktiosta tulosta, joka tulostaa yhden opiskelijan tiedot.

Funktioita käytetään seuraavasti:

opiskelijat = {}\nlisaa_opiskelija(opiskelijat, \"Pekka\")\nlisaa_opiskelija(opiskelijat, \"Liisa\")\ntulosta(opiskelijat, \"Pekka\")\ntulosta(opiskelijat, \"Liisa\")\ntulosta(opiskelijat, \"Jukka\")

Ohjelma tulostaa tässä vaiheessa

\nPekka:\n ei suorituksia\nLiisa:\n ei suorituksia\nei löytynyt ketään nimellä Jukka\n

suoritusten lisäys

Tee funktio lisaa_suoritus, jonka avulla opiskelijalle voidaan lisätä kurssin suoritus. Suoritus on tuple, joka koostuu kurssin nimestä ja arvosanasta:

opiskelijat = {}\nlisaa_opiskelija(opiskelijat, \"Pekka\")\nlisaa_suoritus(opiskelijat, \"Pekka\", (\"Ohpe\", 3))\nlisaa_suoritus(opiskelijat, \"Pekka\", (\"Tira\", 2))\ntulosta(opiskelijat, \"Pekka\")

Opiskelijan tietojen tulostus muuttuu, kun suorituksia on lisätty:

\nPekka:\n suorituksia 2 kurssilta:\n  Ohpe 3\n  Tira 2\n keskiarvo 2.5\n

arvosanojen korotus

Suorituksen lisäämisen pitää toimia siten, että se jättää arvosanan 0 suoritukset huomiotta eikä alenna kurssilla ennestään olevaa arvosanaa:

opiskelijat = {}\nlisaa_opiskelija(opiskelijat, \"Pekka\")\nlisaa_suoritus(opiskelijat, \"Pekka\", (\"Ohpe\", 3))\nlisaa_suoritus(opiskelijat, \"Pekka\", (\"Tira\", 2))\nlisaa_suoritus(opiskelijat, \"Pekka\", (\"Lama\", 0))\nlisaa_suoritus(opiskelijat, \"Pekka\", (\"Ohpe\", 2))\ntulosta(opiskelijat, \"Pekka\")
\nPekka:\n suorituksia 2 kurssilta:\n  Ohpe 3\n  Tira 2\n keskiarvo 2.5\n

kooste opiskelijoista

Tee funktio kooste, joka tulostaa koosteen opiskelijoiden suorituksista. Esimerkki:

opiskelijat = {}\nlisaa_opiskelija(opiskelijat, \"Pekka\")\nlisaa_opiskelija(opiskelijat, \"Liisa\")\nlisaa_suoritus(opiskelijat, \"Pekka\", (\"Lama\", 1))\nlisaa_suoritus(opiskelijat, \"Pekka\", (\"Ohpe\", 1))\nlisaa_suoritus(opiskelijat, \"Pekka\", (\"Tira\", 1))\nlisaa_suoritus(opiskelijat, \"Liisa\", (\"Ohpe\", 5))\nlisaa_suoritus(opiskelijat, \"Liisa\", (\"Jtkt\", 4))\nkooste(opiskelijat)

tulostus näyttää seuraavalta

\nopiskelijoita 2\neniten suorituksia 3 Pekka\nparas keskiarvo 4.5 Liisa\n

Tämän osan huipentaa suhteellisen haastava ongelmanratkaisua vaativa tehtävä, jonka voi ratkaista monella eri tavalla. Vaikka tehtävä on tupleja käsittelevässä luvussa, tupleja tässä tuskin kannattaa käyttää.

Tee ohjelma, joka tulostaa kirjainruudukon oheisten esimerkkien mukaisesti. Voit olettaa, että kerroksia on enintään 26.

Kerrokset: 3

\nCCCCC\nCBBBC\nCBABC\nCBBBC\nCCCCC\n

Kerrokset: 4

\nDDDDDDD\nDCCCCCD\nDCBBBCD\nDCBABCD\nDCBBBCD\nDCCCCCD\nDDDDDDD\n

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Vastaa lopuksi osion loppukyselyyn:

","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-5/4-tuple.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, millainen tietorakenne on tuple"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat muodostaa tuplen erityyppisistä arvoista"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä eroa on tuplella ja listalla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät esimerkkejä tyypillisistä tavoista käyttää tuplea"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tuple eli monikko on listan tapainen tietorakenne. Sen olennaiset erot listaan ovat:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tuple merkitään kaarisuluilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":", lista merkitään hakasuluilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"]"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tuple on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"muuttumaton"}]},{"type":"text","value":", kun taas listan sisältö voi muuttua"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraava koodi luo tuplen, jossa on pisteen koordinaatit:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"piste "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tuplen sisällä oleviin alkioihin viitataan samalla tavalla kuin listassa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"piste "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"x-koordinaatti:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"y-koordinaatti:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"x-koordinaatti: 10\ny-koordinaatti: 20"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tuplen määrittelyn jälkeen sen arvoa ei kuitenkaan voi muuttaa, eli seuraava koodi "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" toimi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"piste "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npiste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"TypeError: 'tuple' object does not support item assignment"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Muodosta tuple","tmcname":"osa05-17c_muodosta_tuple"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tee_tuple(x: int, y: int, z: int)"}]},{"type":"text","value":", joka muodostaa ja palauttaa parametrinaan saamistaan kokonaisluvuista tuplen seuraavien sääntöjen mukaaan:"}]},{"type":"element","tagName":"ol","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tuplen ensimmäinen alkio on parametreista pienin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tuplen toinen alkio on parametreista suurin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tuplen kolmas alkio on parametrien summa"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tee_tuple"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"(-1, 5, 7)"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Vanhin henkilöistä","tmcname":"osa05-18_vanhin_henkiloista"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vanhin(henkilot: list)"}]},{"type":"text","value":", joka saa parametrikseen listan henkilöitä esittäviä tupleja. Funktio etsii ja palauttaa vanhimman henkilön nimen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Henkilötuplessa on ensin henkilön nimi merkkijonona ja toisena alkiona henkilön "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"syntymävuosi"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"h1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1977"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nh2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Einari\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1985"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nh3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1953"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nh4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Essi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1997"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhlista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"h1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" h2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" h3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" h4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vanhin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"hlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Maija"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Vanhemmat henkilöt","tmcname":"osa05-19_vanhemmat_henkilot"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oletetaan, että meillä on edelleen käytössä edellisessä tehtävässä esitellyt henkilö-tuplet."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vanhemmat(henkilot: list, vuosi: int)"}]},{"type":"text","value":", joka palauttaa uuden listan, jolle on tallennettu kaikki "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ennen"}]},{"type":"text","value":" annettua vuotta syntyneet henkilöiden nimet parametrina saadulta henkilöiden listalta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"h1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1977"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nh2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Einari\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1985"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nh3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1953"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nh4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Essi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1997"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhlista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"h1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" h2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" h3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" h4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\nvanhemmat_henkilot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" vanhemmat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"hlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1979"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vanhemmat_henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[ 'Arto', Maija' ]"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"miksi-tuple-on-olemassa","style":"position:relative;"},"children":[{"type":"text","value":"Miksi tuple on olemassa?"},{"type":"element","tagName":"a","properties":{"href":"#miksi-tuple-on-olemassa","ariaLabel":"miksi tuple on olemassa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tuplen ideana on tallentaa jokin kiinteä kokoelma arvoja, jotka liittyvät toisiinsa. Esimerkiksi kun tallennamme pisteen, jossa on x- ja y-koordinaatti, tuple on luonteva valinta, koska pisteeseen kuuluu aina kaksi arvoa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"piste "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voisimme sinänsä tallentaa pisteen myös listana:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"piste "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä ei kuitenkaan tuntuisi yhtä hyvältä ratkaisulta, koska lista sisältää peräkkäisiä alkioita jossakin järjestyksessä ja sen koko voi muuttua. Kun tallennamme pisteen, haluamme tallentaa nimenomaan x- ja y-koordinaatin eikä listaa koordinaateista."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska tuple on muuttumaton, sitä voidaan käyttää sanakirjan avaimena (toisin kuin listaa).\nEsimerkiksi seuraava ohjelma luo sanakirjan, jonka avaimet ovat pisteitä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\npisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"apina\""}]},{"type":"text","value":"\npisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"text","value":"\npisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"cembalo\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"text","value":"\napina\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaava koodi "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" toimisi, jos käyttäisimme listoja:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\npisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"apina\""}]},{"type":"text","value":"\npisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"text","value":"\npisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"cembalo\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"TypeError: unhashable type: 'list'"}]}]},{"type":"element","tagName":"h2","properties":{"id":"tuple-ilman-sulkuja","style":"position:relative;"},"children":[{"type":"text","value":"Tuple ilman sulkuja"},{"type":"element","tagName":"a","properties":{"href":"#tuple-ilman-sulkuja","ariaLabel":"tuple ilman sulkuja permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tuplen määrittelyssä ei ole pakko antaa sulkuja. Esimerkiksi seuraavat koodit toimivat samalla tavalla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän ansiosta voimme tehdä luontevasti funktion, joka palauttaa useita arvoja tuplena. Tarkastellaan seuraavaa esimerkkiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"minmax"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"min"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"max"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nlista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"33"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"21"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"88"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"312"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\npienin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" suurin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" minmax"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Pienin luku on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pienin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ja suurin on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"suurin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pienin luku on 5 ja suurin on 312"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä funktio palauttaa kaksi arvoa tuplena, ja funktion paluuarvo vastaanotetaan \"yhtä aikaa\" kahteen muuttujaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"pienin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" suurin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" minmax"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tapauksessa sijoitusoperaation vasemmalla puolella on tuple, jonka sisällä oleviin muuttujiin asetetaan funktion palauttaman tuplen sisältämät arvot:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pienin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" suurin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" minmax"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanakirjojen yhteydessä esiteltiin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"items"}]},{"type":"text","value":"-metodiin perustuvaa tapaa käydä läpi sanakirjan kaikki avaimet ja arvot:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sanakirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\nsanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"apina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"monkey\""}]},{"type":"text","value":"\nsanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banana\""}]},{"type":"text","value":"\nsanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"cembalo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"harpsichord\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" avain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvo "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sanakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"items"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"avain:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" avain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"arvo:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässäkin Python käyttää taustalla tupleja: "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sanakirja.items()"}]},{"type":"text","value":" palauttaa yksi kerrallaan avain-arvo-parit tuplena, jonka ensimmäinen alkio on avain ja toinen arvo."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vielä yksi tuplen käyttötarkoitus on kahden muuttujan arvon vaihtaminen keskenään:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luku2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" luku2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luku1"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yllä oleva koodi vaihtaa keskenään muuttujien "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku1"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luku2"}]},{"type":"text","value":" arvot, eli koodi toimii samoin kuin seuraava, apumuuttujaa käyttävä koodi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"apu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" luku1\nluku1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" luku2\nluku2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" apu"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Opiskelijarekisteri","tmcname":"osa05-20_opiskelijarekisteri"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtäväsarjassa toteutetaan yksinkertainen opiskelijarekisteri. Ennen ohjelmoinnin aloittamista kannattanee hetki miettiä, minkälaisen tietorakenteen tarvitset ohjelman tallentamien tietojen organisointiin."}]},{"type":"element","tagName":"h4","properties":{"id":"opiskelijoiden-lisays","style":"position:relative;"},"children":[{"type":"text","value":"opiskelijoiden lisäys"},{"type":"element","tagName":"a","properties":{"href":"#opiskelijoiden-lisays","ariaLabel":"opiskelijoiden lisays permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta ensin funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_opiskelija"}]},{"type":"text","value":" uuden opiskelijan lisäämiseen sekä ensimmäinen versio funktiosta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta"}]},{"type":"text","value":", joka tulostaa yhden opiskelijan tiedot."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktioita käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"opiskelijat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\nlisaa_opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Liisa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Liisa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jukka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma tulostaa tässä vaiheessa"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Pekka:\n ei suorituksia\nLiisa:\n ei suorituksia\nei löytynyt ketään nimellä Jukka\n"}]}]},{"type":"element","tagName":"h4","properties":{"id":"suoritusten-lisays","style":"position:relative;"},"children":[{"type":"text","value":"suoritusten lisäys"},{"type":"element","tagName":"a","properties":{"href":"#suoritusten-lisays","ariaLabel":"suoritusten lisays permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_suoritus"}]},{"type":"text","value":", jonka avulla opiskelijalle voidaan lisätä kurssin suoritus. Suoritus on tuple, joka koostuu kurssin nimestä ja arvosanasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"opiskelijat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\nlisaa_opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohpe\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tira\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Opiskelijan tietojen tulostus muuttuu, kun suorituksia on lisätty:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Pekka:\n suorituksia 2 kurssilta:\n Ohpe 3\n Tira 2\n keskiarvo 2.5\n"}]}]},{"type":"element","tagName":"h4","properties":{"id":"arvosanojen-korotus","style":"position:relative;"},"children":[{"type":"text","value":"arvosanojen korotus"},{"type":"element","tagName":"a","properties":{"href":"#arvosanojen-korotus","ariaLabel":"arvosanojen korotus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Suorituksen lisäämisen pitää toimia siten, että se jättää arvosanan 0 suoritukset huomiotta eikä alenna kurssilla ennestään olevaa arvosanaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"opiskelijat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\nlisaa_opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohpe\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tira\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lama\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohpe\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Pekka:\n suorituksia 2 kurssilta:\n Ohpe 3\n Tira 2\n keskiarvo 2.5\n"}]}]},{"type":"element","tagName":"h4","properties":{"id":"kooste-opiskelijoista","style":"position:relative;"},"children":[{"type":"text","value":"kooste opiskelijoista"},{"type":"element","tagName":"a","properties":{"href":"#kooste-opiskelijoista","ariaLabel":"kooste opiskelijoista permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kooste"}]},{"type":"text","value":", joka tulostaa koosteen opiskelijoiden suorituksista. Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"opiskelijat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\nlisaa_opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Liisa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lama\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohpe\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tira\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Liisa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohpe\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Liisa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jtkt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkooste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tulostus näyttää seuraavalta"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"opiskelijoita 2\neniten suorituksia 3 Pekka\nparas keskiarvo 4.5 Liisa\n"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kirjainruudukko","tmcname":"osa05-21_kirjainruudukko"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osan huipentaa suhteellisen haastava ongelmanratkaisua vaativa tehtävä, jonka voi ratkaista monella eri tavalla. Vaikka tehtävä on tupleja käsittelevässä luvussa, tupleja tässä tuskin kannattaa käyttää."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka tulostaa kirjainruudukon oheisten esimerkkien mukaisesti. Voit olettaa, että kerroksia on enintään 26."}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kerrokset: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"CCCCC\nCBBBC\nCBABC\nCBBBC\nCCCCC\n"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kerrokset: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"DDDDDDD\nDCCCCCD\nDCBBBCD\nDCBABCD\nDCBBBCD\nDCCCCCD\nDDDDDDD\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"80966e29-402a-55c4-a555-49ec9f14d65c"},"children":[]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa lopuksi osion loppukyselyyn:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, millainen tietorakenne on tuple
  • \n
  • Osaat muodostaa tuplen erityyppisistä arvoista
  • \n
  • Tiedät, mitä eroa on tuplella ja listalla
  • \n
  • Tiedät esimerkkejä tyypillisistä tavoista käyttää tuplea
  • \n

Tuple eli monikko on listan tapainen tietorakenne. Sen olennaiset erot listaan ovat:

    \n
  • Tuple merkitään kaarisuluilla ( ja ), lista merkitään hakasuluilla [ ja ]
  • \n
  • Tuple on muuttumaton, kun taas listan sisältö voi muuttua
  • \n

Esimerkiksi seuraava koodi luo tuplen, jossa on pisteen koordinaatit:

piste = (10, 20)

Tuplen sisällä oleviin alkioihin viitataan samalla tavalla kuin listassa:

piste = (10, 20)\nprint(\"x-koordinaatti:\", piste[0])\nprint(\"y-koordinaatti:\", piste[1])

x-koordinaatti: 10\ny-koordinaatti: 20

Tuplen määrittelyn jälkeen sen arvoa ei kuitenkaan voi muuttaa, eli seuraava koodi ei toimi:

piste = (10, 20)\npiste[0] = 15

TypeError: 'tuple' object does not support item assignment

Tee funktio tee_tuple(x: int, y: int, z: int), joka muodostaa ja palauttaa parametrinaan saamistaan kokonaisluvuista tuplen seuraavien sääntöjen mukaaan:

    \n
  1. Tuplen ensimmäinen alkio on parametreista pienin
  2. \n
  3. Tuplen toinen alkio on parametreista suurin
  4. \n
  5. Tuplen kolmas alkio on parametrien summa
  6. \n

Esimerkki funktion kutsumisesta:

\nif __name__ == \"__main__\":\n    print(tee_tuple(5, 3, -1))\n

(-1, 5, 7)

Tee funktio vanhin(henkilot: list), joka saa parametrikseen listan henkilöitä esittäviä tupleja. Funktio etsii ja palauttaa vanhimman henkilön nimen.

Henkilötuplessa on ensin henkilön nimi merkkijonona ja toisena alkiona henkilön syntymävuosi.

Esimerkiksi:

h1 = (\"Arto\", 1977)\nh2 = (\"Einari\", 1985)\nh3 = (\"Maija\", 1953)\nh4 = (\"Essi\", 1997)\nhlista = [h1, h2, h3, h4]\n\nprint(vanhin(hlista))

Maija

Oletetaan, että meillä on edelleen käytössä edellisessä tehtävässä esitellyt henkilö-tuplet.

Kirjoita funktio vanhemmat(henkilot: list, vuosi: int), joka palauttaa uuden listan, jolle on tallennettu kaikki ennen annettua vuotta syntyneet henkilöiden nimet parametrina saadulta henkilöiden listalta.

Esimerkiksi:

h1 = (\"Arto\", 1977)\nh2 = (\"Einari\", 1985)\nh3 = (\"Maija\", 1953)\nh4 = (\"Essi\", 1997)\nhlista = [h1, h2, h3, h4]\n\nvanhemmat_henkilot = vanhemmat(hlista, 1979)\nprint(vanhemmat_henkilot)

[ 'Arto', Maija' ]

Miksi tuple on olemassa?

Tuplen ideana on tallentaa jokin kiinteä kokoelma arvoja, jotka liittyvät toisiinsa. Esimerkiksi kun tallennamme pisteen, jossa on x- ja y-koordinaatti, tuple on luonteva valinta, koska pisteeseen kuuluu aina kaksi arvoa:

piste = (10, 20)

Voisimme sinänsä tallentaa pisteen myös listana:

piste = [10, 20]

Tämä ei kuitenkaan tuntuisi yhtä hyvältä ratkaisulta, koska lista sisältää peräkkäisiä alkioita jossakin järjestyksessä ja sen koko voi muuttua. Kun tallennamme pisteen, haluamme tallentaa nimenomaan x- ja y-koordinaatin eikä listaa koordinaateista.

Koska tuple on muuttumaton, sitä voidaan käyttää sanakirjan avaimena (toisin kuin listaa).\nEsimerkiksi seuraava ohjelma luo sanakirjan, jonka avaimet ovat pisteitä:

pisteet = {}\npisteet[(3, 5)] = \"apina\"\npisteet[(5, 0)] = \"banaani\"\npisteet[(1, 2)] = \"cembalo\"\nprint(pisteet[(3, 5)])
\napina\n

Vastaava koodi ei toimisi, jos käyttäisimme listoja:

pisteet = {}\npisteet[[3, 5]] = \"apina\"\npisteet[[5, 0]] = \"banaani\"\npisteet[[1, 2]] = \"cembalo\"\nprint(pisteet[[3, 5]])

TypeError: unhashable type: 'list'

Tuple ilman sulkuja

Tuplen määrittelyssä ei ole pakko antaa sulkuja. Esimerkiksi seuraavat koodit toimivat samalla tavalla:

luvut = (1, 2, 3)
luvut = 1, 2, 3

Tämän ansiosta voimme tehdä luontevasti funktion, joka palauttaa useita arvoja tuplena. Tarkastellaan seuraavaa esimerkkiä:

def minmax(lista):\n  return min(lista), max(lista)\n\nlista = [33, 5, 21, 7, 88, 312, 5]\n\npienin, suurin = minmax(lista)\nprint(f\"Pienin luku on {pienin} ja suurin on {suurin}\")

Pienin luku on 5 ja suurin on 312

Tämä funktio palauttaa kaksi arvoa tuplena, ja funktion paluuarvo vastaanotetaan \"yhtä aikaa\" kahteen muuttujaan:

pienin, suurin = minmax(lista)

Tässä tapauksessa sijoitusoperaation vasemmalla puolella on tuple, jonka sisällä oleviin muuttujiin asetetaan funktion palauttaman tuplen sisältämät arvot:

(pienin, suurin) = minmax(lista)

Sanakirjojen yhteydessä esiteltiin items-metodiin perustuvaa tapaa käydä läpi sanakirjan kaikki avaimet ja arvot:

sanakirja = {}\n\nsanakirja[\"apina\"] = \"monkey\"\nsanakirja[\"banaani\"] = \"banana\"\nsanakirja[\"cembalo\"] = \"harpsichord\"\n\nfor avain, arvo in sanakirja.items():\n    print(\"avain:\", avain)\n    print(\"arvo:\", arvo)

Tässäkin Python käyttää taustalla tupleja: sanakirja.items() palauttaa yksi kerrallaan avain-arvo-parit tuplena, jonka ensimmäinen alkio on avain ja toinen arvo.

Vielä yksi tuplen käyttötarkoitus on kahden muuttujan arvon vaihtaminen keskenään:

luku1, luku2 = luku2, luku1

Yllä oleva koodi vaihtaa keskenään muuttujien luku1 ja luku2 arvot, eli koodi toimii samoin kuin seuraava, apumuuttujaa käyttävä koodi:

apu = luku1\nluku1 = luku2\nluku2 = apu

Tässä tehtäväsarjassa toteutetaan yksinkertainen opiskelijarekisteri. Ennen ohjelmoinnin aloittamista kannattanee hetki miettiä, minkälaisen tietorakenteen tarvitset ohjelman tallentamien tietojen organisointiin.

opiskelijoiden lisäys

Toteuta ensin funktio lisaa_opiskelija uuden opiskelijan lisäämiseen sekä ensimmäinen versio funktiosta tulosta, joka tulostaa yhden opiskelijan tiedot.

Funktioita käytetään seuraavasti:

opiskelijat = {}\nlisaa_opiskelija(opiskelijat, \"Pekka\")\nlisaa_opiskelija(opiskelijat, \"Liisa\")\ntulosta(opiskelijat, \"Pekka\")\ntulosta(opiskelijat, \"Liisa\")\ntulosta(opiskelijat, \"Jukka\")

Ohjelma tulostaa tässä vaiheessa

\nPekka:\n ei suorituksia\nLiisa:\n ei suorituksia\nei löytynyt ketään nimellä Jukka\n

suoritusten lisäys

Tee funktio lisaa_suoritus, jonka avulla opiskelijalle voidaan lisätä kurssin suoritus. Suoritus on tuple, joka koostuu kurssin nimestä ja arvosanasta:

opiskelijat = {}\nlisaa_opiskelija(opiskelijat, \"Pekka\")\nlisaa_suoritus(opiskelijat, \"Pekka\", (\"Ohpe\", 3))\nlisaa_suoritus(opiskelijat, \"Pekka\", (\"Tira\", 2))\ntulosta(opiskelijat, \"Pekka\")

Opiskelijan tietojen tulostus muuttuu, kun suorituksia on lisätty:

\nPekka:\n suorituksia 2 kurssilta:\n  Ohpe 3\n  Tira 2\n keskiarvo 2.5\n

arvosanojen korotus

Suorituksen lisäämisen pitää toimia siten, että se jättää arvosanan 0 suoritukset huomiotta eikä alenna kurssilla ennestään olevaa arvosanaa:

opiskelijat = {}\nlisaa_opiskelija(opiskelijat, \"Pekka\")\nlisaa_suoritus(opiskelijat, \"Pekka\", (\"Ohpe\", 3))\nlisaa_suoritus(opiskelijat, \"Pekka\", (\"Tira\", 2))\nlisaa_suoritus(opiskelijat, \"Pekka\", (\"Lama\", 0))\nlisaa_suoritus(opiskelijat, \"Pekka\", (\"Ohpe\", 2))\ntulosta(opiskelijat, \"Pekka\")
\nPekka:\n suorituksia 2 kurssilta:\n  Ohpe 3\n  Tira 2\n keskiarvo 2.5\n

kooste opiskelijoista

Tee funktio kooste, joka tulostaa koosteen opiskelijoiden suorituksista. Esimerkki:

opiskelijat = {}\nlisaa_opiskelija(opiskelijat, \"Pekka\")\nlisaa_opiskelija(opiskelijat, \"Liisa\")\nlisaa_suoritus(opiskelijat, \"Pekka\", (\"Lama\", 1))\nlisaa_suoritus(opiskelijat, \"Pekka\", (\"Ohpe\", 1))\nlisaa_suoritus(opiskelijat, \"Pekka\", (\"Tira\", 1))\nlisaa_suoritus(opiskelijat, \"Liisa\", (\"Ohpe\", 5))\nlisaa_suoritus(opiskelijat, \"Liisa\", (\"Jtkt\", 4))\nkooste(opiskelijat)

tulostus näyttää seuraavalta

\nopiskelijoita 2\neniten suorituksia 3 Pekka\nparas keskiarvo 4.5 Liisa\n

Tämän osan huipentaa suhteellisen haastava ongelmanratkaisua vaativa tehtävä, jonka voi ratkaista monella eri tavalla. Vaikka tehtävä on tupleja käsittelevässä luvussa, tupleja tässä tuskin kannattaa käyttää.

Tee ohjelma, joka tulostaa kirjainruudukon oheisten esimerkkien mukaisesti. Voit olettaa, että kerroksia on enintään 26.

Kerrokset: 3

\nCCCCC\nCBBBC\nCBABC\nCBBBC\nCCCCC\n

Kerrokset: 4

\nDDDDDDD\nDCCCCCD\nDCBBBCD\nDCBABCD\nDCBBBCD\nDCCCCCD\nDDDDDDD\n

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Vastaa lopuksi osion loppukyselyyn:

","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-5/4-tuple.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-5/page-data.json b/page-data/osa-5/page-data.json index 7b333408a..38707557a 100644 --- a/page-data/osa-5/page-data.json +++ b/page-data/osa-5/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-part-overview-template-js", "path": "/osa-5", - "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-5","title":"Osa 5"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-5/index.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-5","title":"Osa 5"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-5/index.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-6/1-tiedostojen-lukeminen/page-data.json b/page-data/osa-6/1-tiedostojen-lukeminen/page-data.json index 6ab0e64db..a886a4c52 100644 --- a/page-data/osa-6/1-tiedostojen-lukeminen/page-data.json +++ b/page-data/osa-6/1-tiedostojen-lukeminen/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-6/1-tiedostojen-lukeminen", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten tiedoston sisällön voi lukea Pythonissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä ovat tekstitiedosto ja CSV-tiedosto"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat purkaa ja käsitellä CSV-tiedoston sisällön ohjelmassa"}]},{"type":"text","value":"\n"}]}]},{"type":"comment","value":"vastaava teksti löytyy osioista 3-1, 5-1 ja 6-1, tsekkaa kaikki jos muokkaat tätä"},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Kurssin tehtävien tekemisestä"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmointitaidon kehittyminen edellyttää vahvaa rutiinia ja myös omaa soveltavaa oivaltamista. Tämän takia kurssilla on paljon tehtäviä. Osa tehtävistä on kohtuullisen suoraviivaisesti materiaalia hyödyntäviä ja osa taas aivan tarkoituksella haastavampia soveltavia tehtäviä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ei kannata huolestua, vaikka osa kurssin tehtävistä tuntuisikin ensiyrittämällä liian vaikealta. Kaikkia tehtäviä ei ole pakko tehdä, kuten "},{"type":"element","tagName":"a","properties":{"href":"/arvostelu-ja-kokeet"},"children":[{"type":"text","value":"arvosteluperusteet"}]},{"type":"text","value":" toteavat, "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kurssin läpipääsyyn vaaditaan vähintään 25 % jokaisen osan ohjelmointitehtävien pisteistä."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Kurssin osien tehtävät eivät etene vaikeusjärjestyksessä."}]},{"type":"text","value":" Jokaisessa aliosassa esitellään yleensä muutama uusi konsepti, joita harjoitellaan sekä helpommilla että soveltavimmilla tehtävillä. "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Jos törmäät liian haastavan tuntuiseen tehtävään, hyppää seuraavaan"}]},{"type":"text","value":". Voit palata vaikeimpiin tehtäviin osan lopuksi, jos aikaa vielä jää."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lohdutuksen sanana todettakoon, että tällä viikolla mahdottomalta vaikuttava tehtävä näyttää melko varmasti neljän viikon päästä melko helpolta."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yksi tavallinen ohjelmoinnin käyttötarkoitus on käsitellä tiedostoissa olevaa tietoa. Ohjelmat voivat lukea tietoa tiedostoista ja tallentaa tuloksia tiedostoihin. Tiedostojen avulla voimme käsitellä suuriakin aineistoja helposti automaattisesti."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oletamme tällä kurssilla, että käsiteltävät tiedostot ovat "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tekstitiedostoja"}]},{"type":"text","value":" eli ne muodostuvat riveistä, joilla on tekstiä. Esimerkiksi kurssilla käytetty Visual Studio Code -editori käsittelee tekstitiedostoja. Huomaa, että esimerkiksi Word-dokumentti ei ole tekstitiedosto, vaan siinä on tekstin lisäksi muotoilutietoja ja sen käsittely ohjelmallisesti olisi vaikeaa."}]},{"type":"element","tagName":"h2","properties":{"id":"tiedostosta-lukeminen","style":"position:relative;"},"children":[{"type":"text","value":"Tiedostosta lukeminen"},{"type":"element","tagName":"a","properties":{"href":"#tiedostosta-lukeminen","ariaLabel":"tiedostosta lukeminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käytetään esimerkkinä tiedostoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"esimerkki.txt"}]},{"type":"text","value":", jonka sisältönä on:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moi kaikki!\nEsimerkkitiedostomme on kolmerivinen.\nViimeinen rivi."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hyvä tapa käsitellä tiedostoja Pythonissa on käyttää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":"-lausetta, jonka alkurivi avaa tiedoston. Tämän jälkeen tulee lohko, jonka sisällä tiedostoa voi käsitellä. Lohkon jälkeen tiedosto sulkeutuu automaattisesti, eikä sitä voi enää käsitellä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraava koodi lukee ja tulostaa tiedoston sisällön:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"esimerkki.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n sisalto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"read"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sisalto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moi kaikki!\nEsimerkkitiedostomme on kolmerivinen.\nViimeinen rivi."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodissa muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tiedosto"}]},{"type":"text","value":" on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tiedostokahva"}]},{"type":"text","value":", jonka kautta tiedostoa voi käsitellä avaamisen jälkeen. Tässä tapauksessa käytämme metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"read"}]},{"type":"text","value":", joka palauttaa koko tiedoston sisällön yhtenä merkkijonona. Tässä tapauksessa palautettu merkkijono on seuraava:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"Moi kaikki!\\nEsimerkkitiedostomme on kolmerivinen.\\nViimeinen rivi.\""}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"tiedoston-sisallon-lapikaynti","style":"position:relative;"},"children":[{"type":"text","value":"Tiedoston sisällön läpikäynti"},{"type":"element","tagName":"a","properties":{"href":"#tiedoston-sisallon-lapikaynti","ariaLabel":"tiedoston sisallon lapikaynti permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"read"}]},{"type":"text","value":" on näppärä, jos halutaan esimerkiksi tulostaa tiedoston sisältö kokonaisuudessaan ruudulle. Usein haluamme kuitenkin käsitellä tiedostoa rivi kerrallaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme käyttää tiedoston sisällön lukemiseen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukkaa, joka käy läpi tiedoston rivit yksi kerrallaan – siis samaan tapaan kuin esimerkiksi listan läpikäynnissä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava esimerkki lukee saman tiedoston nyt käyttäen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukkaa, poistaa joka rivin perästä rivinvaihdon ja laskee rivien yhteispituuden:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"esimerkki.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n laskuri "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n yhteispituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"replace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n laskuri "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Rivi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" laskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n yhteispituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" pituus\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Rivien yhteispituus:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" yhteispituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rivi 1 Moi kaikki!\nRivi 2 Esimerkkitiedostomme on kolmerivinen.\nRivi 3 Viimeinen rivi.\nRivien yhteispituus: 63"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että rivien läpikäynnissä jokaisen rivin perässä on rivinvaihto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\n"}]},{"type":"text","value":". Yllä oleva koodi kuitenkin poistaa rivinvaihdot "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"replace"}]},{"type":"text","value":"-funktiolla, joka korvaa rivinvaihdot tyhjillä merkkijonoilla. Tämän ansiosta tulostukseen ei tule ylimääräisiä rivivaihtoja ja ohjelma laskee oikein tiedoston rivien yhteispituuden."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Suurin luku","tmcname":"osa06-01_suurin_luku"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedostoon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luvut.txt"}]},{"type":"text","value":" on tallennettu lukuja, yksi luku per rivi seuraavan esimerkin mukaisesti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"sh"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"45"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"108"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","parameter","variable"]},"children":[{"type":"text","value":"-10"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1100"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":".."}]},{"type":"text","value":".jne"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":".."}]},{"type":"text","value":"."}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suurin"}]},{"type":"text","value":", joka lukee tiedoston ja palauttaa suurimman tiedostosta löytyvän luvun."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että tiedoston nimi on aina "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luvut.txt"}]},{"type":"text","value":" eikä funktiolle anneta parametria."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom!"}]},{"type":"text","value":" Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit kokeilla seuraavaa heti tehtävän jälkeen olevaa ohjetta."}]}]},{"type":"element","tagName":"h2","properties":{"id":"mita-jos-vs-code-ei-loyda-tiedostoja-koodia-suoritettaessa","style":"position:relative;"},"children":[{"type":"text","value":"Mitä jos VS code ei löydä tiedostoja koodia suoritettaessa?"},{"type":"element","tagName":"a","properties":{"href":"#mita-jos-vs-code-ei-loyda-tiedostoja-koodia-suoritettaessa","ariaLabel":"mita jos vs code ei loyda tiedostoja koodia suoritettaessa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos VS Code ei löydä tiedostoa suorittaessasi koodia (vihreää nappia painamalla) vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit kokeilla seuraavaa:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Mene asetuksiin valikosta "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"File"}]},{"type":"text","value":" -> "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Preferences"}]},{"type":"text","value":" -> "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Settings"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Etsi muutettava kohta hakusanalla \"executeinfile\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Valitse välilehti "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Workspace"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Laita raksi kohtaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Python"}]},{"type":"text","value":" -> "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Terminal"}]},{"type":"text","value":" -> "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Execute In File Dir"}]}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oikein tehtynä asetus näyttää suunilleen seuraavalta:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/6e5d89f76dfd47af6f9ea67b097452e8/e405b/6_1_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 16.521739130434785%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAIAAAAcOLh5AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAZElEQVQI11XOQQqAMAwEwP5DknRNkNIilaInvXn3/8+RKIoOOe4uCQAQHYDWWq01/xS/UnLO07rP+9HbEEU8DQT+SCmZmZqlB77GRdvGUCa687+yiDAzVH3i8hb9MyZQJ0xv/gSEjBk5LU20dgAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/6e5d89f76dfd47af6f9ea67b097452e8/a0b58/6_1_1.webp 230w","/static/6e5d89f76dfd47af6f9ea67b097452e8/bc10c/6_1_1.webp 460w","/static/6e5d89f76dfd47af6f9ea67b097452e8/966d8/6_1_1.webp 920w","/static/6e5d89f76dfd47af6f9ea67b097452e8/445df/6_1_1.webp 1380w","/static/6e5d89f76dfd47af6f9ea67b097452e8/9b2c8/6_1_1.webp 1566w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/6e5d89f76dfd47af6f9ea67b097452e8/81c8e/6_1_1.png 230w","/static/6e5d89f76dfd47af6f9ea67b097452e8/08a84/6_1_1.png 460w","/static/6e5d89f76dfd47af6f9ea67b097452e8/c0255/6_1_1.png 920w","/static/6e5d89f76dfd47af6f9ea67b097452e8/b1001/6_1_1.png 1380w","/static/6e5d89f76dfd47af6f9ea67b097452e8/e405b/6_1_1.png 1566w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/6e5d89f76dfd47af6f9ea67b097452e8/c0255/6_1_1.png","alt":"6 1 1","title":"6 1 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos edellinenkään ei toimi, voit kopioida kansiossa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"src"}]},{"type":"text","value":" olevan testaukseen käytetyn tiedoston sisällön"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/a57483e6084d39a596ee24c41a42de70/6297e/6_1_2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 22.17391304347826%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAABYlAAAWJQFJUiTwAAAApklEQVQI123N0QqCQBAFUH/CUVlnt3JnVtcSyx1XikKCHur/PyhQih463KcLl5s87rcQRcLoa98037TO1czsFtba6p/kFESm8+U6HyTuT4FcY11Dtd9WVH4gol7keQ4Aa4OIySBjfxwkyKuLc90P5ImYiHeWtdmYRVmWSqmiKLIsAwCllDFGa50EiW3Xj3F6tjKQr5YlE28tozbrISKmaQoAiPg7fgOYxyLFEKvBSAAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/a57483e6084d39a596ee24c41a42de70/a0b58/6_1_2.webp 230w","/static/a57483e6084d39a596ee24c41a42de70/bc10c/6_1_2.webp 460w","/static/a57483e6084d39a596ee24c41a42de70/966d8/6_1_2.webp 920w","/static/a57483e6084d39a596ee24c41a42de70/445df/6_1_2.webp 1380w","/static/a57483e6084d39a596ee24c41a42de70/78de1/6_1_2.webp 1840w","/static/a57483e6084d39a596ee24c41a42de70/4b7c9/6_1_2.webp 2044w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/a57483e6084d39a596ee24c41a42de70/81c8e/6_1_2.png 230w","/static/a57483e6084d39a596ee24c41a42de70/08a84/6_1_2.png 460w","/static/a57483e6084d39a596ee24c41a42de70/c0255/6_1_2.png 920w","/static/a57483e6084d39a596ee24c41a42de70/b1001/6_1_2.png 1380w","/static/a57483e6084d39a596ee24c41a42de70/161ec/6_1_2.png 1840w","/static/a57483e6084d39a596ee24c41a42de70/6297e/6_1_2.png 2044w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/a57483e6084d39a596ee24c41a42de70/c0255/6_1_2.png","alt":"6 1 2","title":"6 1 2","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"suoraan tehtäväkansion alle"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/bc83b27162a67ce98f825821dc304a7e/6297e/6_1_3.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 26.956521739130434%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAt0lEQVQY023P3Q6CMAwFYN6DjqjtNta1MxlDdILGxBvf/4UMGO/4cm5Pf5pa79N0m+eHSBJJMSqzMKv3vaqklPq+995ba51zdkNkPR2COzallJzL8/lalketc86FWWJUIsfMqtq2bdd1sDF/AOaE2AzDUIYyjmPOWUQRiWidjYgxRlU1xnQ7DBGtmyWdy2ViZqL1ul8QSSQyMwDsVI1BxOZ6md65fsYlyTms3/6iznnd7JYBIITwBcyRLmVWTxqEAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/bc83b27162a67ce98f825821dc304a7e/a0b58/6_1_3.webp 230w","/static/bc83b27162a67ce98f825821dc304a7e/bc10c/6_1_3.webp 460w","/static/bc83b27162a67ce98f825821dc304a7e/966d8/6_1_3.webp 920w","/static/bc83b27162a67ce98f825821dc304a7e/445df/6_1_3.webp 1380w","/static/bc83b27162a67ce98f825821dc304a7e/78de1/6_1_3.webp 1840w","/static/bc83b27162a67ce98f825821dc304a7e/4b7c9/6_1_3.webp 2044w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/bc83b27162a67ce98f825821dc304a7e/81c8e/6_1_3.png 230w","/static/bc83b27162a67ce98f825821dc304a7e/08a84/6_1_3.png 460w","/static/bc83b27162a67ce98f825821dc304a7e/c0255/6_1_3.png 920w","/static/bc83b27162a67ce98f825821dc304a7e/b1001/6_1_3.png 1380w","/static/bc83b27162a67ce98f825821dc304a7e/161ec/6_1_3.png 1840w","/static/bc83b27162a67ce98f825821dc304a7e/6297e/6_1_3.png 2044w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/bc83b27162a67ce98f825821dc304a7e/c0255/6_1_3.png","alt":"6 1 3","title":"6 1 3","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"h2","properties":{"id":"tiedostoja-lukevan-koodin-debuggaus","style":"position:relative;"},"children":[{"type":"text","value":"Tiedostoja lukevan koodin debuggaus"},{"type":"element","tagName":"a","properties":{"href":"#tiedostoja-lukevan-koodin-debuggaus","ariaLabel":"tiedostoja lukevan koodin debuggaus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos yrität käyttää VS Coden "},{"type":"element","tagName":"a","properties":{"href":"/osa-4/1-vscode#debuggeri"},"children":[{"type":"text","value":"debuggeria"}]},{"type":"text","value":" tiedostoja lukevan koodin suorittamiseen, törmäät ikävään virheilmoitukseen:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/b0c7745f7a4cc9c485a52d483e0aa290/eff3b/6_1_4.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 31.304347826086953%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAABYlAAAWJQFJUiTwAAABMklEQVQY003PyU7CQACA4d7EBWQpLdDS6XSWzkw702VIIBESgyaYWBZRE60QUIzv/wguB0PyX7/Db2itx5PJcDiKYym4ICFXaSKkZFKGMhUyESKmlAEY+BD5EAGIMA5iThhjRpZlOhsooTjlmFAKgaBgPMSjHOS8kwtHx55itgqt4xIllEqNPM85F4xxSmhAyAziDabbiG8F28voBcGnvrNot+ZmY2E252azMBtFvSZ7XQADQ19dI4QJoX+Y3vXhgcbvcbYL5Z6pHYlKQEpAS0DWrd6yZi3r1uK0Hpm26wND6xxj8o9nrv8Zxl/p4CCSQ5R8cFV6aAPwm4eeLWfd7Dy2OqvzRtS2XQB+n4/x1IOvNHrw8dIBSwcUtlPYzsqF9+3e7dnltFKdVqo3JxfC7v7gb6ThPL16POKXAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/b0c7745f7a4cc9c485a52d483e0aa290/a0b58/6_1_4.webp 230w","/static/b0c7745f7a4cc9c485a52d483e0aa290/bc10c/6_1_4.webp 460w","/static/b0c7745f7a4cc9c485a52d483e0aa290/966d8/6_1_4.webp 920w","/static/b0c7745f7a4cc9c485a52d483e0aa290/445df/6_1_4.webp 1380w","/static/b0c7745f7a4cc9c485a52d483e0aa290/78de1/6_1_4.webp 1840w","/static/b0c7745f7a4cc9c485a52d483e0aa290/5340a/6_1_4.webp 2072w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/b0c7745f7a4cc9c485a52d483e0aa290/81c8e/6_1_4.png 230w","/static/b0c7745f7a4cc9c485a52d483e0aa290/08a84/6_1_4.png 460w","/static/b0c7745f7a4cc9c485a52d483e0aa290/c0255/6_1_4.png 920w","/static/b0c7745f7a4cc9c485a52d483e0aa290/b1001/6_1_4.png 1380w","/static/b0c7745f7a4cc9c485a52d483e0aa290/161ec/6_1_4.png 1840w","/static/b0c7745f7a4cc9c485a52d483e0aa290/eff3b/6_1_4.png 2072w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/b0c7745f7a4cc9c485a52d483e0aa290/c0255/6_1_4.png","alt":"6 1 4","title":"6 1 4","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Syynä tälle on se, että debuggeri etsii tiedostoja tehtäväkansion juuresta eikä edes "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Execute In File Dir"}]},{"type":"text","value":" -asetus ei asiaa muuta. Helpoin ratkaisu ongelmaan on edellisessä luvussa kuvattu testaukseen käytetyn tiedoston kopioiminen tehtävähakemiston juureen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun olet kopioinut tiedostot tehtävähakemiston juureen, joudut ehkä vielä käynnistämään visual studio coden uudelleen jotta kaikki toimisi."}]},{"type":"element","tagName":"h2","properties":{"id":"csv-tiedoston-lukeminen","style":"position:relative;"},"children":[{"type":"text","value":"CSV-tiedoston lukeminen"},{"type":"element","tagName":"a","properties":{"href":"#csv-tiedoston-lukeminen","ariaLabel":"csv tiedoston lukeminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"CSV-tiedosto ("},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Comma Separated Values"}]},{"type":"text","value":") on tekstitiedosto, jonka jokaisella rivillä on tietyllä välimerkillä erotettua tietoa. Välimerkkinä on usein pilkku "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tai puolipiste "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":";"}]},{"type":"text","value":", mutta mikä tahansa muukin merkki on periaatteessa mahdollinen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"CSV-tiedostoja käytetään usein erilaisten aineistojen esittämiseen. Myös Excelin ja muiden vastaavien ohjelmien taulukot voidaan tallentaa CSV-muodossa, jolloin niitä on helppo käsitellä muilla ohjelmilla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme lukea CSV-tiedoston rivit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukalla, mutta miten erottaa rivillä olevat tiedot toisistaan? Helppo tapa on käyttää merkkijonojen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"split"}]},{"type":"text","value":"-metodia: metodille annetaan haluttu välimerkki, ja se palauttaa tiedot välimerkin mukaan eroteltuna listana merkkijonoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki metodin käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"teksti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"apina,banaani,cembalo\""}]},{"type":"text","value":"\nsanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" teksti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\",\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"apina\nbanaani\ncembalo"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkinä tiedostoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"arvosanat.csv"}]},{"type":"text","value":", joka sisältää jokaisella rivillä aluksi opiskelijan nimen ja sen jälkeen tämän eri kursseista saamat arvosanat. Tiedot on erotettu toisistaan puolipisteillä."}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka;5;4;5;3;4;5;5;4;2;4\nPaula;3;4;2;4;4;2;3;1;3;3\nPirjo;4;5;5;4;5;5;4;5;4;4"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma käy läpi tiedoston rivit, jakaa jokaisen rivin osiin ja näyttää opiskelijan nimen sekä arvosanat."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"arvosanat.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"replace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\";\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n arvosanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nimi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arvosanat:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvosanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nimi: Pekka\nArvosanat: ['5', '4', '5', '3', '4', '5', '5', '4', '2', '4']\nNimi: Paula\nArvosanat: ['3', '4', '2', '4', '4', '2', '3', '1', '3', '3']\nNimi: Pirjo\nArvosanat: ['4', '5', '5', '4', '5', '5', '4', '5', '4', '4']"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Hedelmäkauppa","tmcname":"osa06-02_hedelmakauppa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedostossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hedelmat.csv"}]},{"type":"text","value":" on hedelmiä hintoineen seuraavan esimerkin mukaisesti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"sh"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-sh"]},"children":[{"type":"text","value":"banaani"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6.50"}]},{"type":"text","value":"\nomena"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.95"}]},{"type":"text","value":"\nappelsiini"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8.0"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":".."}]},{"type":"text","value":".jne"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":".."}]},{"type":"text","value":"."}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lue_hedelmat"}]},{"type":"text","value":", joka lukee hedelmätiedoston ja muodostaa siitä sanakirjan, jossa hedelmän nimi on avain ja hinta arvo. Hinnan tulee olla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"float"}]},{"type":"text","value":"-arvona sanakirjassa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että tiedoston nimi on aina "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hedelmat.csv"}]},{"type":"text","value":" eikä funktiolle anneta parametria."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lopuksi funktio palauttaa tämän sanakirjan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom!"}]},{"type":"text","value":" Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit kokeilla "},{"type":"element","tagName":"a","properties":{"href":"/osa-6/1-tiedostojen-lukeminen#mita-jos-vs-code-ei-loyda-tiedostoja-koodia-suoritettaessa"},"children":[{"type":"text","value":"täällä"}]},{"type":"text","value":" olevaa ohjetta."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Matriisi","tmcname":"osa06-03_matriisi"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedostossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"matriisi.txt"}]},{"type":"text","value":" on seuraavan esimerkin kaltainen matriisi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"sh"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1,0"}]},{"type":"text","value":",2,8,2,1,3,2,5,2,2,2\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9,2"}]},{"type":"text","value":",4,5,2,4,2,4,1,10,4,2\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":".."}]},{"type":"text","value":".jne"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":".."}]},{"type":"text","value":"."}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktiot "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"maksimi"}]},{"type":"text","value":", jotka lukevat ja palauttavat nimensä mukaisesti matriisin kaikkien alkioiden summan ja suurimman alkion."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita lisäksi funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rivisummat"}]},{"type":"text","value":", joka palauttaa listassa kaikkien matriisin rivien summat. Esimerkiksi matriisille"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"sh"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1,2"}]},{"type":"text","value":",3\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2,3"}]},{"type":"text","value":",4"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"funktio palauttaisi listan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[6, 9]"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vinkki: Voit kirjoittaa ohjelmaan myös muita funktioita – kannattaa siis miettiä, mitä kaikkia yhteisiä toimintoja kolmea funktiota varten vaaditaan. Huomaa, että tiedoston nimi on aina "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"matriisi.txt"}]},{"type":"text","value":" eikä tehtävänannossa määritellyille funktioille anneta parametreja. Itse lisäämäsi funktiot voivat hyödyntää myös parametreja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom!"}]},{"type":"text","value":" Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit kokeilla "},{"type":"element","tagName":"a","properties":{"href":"/osa-6/1-tiedostojen-lukeminen#mita-jos-vs-code-ei-loyda-tiedostoja-koodia-suoritettaessa"},"children":[{"type":"text","value":"täällä"}]},{"type":"text","value":" olevaa ohjetta."}]}]},{"type":"element","tagName":"h2","properties":{"id":"saman-tiedoston-lukeminen-moneen-kertaan","style":"position:relative;"},"children":[{"type":"text","value":"Saman tiedoston lukeminen moneen kertaan"},{"type":"element","tagName":"a","properties":{"href":"#saman-tiedoston-lukeminen-moneen-kertaan","ariaLabel":"saman tiedoston lukeminen moneen kertaan permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joissain tilanteissa ohjelman on tarvetta lukea sama tiedosto useampaan kertaan. Tarkastellaan esimerkkinä seuraavaa ohjelmaa, joka käsittelee henkilötietoja sisältävää tiedostoa:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"text","value":"\nPekka;40;Helsinki\nEmilia;34;Espoo\nErkki;42;Turku\nAntti;100;Helsinki\nLiisa;58;Suonenjoki\n"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"henkilot.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tulostetaan nimet"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\";\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nimi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# etsitään vanhin"}]},{"type":"text","value":"\n vanhimman_ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\";\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" vanhimman_ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n vanhimman_ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" ika\n vanhin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vanhin on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vanhin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma aiheuttaa erikoisen virheilmoituksen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"Traceback "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"most recent call last"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vanhin on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"text","value":" vanhin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nUnboundLocalError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" local variable "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'vanhin'"}]},{"type":"text","value":" referenced before assignment"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Syynä virheelle on se, että jälkimmäistä for-silmukkaa ei suoriteta ollenkaan, sillä tiedoston voi lukea vain kerran. Tämän jälkeen ollaan päästy \"tiedoston loppuun\", ja vaikka yritetään lukea tiedostosta lisää jälkimmäisessä silmukassa, tietoon ei päästä enää käsiksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedosto onkin avattava uudelleen komennolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"open"}]},{"type":"text","value":" toista lukukertaa varten:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"henkilot.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tulostetaan nimet"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\";\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nimi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"henkilot.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# etsitään vanhin"}]},{"type":"text","value":"\n vanhimman_ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\";\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" vanhimman_ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n vanhimman_ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" ika\n vanhin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vanhin on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vanhin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yleensä aina on kuitenkin parasta lukea tiedosto vain kerran ja tallentaa se muotoon, jota ohjelman toiminnallisuudet pystyvät hyödyntämään:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# luetaan tiedostosta henkilöt listaan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"henkilot.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\";\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tulostetaan nimet"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" henkilo "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nimi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# etsitään vanhin"}]},{"type":"text","value":"\nvanhimman_ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" henkilo "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" vanhimman_ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n vanhimman_ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" ika\n vanhin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vanhin on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vanhin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"lisaa-csv-tiedoston-kasittelya","style":"position:relative;"},"children":[{"type":"text","value":"Lisää CSV-tiedoston käsittelyä"},{"type":"element","tagName":"a","properties":{"href":"#lisaa-csv-tiedoston-kasittelya","ariaLabel":"lisaa csv tiedoston kasittelya permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jatketaan opiskelijoiden arvosanoja sisältävän tiedoston "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"arvosanat.csv"}]},{"type":"text","value":" käsittelyä. Tiedosto näyttää siis seuraavalta:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka;5;4;5;3;4;5;5;4;2;4\nPaula;3;4;2;4;4;2;3;1;3;3\nPirjo;4;5;5;4;5;5;4;5;4;4"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma luo tiedoston perusteella sanakirjan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"arvosanat"}]},{"type":"text","value":", jossa jokainen avain on opiskelijan nimi ja vastaava arvo on lista arvosanoista. Ohjelma muuttaa arvosanat kokonaisluvuiksi, jotta niitä on mukavampaa käsitellä myöhemmin."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"arvosanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"arvosanat.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"replace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\";\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n arvosanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" arvosana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n arvosanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"arvosana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"arvosanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"{'Pekka': [5, 4, 5, 3, 4, 5, 5, 4, 2, 4], 'Paula': [3, 4, 2, 4, 4, 2, 3, 1, 3, 3], 'Pirjo': [4, 5, 5, 4, 5, 5, 4, 5, 4, 4]}"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän jälkeen voimme vaikkapa tulostaa analyysin arvosanoista käymällä läpi sanakirjan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"arvosanat"}]},{"type":"text","value":" perusteella:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lista "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" arvosanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"items"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n paras "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"max"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n keskiarvo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sum"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":": paras arvosana "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"paras"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", keskiarvo "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"keskiarvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","format-spec"]},"children":[{"type":"text","value":".2f"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka: paras arvosana 5, keskiarvo 4.10\nPaula: paras arvosana 4, keskiarvo 2.90\nPirjo: paras arvosana 5, keskiarvo 4.50"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kannattaa tutustua huolella esimerkkikoodiin. Se voi ensisilmäyksellä vaikuttaa monimutkaiselta, mutta ratkaisu on helposti sovellettavissa monenlaisiin datatiedostoihin."}]},{"type":"element","tagName":"h2","properties":{"id":"eroon-turhista-riveista-valilyonneista-ja-rivinvaihdoista","style":"position:relative;"},"children":[{"type":"text","value":"Eroon turhista riveistä, välilyönneistä ja rivinvaihdoista"},{"type":"element","tagName":"a","properties":{"href":"#eroon-turhista-riveista-valilyonneista-ja-rivinvaihdoista","ariaLabel":"eroon turhista riveista valilyonneista ja rivinvaihdoista permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olemme tallentaneet Excelistä nimiä taulukon CSV-muodossa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"sh"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-sh"]},"children":[{"type":"text","value":"etunimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"text","value":" sukunimi\nPekka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"text","value":" Python\nJaana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"text","value":" Java\nHeikki"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"text","value":" Haskell"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten tyypillistä, Excel on lisännyt sarakkeiden väliin erottimena toimivan puolipisteen lisäksi myös välilyönnin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Haluamme tulostaa listalla olevat sukunimet. Koska ensimmäinen rivi kertoo sarakkeiden otsikot, ohitamme sen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sukunimet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"henkilot.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\";\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ohitetaan otsikkorivi"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"etunimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"continue"}]},{"type":"text","value":"\n sukunimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sukunimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostus näyttää seuraavalta:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[' Python\\n', ' Java\\n', ' Haskell']"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kaikkiin paitsi viimeiseen rivin sukunimeen on jäänyt mukaan rivinvaihtomerkki, ja jokaisen sukunimen alkuun on jäänyt ikävä välilyönti."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pääsisimme näistä eroon aiempien esimerkkien tapaan käyttämällä metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"replace"}]},{"type":"text","value":", mutta parempi vaihtoehto tässä tilanteessa on käyttää metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"strip"}]},{"type":"text","value":", joka poistaa merkkijonon alusta ja lopusta ns. whitespace-merkit, eli välilyönnit, rivinvaihdot ja muut normaalina merkkinä tulostumattomat merkit."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kokeillaan metodin toimintaa konsolissa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" koe \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"strip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'koe'"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\\n\\ntesti\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"strip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'testi'"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarvittava muutos ohjelmaan on helppo:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sukunimet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"henkilot.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"';'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"etunimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"continue"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tämä oli otsikkorivi, ei huomioida!"}]},{"type":"text","value":"\n sukunimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"strip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sukunimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän jälkeen tulostus on halutunlainen:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['Python', 'Java', 'Haskell']"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkkijonoilla on myös metodit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lstrip"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rstrip"}]},{"type":"text","value":", jotka poistavat ainoastaan merkkijonon vasemmalla tai oikealla puolella olevia merkkejä."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" testimerkkijono \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rstrip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"' testimerkkijono'"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" testimerkkijono \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lstrip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'testimerkkijono '"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"eri-tiedostoissa-olevien-tietojen-yhdistely","style":"position:relative;"},"children":[{"type":"text","value":"Eri tiedostoissa olevien tietojen yhdistely"},{"type":"element","tagName":"a","properties":{"href":"#eri-tiedostoissa-olevien-tietojen-yhdistely","ariaLabel":"eri tiedostoissa olevien tietojen yhdistely permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"On hyvin yleistä, että ohjelmassa tarvittava data on talletettu useaan erilliseen tiedostoon. Tarkastellaan esimerkkinä tilannetta, jossa yrityksen henkilöstön tiedot ovat omassa tiedostossaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tyontekijat.csv"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"csv"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"hetu;nimi;osoite;kaupunki"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"080488-123X;Pekka Mikkola;Vilppulantie 7;00700 Helsinki"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"290274-044S;Liisa Marttinen;Mannerheimintie 100 A 10;00100 Helsinki"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"010479-007Z;Arto Vihavainen;Pihapolku 4;01010 Kerava"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"010499-345K;Leevi Hellas;Tapiolantie 11 B;02000 Espoo"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Työntekijöiden palkat taas ovat talletettu omaan tiedostoonsa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"palkat.csv"}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"csv"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"hetu;palkka;bonus"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"080488-123X;3300;0"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"290274-044S;4150;200"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"010479-007Z;1300;1200"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Molempien tiedostojen riveillä on ensin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"henkilötunnus"}]},{"type":"text","value":", joka kertoo kenen tiedoista on kyse. Käyttämällä henkilötunnusta yhdistävänä tekijänä, on helppo yhdistää henkilöiden nimet ja palkat toisiinsa, ja tehdä esimerkiksi ohjelma, joka tulostaa seuraavanlaisen näkymän henkilöiden ansioihin:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"ansiot:\nPekka Mikkola 3300 euroa\nLiisa Marttinen 4350 euroa\nArto Vihavainen 2500 euroa\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma käyttää aputietorakenteena kahta saankirjaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimet"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"palkat"}]},{"type":"text","value":", joissa molemmissa avaimena toimii henkilötunnus:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tyontekijat.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"';'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hetu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"continue"}]},{"type":"text","value":"\n nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\npalkat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"palkat.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"';'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hetu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"continue"}]},{"type":"text","value":"\n palkat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ansiot:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" hetu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"items"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" hetu "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" palkat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n palkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" palkat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"hetu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","format-spec"]},"children":[{"type":"text","value":"16"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"palkka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" euroa\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","format-spec"]},"children":[{"type":"text","value":"16"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" 0 euroa\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma siis muodostaa ensin sanakirjat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimet"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"palkat"}]},{"type":"text","value":", joiden sisältö näyttää seuraavilta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"sh"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'080488-123X'"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin","class-name"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Pekka Mikkola'"}]},{"type":"text","value":",\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'290274-044S'"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin","class-name"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Liisa Marttinen'"}]},{"type":"text","value":",\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'010479-007Z'"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin","class-name"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Arto Vihavainen'"}]},{"type":"text","value":",\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'010499-345K'"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin","class-name"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Leevi Hellas'"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'080488-123X'"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin","class-name"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3300"}]},{"type":"text","value":",\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'290274-044S'"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin","class-name"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4350"}]},{"type":"text","value":",\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'010479-007Z'"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin","class-name"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2500"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lopun for-silmukka yhdistää henkilöiden nimet ja niitä vastaavat palkat sanakirjojen avulla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma huomioi myös tilanteen, jossa henkilön palkkatietoja ei ole olemassa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että koska ohjelma käyttää aputietorakenteena sanakirjaa, ei henkilöitä vastaavien rivien järjestyksellä ole merkitystä."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kurssin tulokset, osa 1","tmcname":"osa06-04_kurssin_tulokset_osa1"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma käsittelee kahta CSV-muotoista tiedostoa. Toisessa on tieto opiskelijoista:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"csv"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"opnro;etunimi;sukunimi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"12345678;pekka;peloton"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"12345687;jaana;javanainen"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"12345699;liisa;virtanen"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"ja toisessa opiskelijoiden viikoittaisesta tehtävien lukumäärästä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"csv"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"opnro;v1;v2;v3;v4;v5;v6;v7"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"12345678;4;1;1;4;5;2;4"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"12345687;3;5;3;1;5;4;6"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"12345699;10;2;2;7;10;2;2"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Molempien CSV-tiedostojen ensimmäinen rivi on otsikkorivi, joka kertoo kunkin kentän sisällön."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy tiedostojen nimet ja tämän jälkeen tulostaa kunkin opiskelijan tehtävien yhteenlasketun määrän. Ohjelma toimii seuraavasti, kun tiedostojen sisältö on yllä oleva:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Opiskelijatiedot: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"opiskelijat1.csv"}]},{"type":"text","value":"\nTehtävätiedot: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tehtavat1.csv"}]},{"type":"text","value":"\npekka peloton 21\njaana javanainen 27\nliisa virtanen 35"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vinkki: Ohjelman testaileminen on toivottoman hidasta, jos käyttäjä joutuu kirjoittamaan syötteen aina käsin. Testausvaiheessa syötteet kannattaakin antaa \"kovakoodaamalla\" ne esim. seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tänne ei tulla"}]},{"type":"text","value":"\n opiskelijatiedot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Opiskelijatiedot: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tehtavatiedot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tehtävätiedot: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kovakoodatut syötteet"}]},{"type":"text","value":"\n opiskelijatiedot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"opiskelijat1.csv\""}]},{"type":"text","value":"\n tehtavatiedot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tehtavat1.csv\""}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman varsinainen toiminnallisuus on nyt \"piilotettu\" ehdon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"-haaraan, jota ei suoriteta koskaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos taas halutaan nopeasti tarkastaa, toimiiko ohjelma myös käyttäjän kirjoittaessa syötteen, voidaan arvo "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":" muuttaa arvoksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n opiskelijatiedot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Opiskelijatiedot: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tehtavatiedot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tehtävätiedot: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tänne ei tulla!"}]},{"type":"text","value":"\n opiskelijatiedot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"opiskelijat1.csv\""}]},{"type":"text","value":"\n tehtavatiedot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tehtavat1.csv\""}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun koodi on kunnossa, voi ehtorakenteen poistaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Toinen huomio"}]},{"type":"text","value":" Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit "},{"type":"element","tagName":"a","properties":{"href":"/osa-6/1-tiedostojen-lukeminen#mita-jos-vs-code-ei-loyda-tiedostoja-koodia-suoritettaessa"},"children":[{"type":"text","value":"täällä"}]},{"type":"text","value":" kokeilla olevaa ohjetta."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kurssin tulokset, osa 2","tmcname":"osa06-05_kurssin_tulokset_osa2"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellinen tehtävä laajenee vielä siten, että myös opiskelijan koepisteet luetaan CSV-tiedostosta. Tiedoston sisältö näyttää seuraavalta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"csv"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"opnro;k1;k2;k3"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"12345678;4;1;4"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"12345687;3;5;3"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"12345699;10;2;2"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi opiskelija jonka opiskelijanumero on 12345678 on saanut kokeesta 4+1+4 eli yhteensä 9 pistettä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma kysyy tiedostojen nimet ja tulostaa jokaisen opiskelijan arvosanan:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Opiskelijatiedot: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"opiskelijat1.csv"}]},{"type":"text","value":"\nTehtävätiedot: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tehtavat1.csv"}]},{"type":"text","value":"\nKoepisteet: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"koepisteet1.csv"}]},{"type":"text","value":"\npekka peloton 0\njaana javanainen 1\nliisa virtanen 3"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtyjen harjoitustehtävien määrästä saa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"pisteitä"}]},{"type":"text","value":" siten, että vähintään 10 % tehtävämäärästä tuo 1 pisteen, vähintään 20% tuo 2 pistettä jne., ja 100 % eli 40 harjoitustehtävää tuo 10 pistettä. Harjoitustehtävistä saatava pistemäärä on kokonaisluku."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kurssin arvosana määräytyy kokeen ja harjoituspisteiden summan perusteella seuraavan taulukon mukaan:"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"kokeen pisteet + harjoitusten pisteet"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"arvosana"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"0-14"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"0 (eli hylätty)"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"15-17"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"1"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"18-20"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"2"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"21-23"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"3"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"24-27"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"4"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"28-"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"5"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kurssin tulokset, osa 3","tmcname":"osa06-06_kurssin_tulokset_osa3"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä muotoillaan edellisen tehtävän tulostus parempaan muotoon:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Opiskelijatiedot: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"opiskelijat1.csv"}]},{"type":"text","value":"\nTehtävätiedot: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tehtavat1.csv"}]},{"type":"text","value":"\nKoepisteet: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"koepisteet1.csv"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"nimi teht_lkm teht_pist koe_pist yht_pist arvosana\npekka peloton 21 5 9 14 0\njaana javanainen 27 6 11 17 1\nliisa virtanen 35 8 14 22 3\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jokaisella rivillä siis tulostetaan opiskelijan tehtävien lukumäärä, tehtävistä saatavat pisteet, kokeen pisteet, yhteispisteet (koe+harjoitukset) sekä arvosana \"siististi\" siten, että tulostus on jaoteltu sarakkeisiin. Nimisarakkeen leveys on 30 merkkiä ja muiden sarakkeiden leveys on tasan 10 merkkiä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtävässä kannattaa käyttää "},{"type":"element","tagName":"a","properties":{"href":"/osa-4/5-tulostuksen-muotoilu"},"children":[{"type":"text","value":"osassa 4"}]},{"type":"text","value":" käsiteltyjä f-merkkijonoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kannattaa huomata, että merkkijonojen ja lukujen tulostaminen noudattaa hieman erilaista logiikkaa f-merkkijonoissa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"python\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","format-spec"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"jatkuu\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","format-spec"]},"children":[{"type":"text","value":">10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"jatkuu\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"python jatkuu\n pythonjatkuu\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oletusarvoisesti siis merkkijono sisentyy määritellyn levyisen alueen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"vasempaan"}]},{"type":"text","value":" reunaan. Merkillä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":"voidaan ohjata tulostus sisentymään oikeaan reunaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lukuja tulostettaessa logiikka on päinvastainen"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"42"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","format-spec"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"jatkuu\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","format-spec"]},"children":[{"type":"text","value":"<10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"jatkuu\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":" 42jatkuu\n42 jatkuu\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oletusarvo lukujen yhteydessä on tulostuksen sisentyminen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"oikeaan"}]},{"type":"text","value":" reunaan. Merkillä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" voidaan ohjata luvun tulostus sisentymään vasempaan reunaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Spell checker","tmcname":"osa06-07_spellchecker"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka pyytää käyttäjää kirjoittamaan rivin englanninkielistä tekstiä. Ohjelma suorittaa tekstille oikeinkirjoitustarkistuksen ja tulostaa saman tekstin siten, että kaikki väärin kirjoitetut sanat on ympäröity tähdillä. Seuraavassa kaksi käyttöesimerkkiä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Write text: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"We use ptython to make a spell checker"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"We use *ptython* to make a spell checker\n"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Write text: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"This is acually a good and usefull program"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"This is *acually* good and *usefull* program\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjainten koolla ei ole merkitystä ohjelman toiminnan kannalta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma tunnistaa oikein kirjoitetut sanat käyttämällä tehtäväpohjassa olevaa tiedostoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"wordlist.txt"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Toinen huomio"}]},{"type":"text","value":" Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit "},{"type":"element","tagName":"a","properties":{"href":"/osa-6/1-tiedostojen-lukeminen#mita-jos-vs-code-ei-loyda-tiedostoja-koodia-suoritettaessa"},"children":[{"type":"text","value":"täällä"}]},{"type":"text","value":" kokeilla olevaa ohjetta."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Reseptihaku","tmcname":"osa06-08_reseptihaku"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä tehdään ohjelma, joka tarjoaa käyttäjälle mahdollisuuden reseptien hakuun reseptin nimen, valmistusajan tai raaka-aineen nimen perusteella. Ohjelma lukee reseptit käyttäjän antamasta tiedostosta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jokainen resepti koostuu kolmesta tai useammasta rivistä reseptitiedostossa. Ensimmäisellä rivillä on reseptin nimi, toisella rivillä reseptin valmistusaika (kokonaisluku), ja kolmas ja sitä seuraavat rivit kertovat reseptin raaka-aineet. Reseptin raaka-aineiden kuvaus päättyy tyhjään riviin, poislukien viimeinen resepti. Tiedostossa voi olla useampia reseptejä. Alla kuvattuna esimerkkitiedosto."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"sh"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-sh"]},"children":[{"type":"text","value":"Lettutaikina\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]},{"type":"text","value":"\nmaito\nkananmuna\njauho\nsokeri\nsuola\nvoi\n\nLihapullat\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"45"}]},{"type":"text","value":"\njauheliha\nkananmuna\nkorppujauho\n\nTofurullat\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"30"}]},{"type":"text","value":"\ntofu\nriisi\nvesi\nporkkana\nkurkku\navokado\nwasabi\n\nPullataikina\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"60"}]},{"type":"text","value":"\nmaito\nhiiva\nkananmuna\nsuola\nsokeri\nkardemumma\nvoi"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vihje"}]},{"type":"text","value":" tässä tehtävässä lienee järkevintä lukea ensin tiedoston rivit listalle ja käsitellä sitten tätä listaa tehtävän edellyttämällä tavalla."}]},{"type":"element","tagName":"h4","properties":{"id":"reseptien-haku-nimen-perusteella","style":"position:relative;"},"children":[{"type":"text","value":"reseptien haku nimen perusteella"},{"type":"element","tagName":"a","properties":{"href":"#reseptien-haku-nimen-perusteella","ariaLabel":"reseptien haku nimen perusteella permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae_nimi(tiedosto: str, sana: str)"}]},{"type":"text","value":" joka hakee parametrina annetun nimisestä tiedostosta reseptit, joiden nimessä esiintyy toisena parametrina annettu merkkijono. Funktio palauttaa listan, jossa kutakin löydettyä reseptiä vastaa merkkijono, joka kertoo reseptin nimen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"loydetyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" hae_nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"reseptit1.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pulla\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" resepti "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" loydetyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"resepti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lihapullat\nPullataikina"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että hakusanojen kirjainten koolla ei ole merkitystä, eli hakusana "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"pulla"}]},{"type":"text","value":" löytää myös reseptin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Pullataikina"}]},{"type":"text","value":", joka alkaa isolla kirjaimella."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom!"}]},{"type":"text","value":" Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit "},{"type":"element","tagName":"a","properties":{"href":"/osa-6/1-tiedostojen-lukeminen#mita-jos-vs-code-ei-loyda-tiedostoja-koodia-suoritettaessa"},"children":[{"type":"text","value":"täällä"}]},{"type":"text","value":" kokeilla olevaa ohjetta."}]},{"type":"element","tagName":"h4","properties":{"id":"reseptien-hakeminen-valmistusajan-perusteella","style":"position:relative;"},"children":[{"type":"text","value":"reseptien hakeminen valmistusajan perusteella"},{"type":"element","tagName":"a","properties":{"href":"#reseptien-hakeminen-valmistusajan-perusteella","ariaLabel":"reseptien hakeminen valmistusajan perusteella permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae_aika(tiedosto: str, aika: int)"}]},{"type":"text","value":" joka hakee parametrina annetun nimisestä tiedostosta reseptit, joiden valmistusaika on korkeintaan parametrina kerrottu minuuttimäärä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kriteerin täyttävät reseptit palautetaan edellisen tehtävän tapaan listana, nyt kerrotaan myös reseptin valmistumisaika. Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"loydetyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" hae_aika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"reseptit1.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" resepti "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" loydetyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"resepti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lettutaikina, valmistusaika 15 min"}]}]},{"type":"element","tagName":"h4","properties":{"id":"reseptien-hakeminen-raaka-aineen-perusteella","style":"position:relative;"},"children":[{"type":"text","value":"reseptien hakeminen raaka-aineen perusteella"},{"type":"element","tagName":"a","properties":{"href":"#reseptien-hakeminen-raaka-aineen-perusteella","ariaLabel":"reseptien hakeminen raaka aineen perusteella permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Varoitus"}]},{"type":"text","value":" tämä osa on edellisiä selvästi haastavampi. Jos tehtävä ei lähde heti aukenemaan, kannattanee tehdä ensin osan muut tehtävät ja palata lopuksi takaisin tähän. Huomaa, että voit lähettää moniosaisessa tehtävässä palvelimelle myös yksittäiset osat"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae_raakaaine(tiedosto: str, aine: str)"}]},{"type":"text","value":" joka hakee parametrina annetun nimisestä tiedostosta reseptit, jotka sisältävät toisena parametrina annetun raaka-aineen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kriteerin täyttävät reseptit palautetaan edellisen tehtävän tapaan listana. Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"loydetyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" hae_raakaaine"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"reseptit1.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"maito\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" resepti "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" loydetyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"resepti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lettutaikina, valmistusaika 15 min\nPullataikina, valmistusaika 60 min"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kaupunkipyörät","tmcname":"osa06-09_kaupunkipyorat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä tehdään muutama funktio, joiden avulla voidaan tarkastella "},{"type":"element","tagName":"a","properties":{"href":"https://kaupunkipyorat.hsl.fi/fi","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"kaupunkipyörien"}]},{"type":"text","value":" asemien sijaintia sisältävää tiedostoa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedostot näyttävät seuraavilta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"csv"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"Longitude;Latitude;FID;name;total_slot;operative;id"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"24.950292890004903;60.155444793742276;1;Kaivopuisto;30;Yes;001"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"24.956347471358754;60.160959093887129;2;Laivasillankatu;12;Yes;002"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"24.944927399779715;60.158189199971673;3;Kapteeninpuistikko;16;Yes;003"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kutakin asemaa kohti tiedostossa on yksi rivi, joka kertoo aseman koordinaatit, aseman nimen ja muuta tunnistetietoa."}]},{"type":"element","tagName":"h4","properties":{"id":"asemien-valinen-etaisyys","style":"position:relative;"},"children":[{"type":"text","value":"asemien välinen etäisyys"},{"type":"element","tagName":"a","properties":{"href":"#asemien-valinen-etaisyys","ariaLabel":"asemien valinen etaisyys permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ensin funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae_asematiedot(tiedosto: str)"}]},{"type":"text","value":", joka lukee asematiedot tiedostosta ja palauttaa ne sanakirjana, joka näyttää tältä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"{\n \"Kaivopuisto: (24.950292890004903, 60.155444793742276),\n \"Laivasillankatu: (24.956347471358754, 60.160959093887129),\n \"Kapteeninpuistikko: (24.944927399779715, 60.158189199971673)\n}\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eli sanakirjan avaimena on aseman nimi ja arvona tuple, joka koostuu aseman koordinaateista, ensimmäisenä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Longitude"}]},{"type":"text","value":" ja toisena "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Latitude"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee seuraavaksi funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"etaisyys(asemat: dict, asema1: str, asema2: str)"}]},{"type":"text","value":", joka palauttaa parametrina kerrottujen asemien välisen etäisyyden."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Etäisyys lasketaan seuraavalla kaavalla (hyödyntäen Pythagoraan lausetta):"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tämä rivi tarvitaan, jotta saadaan käyttöön metodi sqrt"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" math\n\nx_kilometreina "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"longitude1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" longitude2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"55.26"}]},{"type":"text","value":"\ny_kilometreina "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"latitude1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" latitude2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"111.2"}]},{"type":"text","value":"\netaisyys "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sqrt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x_kilometreina"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" y_kilometreina"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuorituksia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"asemat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" hae_asematiedot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'stations1.csv'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ne "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" etaisyys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"asemat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Designmuseo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hietalahdentori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ne "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" etaisyys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"asemat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Viiskulma\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kaivopuisto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"0.9032737292463177\n0.7753594392019532"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom!"}]},{"type":"text","value":" Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit "},{"type":"element","tagName":"a","properties":{"href":"/osa-6/1-tiedostojen-lukeminen#mita-jos-vs-code-ei-loyda-tiedostoja-koodia-suoritettaessa"},"children":[{"type":"text","value":"täällä"}]},{"type":"text","value":" kokeilla olevaa ohjetta."}]},{"type":"element","tagName":"h4","properties":{"id":"pisin-valimatka","style":"position:relative;"},"children":[{"type":"text","value":"pisin välimatka"},{"type":"element","tagName":"a","properties":{"href":"#pisin-valimatka","ariaLabel":"pisin valimatka permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suurin_etaisyys(asemat: dict)"}]},{"type":"text","value":", joka selvittää, mitkä kaksi asemaa ovat kauimpana toisistaan. Funktio palauttaa tuplen, jonka ensimmäiset kaksi arvoa kertovat asemien nimet ja kolmas arvo niiden välisen etäisyyden."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"asemat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" hae_asematiedot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'stations1.csv'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nasema1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" asema2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" suurin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" suurin_etaisyys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"asemat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"asema1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" asema2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" suurin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laivasillankatu Hietalahdentori 1.478708873076181"}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, miten tiedoston sisällön voi lukea Pythonissa
  • \n
  • Tiedät, mitä ovat tekstitiedosto ja CSV-tiedosto
  • \n
  • Osaat purkaa ja käsitellä CSV-tiedoston sisällön ohjelmassa
  • \n

Ohjelmointitaidon kehittyminen edellyttää vahvaa rutiinia ja myös omaa soveltavaa oivaltamista. Tämän takia kurssilla on paljon tehtäviä. Osa tehtävistä on kohtuullisen suoraviivaisesti materiaalia hyödyntäviä ja osa taas aivan tarkoituksella haastavampia soveltavia tehtäviä.

Ei kannata huolestua, vaikka osa kurssin tehtävistä tuntuisikin ensiyrittämällä liian vaikealta. Kaikkia tehtäviä ei ole pakko tehdä, kuten arvosteluperusteet toteavat, kurssin läpipääsyyn vaaditaan vähintään 25 % jokaisen osan ohjelmointitehtävien pisteistä.

Kurssin osien tehtävät eivät etene vaikeusjärjestyksessä. Jokaisessa aliosassa esitellään yleensä muutama uusi konsepti, joita harjoitellaan sekä helpommilla että soveltavimmilla tehtävillä. Jos törmäät liian haastavan tuntuiseen tehtävään, hyppää seuraavaan. Voit palata vaikeimpiin tehtäviin osan lopuksi, jos aikaa vielä jää.

Lohdutuksen sanana todettakoon, että tällä viikolla mahdottomalta vaikuttava tehtävä näyttää melko varmasti neljän viikon päästä melko helpolta.

Yksi tavallinen ohjelmoinnin käyttötarkoitus on käsitellä tiedostoissa olevaa tietoa. Ohjelmat voivat lukea tietoa tiedostoista ja tallentaa tuloksia tiedostoihin. Tiedostojen avulla voimme käsitellä suuriakin aineistoja helposti automaattisesti.

Oletamme tällä kurssilla, että käsiteltävät tiedostot ovat tekstitiedostoja eli ne muodostuvat riveistä, joilla on tekstiä. Esimerkiksi kurssilla käytetty Visual Studio Code -editori käsittelee tekstitiedostoja. Huomaa, että esimerkiksi Word-dokumentti ei ole tekstitiedosto, vaan siinä on tekstin lisäksi muotoilutietoja ja sen käsittely ohjelmallisesti olisi vaikeaa.

Tiedostosta lukeminen

Käytetään esimerkkinä tiedostoa esimerkki.txt, jonka sisältönä on:

Moi kaikki!\nEsimerkkitiedostomme on kolmerivinen.\nViimeinen rivi.

Hyvä tapa käsitellä tiedostoja Pythonissa on käyttää with-lausetta, jonka alkurivi avaa tiedoston. Tämän jälkeen tulee lohko, jonka sisällä tiedostoa voi käsitellä. Lohkon jälkeen tiedosto sulkeutuu automaattisesti, eikä sitä voi enää käsitellä.

Esimerkiksi seuraava koodi lukee ja tulostaa tiedoston sisällön:

with open(\"esimerkki.txt\") as tiedosto:\n    sisalto = tiedosto.read()\n    print(sisalto)

Moi kaikki!\nEsimerkkitiedostomme on kolmerivinen.\nViimeinen rivi.

Koodissa muuttuja tiedosto on tiedostokahva, jonka kautta tiedostoa voi käsitellä avaamisen jälkeen. Tässä tapauksessa käytämme metodia read, joka palauttaa koko tiedoston sisällön yhtenä merkkijonona. Tässä tapauksessa palautettu merkkijono on seuraava:

\"Moi kaikki!\\nEsimerkkitiedostomme on kolmerivinen.\\nViimeinen rivi.\"

Tiedoston sisällön läpikäynti

Metodi read on näppärä, jos halutaan esimerkiksi tulostaa tiedoston sisältö kokonaisuudessaan ruudulle. Usein haluamme kuitenkin käsitellä tiedostoa rivi kerrallaan.

Voimme käyttää tiedoston sisällön lukemiseen for-silmukkaa, joka käy läpi tiedoston rivit yksi kerrallaan – siis samaan tapaan kuin esimerkiksi listan läpikäynnissä.

Seuraava esimerkki lukee saman tiedoston nyt käyttäen for-silmukkaa, poistaa joka rivin perästä rivinvaihdon ja laskee rivien yhteispituuden:

with open(\"esimerkki.txt\") as tiedosto:\n    laskuri = 0\n    yhteispituus = 0\n\n    for rivi in tiedosto:\n        rivi = rivi.replace(\"\\n\", \"\")\n        laskuri += 1\n        print(\"Rivi\", laskuri, rivi)\n        pituus = len(rivi)\n        yhteispituus += pituus\n\nprint(\"Rivien yhteispituus:\", yhteispituus)

Rivi 1 Moi kaikki!\nRivi 2 Esimerkkitiedostomme on kolmerivinen.\nRivi 3 Viimeinen rivi.\nRivien yhteispituus: 63

Huomaa, että rivien läpikäynnissä jokaisen rivin perässä on rivinvaihto \\n. Yllä oleva koodi kuitenkin poistaa rivinvaihdot replace-funktiolla, joka korvaa rivinvaihdot tyhjillä merkkijonoilla. Tämän ansiosta tulostukseen ei tule ylimääräisiä rivivaihtoja ja ohjelma laskee oikein tiedoston rivien yhteispituuden.

Tiedostoon luvut.txt on tallennettu lukuja, yksi luku per rivi seuraavan esimerkin mukaisesti:

2\n45\n108\n3\n-10\n1100\n...jne...

Kirjoita funktio suurin, joka lukee tiedoston ja palauttaa suurimman tiedostosta löytyvän luvun.

Huomaa, että tiedoston nimi on aina luvut.txt eikä funktiolle anneta parametria.

Huom! Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit kokeilla seuraavaa heti tehtävän jälkeen olevaa ohjetta.

Mitä jos VS code ei löydä tiedostoja koodia suoritettaessa?

Jos VS Code ei löydä tiedostoa suorittaessasi koodia (vihreää nappia painamalla) vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit kokeilla seuraavaa:

    \n
  • Mene asetuksiin valikosta File -> Preferences -> Settings
  • \n
  • Etsi muutettava kohta hakusanalla \"executeinfile\"
  • \n
  • Valitse välilehti Workspace
  • \n
  • Laita raksi kohtaan Python -> Terminal -> Execute In File Dir
  • \n

Oikein tehtynä asetus näyttää suunilleen seuraavalta:

\n \n \n \n \n \n \"6\n \n \n

Jos edellinenkään ei toimi, voit kopioida kansiossa src olevan testaukseen käytetyn tiedoston sisällön

\n \n \n \n \n \n \"6\n \n \n

suoraan tehtäväkansion alle

\n \n \n \n \n \n \"6\n \n \n

Tiedostoja lukevan koodin debuggaus

Jos yrität käyttää VS Coden debuggeria tiedostoja lukevan koodin suorittamiseen, törmäät ikävään virheilmoitukseen:

\n \n \n \n \n \n \"6\n \n \n

Syynä tälle on se, että debuggeri etsii tiedostoja tehtäväkansion juuresta eikä edes Execute In File Dir -asetus ei asiaa muuta. Helpoin ratkaisu ongelmaan on edellisessä luvussa kuvattu testaukseen käytetyn tiedoston kopioiminen tehtävähakemiston juureen.

Kun olet kopioinut tiedostot tehtävähakemiston juureen, joudut ehkä vielä käynnistämään visual studio coden uudelleen jotta kaikki toimisi.

CSV-tiedoston lukeminen

CSV-tiedosto (Comma Separated Values) on tekstitiedosto, jonka jokaisella rivillä on tietyllä välimerkillä erotettua tietoa. Välimerkkinä on usein pilkku , tai puolipiste ;, mutta mikä tahansa muukin merkki on periaatteessa mahdollinen.

CSV-tiedostoja käytetään usein erilaisten aineistojen esittämiseen. Myös Excelin ja muiden vastaavien ohjelmien taulukot voidaan tallentaa CSV-muodossa, jolloin niitä on helppo käsitellä muilla ohjelmilla.

Voimme lukea CSV-tiedoston rivit for-silmukalla, mutta miten erottaa rivillä olevat tiedot toisistaan? Helppo tapa on käyttää merkkijonojen split-metodia: metodille annetaan haluttu välimerkki, ja se palauttaa tiedot välimerkin mukaan eroteltuna listana merkkijonoja.

Esimerkki metodin käytöstä:

teksti = \"apina,banaani,cembalo\"\nsanat = teksti.split(\",\")\nfor sana in sanat:\n    print(sana)

apina\nbanaani\ncembalo

Tarkastellaan esimerkkinä tiedostoa arvosanat.csv, joka sisältää jokaisella rivillä aluksi opiskelijan nimen ja sen jälkeen tämän eri kursseista saamat arvosanat. Tiedot on erotettu toisistaan puolipisteillä.

Pekka;5;4;5;3;4;5;5;4;2;4\nPaula;3;4;2;4;4;2;3;1;3;3\nPirjo;4;5;5;4;5;5;4;5;4;4

Seuraava ohjelma käy läpi tiedoston rivit, jakaa jokaisen rivin osiin ja näyttää opiskelijan nimen sekä arvosanat.

with open(\"arvosanat.csv\") as tiedosto:\n    for rivi in tiedosto:\n        rivi = rivi.replace(\"\\n\", \"\")\n        osat = rivi.split(\";\")\n        nimi = osat[0]\n        arvosanat = osat[1:]\n        print(\"Nimi:\", nimi)\n        print(\"Arvosanat:\", arvosanat)

Nimi: Pekka\nArvosanat: ['5', '4', '5', '3', '4', '5', '5', '4', '2', '4']\nNimi: Paula\nArvosanat: ['3', '4', '2', '4', '4', '2', '3', '1', '3', '3']\nNimi: Pirjo\nArvosanat: ['4', '5', '5', '4', '5', '5', '4', '5', '4', '4']

Tiedostossa hedelmat.csv on hedelmiä hintoineen seuraavan esimerkin mukaisesti:

banaani;6.50\nomena;4.95\nappelsiini;8.0\n...jne...

Kirjoita funktio lue_hedelmat, joka lukee hedelmätiedoston ja muodostaa siitä sanakirjan, jossa hedelmän nimi on avain ja hinta arvo. Hinnan tulee olla float-arvona sanakirjassa.

Huomaa, että tiedoston nimi on aina hedelmat.csv eikä funktiolle anneta parametria.

Lopuksi funktio palauttaa tämän sanakirjan.

Huom! Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit kokeilla täällä olevaa ohjetta.

Tiedostossa matriisi.txt on seuraavan esimerkin kaltainen matriisi:

1,0,2,8,2,1,3,2,5,2,2,2\n9,2,4,5,2,4,2,4,1,10,4,2\n...jne...

Kirjoita funktiot summa ja maksimi, jotka lukevat ja palauttavat nimensä mukaisesti matriisin kaikkien alkioiden summan ja suurimman alkion.

Kirjoita lisäksi funktio rivisummat, joka palauttaa listassa kaikkien matriisin rivien summat. Esimerkiksi matriisille

1,2,3\n2,3,4

funktio palauttaisi listan [6, 9].

Vinkki: Voit kirjoittaa ohjelmaan myös muita funktioita – kannattaa siis miettiä, mitä kaikkia yhteisiä toimintoja kolmea funktiota varten vaaditaan. Huomaa, että tiedoston nimi on aina matriisi.txt eikä tehtävänannossa määritellyille funktioille anneta parametreja. Itse lisäämäsi funktiot voivat hyödyntää myös parametreja.

Huom! Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit kokeilla täällä olevaa ohjetta.

Saman tiedoston lukeminen moneen kertaan

Joissain tilanteissa ohjelman on tarvetta lukea sama tiedosto useampaan kertaan. Tarkastellaan esimerkkinä seuraavaa ohjelmaa, joka käsittelee henkilötietoja sisältävää tiedostoa:

\nPekka;40;Helsinki\nEmilia;34;Espoo\nErkki;42;Turku\nAntti;100;Helsinki\nLiisa;58;Suonenjoki\n
with open(\"henkilot.csv\") as tiedosto:\n    # tulostetaan nimet\n    for rivi in tiedosto:\n        osat = rivi.split(\";\")\n        print(\"Nimi:\", osat[0])\n\n    # etsitään vanhin\n    vanhimman_ika = -1\n    for rivi in tiedosto:\n        osat = rivi.split(\";\")\n        nimi = osat[0]\n        ika = int(osat[1])\n        if ika > vanhimman_ika:\n            vanhimman_ika = ika\n            vanhin = nimi\n    print(\"vanhin on\", vanhin)

Ohjelma aiheuttaa erikoisen virheilmoituksen:

Traceback (most recent call last):\n    print(\"vanhin on\"; vanhin)\nUnboundLocalError: local variable 'vanhin' referenced before assignment

Syynä virheelle on se, että jälkimmäistä for-silmukkaa ei suoriteta ollenkaan, sillä tiedoston voi lukea vain kerran. Tämän jälkeen ollaan päästy \"tiedoston loppuun\", ja vaikka yritetään lukea tiedostosta lisää jälkimmäisessä silmukassa, tietoon ei päästä enää käsiksi.

Tiedosto onkin avattava uudelleen komennolla open toista lukukertaa varten:

with open(\"henkilot.csv\") as tiedosto:\n    # tulostetaan nimet\n    for rivi in tiedosto:\n        osat = rivi.split(\";\")\n        print(\"Nimi:\", osat[0])\n\nwith open(\"henkilot.csv\") as tiedosto:\n    # etsitään vanhin\n    vanhimman_ika = -1\n    for rivi in tiedosto:\n        osat = rivi.split(\";\")\n        nimi = osat[0]\n        ika = int(osat[1])\n        if ika > vanhimman_ika:\n            vanhimman_ika = ika\n            vanhin = nimi\n    print(\"vanhin on\", vanhin)

Yleensä aina on kuitenkin parasta lukea tiedosto vain kerran ja tallentaa se muotoon, jota ohjelman toiminnallisuudet pystyvät hyödyntämään:

henkilot = []\n# luetaan tiedostosta henkilöt listaan\nwith open(\"henkilot.csv\") as tiedosto:\n    for rivi in tiedosto:\n        osat = rivi.split(\";\")\n        henkilot.append((osat[0], int(osat[1]), osat[2]))\n\n# tulostetaan nimet\nfor henkilo in henkilot:\n    print(\"Nimi:\", henkilo[0])\n\n# etsitään vanhin\nvanhimman_ika = -1\nfor henkilo in henkilot:\n    nimi = henkilo[0]\n    ika = henkilo[1]\n    if ika > vanhimman_ika:\n        vanhimman_ika = ika\n        vanhin = nimi\nprint(\"vanhin on\", vanhin)

Lisää CSV-tiedoston käsittelyä

Jatketaan opiskelijoiden arvosanoja sisältävän tiedoston arvosanat.csv käsittelyä. Tiedosto näyttää siis seuraavalta:

Pekka;5;4;5;3;4;5;5;4;2;4\nPaula;3;4;2;4;4;2;3;1;3;3\nPirjo;4;5;5;4;5;5;4;5;4;4

Seuraava ohjelma luo tiedoston perusteella sanakirjan arvosanat, jossa jokainen avain on opiskelijan nimi ja vastaava arvo on lista arvosanoista. Ohjelma muuttaa arvosanat kokonaisluvuiksi, jotta niitä on mukavampaa käsitellä myöhemmin.

arvosanat = {}\nwith open(\"arvosanat.csv\") as tiedosto:\n    for rivi in tiedosto:\n        rivi = rivi.replace(\"\\n\", \"\")\n        osat = rivi.split(\";\")\n        nimi = osat[0]\n        arvosanat[nimi] = []\n        for arvosana in osat[1:]:\n            arvosanat[nimi].append(int(arvosana))\n\nprint(arvosanat)

{'Pekka': [5, 4, 5, 3, 4, 5, 5, 4, 2, 4], 'Paula': [3, 4, 2, 4, 4, 2, 3, 1, 3, 3], 'Pirjo': [4, 5, 5, 4, 5, 5, 4, 5, 4, 4]}

Tämän jälkeen voimme vaikkapa tulostaa analyysin arvosanoista käymällä läpi sanakirjan arvosanat perusteella:

for nimi, lista in arvosanat.items():\n    paras = max(lista)\n    keskiarvo = sum(lista) / len(lista)\n    print(f\"{nimi}: paras arvosana {paras}, keskiarvo {keskiarvo:.2f}\")

Pekka: paras arvosana 5, keskiarvo 4.10\nPaula: paras arvosana 4, keskiarvo 2.90\nPirjo: paras arvosana 5, keskiarvo 4.50

Kannattaa tutustua huolella esimerkkikoodiin. Se voi ensisilmäyksellä vaikuttaa monimutkaiselta, mutta ratkaisu on helposti sovellettavissa monenlaisiin datatiedostoihin.

Eroon turhista riveistä, välilyönneistä ja rivinvaihdoista

Olemme tallentaneet Excelistä nimiä taulukon CSV-muodossa:

etunimi; sukunimi\nPekka; Python\nJaana; Java\nHeikki; Haskell

Kuten tyypillistä, Excel on lisännyt sarakkeiden väliin erottimena toimivan puolipisteen lisäksi myös välilyönnin.

Haluamme tulostaa listalla olevat sukunimet. Koska ensimmäinen rivi kertoo sarakkeiden otsikot, ohitamme sen:

sukunimet = []\nwith open(\"henkilot.csv\") as tiedosto:\n    for rivi in tiedosto:\n        osat = rivi.split(\";\")\n        # ohitetaan otsikkorivi\n        if osat[0] == \"etunimi\":\n            continue\n        sukunimet.append(osat[1])\n\nprint(sukunimet)

Tulostus näyttää seuraavalta:

[' Python\\n', ' Java\\n', ' Haskell']

Kaikkiin paitsi viimeiseen rivin sukunimeen on jäänyt mukaan rivinvaihtomerkki, ja jokaisen sukunimen alkuun on jäänyt ikävä välilyönti.

Pääsisimme näistä eroon aiempien esimerkkien tapaan käyttämällä metodia replace, mutta parempi vaihtoehto tässä tilanteessa on käyttää metodia strip, joka poistaa merkkijonon alusta ja lopusta ns. whitespace-merkit, eli välilyönnit, rivinvaihdot ja muut normaalina merkkinä tulostumattomat merkit.

Kokeillaan metodin toimintaa konsolissa:

>>> \" koe \".strip()\n'koe'\n>>> \"\\n\\ntesti\\n\".strip()\n'testi'\n>>>

Tarvittava muutos ohjelmaan on helppo:

sukunimet = []\nwith open(\"henkilot.csv\") as tiedosto:\n    for rivi in tiedosto:\n        osat = rivi.split(';')\n        if osat[0] == \"etunimi\":\n            continue # tämä oli otsikkorivi, ei huomioida!\n        sukunimet.append(osat[1].strip())\nprint(sukunimet)

Tämän jälkeen tulostus on halutunlainen:

['Python', 'Java', 'Haskell']

Merkkijonoilla on myös metodit lstrip ja rstrip, jotka poistavat ainoastaan merkkijonon vasemmalla tai oikealla puolella olevia merkkejä.

>>> \" testimerkkijono  \".rstrip()\n' testimerkkijono'\n>>> \" testimerkkijono  \".lstrip()\n'testimerkkijono  '

Eri tiedostoissa olevien tietojen yhdistely

On hyvin yleistä, että ohjelmassa tarvittava data on talletettu useaan erilliseen tiedostoon. Tarkastellaan esimerkkinä tilannetta, jossa yrityksen henkilöstön tiedot ovat omassa tiedostossaan tyontekijat.csv:

hetu;nimi;osoite;kaupunki\n080488-123X;Pekka Mikkola;Vilppulantie 7;00700 Helsinki\n290274-044S;Liisa Marttinen;Mannerheimintie 100 A 10;00100 Helsinki\n010479-007Z;Arto Vihavainen;Pihapolku 4;01010 Kerava\n010499-345K;Leevi Hellas;Tapiolantie 11 B;02000 Espoo

Työntekijöiden palkat taas ovat talletettu omaan tiedostoonsa palkat.csv

hetu;palkka;bonus\n080488-123X;3300;0\n290274-044S;4150;200\n010479-007Z;1300;1200

Molempien tiedostojen riveillä on ensin henkilötunnus, joka kertoo kenen tiedoista on kyse. Käyttämällä henkilötunnusta yhdistävänä tekijänä, on helppo yhdistää henkilöiden nimet ja palkat toisiinsa, ja tehdä esimerkiksi ohjelma, joka tulostaa seuraavanlaisen näkymän henkilöiden ansioihin:

\nansiot:\nPekka Mikkola    3300 euroa\nLiisa Marttinen  4350 euroa\nArto Vihavainen  2500 euroa\n

Ohjelma käyttää aputietorakenteena kahta saankirjaa nimet ja palkat, joissa molemmissa avaimena toimii henkilötunnus:

nimet = {}\n\nwith open(\"tyontekijat.csv\") as tiedosto:\n    for rivi in tiedosto:\n        osat = rivi.split(';')\n        if osat[0] == \"hetu\":\n            continue\n        nimet[osat[0]] = osat[1]\n\npalkat = {}\n\nwith open(\"palkat.csv\") as tiedosto:\n    for rivi in tiedosto:\n        osat = rivi.split(';')\n        if osat[0] == \"hetu\":\n            continue\n        palkat[osat[0]] = int(osat[1]) +int(osat[2])\n\nprint(\"ansiot:\")\n\nfor hetu, nimi in nimet.items():\n    if hetu in palkat:\n        palkka = palkat[hetu]\n        print(f\"{nimi:16} {palkka} euroa\")\n    else:\n        print(f\"{nimi:16} 0 euroa\")

Ohjelma siis muodostaa ensin sanakirjat nimet ja palkat, joiden sisältö näyttää seuraavilta:

{\n    '080488-123X': 'Pekka Mikkola',\n    '290274-044S': 'Liisa Marttinen',\n    '010479-007Z': 'Arto Vihavainen',\n    '010499-345K': 'Leevi Hellas'\n}\n\n{\n    '080488-123X': 3300,\n    '290274-044S': 4350,\n    '010479-007Z': 2500\n}

Lopun for-silmukka yhdistää henkilöiden nimet ja niitä vastaavat palkat sanakirjojen avulla.

Ohjelma huomioi myös tilanteen, jossa henkilön palkkatietoja ei ole olemassa.

Huomaa, että koska ohjelma käyttää aputietorakenteena sanakirjaa, ei henkilöitä vastaavien rivien järjestyksellä ole merkitystä.

Ohjelma käsittelee kahta CSV-muotoista tiedostoa. Toisessa on tieto opiskelijoista:

opnro;etunimi;sukunimi\n12345678;pekka;peloton\n12345687;jaana;javanainen\n12345699;liisa;virtanen

ja toisessa opiskelijoiden viikoittaisesta tehtävien lukumäärästä:

opnro;v1;v2;v3;v4;v5;v6;v7\n12345678;4;1;1;4;5;2;4\n12345687;3;5;3;1;5;4;6\n12345699;10;2;2;7;10;2;2

Molempien CSV-tiedostojen ensimmäinen rivi on otsikkorivi, joka kertoo kunkin kentän sisällön.

Tee ohjelma, joka kysyy tiedostojen nimet ja tämän jälkeen tulostaa kunkin opiskelijan tehtävien yhteenlasketun määrän. Ohjelma toimii seuraavasti, kun tiedostojen sisältö on yllä oleva:

Opiskelijatiedot: opiskelijat1.csv\nTehtävätiedot: tehtavat1.csv\npekka peloton 21\njaana javanainen 27\nliisa virtanen 35

Vinkki: Ohjelman testaileminen on toivottoman hidasta, jos käyttäjä joutuu kirjoittamaan syötteen aina käsin. Testausvaiheessa syötteet kannattaakin antaa \"kovakoodaamalla\" ne esim. seuraavasti:

if False:\n    # tänne ei tulla\n    opiskelijatiedot = input(\"Opiskelijatiedot: \")\n    tehtavatiedot = input(\"Tehtävätiedot: \")\nelse:\n    # kovakoodatut syötteet\n    opiskelijatiedot = \"opiskelijat1.csv\"\n    tehtavatiedot = \"tehtavat1.csv\"

Ohjelman varsinainen toiminnallisuus on nyt \"piilotettu\" ehdon False-haaraan, jota ei suoriteta koskaan.

Jos taas halutaan nopeasti tarkastaa, toimiiko ohjelma myös käyttäjän kirjoittaessa syötteen, voidaan arvo False muuttaa arvoksi True:

\nif True:\n    opiskelijatiedot = input(\"Opiskelijatiedot: \")\n    tehtavatiedot = input(\"Tehtävätiedot: \")\nelse:\n    # tänne ei tulla!\n    opiskelijatiedot = \"opiskelijat1.csv\"\n    tehtavatiedot = \"tehtavat1.csv\"

Kun koodi on kunnossa, voi ehtorakenteen poistaa.

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Toinen huomio Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit täällä kokeilla olevaa ohjetta.

Edellinen tehtävä laajenee vielä siten, että myös opiskelijan koepisteet luetaan CSV-tiedostosta. Tiedoston sisältö näyttää seuraavalta:

opnro;k1;k2;k3\n12345678;4;1;4\n12345687;3;5;3\n12345699;10;2;2

Esimerkiksi opiskelija jonka opiskelijanumero on 12345678 on saanut kokeesta 4+1+4 eli yhteensä 9 pistettä.

Ohjelma kysyy tiedostojen nimet ja tulostaa jokaisen opiskelijan arvosanan:

Opiskelijatiedot: opiskelijat1.csv\nTehtävätiedot: tehtavat1.csv\nKoepisteet: koepisteet1.csv\npekka peloton 0\njaana javanainen 1\nliisa virtanen 3

Tehtyjen harjoitustehtävien määrästä saa pisteitä siten, että vähintään 10 % tehtävämäärästä tuo 1 pisteen, vähintään 20% tuo 2 pistettä jne., ja 100 % eli 40 harjoitustehtävää tuo 10 pistettä. Harjoitustehtävistä saatava pistemäärä on kokonaisluku.

Kurssin arvosana määräytyy kokeen ja harjoituspisteiden summan perusteella seuraavan taulukon mukaan:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
kokeen pisteet + harjoitusten pisteetarvosana
0-140 (eli hylätty)
15-171
18-202
21-233
24-274
28-5

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Tässä tehtävässä muotoillaan edellisen tehtävän tulostus parempaan muotoon:

Opiskelijatiedot: opiskelijat1.csv\nTehtävätiedot: tehtavat1.csv\nKoepisteet: koepisteet1.csv

\nnimi                          teht_lkm  teht_pist koe_pist  yht_pist  arvosana\npekka peloton                 21        5         9         14        0\njaana javanainen              27        6         11        17        1\nliisa virtanen                35        8         14        22        3\n

Jokaisella rivillä siis tulostetaan opiskelijan tehtävien lukumäärä, tehtävistä saatavat pisteet, kokeen pisteet, yhteispisteet (koe+harjoitukset) sekä arvosana \"siististi\" siten, että tulostus on jaoteltu sarakkeisiin. Nimisarakkeen leveys on 30 merkkiä ja muiden sarakkeiden leveys on tasan 10 merkkiä.

Tehtävässä kannattaa käyttää osassa 4 käsiteltyjä f-merkkijonoja.

Kannattaa huomata, että merkkijonojen ja lukujen tulostaminen noudattaa hieman erilaista logiikkaa f-merkkijonoissa:

sana = \"python\"\nprint(f\"{sana:10}jatkuu\")\nprint(f\"{sana:>10}jatkuu\")
\npython    jatkuu\n    pythonjatkuu\n

Oletusarvoisesti siis merkkijono sisentyy määritellyn levyisen alueen vasempaan reunaan. Merkillä >voidaan ohjata tulostus sisentymään oikeaan reunaan.

Lukuja tulostettaessa logiikka on päinvastainen

luku = 42\nprint(f\"{luku:10}jatkuu\")\nprint(f\"{luku:<10}jatkuu\")
\n        42jatkuu\n42        jatkuu\n

Oletusarvo lukujen yhteydessä on tulostuksen sisentyminen oikeaan reunaan. Merkillä < voidaan ohjata luvun tulostus sisentymään vasempaan reunaan.

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Tee ohjelma, joka pyytää käyttäjää kirjoittamaan rivin englanninkielistä tekstiä. Ohjelma suorittaa tekstille oikeinkirjoitustarkistuksen ja tulostaa saman tekstin siten, että kaikki väärin kirjoitetut sanat on ympäröity tähdillä. Seuraavassa kaksi käyttöesimerkkiä:

Write text: We use ptython to make a spell checker

\nWe use *ptython* to make a spell checker\n

Write text: This is acually a good and usefull program

\nThis is *acually* good and *usefull* program\n

Kirjainten koolla ei ole merkitystä ohjelman toiminnan kannalta.

Ohjelma tunnistaa oikein kirjoitetut sanat käyttämällä tehtäväpohjassa olevaa tiedostoa wordlist.txt.

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Toinen huomio Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit täällä kokeilla olevaa ohjetta.

Tässä tehtävässä tehdään ohjelma, joka tarjoaa käyttäjälle mahdollisuuden reseptien hakuun reseptin nimen, valmistusajan tai raaka-aineen nimen perusteella. Ohjelma lukee reseptit käyttäjän antamasta tiedostosta.

Jokainen resepti koostuu kolmesta tai useammasta rivistä reseptitiedostossa. Ensimmäisellä rivillä on reseptin nimi, toisella rivillä reseptin valmistusaika (kokonaisluku), ja kolmas ja sitä seuraavat rivit kertovat reseptin raaka-aineet. Reseptin raaka-aineiden kuvaus päättyy tyhjään riviin, poislukien viimeinen resepti. Tiedostossa voi olla useampia reseptejä. Alla kuvattuna esimerkkitiedosto.

Lettutaikina\n15\nmaito\nkananmuna\njauho\nsokeri\nsuola\nvoi\n\nLihapullat\n45\njauheliha\nkananmuna\nkorppujauho\n\nTofurullat\n30\ntofu\nriisi\nvesi\nporkkana\nkurkku\navokado\nwasabi\n\nPullataikina\n60\nmaito\nhiiva\nkananmuna\nsuola\nsokeri\nkardemumma\nvoi

Vihje tässä tehtävässä lienee järkevintä lukea ensin tiedoston rivit listalle ja käsitellä sitten tätä listaa tehtävän edellyttämällä tavalla.

reseptien haku nimen perusteella

Tee funktio hae_nimi(tiedosto: str, sana: str) joka hakee parametrina annetun nimisestä tiedostosta reseptit, joiden nimessä esiintyy toisena parametrina annettu merkkijono. Funktio palauttaa listan, jossa kutakin löydettyä reseptiä vastaa merkkijono, joka kertoo reseptin nimen.

Esimerkki funktion käytöstä:

loydetyt = hae_nimi(\"reseptit1.txt\", \"pulla\")\n\nfor resepti in loydetyt:\n    print(resepti)

Lihapullat\nPullataikina

Huomaa, että hakusanojen kirjainten koolla ei ole merkitystä, eli hakusana pulla löytää myös reseptin Pullataikina, joka alkaa isolla kirjaimella.

Huom! Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit täällä kokeilla olevaa ohjetta.

reseptien hakeminen valmistusajan perusteella

Tee funktio hae_aika(tiedosto: str, aika: int) joka hakee parametrina annetun nimisestä tiedostosta reseptit, joiden valmistusaika on korkeintaan parametrina kerrottu minuuttimäärä.

Kriteerin täyttävät reseptit palautetaan edellisen tehtävän tapaan listana, nyt kerrotaan myös reseptin valmistumisaika. Esimerkki funktion käytöstä:

loydetyt = hae_aika(\"reseptit1.txt\", 20)\n\nfor resepti in loydetyt:\n    print(resepti)

Lettutaikina, valmistusaika 15 min

reseptien hakeminen raaka-aineen perusteella

Varoitus tämä osa on edellisiä selvästi haastavampi. Jos tehtävä ei lähde heti aukenemaan, kannattanee tehdä ensin osan muut tehtävät ja palata lopuksi takaisin tähän. Huomaa, että voit lähettää moniosaisessa tehtävässä palvelimelle myös yksittäiset osat

Tee funktio hae_raakaaine(tiedosto: str, aine: str) joka hakee parametrina annetun nimisestä tiedostosta reseptit, jotka sisältävät toisena parametrina annetun raaka-aineen.

Kriteerin täyttävät reseptit palautetaan edellisen tehtävän tapaan listana. Esimerkki funktion käytöstä:

loydetyt = hae_raakaaine(\"reseptit1.txt\", \"maito\")\n\nfor resepti in loydetyt:\n    print(resepti)

Lettutaikina, valmistusaika 15 min\nPullataikina, valmistusaika 60 min

Tässä tehtävässä tehdään muutama funktio, joiden avulla voidaan tarkastella kaupunkipyörien asemien sijaintia sisältävää tiedostoa.

Tiedostot näyttävät seuraavilta:

Longitude;Latitude;FID;name;total_slot;operative;id\n24.950292890004903;60.155444793742276;1;Kaivopuisto;30;Yes;001\n24.956347471358754;60.160959093887129;2;Laivasillankatu;12;Yes;002\n24.944927399779715;60.158189199971673;3;Kapteeninpuistikko;16;Yes;003

Kutakin asemaa kohti tiedostossa on yksi rivi, joka kertoo aseman koordinaatit, aseman nimen ja muuta tunnistetietoa.

asemien välinen etäisyys

Tee ensin funktio hae_asematiedot(tiedosto: str), joka lukee asematiedot tiedostosta ja palauttaa ne sanakirjana, joka näyttää tältä:

\n{\n  \"Kaivopuisto: (24.950292890004903, 60.155444793742276),\n  \"Laivasillankatu: (24.956347471358754, 60.160959093887129),\n  \"Kapteeninpuistikko: (24.944927399779715, 60.158189199971673)\n}\n

Eli sanakirjan avaimena on aseman nimi ja arvona tuple, joka koostuu aseman koordinaateista, ensimmäisenä Longitude ja toisena Latitude.

Tee seuraavaksi funktio etaisyys(asemat: dict, asema1: str, asema2: str), joka palauttaa parametrina kerrottujen asemien välisen etäisyyden.

Etäisyys lasketaan seuraavalla kaavalla (hyödyntäen Pythagoraan lausetta):

# tämä rivi tarvitaan, jotta saadaan käyttöön metodi sqrt\nimport math\n\nx_kilometreina = (longitude1 - longitude2) * 55.26\ny_kilometreina = (latitude1 - latitude2) * 111.2\netaisyys = math.sqrt(x_kilometreina**2 + y_kilometreina**2)

Esimerkkisuorituksia:

asemat = hae_asematiedot('stations1.csv')\ne = etaisyys(asemat, \"Designmuseo\", \"Hietalahdentori\")\nprint(e)\ne = etaisyys(asemat, \"Viiskulma\", \"Kaivopuisto\")\nprint(e)

0.9032737292463177\n0.7753594392019532

Huom! Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit täällä kokeilla olevaa ohjetta.

pisin välimatka

Tee funktio suurin_etaisyys(asemat: dict), joka selvittää, mitkä kaksi asemaa ovat kauimpana toisistaan. Funktio palauttaa tuplen, jonka ensimmäiset kaksi arvoa kertovat asemien nimet ja kolmas arvo niiden välisen etäisyyden.

asemat = hae_asematiedot('stations1.csv')\nasema1, asema2, suurin = suurin_etaisyys(asemat)\nprint(asema1, asema2, suurin)

Laivasillankatu Hietalahdentori 1.478708873076181

","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-6/1-tiedostojen-lukeminen.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten tiedoston sisällön voi lukea Pythonissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä ovat tekstitiedosto ja CSV-tiedosto"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat purkaa ja käsitellä CSV-tiedoston sisällön ohjelmassa"}]},{"type":"text","value":"\n"}]}]},{"type":"comment","value":"vastaava teksti löytyy osioista 3-1, 5-1 ja 6-1, tsekkaa kaikki jos muokkaat tätä"},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Kurssin tehtävien tekemisestä"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmointitaidon kehittyminen edellyttää vahvaa rutiinia ja myös omaa soveltavaa oivaltamista. Tämän takia kurssilla on paljon tehtäviä. Osa tehtävistä on kohtuullisen suoraviivaisesti materiaalia hyödyntäviä ja osa taas aivan tarkoituksella haastavampia soveltavia tehtäviä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ei kannata huolestua, vaikka osa kurssin tehtävistä tuntuisikin ensiyrittämällä liian vaikealta. Kaikkia tehtäviä ei ole pakko tehdä, kuten "},{"type":"element","tagName":"a","properties":{"href":"/arvostelu-ja-kokeet"},"children":[{"type":"text","value":"arvosteluperusteet"}]},{"type":"text","value":" toteavat, "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kurssin läpipääsyyn vaaditaan vähintään 25 % jokaisen osan ohjelmointitehtävien pisteistä."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Kurssin osien tehtävät eivät etene vaikeusjärjestyksessä."}]},{"type":"text","value":" Jokaisessa aliosassa esitellään yleensä muutama uusi konsepti, joita harjoitellaan sekä helpommilla että soveltavimmilla tehtävillä. "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Jos törmäät liian haastavan tuntuiseen tehtävään, hyppää seuraavaan"}]},{"type":"text","value":". Voit palata vaikeimpiin tehtäviin osan lopuksi, jos aikaa vielä jää."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lohdutuksen sanana todettakoon, että tällä viikolla mahdottomalta vaikuttava tehtävä näyttää melko varmasti neljän viikon päästä melko helpolta."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yksi tavallinen ohjelmoinnin käyttötarkoitus on käsitellä tiedostoissa olevaa tietoa. Ohjelmat voivat lukea tietoa tiedostoista ja tallentaa tuloksia tiedostoihin. Tiedostojen avulla voimme käsitellä suuriakin aineistoja helposti automaattisesti."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oletamme tällä kurssilla, että käsiteltävät tiedostot ovat "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tekstitiedostoja"}]},{"type":"text","value":" eli ne muodostuvat riveistä, joilla on tekstiä. Esimerkiksi kurssilla käytetty Visual Studio Code -editori käsittelee tekstitiedostoja. Huomaa, että esimerkiksi Word-dokumentti ei ole tekstitiedosto, vaan siinä on tekstin lisäksi muotoilutietoja ja sen käsittely ohjelmallisesti olisi vaikeaa."}]},{"type":"element","tagName":"h2","properties":{"id":"tiedostosta-lukeminen","style":"position:relative;"},"children":[{"type":"text","value":"Tiedostosta lukeminen"},{"type":"element","tagName":"a","properties":{"href":"#tiedostosta-lukeminen","ariaLabel":"tiedostosta lukeminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käytetään esimerkkinä tiedostoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"esimerkki.txt"}]},{"type":"text","value":", jonka sisältönä on:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moi kaikki!\nEsimerkkitiedostomme on kolmerivinen.\nViimeinen rivi."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hyvä tapa käsitellä tiedostoja Pythonissa on käyttää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":"-lausetta, jonka alkurivi avaa tiedoston. Tämän jälkeen tulee lohko, jonka sisällä tiedostoa voi käsitellä. Lohkon jälkeen tiedosto sulkeutuu automaattisesti, eikä sitä voi enää käsitellä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraava koodi lukee ja tulostaa tiedoston sisällön:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"esimerkki.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n sisalto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"read"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sisalto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moi kaikki!\nEsimerkkitiedostomme on kolmerivinen.\nViimeinen rivi."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodissa muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tiedosto"}]},{"type":"text","value":" on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tiedostokahva"}]},{"type":"text","value":", jonka kautta tiedostoa voi käsitellä avaamisen jälkeen. Tässä tapauksessa käytämme metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"read"}]},{"type":"text","value":", joka palauttaa koko tiedoston sisällön yhtenä merkkijonona. Tässä tapauksessa palautettu merkkijono on seuraava:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"Moi kaikki!\\nEsimerkkitiedostomme on kolmerivinen.\\nViimeinen rivi.\""}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"tiedoston-sisallon-lapikaynti","style":"position:relative;"},"children":[{"type":"text","value":"Tiedoston sisällön läpikäynti"},{"type":"element","tagName":"a","properties":{"href":"#tiedoston-sisallon-lapikaynti","ariaLabel":"tiedoston sisallon lapikaynti permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"read"}]},{"type":"text","value":" on näppärä, jos halutaan esimerkiksi tulostaa tiedoston sisältö kokonaisuudessaan ruudulle. Usein haluamme kuitenkin käsitellä tiedostoa rivi kerrallaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme käyttää tiedoston sisällön lukemiseen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukkaa, joka käy läpi tiedoston rivit yksi kerrallaan – siis samaan tapaan kuin esimerkiksi listan läpikäynnissä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava esimerkki lukee saman tiedoston nyt käyttäen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukkaa, poistaa joka rivin perästä rivinvaihdon ja laskee rivien yhteispituuden:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"esimerkki.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n laskuri "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n yhteispituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"replace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n laskuri "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Rivi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" laskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n yhteispituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" pituus\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Rivien yhteispituus:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" yhteispituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rivi 1 Moi kaikki!\nRivi 2 Esimerkkitiedostomme on kolmerivinen.\nRivi 3 Viimeinen rivi.\nRivien yhteispituus: 63"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että rivien läpikäynnissä jokaisen rivin perässä on rivinvaihto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\n"}]},{"type":"text","value":". Yllä oleva koodi kuitenkin poistaa rivinvaihdot "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"replace"}]},{"type":"text","value":"-funktiolla, joka korvaa rivinvaihdot tyhjillä merkkijonoilla. Tämän ansiosta tulostukseen ei tule ylimääräisiä rivivaihtoja ja ohjelma laskee oikein tiedoston rivien yhteispituuden."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Suurin luku","tmcname":"osa06-01_suurin_luku"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedostoon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luvut.txt"}]},{"type":"text","value":" on tallennettu lukuja, yksi luku per rivi seuraavan esimerkin mukaisesti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"sh"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"45"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"108"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","parameter","variable"]},"children":[{"type":"text","value":"-10"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1100"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":".."}]},{"type":"text","value":".jne"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":".."}]},{"type":"text","value":"."}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suurin"}]},{"type":"text","value":", joka lukee tiedoston ja palauttaa suurimman tiedostosta löytyvän luvun."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että tiedoston nimi on aina "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"luvut.txt"}]},{"type":"text","value":" eikä funktiolle anneta parametria."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom!"}]},{"type":"text","value":" Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit kokeilla seuraavaa heti tehtävän jälkeen olevaa ohjetta."}]}]},{"type":"element","tagName":"h2","properties":{"id":"mita-jos-vs-code-ei-loyda-tiedostoja-koodia-suoritettaessa","style":"position:relative;"},"children":[{"type":"text","value":"Mitä jos VS code ei löydä tiedostoja koodia suoritettaessa?"},{"type":"element","tagName":"a","properties":{"href":"#mita-jos-vs-code-ei-loyda-tiedostoja-koodia-suoritettaessa","ariaLabel":"mita jos vs code ei loyda tiedostoja koodia suoritettaessa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos VS Code ei löydä tiedostoa suorittaessasi koodia (vihreää nappia painamalla) vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit kokeilla seuraavaa:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Mene asetuksiin valikosta "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"File"}]},{"type":"text","value":" -> "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Preferences"}]},{"type":"text","value":" -> "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Settings"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Etsi muutettava kohta hakusanalla \"executeinfile\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Valitse välilehti "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Workspace"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Laita raksi kohtaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Python"}]},{"type":"text","value":" -> "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Terminal"}]},{"type":"text","value":" -> "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Execute In File Dir"}]}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oikein tehtynä asetus näyttää suunilleen seuraavalta:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/6e5d89f76dfd47af6f9ea67b097452e8/e405b/6_1_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 16.521739130434785%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAIAAAAcOLh5AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAZElEQVQI11XOQQqAMAwEwP5DknRNkNIilaInvXn3/8+RKIoOOe4uCQAQHYDWWq01/xS/UnLO07rP+9HbEEU8DQT+SCmZmZqlB77GRdvGUCa687+yiDAzVH3i8hb9MyZQJ0xv/gSEjBk5LU20dgAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/6e5d89f76dfd47af6f9ea67b097452e8/a0b58/6_1_1.webp 230w","/static/6e5d89f76dfd47af6f9ea67b097452e8/bc10c/6_1_1.webp 460w","/static/6e5d89f76dfd47af6f9ea67b097452e8/966d8/6_1_1.webp 920w","/static/6e5d89f76dfd47af6f9ea67b097452e8/445df/6_1_1.webp 1380w","/static/6e5d89f76dfd47af6f9ea67b097452e8/9b2c8/6_1_1.webp 1566w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/6e5d89f76dfd47af6f9ea67b097452e8/81c8e/6_1_1.png 230w","/static/6e5d89f76dfd47af6f9ea67b097452e8/08a84/6_1_1.png 460w","/static/6e5d89f76dfd47af6f9ea67b097452e8/c0255/6_1_1.png 920w","/static/6e5d89f76dfd47af6f9ea67b097452e8/b1001/6_1_1.png 1380w","/static/6e5d89f76dfd47af6f9ea67b097452e8/e405b/6_1_1.png 1566w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/6e5d89f76dfd47af6f9ea67b097452e8/c0255/6_1_1.png","alt":"6 1 1","title":"6 1 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos edellinenkään ei toimi, voit kopioida kansiossa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"src"}]},{"type":"text","value":" olevan testaukseen käytetyn tiedoston sisällön"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/a57483e6084d39a596ee24c41a42de70/6297e/6_1_2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 22.17391304347826%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAABYlAAAWJQFJUiTwAAAApklEQVQI123N0QqCQBAFUH/CUVlnt3JnVtcSyx1XikKCHur/PyhQih463KcLl5s87rcQRcLoa98037TO1czsFtba6p/kFESm8+U6HyTuT4FcY11Dtd9WVH4gol7keQ4Aa4OIySBjfxwkyKuLc90P5ImYiHeWtdmYRVmWSqmiKLIsAwCllDFGa50EiW3Xj3F6tjKQr5YlE28tozbrISKmaQoAiPg7fgOYxyLFEKvBSAAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/a57483e6084d39a596ee24c41a42de70/a0b58/6_1_2.webp 230w","/static/a57483e6084d39a596ee24c41a42de70/bc10c/6_1_2.webp 460w","/static/a57483e6084d39a596ee24c41a42de70/966d8/6_1_2.webp 920w","/static/a57483e6084d39a596ee24c41a42de70/445df/6_1_2.webp 1380w","/static/a57483e6084d39a596ee24c41a42de70/78de1/6_1_2.webp 1840w","/static/a57483e6084d39a596ee24c41a42de70/4b7c9/6_1_2.webp 2044w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/a57483e6084d39a596ee24c41a42de70/81c8e/6_1_2.png 230w","/static/a57483e6084d39a596ee24c41a42de70/08a84/6_1_2.png 460w","/static/a57483e6084d39a596ee24c41a42de70/c0255/6_1_2.png 920w","/static/a57483e6084d39a596ee24c41a42de70/b1001/6_1_2.png 1380w","/static/a57483e6084d39a596ee24c41a42de70/161ec/6_1_2.png 1840w","/static/a57483e6084d39a596ee24c41a42de70/6297e/6_1_2.png 2044w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/a57483e6084d39a596ee24c41a42de70/c0255/6_1_2.png","alt":"6 1 2","title":"6 1 2","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"suoraan tehtäväkansion alle"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/bc83b27162a67ce98f825821dc304a7e/6297e/6_1_3.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 26.956521739130434%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAt0lEQVQY023P3Q6CMAwFYN6DjqjtNta1MxlDdILGxBvf/4UMGO/4cm5Pf5pa79N0m+eHSBJJMSqzMKv3vaqklPq+995ba51zdkNkPR2COzallJzL8/lalketc86FWWJUIsfMqtq2bdd1sDF/AOaE2AzDUIYyjmPOWUQRiWidjYgxRlU1xnQ7DBGtmyWdy2ViZqL1ul8QSSQyMwDsVI1BxOZ6md65fsYlyTms3/6iznnd7JYBIITwBcyRLmVWTxqEAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/bc83b27162a67ce98f825821dc304a7e/a0b58/6_1_3.webp 230w","/static/bc83b27162a67ce98f825821dc304a7e/bc10c/6_1_3.webp 460w","/static/bc83b27162a67ce98f825821dc304a7e/966d8/6_1_3.webp 920w","/static/bc83b27162a67ce98f825821dc304a7e/445df/6_1_3.webp 1380w","/static/bc83b27162a67ce98f825821dc304a7e/78de1/6_1_3.webp 1840w","/static/bc83b27162a67ce98f825821dc304a7e/4b7c9/6_1_3.webp 2044w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/bc83b27162a67ce98f825821dc304a7e/81c8e/6_1_3.png 230w","/static/bc83b27162a67ce98f825821dc304a7e/08a84/6_1_3.png 460w","/static/bc83b27162a67ce98f825821dc304a7e/c0255/6_1_3.png 920w","/static/bc83b27162a67ce98f825821dc304a7e/b1001/6_1_3.png 1380w","/static/bc83b27162a67ce98f825821dc304a7e/161ec/6_1_3.png 1840w","/static/bc83b27162a67ce98f825821dc304a7e/6297e/6_1_3.png 2044w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/bc83b27162a67ce98f825821dc304a7e/c0255/6_1_3.png","alt":"6 1 3","title":"6 1 3","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"h2","properties":{"id":"tiedostoja-lukevan-koodin-debuggaus","style":"position:relative;"},"children":[{"type":"text","value":"Tiedostoja lukevan koodin debuggaus"},{"type":"element","tagName":"a","properties":{"href":"#tiedostoja-lukevan-koodin-debuggaus","ariaLabel":"tiedostoja lukevan koodin debuggaus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos yrität käyttää VS Coden "},{"type":"element","tagName":"a","properties":{"href":"/osa-4/1-vscode#debuggeri"},"children":[{"type":"text","value":"debuggeria"}]},{"type":"text","value":" tiedostoja lukevan koodin suorittamiseen, törmäät ikävään virheilmoitukseen:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/b0c7745f7a4cc9c485a52d483e0aa290/eff3b/6_1_4.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 31.304347826086953%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAABYlAAAWJQFJUiTwAAABMklEQVQY003PyU7CQACA4d7EBWQpLdDS6XSWzkw702VIIBESgyaYWBZRE60QUIzv/wguB0PyX7/Db2itx5PJcDiKYym4ICFXaSKkZFKGMhUyESKmlAEY+BD5EAGIMA5iThhjRpZlOhsooTjlmFAKgaBgPMSjHOS8kwtHx55itgqt4xIllEqNPM85F4xxSmhAyAziDabbiG8F28voBcGnvrNot+ZmY2E252azMBtFvSZ7XQADQ19dI4QJoX+Y3vXhgcbvcbYL5Z6pHYlKQEpAS0DWrd6yZi3r1uK0Hpm26wND6xxj8o9nrv8Zxl/p4CCSQ5R8cFV6aAPwm4eeLWfd7Dy2OqvzRtS2XQB+n4/x1IOvNHrw8dIBSwcUtlPYzsqF9+3e7dnltFKdVqo3JxfC7v7gb6ThPL16POKXAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/b0c7745f7a4cc9c485a52d483e0aa290/a0b58/6_1_4.webp 230w","/static/b0c7745f7a4cc9c485a52d483e0aa290/bc10c/6_1_4.webp 460w","/static/b0c7745f7a4cc9c485a52d483e0aa290/966d8/6_1_4.webp 920w","/static/b0c7745f7a4cc9c485a52d483e0aa290/445df/6_1_4.webp 1380w","/static/b0c7745f7a4cc9c485a52d483e0aa290/78de1/6_1_4.webp 1840w","/static/b0c7745f7a4cc9c485a52d483e0aa290/5340a/6_1_4.webp 2072w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/b0c7745f7a4cc9c485a52d483e0aa290/81c8e/6_1_4.png 230w","/static/b0c7745f7a4cc9c485a52d483e0aa290/08a84/6_1_4.png 460w","/static/b0c7745f7a4cc9c485a52d483e0aa290/c0255/6_1_4.png 920w","/static/b0c7745f7a4cc9c485a52d483e0aa290/b1001/6_1_4.png 1380w","/static/b0c7745f7a4cc9c485a52d483e0aa290/161ec/6_1_4.png 1840w","/static/b0c7745f7a4cc9c485a52d483e0aa290/eff3b/6_1_4.png 2072w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/b0c7745f7a4cc9c485a52d483e0aa290/c0255/6_1_4.png","alt":"6 1 4","title":"6 1 4","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Syynä tälle on se, että debuggeri etsii tiedostoja tehtäväkansion juuresta eikä edes "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Execute In File Dir"}]},{"type":"text","value":" -asetus ei asiaa muuta. Helpoin ratkaisu ongelmaan on edellisessä luvussa kuvattu testaukseen käytetyn tiedoston kopioiminen tehtävähakemiston juureen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun olet kopioinut tiedostot tehtävähakemiston juureen, joudut ehkä vielä käynnistämään visual studio coden uudelleen jotta kaikki toimisi."}]},{"type":"element","tagName":"h2","properties":{"id":"csv-tiedoston-lukeminen","style":"position:relative;"},"children":[{"type":"text","value":"CSV-tiedoston lukeminen"},{"type":"element","tagName":"a","properties":{"href":"#csv-tiedoston-lukeminen","ariaLabel":"csv tiedoston lukeminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"CSV-tiedosto ("},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Comma Separated Values"}]},{"type":"text","value":") on tekstitiedosto, jonka jokaisella rivillä on tietyllä välimerkillä erotettua tietoa. Välimerkkinä on usein pilkku "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tai puolipiste "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":";"}]},{"type":"text","value":", mutta mikä tahansa muukin merkki on periaatteessa mahdollinen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"CSV-tiedostoja käytetään usein erilaisten aineistojen esittämiseen. Myös Excelin ja muiden vastaavien ohjelmien taulukot voidaan tallentaa CSV-muodossa, jolloin niitä on helppo käsitellä muilla ohjelmilla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme lukea CSV-tiedoston rivit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":"-silmukalla, mutta miten erottaa rivillä olevat tiedot toisistaan? Helppo tapa on käyttää merkkijonojen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"split"}]},{"type":"text","value":"-metodia: metodille annetaan haluttu välimerkki, ja se palauttaa tiedot välimerkin mukaan eroteltuna listana merkkijonoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki metodin käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"teksti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"apina,banaani,cembalo\""}]},{"type":"text","value":"\nsanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" teksti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\",\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"apina\nbanaani\ncembalo"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkinä tiedostoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"arvosanat.csv"}]},{"type":"text","value":", joka sisältää jokaisella rivillä aluksi opiskelijan nimen ja sen jälkeen tämän eri kursseista saamat arvosanat. Tiedot on erotettu toisistaan puolipisteillä."}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka;5;4;5;3;4;5;5;4;2;4\nPaula;3;4;2;4;4;2;3;1;3;3\nPirjo;4;5;5;4;5;5;4;5;4;4"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma käy läpi tiedoston rivit, jakaa jokaisen rivin osiin ja näyttää opiskelijan nimen sekä arvosanat."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"arvosanat.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"replace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\";\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n arvosanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nimi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arvosanat:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvosanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nimi: Pekka\nArvosanat: ['5', '4', '5', '3', '4', '5', '5', '4', '2', '4']\nNimi: Paula\nArvosanat: ['3', '4', '2', '4', '4', '2', '3', '1', '3', '3']\nNimi: Pirjo\nArvosanat: ['4', '5', '5', '4', '5', '5', '4', '5', '4', '4']"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Hedelmäkauppa","tmcname":"osa06-02_hedelmakauppa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedostossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hedelmat.csv"}]},{"type":"text","value":" on hedelmiä hintoineen seuraavan esimerkin mukaisesti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"sh"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-sh"]},"children":[{"type":"text","value":"banaani"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6.50"}]},{"type":"text","value":"\nomena"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.95"}]},{"type":"text","value":"\nappelsiini"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8.0"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":".."}]},{"type":"text","value":".jne"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":".."}]},{"type":"text","value":"."}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lue_hedelmat"}]},{"type":"text","value":", joka lukee hedelmätiedoston ja muodostaa siitä sanakirjan, jossa hedelmän nimi on avain ja hinta arvo. Hinnan tulee olla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"float"}]},{"type":"text","value":"-arvona sanakirjassa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että tiedoston nimi on aina "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hedelmat.csv"}]},{"type":"text","value":" eikä funktiolle anneta parametria."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lopuksi funktio palauttaa tämän sanakirjan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom!"}]},{"type":"text","value":" Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit kokeilla "},{"type":"element","tagName":"a","properties":{"href":"/osa-6/1-tiedostojen-lukeminen#mita-jos-vs-code-ei-loyda-tiedostoja-koodia-suoritettaessa"},"children":[{"type":"text","value":"täällä"}]},{"type":"text","value":" olevaa ohjetta."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Matriisi","tmcname":"osa06-03_matriisi"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedostossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"matriisi.txt"}]},{"type":"text","value":" on seuraavan esimerkin kaltainen matriisi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"sh"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1,0"}]},{"type":"text","value":",2,8,2,1,3,2,5,2,2,2\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9,2"}]},{"type":"text","value":",4,5,2,4,2,4,1,10,4,2\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":".."}]},{"type":"text","value":".jne"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":".."}]},{"type":"text","value":"."}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktiot "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"maksimi"}]},{"type":"text","value":", jotka lukevat ja palauttavat nimensä mukaisesti matriisin kaikkien alkioiden summan ja suurimman alkion."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita lisäksi funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rivisummat"}]},{"type":"text","value":", joka palauttaa listassa kaikkien matriisin rivien summat. Esimerkiksi matriisille"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"sh"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1,2"}]},{"type":"text","value":",3\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2,3"}]},{"type":"text","value":",4"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"funktio palauttaisi listan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[6, 9]"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vinkki: Voit kirjoittaa ohjelmaan myös muita funktioita – kannattaa siis miettiä, mitä kaikkia yhteisiä toimintoja kolmea funktiota varten vaaditaan. Huomaa, että tiedoston nimi on aina "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"matriisi.txt"}]},{"type":"text","value":" eikä tehtävänannossa määritellyille funktioille anneta parametreja. Itse lisäämäsi funktiot voivat hyödyntää myös parametreja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom!"}]},{"type":"text","value":" Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit kokeilla "},{"type":"element","tagName":"a","properties":{"href":"/osa-6/1-tiedostojen-lukeminen#mita-jos-vs-code-ei-loyda-tiedostoja-koodia-suoritettaessa"},"children":[{"type":"text","value":"täällä"}]},{"type":"text","value":" olevaa ohjetta."}]}]},{"type":"element","tagName":"h2","properties":{"id":"saman-tiedoston-lukeminen-moneen-kertaan","style":"position:relative;"},"children":[{"type":"text","value":"Saman tiedoston lukeminen moneen kertaan"},{"type":"element","tagName":"a","properties":{"href":"#saman-tiedoston-lukeminen-moneen-kertaan","ariaLabel":"saman tiedoston lukeminen moneen kertaan permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joissain tilanteissa ohjelman on tarvetta lukea sama tiedosto useampaan kertaan. Tarkastellaan esimerkkinä seuraavaa ohjelmaa, joka käsittelee henkilötietoja sisältävää tiedostoa:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"text","value":"\nPekka;40;Helsinki\nEmilia;34;Espoo\nErkki;42;Turku\nAntti;100;Helsinki\nLiisa;58;Suonenjoki\n"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"henkilot.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tulostetaan nimet"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\";\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nimi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# etsitään vanhin"}]},{"type":"text","value":"\n vanhimman_ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\";\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" vanhimman_ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n vanhimman_ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" ika\n vanhin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vanhin on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vanhin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma aiheuttaa erikoisen virheilmoituksen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"Traceback "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"most recent call last"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vanhin on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"text","value":" vanhin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nUnboundLocalError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" local variable "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'vanhin'"}]},{"type":"text","value":" referenced before assignment"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Syynä virheelle on se, että jälkimmäistä for-silmukkaa ei suoriteta ollenkaan, sillä tiedoston voi lukea vain kerran. Tämän jälkeen ollaan päästy \"tiedoston loppuun\", ja vaikka yritetään lukea tiedostosta lisää jälkimmäisessä silmukassa, tietoon ei päästä enää käsiksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedosto onkin avattava uudelleen komennolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"open"}]},{"type":"text","value":" toista lukukertaa varten:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"henkilot.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tulostetaan nimet"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\";\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nimi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"henkilot.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# etsitään vanhin"}]},{"type":"text","value":"\n vanhimman_ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\";\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" vanhimman_ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n vanhimman_ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" ika\n vanhin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vanhin on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vanhin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yleensä aina on kuitenkin parasta lukea tiedosto vain kerran ja tallentaa se muotoon, jota ohjelman toiminnallisuudet pystyvät hyödyntämään:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# luetaan tiedostosta henkilöt listaan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"henkilot.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\";\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tulostetaan nimet"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" henkilo "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nimi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# etsitään vanhin"}]},{"type":"text","value":"\nvanhimman_ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" henkilo "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" henkilot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" vanhimman_ika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n vanhimman_ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" ika\n vanhin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vanhin on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vanhin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"lisaa-csv-tiedoston-kasittelya","style":"position:relative;"},"children":[{"type":"text","value":"Lisää CSV-tiedoston käsittelyä"},{"type":"element","tagName":"a","properties":{"href":"#lisaa-csv-tiedoston-kasittelya","ariaLabel":"lisaa csv tiedoston kasittelya permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jatketaan opiskelijoiden arvosanoja sisältävän tiedoston "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"arvosanat.csv"}]},{"type":"text","value":" käsittelyä. Tiedosto näyttää siis seuraavalta:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka;5;4;5;3;4;5;5;4;2;4\nPaula;3;4;2;4;4;2;3;1;3;3\nPirjo;4;5;5;4;5;5;4;5;4;4"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma luo tiedoston perusteella sanakirjan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"arvosanat"}]},{"type":"text","value":", jossa jokainen avain on opiskelijan nimi ja vastaava arvo on lista arvosanoista. Ohjelma muuttaa arvosanat kokonaisluvuiksi, jotta niitä on mukavampaa käsitellä myöhemmin."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"arvosanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"arvosanat.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"replace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\";\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n arvosanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" arvosana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n arvosanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"arvosana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"arvosanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"{'Pekka': [5, 4, 5, 3, 4, 5, 5, 4, 2, 4], 'Paula': [3, 4, 2, 4, 4, 2, 3, 1, 3, 3], 'Pirjo': [4, 5, 5, 4, 5, 5, 4, 5, 4, 4]}"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän jälkeen voimme vaikkapa tulostaa analyysin arvosanoista käymällä läpi sanakirjan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"arvosanat"}]},{"type":"text","value":" perusteella:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lista "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" arvosanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"items"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n paras "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"max"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n keskiarvo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sum"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":": paras arvosana "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"paras"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", keskiarvo "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"keskiarvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","format-spec"]},"children":[{"type":"text","value":".2f"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka: paras arvosana 5, keskiarvo 4.10\nPaula: paras arvosana 4, keskiarvo 2.90\nPirjo: paras arvosana 5, keskiarvo 4.50"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kannattaa tutustua huolella esimerkkikoodiin. Se voi ensisilmäyksellä vaikuttaa monimutkaiselta, mutta ratkaisu on helposti sovellettavissa monenlaisiin datatiedostoihin."}]},{"type":"element","tagName":"h2","properties":{"id":"eroon-turhista-riveista-valilyonneista-ja-rivinvaihdoista","style":"position:relative;"},"children":[{"type":"text","value":"Eroon turhista riveistä, välilyönneistä ja rivinvaihdoista"},{"type":"element","tagName":"a","properties":{"href":"#eroon-turhista-riveista-valilyonneista-ja-rivinvaihdoista","ariaLabel":"eroon turhista riveista valilyonneista ja rivinvaihdoista permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olemme tallentaneet Excelistä nimiä taulukon CSV-muodossa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"sh"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-sh"]},"children":[{"type":"text","value":"etunimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"text","value":" sukunimi\nPekka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"text","value":" Python\nJaana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"text","value":" Java\nHeikki"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"text","value":" Haskell"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten tyypillistä, Excel on lisännyt sarakkeiden väliin erottimena toimivan puolipisteen lisäksi myös välilyönnin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Haluamme tulostaa listalla olevat sukunimet. Koska ensimmäinen rivi kertoo sarakkeiden otsikot, ohitamme sen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sukunimet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"henkilot.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\";\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ohitetaan otsikkorivi"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"etunimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"continue"}]},{"type":"text","value":"\n sukunimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sukunimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostus näyttää seuraavalta:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[' Python\\n', ' Java\\n', ' Haskell']"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kaikkiin paitsi viimeiseen rivin sukunimeen on jäänyt mukaan rivinvaihtomerkki, ja jokaisen sukunimen alkuun on jäänyt ikävä välilyönti."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pääsisimme näistä eroon aiempien esimerkkien tapaan käyttämällä metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"replace"}]},{"type":"text","value":", mutta parempi vaihtoehto tässä tilanteessa on käyttää metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"strip"}]},{"type":"text","value":", joka poistaa merkkijonon alusta ja lopusta ns. whitespace-merkit, eli välilyönnit, rivinvaihdot ja muut normaalina merkkinä tulostumattomat merkit."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kokeillaan metodin toimintaa konsolissa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" koe \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"strip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'koe'"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\\n\\ntesti\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"strip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'testi'"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarvittava muutos ohjelmaan on helppo:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sukunimet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"henkilot.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"';'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"etunimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"continue"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tämä oli otsikkorivi, ei huomioida!"}]},{"type":"text","value":"\n sukunimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"strip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sukunimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän jälkeen tulostus on halutunlainen:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['Python', 'Java', 'Haskell']"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkkijonoilla on myös metodit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lstrip"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rstrip"}]},{"type":"text","value":", jotka poistavat ainoastaan merkkijonon vasemmalla tai oikealla puolella olevia merkkejä."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" testimerkkijono \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rstrip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"' testimerkkijono'"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">>"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" testimerkkijono \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lstrip"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'testimerkkijono '"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"eri-tiedostoissa-olevien-tietojen-yhdistely","style":"position:relative;"},"children":[{"type":"text","value":"Eri tiedostoissa olevien tietojen yhdistely"},{"type":"element","tagName":"a","properties":{"href":"#eri-tiedostoissa-olevien-tietojen-yhdistely","ariaLabel":"eri tiedostoissa olevien tietojen yhdistely permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"On hyvin yleistä, että ohjelmassa tarvittava data on talletettu useaan erilliseen tiedostoon. Tarkastellaan esimerkkinä tilannetta, jossa yrityksen henkilöstön tiedot ovat omassa tiedostossaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tyontekijat.csv"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"csv"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"hetu;nimi;osoite;kaupunki"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"080488-123X;Pekka Mikkola;Vilppulantie 7;00700 Helsinki"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"290274-044S;Liisa Marttinen;Mannerheimintie 100 A 10;00100 Helsinki"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"010479-007Z;Arto Vihavainen;Pihapolku 4;01010 Kerava"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"010499-345K;Leevi Hellas;Tapiolantie 11 B;02000 Espoo"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Työntekijöiden palkat taas ovat talletettu omaan tiedostoonsa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"palkat.csv"}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"csv"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"hetu;palkka;bonus"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"080488-123X;3300;0"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"290274-044S;4150;200"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"010479-007Z;1300;1200"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Molempien tiedostojen riveillä on ensin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"henkilötunnus"}]},{"type":"text","value":", joka kertoo kenen tiedoista on kyse. Käyttämällä henkilötunnusta yhdistävänä tekijänä, on helppo yhdistää henkilöiden nimet ja palkat toisiinsa, ja tehdä esimerkiksi ohjelma, joka tulostaa seuraavanlaisen näkymän henkilöiden ansioihin:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"ansiot:\nPekka Mikkola 3300 euroa\nLiisa Marttinen 4350 euroa\nArto Vihavainen 2500 euroa\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma käyttää aputietorakenteena kahta saankirjaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimet"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"palkat"}]},{"type":"text","value":", joissa molemmissa avaimena toimii henkilötunnus:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tyontekijat.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"';'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hetu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"continue"}]},{"type":"text","value":"\n nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\npalkat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"palkat.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"';'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hetu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"continue"}]},{"type":"text","value":"\n palkat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ansiot:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" hetu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" nimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"items"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" hetu "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" palkat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n palkka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" palkat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"hetu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","format-spec"]},"children":[{"type":"text","value":"16"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"palkka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" euroa\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","format-spec"]},"children":[{"type":"text","value":"16"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" 0 euroa\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma siis muodostaa ensin sanakirjat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimet"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"palkat"}]},{"type":"text","value":", joiden sisältö näyttää seuraavilta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"sh"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'080488-123X'"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin","class-name"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Pekka Mikkola'"}]},{"type":"text","value":",\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'290274-044S'"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin","class-name"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Liisa Marttinen'"}]},{"type":"text","value":",\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'010479-007Z'"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin","class-name"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Arto Vihavainen'"}]},{"type":"text","value":",\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'010499-345K'"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin","class-name"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Leevi Hellas'"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'080488-123X'"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin","class-name"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3300"}]},{"type":"text","value":",\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'290274-044S'"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin","class-name"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4350"}]},{"type":"text","value":",\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'010479-007Z'"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin","class-name"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2500"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lopun for-silmukka yhdistää henkilöiden nimet ja niitä vastaavat palkat sanakirjojen avulla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma huomioi myös tilanteen, jossa henkilön palkkatietoja ei ole olemassa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että koska ohjelma käyttää aputietorakenteena sanakirjaa, ei henkilöitä vastaavien rivien järjestyksellä ole merkitystä."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kurssin tulokset, osa 1","tmcname":"osa06-04_kurssin_tulokset_osa1"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma käsittelee kahta CSV-muotoista tiedostoa. Toisessa on tieto opiskelijoista:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"csv"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"opnro;etunimi;sukunimi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"12345678;pekka;peloton"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"12345687;jaana;javanainen"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"12345699;liisa;virtanen"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"ja toisessa opiskelijoiden viikoittaisesta tehtävien lukumäärästä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"csv"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"opnro;v1;v2;v3;v4;v5;v6;v7"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"12345678;4;1;1;4;5;2;4"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"12345687;3;5;3;1;5;4;6"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"12345699;10;2;2;7;10;2;2"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Molempien CSV-tiedostojen ensimmäinen rivi on otsikkorivi, joka kertoo kunkin kentän sisällön."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy tiedostojen nimet ja tämän jälkeen tulostaa kunkin opiskelijan tehtävien yhteenlasketun määrän. Ohjelma toimii seuraavasti, kun tiedostojen sisältö on yllä oleva:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Opiskelijatiedot: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"opiskelijat1.csv"}]},{"type":"text","value":"\nTehtävätiedot: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tehtavat1.csv"}]},{"type":"text","value":"\npekka peloton 21\njaana javanainen 27\nliisa virtanen 35"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vinkki: Ohjelman testaileminen on toivottoman hidasta, jos käyttäjä joutuu kirjoittamaan syötteen aina käsin. Testausvaiheessa syötteet kannattaakin antaa \"kovakoodaamalla\" ne esim. seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tänne ei tulla"}]},{"type":"text","value":"\n opiskelijatiedot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Opiskelijatiedot: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tehtavatiedot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tehtävätiedot: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kovakoodatut syötteet"}]},{"type":"text","value":"\n opiskelijatiedot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"opiskelijat1.csv\""}]},{"type":"text","value":"\n tehtavatiedot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tehtavat1.csv\""}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman varsinainen toiminnallisuus on nyt \"piilotettu\" ehdon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"-haaraan, jota ei suoriteta koskaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos taas halutaan nopeasti tarkastaa, toimiiko ohjelma myös käyttäjän kirjoittaessa syötteen, voidaan arvo "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":" muuttaa arvoksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n opiskelijatiedot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Opiskelijatiedot: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tehtavatiedot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tehtävätiedot: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tänne ei tulla!"}]},{"type":"text","value":"\n opiskelijatiedot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"opiskelijat1.csv\""}]},{"type":"text","value":"\n tehtavatiedot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tehtavat1.csv\""}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun koodi on kunnossa, voi ehtorakenteen poistaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Toinen huomio"}]},{"type":"text","value":" Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit "},{"type":"element","tagName":"a","properties":{"href":"/osa-6/1-tiedostojen-lukeminen#mita-jos-vs-code-ei-loyda-tiedostoja-koodia-suoritettaessa"},"children":[{"type":"text","value":"täällä"}]},{"type":"text","value":" kokeilla olevaa ohjetta."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kurssin tulokset, osa 2","tmcname":"osa06-05_kurssin_tulokset_osa2"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellinen tehtävä laajenee vielä siten, että myös opiskelijan koepisteet luetaan CSV-tiedostosta. Tiedoston sisältö näyttää seuraavalta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"csv"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"opnro;k1;k2;k3"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"12345678;4;1;4"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"12345687;3;5;3"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"12345699;10;2;2"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi opiskelija jonka opiskelijanumero on 12345678 on saanut kokeesta 4+1+4 eli yhteensä 9 pistettä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma kysyy tiedostojen nimet ja tulostaa jokaisen opiskelijan arvosanan:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Opiskelijatiedot: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"opiskelijat1.csv"}]},{"type":"text","value":"\nTehtävätiedot: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tehtavat1.csv"}]},{"type":"text","value":"\nKoepisteet: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"koepisteet1.csv"}]},{"type":"text","value":"\npekka peloton 0\njaana javanainen 1\nliisa virtanen 3"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtyjen harjoitustehtävien määrästä saa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"pisteitä"}]},{"type":"text","value":" siten, että vähintään 10 % tehtävämäärästä tuo 1 pisteen, vähintään 20% tuo 2 pistettä jne., ja 100 % eli 40 harjoitustehtävää tuo 10 pistettä. Harjoitustehtävistä saatava pistemäärä on kokonaisluku."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kurssin arvosana määräytyy kokeen ja harjoituspisteiden summan perusteella seuraavan taulukon mukaan:"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"kokeen pisteet + harjoitusten pisteet"}]},{"type":"element","tagName":"th","properties":{"align":"center"},"children":[{"type":"text","value":"arvosana"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"0-14"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"0 (eli hylätty)"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"15-17"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"1"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"18-20"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"2"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"21-23"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"3"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"24-27"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"4"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"28-"}]},{"type":"element","tagName":"td","properties":{"align":"center"},"children":[{"type":"text","value":"5"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kurssin tulokset, osa 3","tmcname":"osa06-06_kurssin_tulokset_osa3"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä muotoillaan edellisen tehtävän tulostus parempaan muotoon:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Opiskelijatiedot: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"opiskelijat1.csv"}]},{"type":"text","value":"\nTehtävätiedot: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tehtavat1.csv"}]},{"type":"text","value":"\nKoepisteet: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"koepisteet1.csv"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"nimi teht_lkm teht_pist koe_pist yht_pist arvosana\npekka peloton 21 5 9 14 0\njaana javanainen 27 6 11 17 1\nliisa virtanen 35 8 14 22 3\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jokaisella rivillä siis tulostetaan opiskelijan tehtävien lukumäärä, tehtävistä saatavat pisteet, kokeen pisteet, yhteispisteet (koe+harjoitukset) sekä arvosana \"siististi\" siten, että tulostus on jaoteltu sarakkeisiin. Nimisarakkeen leveys on 30 merkkiä ja muiden sarakkeiden leveys on tasan 10 merkkiä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtävässä kannattaa käyttää "},{"type":"element","tagName":"a","properties":{"href":"/osa-4/5-tulostuksen-muotoilu"},"children":[{"type":"text","value":"osassa 4"}]},{"type":"text","value":" käsiteltyjä f-merkkijonoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kannattaa huomata, että merkkijonojen ja lukujen tulostaminen noudattaa hieman erilaista logiikkaa f-merkkijonoissa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"sana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"python\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","format-spec"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"jatkuu\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","format-spec"]},"children":[{"type":"text","value":">10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"jatkuu\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"python jatkuu\n pythonjatkuu\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oletusarvoisesti siis merkkijono sisentyy määritellyn levyisen alueen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"vasempaan"}]},{"type":"text","value":" reunaan. Merkillä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":"voidaan ohjata tulostus sisentymään oikeaan reunaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lukuja tulostettaessa logiikka on päinvastainen"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"42"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","format-spec"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"jatkuu\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","format-spec"]},"children":[{"type":"text","value":"<10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"jatkuu\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":" 42jatkuu\n42 jatkuu\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oletusarvo lukujen yhteydessä on tulostuksen sisentyminen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"oikeaan"}]},{"type":"text","value":" reunaan. Merkillä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" voidaan ohjata luvun tulostus sisentymään vasempaan reunaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Spell checker","tmcname":"osa06-07_spellchecker"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka pyytää käyttäjää kirjoittamaan rivin englanninkielistä tekstiä. Ohjelma suorittaa tekstille oikeinkirjoitustarkistuksen ja tulostaa saman tekstin siten, että kaikki väärin kirjoitetut sanat on ympäröity tähdillä. Seuraavassa kaksi käyttöesimerkkiä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Write text: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"We use ptython to make a spell checker"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"We use *ptython* to make a spell checker\n"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Write text: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"This is acually a good and usefull program"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"This is *acually* good and *usefull* program\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjainten koolla ei ole merkitystä ohjelman toiminnan kannalta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma tunnistaa oikein kirjoitetut sanat käyttämällä tehtäväpohjassa olevaa tiedostoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"wordlist.txt"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Toinen huomio"}]},{"type":"text","value":" Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit "},{"type":"element","tagName":"a","properties":{"href":"/osa-6/1-tiedostojen-lukeminen#mita-jos-vs-code-ei-loyda-tiedostoja-koodia-suoritettaessa"},"children":[{"type":"text","value":"täällä"}]},{"type":"text","value":" kokeilla olevaa ohjetta."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Reseptihaku","tmcname":"osa06-08_reseptihaku"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä tehdään ohjelma, joka tarjoaa käyttäjälle mahdollisuuden reseptien hakuun reseptin nimen, valmistusajan tai raaka-aineen nimen perusteella. Ohjelma lukee reseptit käyttäjän antamasta tiedostosta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jokainen resepti koostuu kolmesta tai useammasta rivistä reseptitiedostossa. Ensimmäisellä rivillä on reseptin nimi, toisella rivillä reseptin valmistusaika (kokonaisluku), ja kolmas ja sitä seuraavat rivit kertovat reseptin raaka-aineet. Reseptin raaka-aineiden kuvaus päättyy tyhjään riviin, poislukien viimeinen resepti. Tiedostossa voi olla useampia reseptejä. Alla kuvattuna esimerkkitiedosto."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"sh"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-sh"]},"children":[{"type":"text","value":"Lettutaikina\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]},{"type":"text","value":"\nmaito\nkananmuna\njauho\nsokeri\nsuola\nvoi\n\nLihapullat\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"45"}]},{"type":"text","value":"\njauheliha\nkananmuna\nkorppujauho\n\nTofurullat\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"30"}]},{"type":"text","value":"\ntofu\nriisi\nvesi\nporkkana\nkurkku\navokado\nwasabi\n\nPullataikina\n"},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"60"}]},{"type":"text","value":"\nmaito\nhiiva\nkananmuna\nsuola\nsokeri\nkardemumma\nvoi"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vihje"}]},{"type":"text","value":" tässä tehtävässä lienee järkevintä lukea ensin tiedoston rivit listalle ja käsitellä sitten tätä listaa tehtävän edellyttämällä tavalla."}]},{"type":"element","tagName":"h4","properties":{"id":"reseptien-haku-nimen-perusteella","style":"position:relative;"},"children":[{"type":"text","value":"reseptien haku nimen perusteella"},{"type":"element","tagName":"a","properties":{"href":"#reseptien-haku-nimen-perusteella","ariaLabel":"reseptien haku nimen perusteella permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae_nimi(tiedosto: str, sana: str)"}]},{"type":"text","value":" joka hakee parametrina annetun nimisestä tiedostosta reseptit, joiden nimessä esiintyy toisena parametrina annettu merkkijono. Funktio palauttaa listan, jossa kutakin löydettyä reseptiä vastaa merkkijono, joka kertoo reseptin nimen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"loydetyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" hae_nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"reseptit1.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pulla\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" resepti "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" loydetyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"resepti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lihapullat\nPullataikina"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että hakusanojen kirjainten koolla ei ole merkitystä, eli hakusana "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"pulla"}]},{"type":"text","value":" löytää myös reseptin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Pullataikina"}]},{"type":"text","value":", joka alkaa isolla kirjaimella."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom!"}]},{"type":"text","value":" Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit "},{"type":"element","tagName":"a","properties":{"href":"/osa-6/1-tiedostojen-lukeminen#mita-jos-vs-code-ei-loyda-tiedostoja-koodia-suoritettaessa"},"children":[{"type":"text","value":"täällä"}]},{"type":"text","value":" kokeilla olevaa ohjetta."}]},{"type":"element","tagName":"h4","properties":{"id":"reseptien-hakeminen-valmistusajan-perusteella","style":"position:relative;"},"children":[{"type":"text","value":"reseptien hakeminen valmistusajan perusteella"},{"type":"element","tagName":"a","properties":{"href":"#reseptien-hakeminen-valmistusajan-perusteella","ariaLabel":"reseptien hakeminen valmistusajan perusteella permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae_aika(tiedosto: str, aika: int)"}]},{"type":"text","value":" joka hakee parametrina annetun nimisestä tiedostosta reseptit, joiden valmistusaika on korkeintaan parametrina kerrottu minuuttimäärä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kriteerin täyttävät reseptit palautetaan edellisen tehtävän tapaan listana, nyt kerrotaan myös reseptin valmistumisaika. Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"loydetyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" hae_aika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"reseptit1.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" resepti "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" loydetyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"resepti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lettutaikina, valmistusaika 15 min"}]}]},{"type":"element","tagName":"h4","properties":{"id":"reseptien-hakeminen-raaka-aineen-perusteella","style":"position:relative;"},"children":[{"type":"text","value":"reseptien hakeminen raaka-aineen perusteella"},{"type":"element","tagName":"a","properties":{"href":"#reseptien-hakeminen-raaka-aineen-perusteella","ariaLabel":"reseptien hakeminen raaka aineen perusteella permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Varoitus"}]},{"type":"text","value":" tämä osa on edellisiä selvästi haastavampi. Jos tehtävä ei lähde heti aukenemaan, kannattanee tehdä ensin osan muut tehtävät ja palata lopuksi takaisin tähän. Huomaa, että voit lähettää moniosaisessa tehtävässä palvelimelle myös yksittäiset osat"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae_raakaaine(tiedosto: str, aine: str)"}]},{"type":"text","value":" joka hakee parametrina annetun nimisestä tiedostosta reseptit, jotka sisältävät toisena parametrina annetun raaka-aineen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kriteerin täyttävät reseptit palautetaan edellisen tehtävän tapaan listana. Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"loydetyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" hae_raakaaine"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"reseptit1.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"maito\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" resepti "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" loydetyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"resepti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lettutaikina, valmistusaika 15 min\nPullataikina, valmistusaika 60 min"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kaupunkipyörät","tmcname":"osa06-09_kaupunkipyorat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä tehdään muutama funktio, joiden avulla voidaan tarkastella "},{"type":"element","tagName":"a","properties":{"href":"https://kaupunkipyorat.hsl.fi/fi","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"kaupunkipyörien"}]},{"type":"text","value":" asemien sijaintia sisältävää tiedostoa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedostot näyttävät seuraavilta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"csv"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"Longitude;Latitude;FID;name;total_slot;operative;id"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"24.950292890004903;60.155444793742276;1;Kaivopuisto;30;Yes;001"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"24.956347471358754;60.160959093887129;2;Laivasillankatu;12;Yes;002"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"24.944927399779715;60.158189199971673;3;Kapteeninpuistikko;16;Yes;003"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kutakin asemaa kohti tiedostossa on yksi rivi, joka kertoo aseman koordinaatit, aseman nimen ja muuta tunnistetietoa."}]},{"type":"element","tagName":"h4","properties":{"id":"asemien-valinen-etaisyys","style":"position:relative;"},"children":[{"type":"text","value":"asemien välinen etäisyys"},{"type":"element","tagName":"a","properties":{"href":"#asemien-valinen-etaisyys","ariaLabel":"asemien valinen etaisyys permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ensin funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae_asematiedot(tiedosto: str)"}]},{"type":"text","value":", joka lukee asematiedot tiedostosta ja palauttaa ne sanakirjana, joka näyttää tältä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"{\n \"Kaivopuisto: (24.950292890004903, 60.155444793742276),\n \"Laivasillankatu: (24.956347471358754, 60.160959093887129),\n \"Kapteeninpuistikko: (24.944927399779715, 60.158189199971673)\n}\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eli sanakirjan avaimena on aseman nimi ja arvona tuple, joka koostuu aseman koordinaateista, ensimmäisenä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Longitude"}]},{"type":"text","value":" ja toisena "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Latitude"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee seuraavaksi funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"etaisyys(asemat: dict, asema1: str, asema2: str)"}]},{"type":"text","value":", joka palauttaa parametrina kerrottujen asemien välisen etäisyyden."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Etäisyys lasketaan seuraavalla kaavalla (hyödyntäen Pythagoraan lausetta):"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tämä rivi tarvitaan, jotta saadaan käyttöön metodi sqrt"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" math\n\nx_kilometreina "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"longitude1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" longitude2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"55.26"}]},{"type":"text","value":"\ny_kilometreina "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"latitude1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" latitude2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"111.2"}]},{"type":"text","value":"\netaisyys "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sqrt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x_kilometreina"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" y_kilometreina"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuorituksia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"asemat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" hae_asematiedot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'stations1.csv'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ne "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" etaisyys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"asemat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Designmuseo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hietalahdentori\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ne "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" etaisyys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"asemat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Viiskulma\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kaivopuisto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"e"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"0.9032737292463177\n0.7753594392019532"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom!"}]},{"type":"text","value":" Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit "},{"type":"element","tagName":"a","properties":{"href":"/osa-6/1-tiedostojen-lukeminen#mita-jos-vs-code-ei-loyda-tiedostoja-koodia-suoritettaessa"},"children":[{"type":"text","value":"täällä"}]},{"type":"text","value":" kokeilla olevaa ohjetta."}]},{"type":"element","tagName":"h4","properties":{"id":"pisin-valimatka","style":"position:relative;"},"children":[{"type":"text","value":"pisin välimatka"},{"type":"element","tagName":"a","properties":{"href":"#pisin-valimatka","ariaLabel":"pisin valimatka permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suurin_etaisyys(asemat: dict)"}]},{"type":"text","value":", joka selvittää, mitkä kaksi asemaa ovat kauimpana toisistaan. Funktio palauttaa tuplen, jonka ensimmäiset kaksi arvoa kertovat asemien nimet ja kolmas arvo niiden välisen etäisyyden."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"asemat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" hae_asematiedot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'stations1.csv'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nasema1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" asema2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" suurin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" suurin_etaisyys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"asemat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"asema1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" asema2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" suurin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laivasillankatu Hietalahdentori 1.478708873076181"}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, miten tiedoston sisällön voi lukea Pythonissa
  • \n
  • Tiedät, mitä ovat tekstitiedosto ja CSV-tiedosto
  • \n
  • Osaat purkaa ja käsitellä CSV-tiedoston sisällön ohjelmassa
  • \n

Ohjelmointitaidon kehittyminen edellyttää vahvaa rutiinia ja myös omaa soveltavaa oivaltamista. Tämän takia kurssilla on paljon tehtäviä. Osa tehtävistä on kohtuullisen suoraviivaisesti materiaalia hyödyntäviä ja osa taas aivan tarkoituksella haastavampia soveltavia tehtäviä.

Ei kannata huolestua, vaikka osa kurssin tehtävistä tuntuisikin ensiyrittämällä liian vaikealta. Kaikkia tehtäviä ei ole pakko tehdä, kuten arvosteluperusteet toteavat, kurssin läpipääsyyn vaaditaan vähintään 25 % jokaisen osan ohjelmointitehtävien pisteistä.

Kurssin osien tehtävät eivät etene vaikeusjärjestyksessä. Jokaisessa aliosassa esitellään yleensä muutama uusi konsepti, joita harjoitellaan sekä helpommilla että soveltavimmilla tehtävillä. Jos törmäät liian haastavan tuntuiseen tehtävään, hyppää seuraavaan. Voit palata vaikeimpiin tehtäviin osan lopuksi, jos aikaa vielä jää.

Lohdutuksen sanana todettakoon, että tällä viikolla mahdottomalta vaikuttava tehtävä näyttää melko varmasti neljän viikon päästä melko helpolta.

Yksi tavallinen ohjelmoinnin käyttötarkoitus on käsitellä tiedostoissa olevaa tietoa. Ohjelmat voivat lukea tietoa tiedostoista ja tallentaa tuloksia tiedostoihin. Tiedostojen avulla voimme käsitellä suuriakin aineistoja helposti automaattisesti.

Oletamme tällä kurssilla, että käsiteltävät tiedostot ovat tekstitiedostoja eli ne muodostuvat riveistä, joilla on tekstiä. Esimerkiksi kurssilla käytetty Visual Studio Code -editori käsittelee tekstitiedostoja. Huomaa, että esimerkiksi Word-dokumentti ei ole tekstitiedosto, vaan siinä on tekstin lisäksi muotoilutietoja ja sen käsittely ohjelmallisesti olisi vaikeaa.

Tiedostosta lukeminen

Käytetään esimerkkinä tiedostoa esimerkki.txt, jonka sisältönä on:

Moi kaikki!\nEsimerkkitiedostomme on kolmerivinen.\nViimeinen rivi.

Hyvä tapa käsitellä tiedostoja Pythonissa on käyttää with-lausetta, jonka alkurivi avaa tiedoston. Tämän jälkeen tulee lohko, jonka sisällä tiedostoa voi käsitellä. Lohkon jälkeen tiedosto sulkeutuu automaattisesti, eikä sitä voi enää käsitellä.

Esimerkiksi seuraava koodi lukee ja tulostaa tiedoston sisällön:

with open(\"esimerkki.txt\") as tiedosto:\n    sisalto = tiedosto.read()\n    print(sisalto)

Moi kaikki!\nEsimerkkitiedostomme on kolmerivinen.\nViimeinen rivi.

Koodissa muuttuja tiedosto on tiedostokahva, jonka kautta tiedostoa voi käsitellä avaamisen jälkeen. Tässä tapauksessa käytämme metodia read, joka palauttaa koko tiedoston sisällön yhtenä merkkijonona. Tässä tapauksessa palautettu merkkijono on seuraava:

\"Moi kaikki!\\nEsimerkkitiedostomme on kolmerivinen.\\nViimeinen rivi.\"

Tiedoston sisällön läpikäynti

Metodi read on näppärä, jos halutaan esimerkiksi tulostaa tiedoston sisältö kokonaisuudessaan ruudulle. Usein haluamme kuitenkin käsitellä tiedostoa rivi kerrallaan.

Voimme käyttää tiedoston sisällön lukemiseen for-silmukkaa, joka käy läpi tiedoston rivit yksi kerrallaan – siis samaan tapaan kuin esimerkiksi listan läpikäynnissä.

Seuraava esimerkki lukee saman tiedoston nyt käyttäen for-silmukkaa, poistaa joka rivin perästä rivinvaihdon ja laskee rivien yhteispituuden:

with open(\"esimerkki.txt\") as tiedosto:\n    laskuri = 0\n    yhteispituus = 0\n\n    for rivi in tiedosto:\n        rivi = rivi.replace(\"\\n\", \"\")\n        laskuri += 1\n        print(\"Rivi\", laskuri, rivi)\n        pituus = len(rivi)\n        yhteispituus += pituus\n\nprint(\"Rivien yhteispituus:\", yhteispituus)

Rivi 1 Moi kaikki!\nRivi 2 Esimerkkitiedostomme on kolmerivinen.\nRivi 3 Viimeinen rivi.\nRivien yhteispituus: 63

Huomaa, että rivien läpikäynnissä jokaisen rivin perässä on rivinvaihto \\n. Yllä oleva koodi kuitenkin poistaa rivinvaihdot replace-funktiolla, joka korvaa rivinvaihdot tyhjillä merkkijonoilla. Tämän ansiosta tulostukseen ei tule ylimääräisiä rivivaihtoja ja ohjelma laskee oikein tiedoston rivien yhteispituuden.

Tiedostoon luvut.txt on tallennettu lukuja, yksi luku per rivi seuraavan esimerkin mukaisesti:

2\n45\n108\n3\n-10\n1100\n...jne...

Kirjoita funktio suurin, joka lukee tiedoston ja palauttaa suurimman tiedostosta löytyvän luvun.

Huomaa, että tiedoston nimi on aina luvut.txt eikä funktiolle anneta parametria.

Huom! Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit kokeilla seuraavaa heti tehtävän jälkeen olevaa ohjetta.

Mitä jos VS code ei löydä tiedostoja koodia suoritettaessa?

Jos VS Code ei löydä tiedostoa suorittaessasi koodia (vihreää nappia painamalla) vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit kokeilla seuraavaa:

    \n
  • Mene asetuksiin valikosta File -> Preferences -> Settings
  • \n
  • Etsi muutettava kohta hakusanalla \"executeinfile\"
  • \n
  • Valitse välilehti Workspace
  • \n
  • Laita raksi kohtaan Python -> Terminal -> Execute In File Dir
  • \n

Oikein tehtynä asetus näyttää suunilleen seuraavalta:

\n \n \n \n \n \n \"6\n \n \n

Jos edellinenkään ei toimi, voit kopioida kansiossa src olevan testaukseen käytetyn tiedoston sisällön

\n \n \n \n \n \n \"6\n \n \n

suoraan tehtäväkansion alle

\n \n \n \n \n \n \"6\n \n \n

Tiedostoja lukevan koodin debuggaus

Jos yrität käyttää VS Coden debuggeria tiedostoja lukevan koodin suorittamiseen, törmäät ikävään virheilmoitukseen:

\n \n \n \n \n \n \"6\n \n \n

Syynä tälle on se, että debuggeri etsii tiedostoja tehtäväkansion juuresta eikä edes Execute In File Dir -asetus ei asiaa muuta. Helpoin ratkaisu ongelmaan on edellisessä luvussa kuvattu testaukseen käytetyn tiedoston kopioiminen tehtävähakemiston juureen.

Kun olet kopioinut tiedostot tehtävähakemiston juureen, joudut ehkä vielä käynnistämään visual studio coden uudelleen jotta kaikki toimisi.

CSV-tiedoston lukeminen

CSV-tiedosto (Comma Separated Values) on tekstitiedosto, jonka jokaisella rivillä on tietyllä välimerkillä erotettua tietoa. Välimerkkinä on usein pilkku , tai puolipiste ;, mutta mikä tahansa muukin merkki on periaatteessa mahdollinen.

CSV-tiedostoja käytetään usein erilaisten aineistojen esittämiseen. Myös Excelin ja muiden vastaavien ohjelmien taulukot voidaan tallentaa CSV-muodossa, jolloin niitä on helppo käsitellä muilla ohjelmilla.

Voimme lukea CSV-tiedoston rivit for-silmukalla, mutta miten erottaa rivillä olevat tiedot toisistaan? Helppo tapa on käyttää merkkijonojen split-metodia: metodille annetaan haluttu välimerkki, ja se palauttaa tiedot välimerkin mukaan eroteltuna listana merkkijonoja.

Esimerkki metodin käytöstä:

teksti = \"apina,banaani,cembalo\"\nsanat = teksti.split(\",\")\nfor sana in sanat:\n    print(sana)

apina\nbanaani\ncembalo

Tarkastellaan esimerkkinä tiedostoa arvosanat.csv, joka sisältää jokaisella rivillä aluksi opiskelijan nimen ja sen jälkeen tämän eri kursseista saamat arvosanat. Tiedot on erotettu toisistaan puolipisteillä.

Pekka;5;4;5;3;4;5;5;4;2;4\nPaula;3;4;2;4;4;2;3;1;3;3\nPirjo;4;5;5;4;5;5;4;5;4;4

Seuraava ohjelma käy läpi tiedoston rivit, jakaa jokaisen rivin osiin ja näyttää opiskelijan nimen sekä arvosanat.

with open(\"arvosanat.csv\") as tiedosto:\n    for rivi in tiedosto:\n        rivi = rivi.replace(\"\\n\", \"\")\n        osat = rivi.split(\";\")\n        nimi = osat[0]\n        arvosanat = osat[1:]\n        print(\"Nimi:\", nimi)\n        print(\"Arvosanat:\", arvosanat)

Nimi: Pekka\nArvosanat: ['5', '4', '5', '3', '4', '5', '5', '4', '2', '4']\nNimi: Paula\nArvosanat: ['3', '4', '2', '4', '4', '2', '3', '1', '3', '3']\nNimi: Pirjo\nArvosanat: ['4', '5', '5', '4', '5', '5', '4', '5', '4', '4']

Tiedostossa hedelmat.csv on hedelmiä hintoineen seuraavan esimerkin mukaisesti:

banaani;6.50\nomena;4.95\nappelsiini;8.0\n...jne...

Kirjoita funktio lue_hedelmat, joka lukee hedelmätiedoston ja muodostaa siitä sanakirjan, jossa hedelmän nimi on avain ja hinta arvo. Hinnan tulee olla float-arvona sanakirjassa.

Huomaa, että tiedoston nimi on aina hedelmat.csv eikä funktiolle anneta parametria.

Lopuksi funktio palauttaa tämän sanakirjan.

Huom! Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit kokeilla täällä olevaa ohjetta.

Tiedostossa matriisi.txt on seuraavan esimerkin kaltainen matriisi:

1,0,2,8,2,1,3,2,5,2,2,2\n9,2,4,5,2,4,2,4,1,10,4,2\n...jne...

Kirjoita funktiot summa ja maksimi, jotka lukevat ja palauttavat nimensä mukaisesti matriisin kaikkien alkioiden summan ja suurimman alkion.

Kirjoita lisäksi funktio rivisummat, joka palauttaa listassa kaikkien matriisin rivien summat. Esimerkiksi matriisille

1,2,3\n2,3,4

funktio palauttaisi listan [6, 9].

Vinkki: Voit kirjoittaa ohjelmaan myös muita funktioita – kannattaa siis miettiä, mitä kaikkia yhteisiä toimintoja kolmea funktiota varten vaaditaan. Huomaa, että tiedoston nimi on aina matriisi.txt eikä tehtävänannossa määritellyille funktioille anneta parametreja. Itse lisäämäsi funktiot voivat hyödyntää myös parametreja.

Huom! Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit kokeilla täällä olevaa ohjetta.

Saman tiedoston lukeminen moneen kertaan

Joissain tilanteissa ohjelman on tarvetta lukea sama tiedosto useampaan kertaan. Tarkastellaan esimerkkinä seuraavaa ohjelmaa, joka käsittelee henkilötietoja sisältävää tiedostoa:

\nPekka;40;Helsinki\nEmilia;34;Espoo\nErkki;42;Turku\nAntti;100;Helsinki\nLiisa;58;Suonenjoki\n
with open(\"henkilot.csv\") as tiedosto:\n    # tulostetaan nimet\n    for rivi in tiedosto:\n        osat = rivi.split(\";\")\n        print(\"Nimi:\", osat[0])\n\n    # etsitään vanhin\n    vanhimman_ika = -1\n    for rivi in tiedosto:\n        osat = rivi.split(\";\")\n        nimi = osat[0]\n        ika = int(osat[1])\n        if ika > vanhimman_ika:\n            vanhimman_ika = ika\n            vanhin = nimi\n    print(\"vanhin on\", vanhin)

Ohjelma aiheuttaa erikoisen virheilmoituksen:

Traceback (most recent call last):\n    print(\"vanhin on\"; vanhin)\nUnboundLocalError: local variable 'vanhin' referenced before assignment

Syynä virheelle on se, että jälkimmäistä for-silmukkaa ei suoriteta ollenkaan, sillä tiedoston voi lukea vain kerran. Tämän jälkeen ollaan päästy \"tiedoston loppuun\", ja vaikka yritetään lukea tiedostosta lisää jälkimmäisessä silmukassa, tietoon ei päästä enää käsiksi.

Tiedosto onkin avattava uudelleen komennolla open toista lukukertaa varten:

with open(\"henkilot.csv\") as tiedosto:\n    # tulostetaan nimet\n    for rivi in tiedosto:\n        osat = rivi.split(\";\")\n        print(\"Nimi:\", osat[0])\n\nwith open(\"henkilot.csv\") as tiedosto:\n    # etsitään vanhin\n    vanhimman_ika = -1\n    for rivi in tiedosto:\n        osat = rivi.split(\";\")\n        nimi = osat[0]\n        ika = int(osat[1])\n        if ika > vanhimman_ika:\n            vanhimman_ika = ika\n            vanhin = nimi\n    print(\"vanhin on\", vanhin)

Yleensä aina on kuitenkin parasta lukea tiedosto vain kerran ja tallentaa se muotoon, jota ohjelman toiminnallisuudet pystyvät hyödyntämään:

henkilot = []\n# luetaan tiedostosta henkilöt listaan\nwith open(\"henkilot.csv\") as tiedosto:\n    for rivi in tiedosto:\n        osat = rivi.split(\";\")\n        henkilot.append((osat[0], int(osat[1]), osat[2]))\n\n# tulostetaan nimet\nfor henkilo in henkilot:\n    print(\"Nimi:\", henkilo[0])\n\n# etsitään vanhin\nvanhimman_ika = -1\nfor henkilo in henkilot:\n    nimi = henkilo[0]\n    ika = henkilo[1]\n    if ika > vanhimman_ika:\n        vanhimman_ika = ika\n        vanhin = nimi\nprint(\"vanhin on\", vanhin)

Lisää CSV-tiedoston käsittelyä

Jatketaan opiskelijoiden arvosanoja sisältävän tiedoston arvosanat.csv käsittelyä. Tiedosto näyttää siis seuraavalta:

Pekka;5;4;5;3;4;5;5;4;2;4\nPaula;3;4;2;4;4;2;3;1;3;3\nPirjo;4;5;5;4;5;5;4;5;4;4

Seuraava ohjelma luo tiedoston perusteella sanakirjan arvosanat, jossa jokainen avain on opiskelijan nimi ja vastaava arvo on lista arvosanoista. Ohjelma muuttaa arvosanat kokonaisluvuiksi, jotta niitä on mukavampaa käsitellä myöhemmin.

arvosanat = {}\nwith open(\"arvosanat.csv\") as tiedosto:\n    for rivi in tiedosto:\n        rivi = rivi.replace(\"\\n\", \"\")\n        osat = rivi.split(\";\")\n        nimi = osat[0]\n        arvosanat[nimi] = []\n        for arvosana in osat[1:]:\n            arvosanat[nimi].append(int(arvosana))\n\nprint(arvosanat)

{'Pekka': [5, 4, 5, 3, 4, 5, 5, 4, 2, 4], 'Paula': [3, 4, 2, 4, 4, 2, 3, 1, 3, 3], 'Pirjo': [4, 5, 5, 4, 5, 5, 4, 5, 4, 4]}

Tämän jälkeen voimme vaikkapa tulostaa analyysin arvosanoista käymällä läpi sanakirjan arvosanat perusteella:

for nimi, lista in arvosanat.items():\n    paras = max(lista)\n    keskiarvo = sum(lista) / len(lista)\n    print(f\"{nimi}: paras arvosana {paras}, keskiarvo {keskiarvo:.2f}\")

Pekka: paras arvosana 5, keskiarvo 4.10\nPaula: paras arvosana 4, keskiarvo 2.90\nPirjo: paras arvosana 5, keskiarvo 4.50

Kannattaa tutustua huolella esimerkkikoodiin. Se voi ensisilmäyksellä vaikuttaa monimutkaiselta, mutta ratkaisu on helposti sovellettavissa monenlaisiin datatiedostoihin.

Eroon turhista riveistä, välilyönneistä ja rivinvaihdoista

Olemme tallentaneet Excelistä nimiä taulukon CSV-muodossa:

etunimi; sukunimi\nPekka; Python\nJaana; Java\nHeikki; Haskell

Kuten tyypillistä, Excel on lisännyt sarakkeiden väliin erottimena toimivan puolipisteen lisäksi myös välilyönnin.

Haluamme tulostaa listalla olevat sukunimet. Koska ensimmäinen rivi kertoo sarakkeiden otsikot, ohitamme sen:

sukunimet = []\nwith open(\"henkilot.csv\") as tiedosto:\n    for rivi in tiedosto:\n        osat = rivi.split(\";\")\n        # ohitetaan otsikkorivi\n        if osat[0] == \"etunimi\":\n            continue\n        sukunimet.append(osat[1])\n\nprint(sukunimet)

Tulostus näyttää seuraavalta:

[' Python\\n', ' Java\\n', ' Haskell']

Kaikkiin paitsi viimeiseen rivin sukunimeen on jäänyt mukaan rivinvaihtomerkki, ja jokaisen sukunimen alkuun on jäänyt ikävä välilyönti.

Pääsisimme näistä eroon aiempien esimerkkien tapaan käyttämällä metodia replace, mutta parempi vaihtoehto tässä tilanteessa on käyttää metodia strip, joka poistaa merkkijonon alusta ja lopusta ns. whitespace-merkit, eli välilyönnit, rivinvaihdot ja muut normaalina merkkinä tulostumattomat merkit.

Kokeillaan metodin toimintaa konsolissa:

>>> \" koe \".strip()\n'koe'\n>>> \"\\n\\ntesti\\n\".strip()\n'testi'\n>>>

Tarvittava muutos ohjelmaan on helppo:

sukunimet = []\nwith open(\"henkilot.csv\") as tiedosto:\n    for rivi in tiedosto:\n        osat = rivi.split(';')\n        if osat[0] == \"etunimi\":\n            continue # tämä oli otsikkorivi, ei huomioida!\n        sukunimet.append(osat[1].strip())\nprint(sukunimet)

Tämän jälkeen tulostus on halutunlainen:

['Python', 'Java', 'Haskell']

Merkkijonoilla on myös metodit lstrip ja rstrip, jotka poistavat ainoastaan merkkijonon vasemmalla tai oikealla puolella olevia merkkejä.

>>> \" testimerkkijono  \".rstrip()\n' testimerkkijono'\n>>> \" testimerkkijono  \".lstrip()\n'testimerkkijono  '

Eri tiedostoissa olevien tietojen yhdistely

On hyvin yleistä, että ohjelmassa tarvittava data on talletettu useaan erilliseen tiedostoon. Tarkastellaan esimerkkinä tilannetta, jossa yrityksen henkilöstön tiedot ovat omassa tiedostossaan tyontekijat.csv:

hetu;nimi;osoite;kaupunki\n080488-123X;Pekka Mikkola;Vilppulantie 7;00700 Helsinki\n290274-044S;Liisa Marttinen;Mannerheimintie 100 A 10;00100 Helsinki\n010479-007Z;Arto Vihavainen;Pihapolku 4;01010 Kerava\n010499-345K;Leevi Hellas;Tapiolantie 11 B;02000 Espoo

Työntekijöiden palkat taas ovat talletettu omaan tiedostoonsa palkat.csv

hetu;palkka;bonus\n080488-123X;3300;0\n290274-044S;4150;200\n010479-007Z;1300;1200

Molempien tiedostojen riveillä on ensin henkilötunnus, joka kertoo kenen tiedoista on kyse. Käyttämällä henkilötunnusta yhdistävänä tekijänä, on helppo yhdistää henkilöiden nimet ja palkat toisiinsa, ja tehdä esimerkiksi ohjelma, joka tulostaa seuraavanlaisen näkymän henkilöiden ansioihin:

\nansiot:\nPekka Mikkola    3300 euroa\nLiisa Marttinen  4350 euroa\nArto Vihavainen  2500 euroa\n

Ohjelma käyttää aputietorakenteena kahta saankirjaa nimet ja palkat, joissa molemmissa avaimena toimii henkilötunnus:

nimet = {}\n\nwith open(\"tyontekijat.csv\") as tiedosto:\n    for rivi in tiedosto:\n        osat = rivi.split(';')\n        if osat[0] == \"hetu\":\n            continue\n        nimet[osat[0]] = osat[1]\n\npalkat = {}\n\nwith open(\"palkat.csv\") as tiedosto:\n    for rivi in tiedosto:\n        osat = rivi.split(';')\n        if osat[0] == \"hetu\":\n            continue\n        palkat[osat[0]] = int(osat[1]) +int(osat[2])\n\nprint(\"ansiot:\")\n\nfor hetu, nimi in nimet.items():\n    if hetu in palkat:\n        palkka = palkat[hetu]\n        print(f\"{nimi:16} {palkka} euroa\")\n    else:\n        print(f\"{nimi:16} 0 euroa\")

Ohjelma siis muodostaa ensin sanakirjat nimet ja palkat, joiden sisältö näyttää seuraavilta:

{\n    '080488-123X': 'Pekka Mikkola',\n    '290274-044S': 'Liisa Marttinen',\n    '010479-007Z': 'Arto Vihavainen',\n    '010499-345K': 'Leevi Hellas'\n}\n\n{\n    '080488-123X': 3300,\n    '290274-044S': 4350,\n    '010479-007Z': 2500\n}

Lopun for-silmukka yhdistää henkilöiden nimet ja niitä vastaavat palkat sanakirjojen avulla.

Ohjelma huomioi myös tilanteen, jossa henkilön palkkatietoja ei ole olemassa.

Huomaa, että koska ohjelma käyttää aputietorakenteena sanakirjaa, ei henkilöitä vastaavien rivien järjestyksellä ole merkitystä.

Ohjelma käsittelee kahta CSV-muotoista tiedostoa. Toisessa on tieto opiskelijoista:

opnro;etunimi;sukunimi\n12345678;pekka;peloton\n12345687;jaana;javanainen\n12345699;liisa;virtanen

ja toisessa opiskelijoiden viikoittaisesta tehtävien lukumäärästä:

opnro;v1;v2;v3;v4;v5;v6;v7\n12345678;4;1;1;4;5;2;4\n12345687;3;5;3;1;5;4;6\n12345699;10;2;2;7;10;2;2

Molempien CSV-tiedostojen ensimmäinen rivi on otsikkorivi, joka kertoo kunkin kentän sisällön.

Tee ohjelma, joka kysyy tiedostojen nimet ja tämän jälkeen tulostaa kunkin opiskelijan tehtävien yhteenlasketun määrän. Ohjelma toimii seuraavasti, kun tiedostojen sisältö on yllä oleva:

Opiskelijatiedot: opiskelijat1.csv\nTehtävätiedot: tehtavat1.csv\npekka peloton 21\njaana javanainen 27\nliisa virtanen 35

Vinkki: Ohjelman testaileminen on toivottoman hidasta, jos käyttäjä joutuu kirjoittamaan syötteen aina käsin. Testausvaiheessa syötteet kannattaakin antaa \"kovakoodaamalla\" ne esim. seuraavasti:

if False:\n    # tänne ei tulla\n    opiskelijatiedot = input(\"Opiskelijatiedot: \")\n    tehtavatiedot = input(\"Tehtävätiedot: \")\nelse:\n    # kovakoodatut syötteet\n    opiskelijatiedot = \"opiskelijat1.csv\"\n    tehtavatiedot = \"tehtavat1.csv\"

Ohjelman varsinainen toiminnallisuus on nyt \"piilotettu\" ehdon False-haaraan, jota ei suoriteta koskaan.

Jos taas halutaan nopeasti tarkastaa, toimiiko ohjelma myös käyttäjän kirjoittaessa syötteen, voidaan arvo False muuttaa arvoksi True:

\nif True:\n    opiskelijatiedot = input(\"Opiskelijatiedot: \")\n    tehtavatiedot = input(\"Tehtävätiedot: \")\nelse:\n    # tänne ei tulla!\n    opiskelijatiedot = \"opiskelijat1.csv\"\n    tehtavatiedot = \"tehtavat1.csv\"

Kun koodi on kunnossa, voi ehtorakenteen poistaa.

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Toinen huomio Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit täällä kokeilla olevaa ohjetta.

Edellinen tehtävä laajenee vielä siten, että myös opiskelijan koepisteet luetaan CSV-tiedostosta. Tiedoston sisältö näyttää seuraavalta:

opnro;k1;k2;k3\n12345678;4;1;4\n12345687;3;5;3\n12345699;10;2;2

Esimerkiksi opiskelija jonka opiskelijanumero on 12345678 on saanut kokeesta 4+1+4 eli yhteensä 9 pistettä.

Ohjelma kysyy tiedostojen nimet ja tulostaa jokaisen opiskelijan arvosanan:

Opiskelijatiedot: opiskelijat1.csv\nTehtävätiedot: tehtavat1.csv\nKoepisteet: koepisteet1.csv\npekka peloton 0\njaana javanainen 1\nliisa virtanen 3

Tehtyjen harjoitustehtävien määrästä saa pisteitä siten, että vähintään 10 % tehtävämäärästä tuo 1 pisteen, vähintään 20% tuo 2 pistettä jne., ja 100 % eli 40 harjoitustehtävää tuo 10 pistettä. Harjoitustehtävistä saatava pistemäärä on kokonaisluku.

Kurssin arvosana määräytyy kokeen ja harjoituspisteiden summan perusteella seuraavan taulukon mukaan:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
kokeen pisteet + harjoitusten pisteetarvosana
0-140 (eli hylätty)
15-171
18-202
21-233
24-274
28-5

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Tässä tehtävässä muotoillaan edellisen tehtävän tulostus parempaan muotoon:

Opiskelijatiedot: opiskelijat1.csv\nTehtävätiedot: tehtavat1.csv\nKoepisteet: koepisteet1.csv

\nnimi                          teht_lkm  teht_pist koe_pist  yht_pist  arvosana\npekka peloton                 21        5         9         14        0\njaana javanainen              27        6         11        17        1\nliisa virtanen                35        8         14        22        3\n

Jokaisella rivillä siis tulostetaan opiskelijan tehtävien lukumäärä, tehtävistä saatavat pisteet, kokeen pisteet, yhteispisteet (koe+harjoitukset) sekä arvosana \"siististi\" siten, että tulostus on jaoteltu sarakkeisiin. Nimisarakkeen leveys on 30 merkkiä ja muiden sarakkeiden leveys on tasan 10 merkkiä.

Tehtävässä kannattaa käyttää osassa 4 käsiteltyjä f-merkkijonoja.

Kannattaa huomata, että merkkijonojen ja lukujen tulostaminen noudattaa hieman erilaista logiikkaa f-merkkijonoissa:

sana = \"python\"\nprint(f\"{sana:10}jatkuu\")\nprint(f\"{sana:>10}jatkuu\")
\npython    jatkuu\n    pythonjatkuu\n

Oletusarvoisesti siis merkkijono sisentyy määritellyn levyisen alueen vasempaan reunaan. Merkillä >voidaan ohjata tulostus sisentymään oikeaan reunaan.

Lukuja tulostettaessa logiikka on päinvastainen

luku = 42\nprint(f\"{luku:10}jatkuu\")\nprint(f\"{luku:<10}jatkuu\")
\n        42jatkuu\n42        jatkuu\n

Oletusarvo lukujen yhteydessä on tulostuksen sisentyminen oikeaan reunaan. Merkillä < voidaan ohjata luvun tulostus sisentymään vasempaan reunaan.

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Tee ohjelma, joka pyytää käyttäjää kirjoittamaan rivin englanninkielistä tekstiä. Ohjelma suorittaa tekstille oikeinkirjoitustarkistuksen ja tulostaa saman tekstin siten, että kaikki väärin kirjoitetut sanat on ympäröity tähdillä. Seuraavassa kaksi käyttöesimerkkiä:

Write text: We use ptython to make a spell checker

\nWe use *ptython* to make a spell checker\n

Write text: This is acually a good and usefull program

\nThis is *acually* good and *usefull* program\n

Kirjainten koolla ei ole merkitystä ohjelman toiminnan kannalta.

Ohjelma tunnistaa oikein kirjoitetut sanat käyttämällä tehtäväpohjassa olevaa tiedostoa wordlist.txt.

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Toinen huomio Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit täällä kokeilla olevaa ohjetta.

Tässä tehtävässä tehdään ohjelma, joka tarjoaa käyttäjälle mahdollisuuden reseptien hakuun reseptin nimen, valmistusajan tai raaka-aineen nimen perusteella. Ohjelma lukee reseptit käyttäjän antamasta tiedostosta.

Jokainen resepti koostuu kolmesta tai useammasta rivistä reseptitiedostossa. Ensimmäisellä rivillä on reseptin nimi, toisella rivillä reseptin valmistusaika (kokonaisluku), ja kolmas ja sitä seuraavat rivit kertovat reseptin raaka-aineet. Reseptin raaka-aineiden kuvaus päättyy tyhjään riviin, poislukien viimeinen resepti. Tiedostossa voi olla useampia reseptejä. Alla kuvattuna esimerkkitiedosto.

Lettutaikina\n15\nmaito\nkananmuna\njauho\nsokeri\nsuola\nvoi\n\nLihapullat\n45\njauheliha\nkananmuna\nkorppujauho\n\nTofurullat\n30\ntofu\nriisi\nvesi\nporkkana\nkurkku\navokado\nwasabi\n\nPullataikina\n60\nmaito\nhiiva\nkananmuna\nsuola\nsokeri\nkardemumma\nvoi

Vihje tässä tehtävässä lienee järkevintä lukea ensin tiedoston rivit listalle ja käsitellä sitten tätä listaa tehtävän edellyttämällä tavalla.

reseptien haku nimen perusteella

Tee funktio hae_nimi(tiedosto: str, sana: str) joka hakee parametrina annetun nimisestä tiedostosta reseptit, joiden nimessä esiintyy toisena parametrina annettu merkkijono. Funktio palauttaa listan, jossa kutakin löydettyä reseptiä vastaa merkkijono, joka kertoo reseptin nimen.

Esimerkki funktion käytöstä:

loydetyt = hae_nimi(\"reseptit1.txt\", \"pulla\")\n\nfor resepti in loydetyt:\n    print(resepti)

Lihapullat\nPullataikina

Huomaa, että hakusanojen kirjainten koolla ei ole merkitystä, eli hakusana pulla löytää myös reseptin Pullataikina, joka alkaa isolla kirjaimella.

Huom! Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit täällä kokeilla olevaa ohjetta.

reseptien hakeminen valmistusajan perusteella

Tee funktio hae_aika(tiedosto: str, aika: int) joka hakee parametrina annetun nimisestä tiedostosta reseptit, joiden valmistusaika on korkeintaan parametrina kerrottu minuuttimäärä.

Kriteerin täyttävät reseptit palautetaan edellisen tehtävän tapaan listana, nyt kerrotaan myös reseptin valmistumisaika. Esimerkki funktion käytöstä:

loydetyt = hae_aika(\"reseptit1.txt\", 20)\n\nfor resepti in loydetyt:\n    print(resepti)

Lettutaikina, valmistusaika 15 min

reseptien hakeminen raaka-aineen perusteella

Varoitus tämä osa on edellisiä selvästi haastavampi. Jos tehtävä ei lähde heti aukenemaan, kannattanee tehdä ensin osan muut tehtävät ja palata lopuksi takaisin tähän. Huomaa, että voit lähettää moniosaisessa tehtävässä palvelimelle myös yksittäiset osat

Tee funktio hae_raakaaine(tiedosto: str, aine: str) joka hakee parametrina annetun nimisestä tiedostosta reseptit, jotka sisältävät toisena parametrina annetun raaka-aineen.

Kriteerin täyttävät reseptit palautetaan edellisen tehtävän tapaan listana. Esimerkki funktion käytöstä:

loydetyt = hae_raakaaine(\"reseptit1.txt\", \"maito\")\n\nfor resepti in loydetyt:\n    print(resepti)

Lettutaikina, valmistusaika 15 min\nPullataikina, valmistusaika 60 min

Tässä tehtävässä tehdään muutama funktio, joiden avulla voidaan tarkastella kaupunkipyörien asemien sijaintia sisältävää tiedostoa.

Tiedostot näyttävät seuraavilta:

Longitude;Latitude;FID;name;total_slot;operative;id\n24.950292890004903;60.155444793742276;1;Kaivopuisto;30;Yes;001\n24.956347471358754;60.160959093887129;2;Laivasillankatu;12;Yes;002\n24.944927399779715;60.158189199971673;3;Kapteeninpuistikko;16;Yes;003

Kutakin asemaa kohti tiedostossa on yksi rivi, joka kertoo aseman koordinaatit, aseman nimen ja muuta tunnistetietoa.

asemien välinen etäisyys

Tee ensin funktio hae_asematiedot(tiedosto: str), joka lukee asematiedot tiedostosta ja palauttaa ne sanakirjana, joka näyttää tältä:

\n{\n  \"Kaivopuisto: (24.950292890004903, 60.155444793742276),\n  \"Laivasillankatu: (24.956347471358754, 60.160959093887129),\n  \"Kapteeninpuistikko: (24.944927399779715, 60.158189199971673)\n}\n

Eli sanakirjan avaimena on aseman nimi ja arvona tuple, joka koostuu aseman koordinaateista, ensimmäisenä Longitude ja toisena Latitude.

Tee seuraavaksi funktio etaisyys(asemat: dict, asema1: str, asema2: str), joka palauttaa parametrina kerrottujen asemien välisen etäisyyden.

Etäisyys lasketaan seuraavalla kaavalla (hyödyntäen Pythagoraan lausetta):

# tämä rivi tarvitaan, jotta saadaan käyttöön metodi sqrt\nimport math\n\nx_kilometreina = (longitude1 - longitude2) * 55.26\ny_kilometreina = (latitude1 - latitude2) * 111.2\netaisyys = math.sqrt(x_kilometreina**2 + y_kilometreina**2)

Esimerkkisuorituksia:

asemat = hae_asematiedot('stations1.csv')\ne = etaisyys(asemat, \"Designmuseo\", \"Hietalahdentori\")\nprint(e)\ne = etaisyys(asemat, \"Viiskulma\", \"Kaivopuisto\")\nprint(e)

0.9032737292463177\n0.7753594392019532

Huom! Jos VS Code ei löydä tiedostoa vaikka olet tarkastanut tiedoston nimen kirjoitusasun, voit täällä kokeilla olevaa ohjetta.

pisin välimatka

Tee funktio suurin_etaisyys(asemat: dict), joka selvittää, mitkä kaksi asemaa ovat kauimpana toisistaan. Funktio palauttaa tuplen, jonka ensimmäiset kaksi arvoa kertovat asemien nimet ja kolmas arvo niiden välisen etäisyyden.

asemat = hae_asematiedot('stations1.csv')\nasema1, asema2, suurin = suurin_etaisyys(asemat)\nprint(asema1, asema2, suurin)

Laivasillankatu Hietalahdentori 1.478708873076181

","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-6/1-tiedostojen-lukeminen.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-6/2-tiedostojen-kirjoittaminen/page-data.json b/page-data/osa-6/2-tiedostojen-kirjoittaminen/page-data.json index f412d8d11..829a13e43 100644 --- a/page-data/osa-6/2-tiedostojen-kirjoittaminen/page-data.json +++ b/page-data/osa-6/2-tiedostojen-kirjoittaminen/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-6/2-tiedostojen-kirjoittaminen", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat luoda itse tiedoston Pythonilla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat kirjoittaa tekstimuotoista tietoa tiedostoon"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat kirjoittaa CSV-muotoisen tiedoston omasta datastasi"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedoston lukemisen lisäksi voimme luonnollisesti myös kirjoittaa tiedostoon tietoa. Tyypillinen esimerkki on ohjelman tulosten tallentaminen tiedostoon, jotta niitä voidaan käyttää myös myöhemmin tai muokata edelleen jollain toisella ohjelmalla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedoston kirjoittamisessa voimme joko luoda uuden tiedoston tai lisätä tietoa olemassa olevan tiedoston vanhan tiedon perään. Molemmissa tapauksissa käytetään edellisestä osasta tuttua "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"open"}]},{"type":"text","value":"-funktiota, mutta kirjoittamista varten funktiolle annetaan toinen parametri."}]},{"type":"element","tagName":"h2","properties":{"id":"uuden-tiedoston-luominen","style":"position:relative;"},"children":[{"type":"text","value":"Uuden tiedoston luominen"},{"type":"element","tagName":"a","properties":{"href":"#uuden-tiedoston-luominen","ariaLabel":"uuden tiedoston luominen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Uusi tiedosto luodaan antamalla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"open"}]},{"type":"text","value":"-funktiolle tiedoston nimen lisäksi avaustilaksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"w"}]},{"type":"text","value":" (tulee sanasta \"write\"). Esimerkiksi"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"uusi_tiedosto.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"w\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tiedostoon kirjoittaminen"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"mikäli tiedosto on jo olemassa, kaikki sen sisältö ylikirjoitetaan"}]},{"type":"text","value":". Ole siis erittäin huolellinen uusia tiedostoja luodessasi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun tiedosto on avattu, sinne voidaan kirjoittaa tietoa. Kirjoittaminen tapahtuu metodilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"write"}]},{"type":"text","value":", joka saa parametrikseen kirjoitettavan merkkijonon."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"uusi_tiedosto.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"w\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi kaikki!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suorittamisen jälkeen samaan hakemistoon ilmestyy tiedosto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"uusi_tiedosto.txt"}]},{"type":"text","value":", jonka sisältö näyttää tältä:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moi kaikki!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että jos tiedostoon halutaan rivinvaihtoja, ne täytyy lisätä tekstiin itse. Esimerkiksi ohjelma"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"uusi_tiedosto.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"w\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi kaikki!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Toinen rivi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Viimeinen rivi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tuottaa seuraavanlaisen tiedoston:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moi kaikki!Toinen riviViimeinen rivi"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostukset saadaan omille riveilleen lisäämällä rivien loppuun rivivaihtomerkki "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\n"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"uusi_tiedosto.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"w\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi kaikki!\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Toinen rivi\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Viimeinen rivi\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt tiedosto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"uusi_tiedosto.txt"}]},{"type":"text","value":" näyttää tältä:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moi kaikki!\nToinen rivi\nViimeinen rivi"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Omistuskirjoitus","tmcname":"osa06-10_omistuskirjoitus"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy nimeä ja luo \"omistuskirjoituksen\" käyttäjän haluamaan tiedostoon. Seuraavassa ohjelman esimerkkisuoritus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kenelle teos omistetaan: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Arto"}]},{"type":"text","value":"\nMihin kirjoitetaan: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"omistettu.txt"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedoston "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"omistettu.txt"}]},{"type":"text","value":" sisällöksi tulee"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hei Arto, toivomme viihtyisiä hetkiä python-kurssimateriaalin parissa! Terveisin mooc.fi-tiimi"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"h2","properties":{"id":"tiedon-lisaaminen-olemassaolevaan-tiedostoon","style":"position:relative;"},"children":[{"type":"text","value":"Tiedon lisääminen olemassaolevaan tiedostoon"},{"type":"element","tagName":"a","properties":{"href":"#tiedon-lisaaminen-olemassaolevaan-tiedostoon","ariaLabel":"tiedon lisaaminen olemassaolevaan tiedostoon permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos haluamme lisätä tietoa olemassa olevaan tiedostoon, voimme avata tiedoston tilassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":" (lyhenne sanasta \"append\"). Tällöin tiedoston nykyistä sisältöä ei pyyhitä, vaan uusi tieto kirjoitetaan tiedoston loppuun."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos tiedostoa ei ole olemassa, tila "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":" toimii samalla tavalla kuin tila "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"w"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma avaa edellisen esimerkin tuottaman tiedoston "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"uusi_tiedosto.txt"}]},{"type":"text","value":" ja lisää sen perään pari riviä tekstiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"uusi_tiedosto.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"a\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Rivi numero 4\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ja taas yksi.\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suorituksen jälkeen tiedosto näyttää tältä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moi kaikki!\nToinen rivi\nViimeinen rivi\nRivi numero 4\nJa taas yksi."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedon lisääminen tiedostoon on kuitenkin suhteellisen harvoin tarvittava operaatio."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedostoon lisäämisen sijaan on usein yksinkertaisinta kirjoittaa tiedosto kokonaan uudelleen. Näin joudutaan useimmiten tekemään jos esimerkiksi tiedoston sisältö muuttuu keskeltä tiedostoa."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Päiväkirja","tmcname":"osa06-11_paivakirja"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka mallintaa yksinkertaista päiväkirjaa. Ohjelman tulee tallentaa päiväkirjamerkinnät tiedostoon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"paivakirja.txt"}]},{"type":"text","value":". Kun ohjelma käynnistetään, se lukee merkinnät tiedostosta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huom! Paikalliset testit voivat muuttaa tiedoston sisältöä - kopioi siis tiedosto talteen ennen testien ajamista, jos haluat säilyttää sen sisällön."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia seuraavan esimerkin mukaisesti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nAnna merkintä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Tänään söin puuroa"}]},{"type":"text","value":"\nPäiväkirja tallennettu"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nMerkinnät:\nTänään söin puuroa\n1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nAnna merkintä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Illalla kävin saunassa"}]},{"type":"text","value":"\nPäiväkirja tallennettu"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nMerkinnät:\nTänään söin puuroa\nIllalla kävin saunassa\n1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nHeippa!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Uusi käynnistys:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nMerkinnät:\nTänään söin puuroa\nIllalla kävin saunassa\n1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nHeippa!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"h2","properties":{"id":"csv-tiedoston-kirjoittaminen","style":"position:relative;"},"children":[{"type":"text","value":"CSV-tiedoston kirjoittaminen"},{"type":"element","tagName":"a","properties":{"href":"#csv-tiedoston-kirjoittaminen","ariaLabel":"csv tiedoston kirjoittaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"CSV-tiedoston voi kirjoittaa rivi riviltä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"write"}]},{"type":"text","value":"-metodilla. Esimerkiksi seuraava esimerkki luo tiedoston "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"koodarit.csv"}]},{"type":"text","value":", jonka jokaisella rivillä on koodarin nimi, työympäristö, lempikieli ja kokemus vuosissa. Tiedot on erotettu puolipisteillä."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodarit.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"w\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki;Windows;Pascal;10\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Matti;Linux;PHP;2\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti;Linux;Java;17\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia;Mac;Cobol;9\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän tuloksena on seuraava tiedosto:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Erkki;Windows;Pascal;10\nMatti;Linux;PHP;2\nAntti;Linux;Java;17\nEmilia;Mac;Cobol;9"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan sitten tilannetta, jossa tiedostoon kirjoitettavat tiedot ovatkin muistissa listoina:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"koodarit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nkoodarit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Windows\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pascal\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkoodarit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Matti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Linux\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"PHP\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkoodarit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Linux\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Java\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"17"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkoodarit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mac\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Cobol\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt voimme kirjoittaa koodarien tiedot CSV-tiedostoon näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodarit.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"w\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" koodari "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" koodarit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"koodari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"koodari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"koodari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"koodari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos koodaria kuvaavissa listoissa olisi suuri määrä alkioita, olisi csv-tiedostoon kirjoitetavien rivien muodostaminen yllä olevalla tekniikalla työläähköä, ja rivit kannattaisikin koota silmukan avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodarit.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"w\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" koodari "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" koodarit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" arvo "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" koodari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":";\""}]}]},{"type":"text","value":"\n rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"tiedoston-tyhjentaminen-ja-poisto","style":"position:relative;"},"children":[{"type":"text","value":"Tiedoston tyhjentäminen ja poisto"},{"type":"element","tagName":"a","properties":{"href":"#tiedoston-tyhjentaminen-ja-poisto","ariaLabel":"tiedoston tyhjentaminen ja poisto permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joissain tilanteissa ohjelmassa on tarvetta tyhjentää olemassaolevan tiedoston sisältö. Tämä onnistuu avaamalla tiedosto kirjoitustilassa \"w\" ja sulkemalla tiedosto välittömästi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tyhjennettava_tiedosto.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"w\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":"-lohkossa on ainoastaan komento "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pass"}]},{"type":"text","value":", joka ei tee mitään. Komento tarvitaan, sillä Python ei salli sellaisia lohkoja missä ei ole mitään komentoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedoston tyhjennys on mahdollista tehdä myös ilman "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":"-lohkokon käyttöä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'tyhjennettava_tiedosto.txt'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'w'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"close"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Tiedoston poistaminen"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedosto voidaan myös poistaa kokonaan. Poisto tapahtuu seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# poisto-komento tuodaan koodin käyttöön import-lauseella"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" os\n\nos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"remove"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tarpeeton_tiedosto.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä ei kuitenkaan teknisten rajoitteiden takia toimi palvelimella suoritettavissa testeissä, joten käytä ylläolevia tapoja jos joudut tehtävissä tyhjentämään tiedoston."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Aineiston suodatus","tmcname":"osa06-12_aineiston_suodatus"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedostossa laskut.csv on tehtävien ratkaisuja seuraavan esimerkin mukaisesti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"csv"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"Arto;2+5;7"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"Pekka;3-2;1"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"Erkki;9+3;11"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"Arto;8-3;4"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"Pekka;5+5;10"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"...jne..."}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jokaisella rivin muoto on siis "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"oppilaan_nimi;lasku;lopputulos"}]},{"type":"text","value":". Laskut ovat kaikki esimerkin mukaisesti joko yhteen- tai vähennyslaskuja, ja kaikissa on kaksi operandia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suodata_laskut()"}]},{"type":"text","value":", joka"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Lukee tiedoston "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"laskut.csv"}]},{"type":"text","value":" sisällön ja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"kirjoittaa tiedostoon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"oikeat.csv"}]},{"type":"text","value":" ne rivit, joilla laskutoimituksen lopputulos on oikein sekä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"kirjoittaa tiedostoon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vaarat.csv"}]},{"type":"text","value":" ne rivit, joilla laskutoimituksen lopputulos on väärin."}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellisestä esimerkistä tiedostoon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"oikeat.csv"}]},{"type":"text","value":" olisi siis kirjoitettu rivit"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"sh"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-sh"]},"children":[{"type":"text","value":"Arto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"+5"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"text","value":"\nPekka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"-2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nPekka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"+5"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kaksi muuta riviä olisi kirjoitettu tiedostoon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vaarat.csv"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita rivit samassa järjestyksessä kuin ne esiintyvät alkuperäisessä tiedostossa. Älä muuta alkuperäistä tiedostoa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Huomaa"}]},{"type":"text","value":" että funktion tulee toimia oikein siinäkin tapauksessa että funktiota kutsutaan monta kertaa perkkäin. Eli riippumatta siitä suoritatko funktion vain kerran"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"suodata_laskut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tai useita kertoja peräkkän"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"suodata_laskut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsuodata_laskut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsuodata_laskut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsuodata_laskut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tiedostojen sisältöjen tulee lopulta olla samat."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Henkilöt talteen","tmcname":"osa06-13_henkilot_talteen"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tallenna_henkilo(henkilo: tuple)"}]},{"type":"text","value":" joka saa parametrikseen henkilöä kuvaavan tuplen. Tuplessa on seuraavat tiedot tässä järjestyksessä:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Nimi (merkkijono)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ikä (kokonaisluku)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Pituus (liukuluku)"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tallenna henkilön tiedot tiedostoon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"henkilot.csv"}]},{"type":"text","value":" olemassa olevien tietojen perään. Tiedot tulee tallentaa muodosssa"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"nimi;ikä;pituus"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"eli yhden henkilön tiedot tulevat yhdelle riville. Jos funktiota esim. kutsuttaisiin parametrien arvoilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(\"Kimmo Kimmonen\", 37, 175.5)"}]},{"type":"text","value":", ohjelma kirjoittaisi tiedoston loppuun rivin"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kimmo Kimmonen;37;175.5"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"tiedon-kasittely-csvna","style":"position:relative;"},"children":[{"type":"text","value":"Tiedon käsittely CSV:nä"},{"type":"element","tagName":"a","properties":{"href":"#tiedon-kasittely-csvna","ariaLabel":"tiedon kasittely csvna permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehdään vielä lopuksi ohjelma, joka lukee CSV-tiedostosta opiskelijoiden viikoittaiset kurssipistemäärät ja laskee näiden avulla kurssin arvosanan. Lopuksi ohjelma luo CSV-tiedoston, josta selviää opiskelijan yhteispistemäärä sekä arvosana"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman lukema CSV-tiedosto näyttää seuraavalta:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka;4;2;3;5;4;0;0\nPaula;7;2;8;3;5;4;5\nPirjo;3;4;3;5;3;4;4\nEmilia;6;6;5;5;0;4;8"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman logiikka on jaettu kolmeen funktioon. Tiedoston lukeminen tapahtuu samaan tapaan kuin edellisessä aliluvussa: tiedot talletetaan sanakirjaan, jossa avaimena on opiskelijan nimi ja arvona lista viikkopisteistä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lue_viikkopisteet"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tiedostonimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n viikkopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tiedostonimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\";\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n viikkopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lista\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" viikkopisteet"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Arvosanojen laskemista varten on tehty oma funktionsa, jota tiedostoon kirjoittava funktio hyödyntää:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"arvosana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"25"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"30"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"35"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"40"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tallenna_tulokset"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tiedostonimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" viikkopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tiedostonimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"w\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lista "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" viikkopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"items"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sum"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"arvosana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\\n\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Itse \"pääohjelma\" on nyt hyvin yksinkertainen. Huomaa, että luettavan ja kirjoitettavan tiedoston nimet annetaan funktioille parametrina:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"viikkopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue_viikkopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"viikkopisteet.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntallenna_tulokset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tulokset.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" viikkopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Suorituksen tuloksena oleva CSV-tiedosto näyttää seuraavalta:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka;18;0\nPaula;34;3\nPirjo;26;2\nEmilia;41;5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, miten ohjelma on koostettu suhteellisen yksinkertaisista, vain yhteen asiaan keskittyvistä funktioista. Tämä on yleisesti ottaen suositeltava tapa ohjelmoinnissa, se helpottaa ohjelman toiminnallisuuden varmistamista sekä myöhemmin ohjelmaan tehtävien muutosten sekä laajennusten tekemistä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos esimerkiksi haluaisimme ohjelmaan toiminnallisuuden, joka tulostaa yhden opiskelijan arvosanan, olisi toiminnallisuus helppo koostaa käyttäen apuna jo valmiina olevaa arvosanan laskevaa funktiota:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hae_arvosana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"haettava"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" viikkopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lista "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" viikkopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"items"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" haettava"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" arvosana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sum"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n\nviikkopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue_viikkopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"viikkopisteet.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"hae_arvosana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Paula\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" viikkopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos ohjelmasta halutaan muuttaa tai korjata \"yhtä asiaa\", esimerkiksi arvosanojen pisterajoja, kohdistuu muokkaus hyvin rakennetussa ohjelmassa ainoastaan yhteen tai muutamaan funktioon. Jos sama logiikka, esimerkiksi arvosanan laskeminen, olisi kopioitu useaan paikkaan, kasvaisi riski, että muutoksia ei muistettaisi tehdä kaikkiin oikeisiin paikkoihin."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kurssin tulokset, osa 4","tmcname":"osa06-14_kurssin_tulokset_osa4"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajennetaan vielä hieman aiemmin kurssien tulokset generoivaa sovellusta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tällä hetkellä tiedostosta luetaan opiskelijoiden nimet, tehtäväpisteet sekä koepisteet. Laajennetaan ohjelmaa siten, että myös kurssin nimi ja laajuus luetaan tiedostosta, jonka muoto on seuraava (tiedosto on kirjoitettu ilman ääkkösiä, jotta se ei aiheuttaisi ongelmia Windowsissa):"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"\nnimi: Ohjelmoinnin perusteet\nlaajuus opintopisteina: 5\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma luo kaksi tiedostoa. Tiedoston "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulos.txt"}]},{"type":"text","value":" muoto on seuraava:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Ohjelmoinnin perusteet, 5 opintopistettä\n========================================\nnimi teht_lkm teht_pist koe_pist yht_pist arvosana\npekka peloton 21 5 9 14 0\njaana javanainen 27 6 11 17 1\nliisa virtanen 35 8 14 22 3\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulokset kertova osa on siis samanlainen kuin tehtävän edellisen osan tulostus."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän lisäksi luodaan tiedosto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulos.csv"}]},{"type":"text","value":", jonka muoto on seuraava:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"12345678;pekka peloton;0\n12345687;jaana javanainen;1\n12345699;liisa virtanen;3\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suoritus näyttää seuraavalta:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"opiskelijatiedot: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"opiskelijat1.csv"}]},{"type":"text","value":"\ntehtävätiedot: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tehtavat1.csv"}]},{"type":"text","value":"\nkoepisteet: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"koepisteet1.csv"}]},{"type":"text","value":"\nkurssin tiedot: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kurssi1.txt"}]},{"type":"text","value":"\nTulokset talletettu tiedostoihin tulos.txt ja tulos.csv"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma siis ainoastaan kyselee tiedostojen nimet ja varsinaiset tulokset tallennetaan vain tiedostoihin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sanahaku","tmcname":"osa06-15_sanahaku"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjasta löytyy tiedosto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sanat.txt"}]},{"type":"text","value":", joka sisältää englanninkielisiä sanoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväsi on kirjoittaa funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae_sanat(hakusana: str)"}]},{"type":"text","value":", joka palauttaa listana annetun hakusanan mukaiset sanat tiedostosta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hakusanassa voi käyttää pienten kirjainten lisäksi seuraavia erikoismerkkejä:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Piste "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":" tarkoittaa, että mikä tahansa merkki käy (esim "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ca."}]},{"type":"text","value":" vastaa vaikkapa sanoja cat ja car, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"p.ng"}]},{"type":"text","value":" sanoja ping ja pong ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":".a.e"}]},{"type":"text","value":" sanoja sane, care tai late."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Asteriski "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" tarkoittaa, että sanan alku- tai loppuosaksi käy mikä tahansa jono, esim. "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ca*"}]},{"type":"text","value":" vastaa vaikkapa sanoja california, cat, caring tai catapult. Vastaavasti hakusana "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"*ane"}]},{"type":"text","value":" vastaa vaikkapa sanoja crane, insane tai aeroplane. Voit olettaa, että asteriski on aina joko hakusanan alussa tai lopussa, ja että hakusanassa esiintyy korkeintaan yksi asteriski."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Jos hakusanassa ei ole erikoismerkkejä, haetaan vain täsmälleen hakusanaa vastaava sana."}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sovitaan, että samassa hakusanassa ei voi käyttää molempia erikoismerkkejä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanat ovat tiedostossa kokonaan pienillä kirjaimilla kirjoitettuna. Voit myös olettaa, että funktion parametri on annettu kokonaan pienillä kirjaimilla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos yhtään tulosta ei löydy, funktio palauttaa tyhjän listan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vinkki: Pythonin merkkijonometodeista startswith() ja endswith() saattaa olla hyötyä tehtävässä, googlaa niiden toiminta tarvittaessa tarkemmin!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"hae_sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"*vokes\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['convokes', 'equivokes', 'evokes', 'invokes', 'provokes', 'reinvokes', 'revokes']"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Muistava sanakirja","tmcname":"osa06-16_muistava_sanakirja"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee sanakirjaa mallintava ohjelma, johon voi syöttää uusia sanoja tai josta voi hakea syötettyjä sanoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia näin:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nAnna sana suomeksi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"auto"}]},{"type":"text","value":"\nAnna sana englanniksi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"car"}]},{"type":"text","value":"\nSanapari lisätty\n1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nAnna sana suomeksi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"roska"}]},{"type":"text","value":"\nAnna sana englanniksi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"garbage"}]},{"type":"text","value":"\nSanapari lisätty\n1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nAnna sana suomeksi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"laukku"}]},{"type":"text","value":"\nAnna sana englanniksi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"bag"}]},{"type":"text","value":"\nSanapari lisätty\n1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"bag"}]},{"type":"text","value":"\nroska - garbage\nlaukku - bag\n1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"car"}]},{"type":"text","value":"\nauto - car\n1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"laukku"}]},{"type":"text","value":"\nlaukku - bag\n1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nMoi!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanat tallennetaan tiedostoon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sanakirja.txt"}]},{"type":"text","value":". Ohjelma lukee tiedoston sisällön kun se käynnistetään. Uudet sanaparit lisätään tiedostoon aina tallennuksen yhteydessä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit itse päättää tiedostoon tallennettavan tiedon muodon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että paikallisten TMC-testien ajaminen voi tyhjentää sanakirja-tiedoston."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat luoda itse tiedoston Pythonilla
  • \n
  • Osaat kirjoittaa tekstimuotoista tietoa tiedostoon
  • \n
  • Osaat kirjoittaa CSV-muotoisen tiedoston omasta datastasi
  • \n

Tiedoston lukemisen lisäksi voimme luonnollisesti myös kirjoittaa tiedostoon tietoa. Tyypillinen esimerkki on ohjelman tulosten tallentaminen tiedostoon, jotta niitä voidaan käyttää myös myöhemmin tai muokata edelleen jollain toisella ohjelmalla.

Tiedoston kirjoittamisessa voimme joko luoda uuden tiedoston tai lisätä tietoa olemassa olevan tiedoston vanhan tiedon perään. Molemmissa tapauksissa käytetään edellisestä osasta tuttua open-funktiota, mutta kirjoittamista varten funktiolle annetaan toinen parametri.

Uuden tiedoston luominen

Uusi tiedosto luodaan antamalla open-funktiolle tiedoston nimen lisäksi avaustilaksi w (tulee sanasta \"write\"). Esimerkiksi

with open(\"uusi_tiedosto.txt\", \"w\") as tiedosto:\n    # tiedostoon kirjoittaminen

Huomaa, että mikäli tiedosto on jo olemassa, kaikki sen sisältö ylikirjoitetaan. Ole siis erittäin huolellinen uusia tiedostoja luodessasi.

Kun tiedosto on avattu, sinne voidaan kirjoittaa tietoa. Kirjoittaminen tapahtuu metodilla write, joka saa parametrikseen kirjoitettavan merkkijonon.

with open(\"uusi_tiedosto.txt\", \"w\") as tiedosto:\n    tiedosto.write(\"Moi kaikki!\")

Ohjelman suorittamisen jälkeen samaan hakemistoon ilmestyy tiedosto uusi_tiedosto.txt, jonka sisältö näyttää tältä:

Moi kaikki!

Huomaa, että jos tiedostoon halutaan rivinvaihtoja, ne täytyy lisätä tekstiin itse. Esimerkiksi ohjelma

with open(\"uusi_tiedosto.txt\", \"w\") as tiedosto:\n    tiedosto.write(\"Moi kaikki!\")\n    tiedosto.write(\"Toinen rivi\")\n    tiedosto.write(\"Viimeinen rivi\")

tuottaa seuraavanlaisen tiedoston:

Moi kaikki!Toinen riviViimeinen rivi

Tulostukset saadaan omille riveilleen lisäämällä rivien loppuun rivivaihtomerkki \\n:

with open(\"uusi_tiedosto.txt\", \"w\") as tiedosto:\n    tiedosto.write(\"Moi kaikki!\\n\")\n    tiedosto.write(\"Toinen rivi\\n\")\n    tiedosto.write(\"Viimeinen rivi\\n\")

Nyt tiedosto uusi_tiedosto.txt näyttää tältä:

Moi kaikki!\nToinen rivi\nViimeinen rivi

Tee ohjelma, joka kysyy nimeä ja luo \"omistuskirjoituksen\" käyttäjän haluamaan tiedostoon. Seuraavassa ohjelman esimerkkisuoritus:

Kenelle teos omistetaan: Arto\nMihin kirjoitetaan: omistettu.txt

Tiedoston omistettu.txt sisällöksi tulee

Hei Arto, toivomme viihtyisiä hetkiä python-kurssimateriaalin parissa! Terveisin mooc.fi-tiimi

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Tiedon lisääminen olemassaolevaan tiedostoon

Jos haluamme lisätä tietoa olemassa olevaan tiedostoon, voimme avata tiedoston tilassa a (lyhenne sanasta \"append\"). Tällöin tiedoston nykyistä sisältöä ei pyyhitä, vaan uusi tieto kirjoitetaan tiedoston loppuun.

Jos tiedostoa ei ole olemassa, tila a toimii samalla tavalla kuin tila w.

Seuraava ohjelma avaa edellisen esimerkin tuottaman tiedoston uusi_tiedosto.txt ja lisää sen perään pari riviä tekstiä:

with open(\"uusi_tiedosto.txt\", \"a\") as tiedosto:\n    tiedosto.write(\"Rivi numero 4\\n\")\n    tiedosto.write(\"Ja taas yksi.\\n\")

Ohjelman suorituksen jälkeen tiedosto näyttää tältä:

Moi kaikki!\nToinen rivi\nViimeinen rivi\nRivi numero 4\nJa taas yksi.

Tiedon lisääminen tiedostoon on kuitenkin suhteellisen harvoin tarvittava operaatio.

Tiedostoon lisäämisen sijaan on usein yksinkertaisinta kirjoittaa tiedosto kokonaan uudelleen. Näin joudutaan useimmiten tekemään jos esimerkiksi tiedoston sisältö muuttuu keskeltä tiedostoa.

Tee ohjelma, joka mallintaa yksinkertaista päiväkirjaa. Ohjelman tulee tallentaa päiväkirjamerkinnät tiedostoon paivakirja.txt. Kun ohjelma käynnistetään, se lukee merkinnät tiedostosta.

Huom! Paikalliset testit voivat muuttaa tiedoston sisältöä - kopioi siis tiedosto talteen ennen testien ajamista, jos haluat säilyttää sen sisällön.

Ohjelman tulee toimia seuraavan esimerkin mukaisesti:

1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: 1\nAnna merkintä: Tänään söin puuroa\nPäiväkirja tallennettu

1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: 2\nMerkinnät:\nTänään söin puuroa\n1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: 1\nAnna merkintä: Illalla kävin saunassa\nPäiväkirja tallennettu

1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: 2\nMerkinnät:\nTänään söin puuroa\nIllalla kävin saunassa\n1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: 0\nHeippa!

Uusi käynnistys:

1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: 2\nMerkinnät:\nTänään söin puuroa\nIllalla kävin saunassa\n1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: 0\nHeippa!

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

CSV-tiedoston kirjoittaminen

CSV-tiedoston voi kirjoittaa rivi riviltä write-metodilla. Esimerkiksi seuraava esimerkki luo tiedoston koodarit.csv, jonka jokaisella rivillä on koodarin nimi, työympäristö, lempikieli ja kokemus vuosissa. Tiedot on erotettu puolipisteillä.

with open(\"koodarit.csv\", \"w\") as tiedosto:\n    tiedosto.write(\"Erkki;Windows;Pascal;10\\n\")\n    tiedosto.write(\"Matti;Linux;PHP;2\\n\")\n    tiedosto.write(\"Antti;Linux;Java;17\\n\")\n    tiedosto.write(\"Emilia;Mac;Cobol;9\\n\")

Tämän tuloksena on seuraava tiedosto:

Erkki;Windows;Pascal;10\nMatti;Linux;PHP;2\nAntti;Linux;Java;17\nEmilia;Mac;Cobol;9

Tarkastellaan sitten tilannetta, jossa tiedostoon kirjoitettavat tiedot ovatkin muistissa listoina:

koodarit = []\nkoodarit.append([\"Erkki\", \"Windows\", \"Pascal\", 10])\nkoodarit.append([\"Matti\", \"Linux\", \"PHP\", 2])\nkoodarit.append([\"Antti\", \"Linux\", \"Java\", 17])\nkoodarit.append([\"Emilia\", \"Mac\", \"Cobol\", 9])

Nyt voimme kirjoittaa koodarien tiedot CSV-tiedostoon näin:

with open(\"koodarit.csv\", \"w\") as tiedosto:\n    for koodari in koodarit:\n        rivi = f\"{koodari[0]};{koodari[1]};{koodari[2]};{koodari[3]}\"\n        tiedosto.write(rivi+\"\\n\")

Jos koodaria kuvaavissa listoissa olisi suuri määrä alkioita, olisi csv-tiedostoon kirjoitetavien rivien muodostaminen yllä olevalla tekniikalla työläähköä, ja rivit kannattaisikin koota silmukan avulla:

with open(\"koodarit.csv\", \"w\") as tiedosto:\n    for koodari in koodarit:\n        rivi = \"\"\n        for arvo in koodari:\n            rivi += f\"{arvo};\"\n        rivi = rivi[:-1]\n        tiedosto.write(rivi+\"\\n\")

Tiedoston tyhjentäminen ja poisto

Joissain tilanteissa ohjelmassa on tarvetta tyhjentää olemassaolevan tiedoston sisältö. Tämä onnistuu avaamalla tiedosto kirjoitustilassa \"w\" ja sulkemalla tiedosto välittömästi:

with open(\"tyhjennettava_tiedosto.txt\", \"w\") as tiedosto:\n    pass

Nyt with-lohkossa on ainoastaan komento pass, joka ei tee mitään. Komento tarvitaan, sillä Python ei salli sellaisia lohkoja missä ei ole mitään komentoja.

Tiedoston tyhjennys on mahdollista tehdä myös ilman with-lohkokon käyttöä:

open('tyhjennettava_tiedosto.txt', 'w').close()

Tiedosto voidaan myös poistaa kokonaan. Poisto tapahtuu seuraavasti:

# poisto-komento tuodaan koodin käyttöön import-lauseella\nimport os\n\nos.remove(\"tarpeeton_tiedosto.csv\")

Tämä ei kuitenkaan teknisten rajoitteiden takia toimi palvelimella suoritettavissa testeissä, joten käytä ylläolevia tapoja jos joudut tehtävissä tyhjentämään tiedoston.

Tiedostossa laskut.csv on tehtävien ratkaisuja seuraavan esimerkin mukaisesti:

Arto;2+5;7\nPekka;3-2;1\nErkki;9+3;11\nArto;8-3;4\nPekka;5+5;10\n...jne...

Jokaisella rivin muoto on siis oppilaan_nimi;lasku;lopputulos. Laskut ovat kaikki esimerkin mukaisesti joko yhteen- tai vähennyslaskuja, ja kaikissa on kaksi operandia.

Kirjoita funktio suodata_laskut(), joka

    \n
  • Lukee tiedoston laskut.csv sisällön ja
  • \n
  • kirjoittaa tiedostoon oikeat.csv ne rivit, joilla laskutoimituksen lopputulos on oikein sekä
  • \n
  • kirjoittaa tiedostoon vaarat.csv ne rivit, joilla laskutoimituksen lopputulos on väärin.
  • \n

Edellisestä esimerkistä tiedostoon oikeat.csv olisi siis kirjoitettu rivit

Arto;2+5;7\nPekka;3-2;1\nPekka;5+5;10

Kaksi muuta riviä olisi kirjoitettu tiedostoon vaarat.csv.

Kirjoita rivit samassa järjestyksessä kuin ne esiintyvät alkuperäisessä tiedostossa. Älä muuta alkuperäistä tiedostoa.

Huomaa että funktion tulee toimia oikein siinäkin tapauksessa että funktiota kutsutaan monta kertaa perkkäin. Eli riippumatta siitä suoritatko funktion vain kerran

suodata_laskut()

tai useita kertoja peräkkän

suodata_laskut()\nsuodata_laskut()\nsuodata_laskut()\nsuodata_laskut()

tiedostojen sisältöjen tulee lopulta olla samat.

Kirjoita funktio tallenna_henkilo(henkilo: tuple) joka saa parametrikseen henkilöä kuvaavan tuplen. Tuplessa on seuraavat tiedot tässä järjestyksessä:

    \n
  • Nimi (merkkijono)
  • \n
  • Ikä (kokonaisluku)
  • \n
  • Pituus (liukuluku)
  • \n

Tallenna henkilön tiedot tiedostoon henkilot.csv olemassa olevien tietojen perään. Tiedot tulee tallentaa muodosssa

nimi;ikä;pituus

eli yhden henkilön tiedot tulevat yhdelle riville. Jos funktiota esim. kutsuttaisiin parametrien arvoilla (\"Kimmo Kimmonen\", 37, 175.5), ohjelma kirjoittaisi tiedoston loppuun rivin

Kimmo Kimmonen;37;175.5

Tiedon käsittely CSV:nä

Tehdään vielä lopuksi ohjelma, joka lukee CSV-tiedostosta opiskelijoiden viikoittaiset kurssipistemäärät ja laskee näiden avulla kurssin arvosanan. Lopuksi ohjelma luo CSV-tiedoston, josta selviää opiskelijan yhteispistemäärä sekä arvosana

Ohjelman lukema CSV-tiedosto näyttää seuraavalta:

Pekka;4;2;3;5;4;0;0\nPaula;7;2;8;3;5;4;5\nPirjo;3;4;3;5;3;4;4\nEmilia;6;6;5;5;0;4;8

Ohjelman logiikka on jaettu kolmeen funktioon. Tiedoston lukeminen tapahtuu samaan tapaan kuin edellisessä aliluvussa: tiedot talletetaan sanakirjaan, jossa avaimena on opiskelijan nimi ja arvona lista viikkopisteistä:

def lue_viikkopisteet(tiedostonimi):\n    viikkopisteet = {}\n    with open(tiedostonimi) as tiedosto:\n        for rivi in tiedosto:\n            osat = rivi.split(\";\")\n            lista = []\n            for pisteet in osat[1:]:\n                lista.append(int(pisteet))\n            viikkopisteet[osat[0]] = lista\n\n    return viikkopisteet

Arvosanojen laskemista varten on tehty oma funktionsa, jota tiedostoon kirjoittava funktio hyödyntää:

def arvosana(pisteet):\n    if pisteet < 20:\n        return 0\n    elif pisteet < 25:\n        return 1\n    elif pisteet < 30:\n        return 2\n    elif pisteet < 35:\n        return 3\n    elif pisteet < 40:\n        return 4\n    else:\n        return 5\n\ndef tallenna_tulokset(tiedostonimi, viikkopisteet):\n    with open(tiedostonimi, \"w\") as tiedosto:\n        for nimi, lista in viikkopisteet.items():\n            summa = sum(lista)\n            tiedosto.write(f\"{nimi};{summa};{arvosana(summa)}\\n\")

Itse \"pääohjelma\" on nyt hyvin yksinkertainen. Huomaa, että luettavan ja kirjoitettavan tiedoston nimet annetaan funktioille parametrina:

viikkopisteet = lue_viikkopisteet(\"viikkopisteet.csv\")\ntallenna_tulokset(\"tulokset.csv\", viikkopisteet)

Suorituksen tuloksena oleva CSV-tiedosto näyttää seuraavalta:

Pekka;18;0\nPaula;34;3\nPirjo;26;2\nEmilia;41;5

Huomaa, miten ohjelma on koostettu suhteellisen yksinkertaisista, vain yhteen asiaan keskittyvistä funktioista. Tämä on yleisesti ottaen suositeltava tapa ohjelmoinnissa, se helpottaa ohjelman toiminnallisuuden varmistamista sekä myöhemmin ohjelmaan tehtävien muutosten sekä laajennusten tekemistä.

Jos esimerkiksi haluaisimme ohjelmaan toiminnallisuuden, joka tulostaa yhden opiskelijan arvosanan, olisi toiminnallisuus helppo koostaa käyttäen apuna jo valmiina olevaa arvosanan laskevaa funktiota:

def hae_arvosana(haettava, viikkopisteet):\n    for nimi, lista in viikkopisteet.items():\n        if nimi == haettava:\n            return arvosana(sum(lista))\n\n\nviikkopisteet = lue_viikkopisteet(\"viikkopisteet.csv\")\nprint(hae_arvosana(\"Paula\", viikkopisteet))\n

3

Jos ohjelmasta halutaan muuttaa tai korjata \"yhtä asiaa\", esimerkiksi arvosanojen pisterajoja, kohdistuu muokkaus hyvin rakennetussa ohjelmassa ainoastaan yhteen tai muutamaan funktioon. Jos sama logiikka, esimerkiksi arvosanan laskeminen, olisi kopioitu useaan paikkaan, kasvaisi riski, että muutoksia ei muistettaisi tehdä kaikkiin oikeisiin paikkoihin.

Laajennetaan vielä hieman aiemmin kurssien tulokset generoivaa sovellusta.

Tällä hetkellä tiedostosta luetaan opiskelijoiden nimet, tehtäväpisteet sekä koepisteet. Laajennetaan ohjelmaa siten, että myös kurssin nimi ja laajuus luetaan tiedostosta, jonka muoto on seuraava (tiedosto on kirjoitettu ilman ääkkösiä, jotta se ei aiheuttaisi ongelmia Windowsissa):

\n\nnimi: Ohjelmoinnin perusteet\nlaajuus opintopisteina: 5\n

Ohjelma luo kaksi tiedostoa. Tiedoston tulos.txt muoto on seuraava:

\nOhjelmoinnin perusteet, 5 opintopistettä\n========================================\nnimi                          teht_lkm  teht_pist koe_pist  yht_pist  arvosana\npekka peloton                 21        5         9         14        0\njaana javanainen              27        6         11        17        1\nliisa virtanen                35        8         14        22        3\n

Tulokset kertova osa on siis samanlainen kuin tehtävän edellisen osan tulostus.

Tämän lisäksi luodaan tiedosto tulos.csv, jonka muoto on seuraava:

\n12345678;pekka peloton;0\n12345687;jaana javanainen;1\n12345699;liisa virtanen;3\n

Ohjelman suoritus näyttää seuraavalta:

opiskelijatiedot: opiskelijat1.csv\ntehtävätiedot: tehtavat1.csv\nkoepisteet: koepisteet1.csv\nkurssin tiedot: kurssi1.txt\nTulokset talletettu tiedostoihin tulos.txt ja tulos.csv

Ohjelma siis ainoastaan kyselee tiedostojen nimet ja varsinaiset tulokset tallennetaan vain tiedostoihin.

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Tehtäväpohjasta löytyy tiedosto sanat.txt, joka sisältää englanninkielisiä sanoja.

Tehtäväsi on kirjoittaa funktio hae_sanat(hakusana: str), joka palauttaa listana annetun hakusanan mukaiset sanat tiedostosta.

Hakusanassa voi käyttää pienten kirjainten lisäksi seuraavia erikoismerkkejä:

    \n
  • Piste . tarkoittaa, että mikä tahansa merkki käy (esim ca. vastaa vaikkapa sanoja cat ja car, p.ng sanoja ping ja pong ja .a.e sanoja sane, care tai late.
  • \n
  • Asteriski * tarkoittaa, että sanan alku- tai loppuosaksi käy mikä tahansa jono, esim. ca* vastaa vaikkapa sanoja california, cat, caring tai catapult. Vastaavasti hakusana *ane vastaa vaikkapa sanoja crane, insane tai aeroplane. Voit olettaa, että asteriski on aina joko hakusanan alussa tai lopussa, ja että hakusanassa esiintyy korkeintaan yksi asteriski.
  • \n
  • Jos hakusanassa ei ole erikoismerkkejä, haetaan vain täsmälleen hakusanaa vastaava sana.
  • \n

Sovitaan, että samassa hakusanassa ei voi käyttää molempia erikoismerkkejä.

Sanat ovat tiedostossa kokonaan pienillä kirjaimilla kirjoitettuna. Voit myös olettaa, että funktion parametri on annettu kokonaan pienillä kirjaimilla.

Jos yhtään tulosta ei löydy, funktio palauttaa tyhjän listan.

Vinkki: Pythonin merkkijonometodeista startswith() ja endswith() saattaa olla hyötyä tehtävässä, googlaa niiden toiminta tarvittaessa tarkemmin!

Esimerkki funktion kutsumisesta:

\nprint(hae_sanat(\"*vokes\"))\n

['convokes', 'equivokes', 'evokes', 'invokes', 'provokes', 'reinvokes', 'revokes']

Tee sanakirjaa mallintava ohjelma, johon voi syöttää uusia sanoja tai josta voi hakea syötettyjä sanoja.

Ohjelman tulee toimia näin:

1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: 1\nAnna sana suomeksi: auto\nAnna sana englanniksi: car\nSanapari lisätty\n1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: 1\nAnna sana suomeksi: roska\nAnna sana englanniksi: garbage\nSanapari lisätty\n1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: 1\nAnna sana suomeksi: laukku\nAnna sana englanniksi: bag\nSanapari lisätty\n1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: 2\nAnna sana: bag\nroska - garbage\nlaukku - bag\n1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: 2\nAnna sana: car\nauto - car\n1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: 2\nAnna sana: laukku\nlaukku - bag\n1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: 3\nMoi!

Sanat tallennetaan tiedostoon sanakirja.txt. Ohjelma lukee tiedoston sisällön kun se käynnistetään. Uudet sanaparit lisätään tiedostoon aina tallennuksen yhteydessä.

Voit itse päättää tiedostoon tallennettavan tiedon muodon.

Huomaa, että paikallisten TMC-testien ajaminen voi tyhjentää sanakirja-tiedoston.

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-6/2-tiedostojen-kirjoittaminen.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat luoda itse tiedoston Pythonilla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat kirjoittaa tekstimuotoista tietoa tiedostoon"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat kirjoittaa CSV-muotoisen tiedoston omasta datastasi"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedoston lukemisen lisäksi voimme luonnollisesti myös kirjoittaa tiedostoon tietoa. Tyypillinen esimerkki on ohjelman tulosten tallentaminen tiedostoon, jotta niitä voidaan käyttää myös myöhemmin tai muokata edelleen jollain toisella ohjelmalla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedoston kirjoittamisessa voimme joko luoda uuden tiedoston tai lisätä tietoa olemassa olevan tiedoston vanhan tiedon perään. Molemmissa tapauksissa käytetään edellisestä osasta tuttua "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"open"}]},{"type":"text","value":"-funktiota, mutta kirjoittamista varten funktiolle annetaan toinen parametri."}]},{"type":"element","tagName":"h2","properties":{"id":"uuden-tiedoston-luominen","style":"position:relative;"},"children":[{"type":"text","value":"Uuden tiedoston luominen"},{"type":"element","tagName":"a","properties":{"href":"#uuden-tiedoston-luominen","ariaLabel":"uuden tiedoston luominen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Uusi tiedosto luodaan antamalla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"open"}]},{"type":"text","value":"-funktiolle tiedoston nimen lisäksi avaustilaksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"w"}]},{"type":"text","value":" (tulee sanasta \"write\"). Esimerkiksi"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"uusi_tiedosto.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"w\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tiedostoon kirjoittaminen"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"mikäli tiedosto on jo olemassa, kaikki sen sisältö ylikirjoitetaan"}]},{"type":"text","value":". Ole siis erittäin huolellinen uusia tiedostoja luodessasi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun tiedosto on avattu, sinne voidaan kirjoittaa tietoa. Kirjoittaminen tapahtuu metodilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"write"}]},{"type":"text","value":", joka saa parametrikseen kirjoitettavan merkkijonon."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"uusi_tiedosto.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"w\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi kaikki!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suorittamisen jälkeen samaan hakemistoon ilmestyy tiedosto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"uusi_tiedosto.txt"}]},{"type":"text","value":", jonka sisältö näyttää tältä:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moi kaikki!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että jos tiedostoon halutaan rivinvaihtoja, ne täytyy lisätä tekstiin itse. Esimerkiksi ohjelma"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"uusi_tiedosto.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"w\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi kaikki!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Toinen rivi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Viimeinen rivi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tuottaa seuraavanlaisen tiedoston:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moi kaikki!Toinen riviViimeinen rivi"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostukset saadaan omille riveilleen lisäämällä rivien loppuun rivivaihtomerkki "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\\n"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"uusi_tiedosto.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"w\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi kaikki!\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Toinen rivi\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Viimeinen rivi\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt tiedosto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"uusi_tiedosto.txt"}]},{"type":"text","value":" näyttää tältä:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moi kaikki!\nToinen rivi\nViimeinen rivi"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Omistuskirjoitus","tmcname":"osa06-10_omistuskirjoitus"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy nimeä ja luo \"omistuskirjoituksen\" käyttäjän haluamaan tiedostoon. Seuraavassa ohjelman esimerkkisuoritus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kenelle teos omistetaan: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Arto"}]},{"type":"text","value":"\nMihin kirjoitetaan: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"omistettu.txt"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedoston "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"omistettu.txt"}]},{"type":"text","value":" sisällöksi tulee"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hei Arto, toivomme viihtyisiä hetkiä python-kurssimateriaalin parissa! Terveisin mooc.fi-tiimi"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"h2","properties":{"id":"tiedon-lisaaminen-olemassaolevaan-tiedostoon","style":"position:relative;"},"children":[{"type":"text","value":"Tiedon lisääminen olemassaolevaan tiedostoon"},{"type":"element","tagName":"a","properties":{"href":"#tiedon-lisaaminen-olemassaolevaan-tiedostoon","ariaLabel":"tiedon lisaaminen olemassaolevaan tiedostoon permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos haluamme lisätä tietoa olemassa olevaan tiedostoon, voimme avata tiedoston tilassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":" (lyhenne sanasta \"append\"). Tällöin tiedoston nykyistä sisältöä ei pyyhitä, vaan uusi tieto kirjoitetaan tiedoston loppuun."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos tiedostoa ei ole olemassa, tila "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":" toimii samalla tavalla kuin tila "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"w"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma avaa edellisen esimerkin tuottaman tiedoston "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"uusi_tiedosto.txt"}]},{"type":"text","value":" ja lisää sen perään pari riviä tekstiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"uusi_tiedosto.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"a\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Rivi numero 4\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ja taas yksi.\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suorituksen jälkeen tiedosto näyttää tältä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moi kaikki!\nToinen rivi\nViimeinen rivi\nRivi numero 4\nJa taas yksi."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedon lisääminen tiedostoon on kuitenkin suhteellisen harvoin tarvittava operaatio."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedostoon lisäämisen sijaan on usein yksinkertaisinta kirjoittaa tiedosto kokonaan uudelleen. Näin joudutaan useimmiten tekemään jos esimerkiksi tiedoston sisältö muuttuu keskeltä tiedostoa."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Päiväkirja","tmcname":"osa06-11_paivakirja"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka mallintaa yksinkertaista päiväkirjaa. Ohjelman tulee tallentaa päiväkirjamerkinnät tiedostoon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"paivakirja.txt"}]},{"type":"text","value":". Kun ohjelma käynnistetään, se lukee merkinnät tiedostosta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huom! Paikalliset testit voivat muuttaa tiedoston sisältöä - kopioi siis tiedosto talteen ennen testien ajamista, jos haluat säilyttää sen sisällön."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia seuraavan esimerkin mukaisesti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nAnna merkintä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Tänään söin puuroa"}]},{"type":"text","value":"\nPäiväkirja tallennettu"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nMerkinnät:\nTänään söin puuroa\n1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nAnna merkintä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Illalla kävin saunassa"}]},{"type":"text","value":"\nPäiväkirja tallennettu"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nMerkinnät:\nTänään söin puuroa\nIllalla kävin saunassa\n1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nHeippa!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Uusi käynnistys:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nMerkinnät:\nTänään söin puuroa\nIllalla kävin saunassa\n1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\nHeippa!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"h2","properties":{"id":"csv-tiedoston-kirjoittaminen","style":"position:relative;"},"children":[{"type":"text","value":"CSV-tiedoston kirjoittaminen"},{"type":"element","tagName":"a","properties":{"href":"#csv-tiedoston-kirjoittaminen","ariaLabel":"csv tiedoston kirjoittaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"CSV-tiedoston voi kirjoittaa rivi riviltä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"write"}]},{"type":"text","value":"-metodilla. Esimerkiksi seuraava esimerkki luo tiedoston "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"koodarit.csv"}]},{"type":"text","value":", jonka jokaisella rivillä on koodarin nimi, työympäristö, lempikieli ja kokemus vuosissa. Tiedot on erotettu puolipisteillä."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodarit.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"w\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki;Windows;Pascal;10\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Matti;Linux;PHP;2\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti;Linux;Java;17\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia;Mac;Cobol;9\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän tuloksena on seuraava tiedosto:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Erkki;Windows;Pascal;10\nMatti;Linux;PHP;2\nAntti;Linux;Java;17\nEmilia;Mac;Cobol;9"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan sitten tilannetta, jossa tiedostoon kirjoitettavat tiedot ovatkin muistissa listoina:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"koodarit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nkoodarit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Windows\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pascal\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkoodarit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Matti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Linux\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"PHP\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkoodarit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Linux\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Java\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"17"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkoodarit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mac\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Cobol\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt voimme kirjoittaa koodarien tiedot CSV-tiedostoon näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodarit.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"w\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" koodari "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" koodarit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"koodari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"koodari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"koodari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"koodari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos koodaria kuvaavissa listoissa olisi suuri määrä alkioita, olisi csv-tiedostoon kirjoitetavien rivien muodostaminen yllä olevalla tekniikalla työläähköä, ja rivit kannattaisikin koota silmukan avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodarit.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"w\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" koodari "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" koodarit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" arvo "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" koodari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":";\""}]}]},{"type":"text","value":"\n rivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\\n\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"tiedoston-tyhjentaminen-ja-poisto","style":"position:relative;"},"children":[{"type":"text","value":"Tiedoston tyhjentäminen ja poisto"},{"type":"element","tagName":"a","properties":{"href":"#tiedoston-tyhjentaminen-ja-poisto","ariaLabel":"tiedoston tyhjentaminen ja poisto permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joissain tilanteissa ohjelmassa on tarvetta tyhjentää olemassaolevan tiedoston sisältö. Tämä onnistuu avaamalla tiedosto kirjoitustilassa \"w\" ja sulkemalla tiedosto välittömästi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tyhjennettava_tiedosto.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"w\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":"-lohkossa on ainoastaan komento "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pass"}]},{"type":"text","value":", joka ei tee mitään. Komento tarvitaan, sillä Python ei salli sellaisia lohkoja missä ei ole mitään komentoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedoston tyhjennys on mahdollista tehdä myös ilman "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":"-lohkokon käyttöä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'tyhjennettava_tiedosto.txt'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'w'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"close"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"text-box","properties":{"variant":"hint","name":"Tiedoston poistaminen"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedosto voidaan myös poistaa kokonaan. Poisto tapahtuu seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# poisto-komento tuodaan koodin käyttöön import-lauseella"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" os\n\nos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"remove"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tarpeeton_tiedosto.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä ei kuitenkaan teknisten rajoitteiden takia toimi palvelimella suoritettavissa testeissä, joten käytä ylläolevia tapoja jos joudut tehtävissä tyhjentämään tiedoston."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Aineiston suodatus","tmcname":"osa06-12_aineiston_suodatus"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedostossa laskut.csv on tehtävien ratkaisuja seuraavan esimerkin mukaisesti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"csv"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"Arto;2+5;7"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"Pekka;3-2;1"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"Erkki;9+3;11"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"Arto;8-3;4"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"Pekka;5+5;10"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"...jne..."}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jokaisella rivin muoto on siis "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"oppilaan_nimi;lasku;lopputulos"}]},{"type":"text","value":". Laskut ovat kaikki esimerkin mukaisesti joko yhteen- tai vähennyslaskuja, ja kaikissa on kaksi operandia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suodata_laskut()"}]},{"type":"text","value":", joka"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Lukee tiedoston "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"laskut.csv"}]},{"type":"text","value":" sisällön ja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"kirjoittaa tiedostoon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"oikeat.csv"}]},{"type":"text","value":" ne rivit, joilla laskutoimituksen lopputulos on oikein sekä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"kirjoittaa tiedostoon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vaarat.csv"}]},{"type":"text","value":" ne rivit, joilla laskutoimituksen lopputulos on väärin."}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellisestä esimerkistä tiedostoon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"oikeat.csv"}]},{"type":"text","value":" olisi siis kirjoitettu rivit"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"sh"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-sh"]},"children":[{"type":"text","value":"Arto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"+5"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"text","value":"\nPekka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"-2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nPekka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"+5"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kaksi muuta riviä olisi kirjoitettu tiedostoon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vaarat.csv"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita rivit samassa järjestyksessä kuin ne esiintyvät alkuperäisessä tiedostossa. Älä muuta alkuperäistä tiedostoa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Huomaa"}]},{"type":"text","value":" että funktion tulee toimia oikein siinäkin tapauksessa että funktiota kutsutaan monta kertaa perkkäin. Eli riippumatta siitä suoritatko funktion vain kerran"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"suodata_laskut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tai useita kertoja peräkkän"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"suodata_laskut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsuodata_laskut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsuodata_laskut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsuodata_laskut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tiedostojen sisältöjen tulee lopulta olla samat."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Henkilöt talteen","tmcname":"osa06-13_henkilot_talteen"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tallenna_henkilo(henkilo: tuple)"}]},{"type":"text","value":" joka saa parametrikseen henkilöä kuvaavan tuplen. Tuplessa on seuraavat tiedot tässä järjestyksessä:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Nimi (merkkijono)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ikä (kokonaisluku)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Pituus (liukuluku)"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tallenna henkilön tiedot tiedostoon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"henkilot.csv"}]},{"type":"text","value":" olemassa olevien tietojen perään. Tiedot tulee tallentaa muodosssa"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"nimi;ikä;pituus"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"eli yhden henkilön tiedot tulevat yhdelle riville. Jos funktiota esim. kutsuttaisiin parametrien arvoilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"(\"Kimmo Kimmonen\", 37, 175.5)"}]},{"type":"text","value":", ohjelma kirjoittaisi tiedoston loppuun rivin"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kimmo Kimmonen;37;175.5"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"tiedon-kasittely-csvna","style":"position:relative;"},"children":[{"type":"text","value":"Tiedon käsittely CSV:nä"},{"type":"element","tagName":"a","properties":{"href":"#tiedon-kasittely-csvna","ariaLabel":"tiedon kasittely csvna permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehdään vielä lopuksi ohjelma, joka lukee CSV-tiedostosta opiskelijoiden viikoittaiset kurssipistemäärät ja laskee näiden avulla kurssin arvosanan. Lopuksi ohjelma luo CSV-tiedoston, josta selviää opiskelijan yhteispistemäärä sekä arvosana"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman lukema CSV-tiedosto näyttää seuraavalta:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka;4;2;3;5;4;0;0\nPaula;7;2;8;3;5;4;5\nPirjo;3;4;3;5;3;4;4\nEmilia;6;6;5;5;0;4;8"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman logiikka on jaettu kolmeen funktioon. Tiedoston lukeminen tapahtuu samaan tapaan kuin edellisessä aliluvussa: tiedot talletetaan sanakirjaan, jossa avaimena on opiskelijan nimi ja arvona lista viikkopisteistä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lue_viikkopisteet"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tiedostonimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n viikkopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tiedostonimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\";\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n viikkopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lista\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" viikkopisteet"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Arvosanojen laskemista varten on tehty oma funktionsa, jota tiedostoon kirjoittava funktio hyödyntää:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"arvosana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"25"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"30"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"35"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"40"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tallenna_tulokset"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tiedostonimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" viikkopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tiedostonimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"w\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lista "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" viikkopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"items"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sum"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"write"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":";"}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"arvosana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\\n\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Itse \"pääohjelma\" on nyt hyvin yksinkertainen. Huomaa, että luettavan ja kirjoitettavan tiedoston nimet annetaan funktioille parametrina:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"viikkopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue_viikkopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"viikkopisteet.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntallenna_tulokset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tulokset.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" viikkopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Suorituksen tuloksena oleva CSV-tiedosto näyttää seuraavalta:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka;18;0\nPaula;34;3\nPirjo;26;2\nEmilia;41;5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, miten ohjelma on koostettu suhteellisen yksinkertaisista, vain yhteen asiaan keskittyvistä funktioista. Tämä on yleisesti ottaen suositeltava tapa ohjelmoinnissa, se helpottaa ohjelman toiminnallisuuden varmistamista sekä myöhemmin ohjelmaan tehtävien muutosten sekä laajennusten tekemistä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos esimerkiksi haluaisimme ohjelmaan toiminnallisuuden, joka tulostaa yhden opiskelijan arvosanan, olisi toiminnallisuus helppo koostaa käyttäen apuna jo valmiina olevaa arvosanan laskevaa funktiota:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hae_arvosana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"haettava"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" viikkopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lista "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" viikkopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"items"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" haettava"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" arvosana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sum"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n\nviikkopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue_viikkopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"viikkopisteet.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"hae_arvosana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Paula\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" viikkopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos ohjelmasta halutaan muuttaa tai korjata \"yhtä asiaa\", esimerkiksi arvosanojen pisterajoja, kohdistuu muokkaus hyvin rakennetussa ohjelmassa ainoastaan yhteen tai muutamaan funktioon. Jos sama logiikka, esimerkiksi arvosanan laskeminen, olisi kopioitu useaan paikkaan, kasvaisi riski, että muutoksia ei muistettaisi tehdä kaikkiin oikeisiin paikkoihin."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kurssin tulokset, osa 4","tmcname":"osa06-14_kurssin_tulokset_osa4"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajennetaan vielä hieman aiemmin kurssien tulokset generoivaa sovellusta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tällä hetkellä tiedostosta luetaan opiskelijoiden nimet, tehtäväpisteet sekä koepisteet. Laajennetaan ohjelmaa siten, että myös kurssin nimi ja laajuus luetaan tiedostosta, jonka muoto on seuraava (tiedosto on kirjoitettu ilman ääkkösiä, jotta se ei aiheuttaisi ongelmia Windowsissa):"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"\nnimi: Ohjelmoinnin perusteet\nlaajuus opintopisteina: 5\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma luo kaksi tiedostoa. Tiedoston "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulos.txt"}]},{"type":"text","value":" muoto on seuraava:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"Ohjelmoinnin perusteet, 5 opintopistettä\n========================================\nnimi teht_lkm teht_pist koe_pist yht_pist arvosana\npekka peloton 21 5 9 14 0\njaana javanainen 27 6 11 17 1\nliisa virtanen 35 8 14 22 3\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulokset kertova osa on siis samanlainen kuin tehtävän edellisen osan tulostus."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän lisäksi luodaan tiedosto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulos.csv"}]},{"type":"text","value":", jonka muoto on seuraava:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"12345678;pekka peloton;0\n12345687;jaana javanainen;1\n12345699;liisa virtanen;3\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suoritus näyttää seuraavalta:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"opiskelijatiedot: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"opiskelijat1.csv"}]},{"type":"text","value":"\ntehtävätiedot: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tehtavat1.csv"}]},{"type":"text","value":"\nkoepisteet: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"koepisteet1.csv"}]},{"type":"text","value":"\nkurssin tiedot: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kurssi1.txt"}]},{"type":"text","value":"\nTulokset talletettu tiedostoihin tulos.txt ja tulos.csv"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma siis ainoastaan kyselee tiedostojen nimet ja varsinaiset tulokset tallennetaan vain tiedostoihin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sanahaku","tmcname":"osa06-15_sanahaku"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjasta löytyy tiedosto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sanat.txt"}]},{"type":"text","value":", joka sisältää englanninkielisiä sanoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväsi on kirjoittaa funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae_sanat(hakusana: str)"}]},{"type":"text","value":", joka palauttaa listana annetun hakusanan mukaiset sanat tiedostosta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hakusanassa voi käyttää pienten kirjainten lisäksi seuraavia erikoismerkkejä:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Piste "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":" tarkoittaa, että mikä tahansa merkki käy (esim "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ca."}]},{"type":"text","value":" vastaa vaikkapa sanoja cat ja car, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"p.ng"}]},{"type":"text","value":" sanoja ping ja pong ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":".a.e"}]},{"type":"text","value":" sanoja sane, care tai late."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Asteriski "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" tarkoittaa, että sanan alku- tai loppuosaksi käy mikä tahansa jono, esim. "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ca*"}]},{"type":"text","value":" vastaa vaikkapa sanoja california, cat, caring tai catapult. Vastaavasti hakusana "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"*ane"}]},{"type":"text","value":" vastaa vaikkapa sanoja crane, insane tai aeroplane. Voit olettaa, että asteriski on aina joko hakusanan alussa tai lopussa, ja että hakusanassa esiintyy korkeintaan yksi asteriski."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Jos hakusanassa ei ole erikoismerkkejä, haetaan vain täsmälleen hakusanaa vastaava sana."}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sovitaan, että samassa hakusanassa ei voi käyttää molempia erikoismerkkejä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanat ovat tiedostossa kokonaan pienillä kirjaimilla kirjoitettuna. Voit myös olettaa, että funktion parametri on annettu kokonaan pienillä kirjaimilla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos yhtään tulosta ei löydy, funktio palauttaa tyhjän listan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vinkki: Pythonin merkkijonometodeista startswith() ja endswith() saattaa olla hyötyä tehtävässä, googlaa niiden toiminta tarvittaessa tarkemmin!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"hae_sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"*vokes\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['convokes', 'equivokes', 'evokes', 'invokes', 'provokes', 'reinvokes', 'revokes']"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Muistava sanakirja","tmcname":"osa06-16_muistava_sanakirja"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee sanakirjaa mallintava ohjelma, johon voi syöttää uusia sanoja tai josta voi hakea syötettyjä sanoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia näin:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nAnna sana suomeksi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"auto"}]},{"type":"text","value":"\nAnna sana englanniksi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"car"}]},{"type":"text","value":"\nSanapari lisätty\n1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nAnna sana suomeksi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"roska"}]},{"type":"text","value":"\nAnna sana englanniksi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"garbage"}]},{"type":"text","value":"\nSanapari lisätty\n1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\nAnna sana suomeksi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"laukku"}]},{"type":"text","value":"\nAnna sana englanniksi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"bag"}]},{"type":"text","value":"\nSanapari lisätty\n1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"bag"}]},{"type":"text","value":"\nroska - garbage\nlaukku - bag\n1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"car"}]},{"type":"text","value":"\nauto - car\n1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\nAnna sana: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"laukku"}]},{"type":"text","value":"\nlaukku - bag\n1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nMoi!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanat tallennetaan tiedostoon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sanakirja.txt"}]},{"type":"text","value":". Ohjelma lukee tiedoston sisällön kun se käynnistetään. Uudet sanaparit lisätään tiedostoon aina tallennuksen yhteydessä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit itse päättää tiedostoon tallennettavan tiedon muodon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että paikallisten TMC-testien ajaminen voi tyhjentää sanakirja-tiedoston."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" tässä tehtävässä (eikä missään muussakaan tehtävissä missä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei"}]},{"type":"text","value":" erikseen pyydetä funktioiden toteuttamista) mitään koodia "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ei tule sijoittaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkoon!"}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat luoda itse tiedoston Pythonilla
  • \n
  • Osaat kirjoittaa tekstimuotoista tietoa tiedostoon
  • \n
  • Osaat kirjoittaa CSV-muotoisen tiedoston omasta datastasi
  • \n

Tiedoston lukemisen lisäksi voimme luonnollisesti myös kirjoittaa tiedostoon tietoa. Tyypillinen esimerkki on ohjelman tulosten tallentaminen tiedostoon, jotta niitä voidaan käyttää myös myöhemmin tai muokata edelleen jollain toisella ohjelmalla.

Tiedoston kirjoittamisessa voimme joko luoda uuden tiedoston tai lisätä tietoa olemassa olevan tiedoston vanhan tiedon perään. Molemmissa tapauksissa käytetään edellisestä osasta tuttua open-funktiota, mutta kirjoittamista varten funktiolle annetaan toinen parametri.

Uuden tiedoston luominen

Uusi tiedosto luodaan antamalla open-funktiolle tiedoston nimen lisäksi avaustilaksi w (tulee sanasta \"write\"). Esimerkiksi

with open(\"uusi_tiedosto.txt\", \"w\") as tiedosto:\n    # tiedostoon kirjoittaminen

Huomaa, että mikäli tiedosto on jo olemassa, kaikki sen sisältö ylikirjoitetaan. Ole siis erittäin huolellinen uusia tiedostoja luodessasi.

Kun tiedosto on avattu, sinne voidaan kirjoittaa tietoa. Kirjoittaminen tapahtuu metodilla write, joka saa parametrikseen kirjoitettavan merkkijonon.

with open(\"uusi_tiedosto.txt\", \"w\") as tiedosto:\n    tiedosto.write(\"Moi kaikki!\")

Ohjelman suorittamisen jälkeen samaan hakemistoon ilmestyy tiedosto uusi_tiedosto.txt, jonka sisältö näyttää tältä:

Moi kaikki!

Huomaa, että jos tiedostoon halutaan rivinvaihtoja, ne täytyy lisätä tekstiin itse. Esimerkiksi ohjelma

with open(\"uusi_tiedosto.txt\", \"w\") as tiedosto:\n    tiedosto.write(\"Moi kaikki!\")\n    tiedosto.write(\"Toinen rivi\")\n    tiedosto.write(\"Viimeinen rivi\")

tuottaa seuraavanlaisen tiedoston:

Moi kaikki!Toinen riviViimeinen rivi

Tulostukset saadaan omille riveilleen lisäämällä rivien loppuun rivivaihtomerkki \\n:

with open(\"uusi_tiedosto.txt\", \"w\") as tiedosto:\n    tiedosto.write(\"Moi kaikki!\\n\")\n    tiedosto.write(\"Toinen rivi\\n\")\n    tiedosto.write(\"Viimeinen rivi\\n\")

Nyt tiedosto uusi_tiedosto.txt näyttää tältä:

Moi kaikki!\nToinen rivi\nViimeinen rivi

Tee ohjelma, joka kysyy nimeä ja luo \"omistuskirjoituksen\" käyttäjän haluamaan tiedostoon. Seuraavassa ohjelman esimerkkisuoritus:

Kenelle teos omistetaan: Arto\nMihin kirjoitetaan: omistettu.txt

Tiedoston omistettu.txt sisällöksi tulee

Hei Arto, toivomme viihtyisiä hetkiä python-kurssimateriaalin parissa! Terveisin mooc.fi-tiimi

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Tiedon lisääminen olemassaolevaan tiedostoon

Jos haluamme lisätä tietoa olemassa olevaan tiedostoon, voimme avata tiedoston tilassa a (lyhenne sanasta \"append\"). Tällöin tiedoston nykyistä sisältöä ei pyyhitä, vaan uusi tieto kirjoitetaan tiedoston loppuun.

Jos tiedostoa ei ole olemassa, tila a toimii samalla tavalla kuin tila w.

Seuraava ohjelma avaa edellisen esimerkin tuottaman tiedoston uusi_tiedosto.txt ja lisää sen perään pari riviä tekstiä:

with open(\"uusi_tiedosto.txt\", \"a\") as tiedosto:\n    tiedosto.write(\"Rivi numero 4\\n\")\n    tiedosto.write(\"Ja taas yksi.\\n\")

Ohjelman suorituksen jälkeen tiedosto näyttää tältä:

Moi kaikki!\nToinen rivi\nViimeinen rivi\nRivi numero 4\nJa taas yksi.

Tiedon lisääminen tiedostoon on kuitenkin suhteellisen harvoin tarvittava operaatio.

Tiedostoon lisäämisen sijaan on usein yksinkertaisinta kirjoittaa tiedosto kokonaan uudelleen. Näin joudutaan useimmiten tekemään jos esimerkiksi tiedoston sisältö muuttuu keskeltä tiedostoa.

Tee ohjelma, joka mallintaa yksinkertaista päiväkirjaa. Ohjelman tulee tallentaa päiväkirjamerkinnät tiedostoon paivakirja.txt. Kun ohjelma käynnistetään, se lukee merkinnät tiedostosta.

Huom! Paikalliset testit voivat muuttaa tiedoston sisältöä - kopioi siis tiedosto talteen ennen testien ajamista, jos haluat säilyttää sen sisällön.

Ohjelman tulee toimia seuraavan esimerkin mukaisesti:

1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: 1\nAnna merkintä: Tänään söin puuroa\nPäiväkirja tallennettu

1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: 2\nMerkinnät:\nTänään söin puuroa\n1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: 1\nAnna merkintä: Illalla kävin saunassa\nPäiväkirja tallennettu

1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: 2\nMerkinnät:\nTänään söin puuroa\nIllalla kävin saunassa\n1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: 0\nHeippa!

Uusi käynnistys:

1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: 2\nMerkinnät:\nTänään söin puuroa\nIllalla kävin saunassa\n1 - lisää merkintä, 2 - lue merkinnät, 0 - lopeta\nValinta: 0\nHeippa!

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

CSV-tiedoston kirjoittaminen

CSV-tiedoston voi kirjoittaa rivi riviltä write-metodilla. Esimerkiksi seuraava esimerkki luo tiedoston koodarit.csv, jonka jokaisella rivillä on koodarin nimi, työympäristö, lempikieli ja kokemus vuosissa. Tiedot on erotettu puolipisteillä.

with open(\"koodarit.csv\", \"w\") as tiedosto:\n    tiedosto.write(\"Erkki;Windows;Pascal;10\\n\")\n    tiedosto.write(\"Matti;Linux;PHP;2\\n\")\n    tiedosto.write(\"Antti;Linux;Java;17\\n\")\n    tiedosto.write(\"Emilia;Mac;Cobol;9\\n\")

Tämän tuloksena on seuraava tiedosto:

Erkki;Windows;Pascal;10\nMatti;Linux;PHP;2\nAntti;Linux;Java;17\nEmilia;Mac;Cobol;9

Tarkastellaan sitten tilannetta, jossa tiedostoon kirjoitettavat tiedot ovatkin muistissa listoina:

koodarit = []\nkoodarit.append([\"Erkki\", \"Windows\", \"Pascal\", 10])\nkoodarit.append([\"Matti\", \"Linux\", \"PHP\", 2])\nkoodarit.append([\"Antti\", \"Linux\", \"Java\", 17])\nkoodarit.append([\"Emilia\", \"Mac\", \"Cobol\", 9])

Nyt voimme kirjoittaa koodarien tiedot CSV-tiedostoon näin:

with open(\"koodarit.csv\", \"w\") as tiedosto:\n    for koodari in koodarit:\n        rivi = f\"{koodari[0]};{koodari[1]};{koodari[2]};{koodari[3]}\"\n        tiedosto.write(rivi+\"\\n\")

Jos koodaria kuvaavissa listoissa olisi suuri määrä alkioita, olisi csv-tiedostoon kirjoitetavien rivien muodostaminen yllä olevalla tekniikalla työläähköä, ja rivit kannattaisikin koota silmukan avulla:

with open(\"koodarit.csv\", \"w\") as tiedosto:\n    for koodari in koodarit:\n        rivi = \"\"\n        for arvo in koodari:\n            rivi += f\"{arvo};\"\n        rivi = rivi[:-1]\n        tiedosto.write(rivi+\"\\n\")

Tiedoston tyhjentäminen ja poisto

Joissain tilanteissa ohjelmassa on tarvetta tyhjentää olemassaolevan tiedoston sisältö. Tämä onnistuu avaamalla tiedosto kirjoitustilassa \"w\" ja sulkemalla tiedosto välittömästi:

with open(\"tyhjennettava_tiedosto.txt\", \"w\") as tiedosto:\n    pass

Nyt with-lohkossa on ainoastaan komento pass, joka ei tee mitään. Komento tarvitaan, sillä Python ei salli sellaisia lohkoja missä ei ole mitään komentoja.

Tiedoston tyhjennys on mahdollista tehdä myös ilman with-lohkokon käyttöä:

open('tyhjennettava_tiedosto.txt', 'w').close()

Tiedosto voidaan myös poistaa kokonaan. Poisto tapahtuu seuraavasti:

# poisto-komento tuodaan koodin käyttöön import-lauseella\nimport os\n\nos.remove(\"tarpeeton_tiedosto.csv\")

Tämä ei kuitenkaan teknisten rajoitteiden takia toimi palvelimella suoritettavissa testeissä, joten käytä ylläolevia tapoja jos joudut tehtävissä tyhjentämään tiedoston.

Tiedostossa laskut.csv on tehtävien ratkaisuja seuraavan esimerkin mukaisesti:

Arto;2+5;7\nPekka;3-2;1\nErkki;9+3;11\nArto;8-3;4\nPekka;5+5;10\n...jne...

Jokaisella rivin muoto on siis oppilaan_nimi;lasku;lopputulos. Laskut ovat kaikki esimerkin mukaisesti joko yhteen- tai vähennyslaskuja, ja kaikissa on kaksi operandia.

Kirjoita funktio suodata_laskut(), joka

    \n
  • Lukee tiedoston laskut.csv sisällön ja
  • \n
  • kirjoittaa tiedostoon oikeat.csv ne rivit, joilla laskutoimituksen lopputulos on oikein sekä
  • \n
  • kirjoittaa tiedostoon vaarat.csv ne rivit, joilla laskutoimituksen lopputulos on väärin.
  • \n

Edellisestä esimerkistä tiedostoon oikeat.csv olisi siis kirjoitettu rivit

Arto;2+5;7\nPekka;3-2;1\nPekka;5+5;10

Kaksi muuta riviä olisi kirjoitettu tiedostoon vaarat.csv.

Kirjoita rivit samassa järjestyksessä kuin ne esiintyvät alkuperäisessä tiedostossa. Älä muuta alkuperäistä tiedostoa.

Huomaa että funktion tulee toimia oikein siinäkin tapauksessa että funktiota kutsutaan monta kertaa perkkäin. Eli riippumatta siitä suoritatko funktion vain kerran

suodata_laskut()

tai useita kertoja peräkkän

suodata_laskut()\nsuodata_laskut()\nsuodata_laskut()\nsuodata_laskut()

tiedostojen sisältöjen tulee lopulta olla samat.

Kirjoita funktio tallenna_henkilo(henkilo: tuple) joka saa parametrikseen henkilöä kuvaavan tuplen. Tuplessa on seuraavat tiedot tässä järjestyksessä:

    \n
  • Nimi (merkkijono)
  • \n
  • Ikä (kokonaisluku)
  • \n
  • Pituus (liukuluku)
  • \n

Tallenna henkilön tiedot tiedostoon henkilot.csv olemassa olevien tietojen perään. Tiedot tulee tallentaa muodosssa

nimi;ikä;pituus

eli yhden henkilön tiedot tulevat yhdelle riville. Jos funktiota esim. kutsuttaisiin parametrien arvoilla (\"Kimmo Kimmonen\", 37, 175.5), ohjelma kirjoittaisi tiedoston loppuun rivin

Kimmo Kimmonen;37;175.5

Tiedon käsittely CSV:nä

Tehdään vielä lopuksi ohjelma, joka lukee CSV-tiedostosta opiskelijoiden viikoittaiset kurssipistemäärät ja laskee näiden avulla kurssin arvosanan. Lopuksi ohjelma luo CSV-tiedoston, josta selviää opiskelijan yhteispistemäärä sekä arvosana

Ohjelman lukema CSV-tiedosto näyttää seuraavalta:

Pekka;4;2;3;5;4;0;0\nPaula;7;2;8;3;5;4;5\nPirjo;3;4;3;5;3;4;4\nEmilia;6;6;5;5;0;4;8

Ohjelman logiikka on jaettu kolmeen funktioon. Tiedoston lukeminen tapahtuu samaan tapaan kuin edellisessä aliluvussa: tiedot talletetaan sanakirjaan, jossa avaimena on opiskelijan nimi ja arvona lista viikkopisteistä:

def lue_viikkopisteet(tiedostonimi):\n    viikkopisteet = {}\n    with open(tiedostonimi) as tiedosto:\n        for rivi in tiedosto:\n            osat = rivi.split(\";\")\n            lista = []\n            for pisteet in osat[1:]:\n                lista.append(int(pisteet))\n            viikkopisteet[osat[0]] = lista\n\n    return viikkopisteet

Arvosanojen laskemista varten on tehty oma funktionsa, jota tiedostoon kirjoittava funktio hyödyntää:

def arvosana(pisteet):\n    if pisteet < 20:\n        return 0\n    elif pisteet < 25:\n        return 1\n    elif pisteet < 30:\n        return 2\n    elif pisteet < 35:\n        return 3\n    elif pisteet < 40:\n        return 4\n    else:\n        return 5\n\ndef tallenna_tulokset(tiedostonimi, viikkopisteet):\n    with open(tiedostonimi, \"w\") as tiedosto:\n        for nimi, lista in viikkopisteet.items():\n            summa = sum(lista)\n            tiedosto.write(f\"{nimi};{summa};{arvosana(summa)}\\n\")

Itse \"pääohjelma\" on nyt hyvin yksinkertainen. Huomaa, että luettavan ja kirjoitettavan tiedoston nimet annetaan funktioille parametrina:

viikkopisteet = lue_viikkopisteet(\"viikkopisteet.csv\")\ntallenna_tulokset(\"tulokset.csv\", viikkopisteet)

Suorituksen tuloksena oleva CSV-tiedosto näyttää seuraavalta:

Pekka;18;0\nPaula;34;3\nPirjo;26;2\nEmilia;41;5

Huomaa, miten ohjelma on koostettu suhteellisen yksinkertaisista, vain yhteen asiaan keskittyvistä funktioista. Tämä on yleisesti ottaen suositeltava tapa ohjelmoinnissa, se helpottaa ohjelman toiminnallisuuden varmistamista sekä myöhemmin ohjelmaan tehtävien muutosten sekä laajennusten tekemistä.

Jos esimerkiksi haluaisimme ohjelmaan toiminnallisuuden, joka tulostaa yhden opiskelijan arvosanan, olisi toiminnallisuus helppo koostaa käyttäen apuna jo valmiina olevaa arvosanan laskevaa funktiota:

def hae_arvosana(haettava, viikkopisteet):\n    for nimi, lista in viikkopisteet.items():\n        if nimi == haettava:\n            return arvosana(sum(lista))\n\n\nviikkopisteet = lue_viikkopisteet(\"viikkopisteet.csv\")\nprint(hae_arvosana(\"Paula\", viikkopisteet))\n

3

Jos ohjelmasta halutaan muuttaa tai korjata \"yhtä asiaa\", esimerkiksi arvosanojen pisterajoja, kohdistuu muokkaus hyvin rakennetussa ohjelmassa ainoastaan yhteen tai muutamaan funktioon. Jos sama logiikka, esimerkiksi arvosanan laskeminen, olisi kopioitu useaan paikkaan, kasvaisi riski, että muutoksia ei muistettaisi tehdä kaikkiin oikeisiin paikkoihin.

Laajennetaan vielä hieman aiemmin kurssien tulokset generoivaa sovellusta.

Tällä hetkellä tiedostosta luetaan opiskelijoiden nimet, tehtäväpisteet sekä koepisteet. Laajennetaan ohjelmaa siten, että myös kurssin nimi ja laajuus luetaan tiedostosta, jonka muoto on seuraava (tiedosto on kirjoitettu ilman ääkkösiä, jotta se ei aiheuttaisi ongelmia Windowsissa):

\n\nnimi: Ohjelmoinnin perusteet\nlaajuus opintopisteina: 5\n

Ohjelma luo kaksi tiedostoa. Tiedoston tulos.txt muoto on seuraava:

\nOhjelmoinnin perusteet, 5 opintopistettä\n========================================\nnimi                          teht_lkm  teht_pist koe_pist  yht_pist  arvosana\npekka peloton                 21        5         9         14        0\njaana javanainen              27        6         11        17        1\nliisa virtanen                35        8         14        22        3\n

Tulokset kertova osa on siis samanlainen kuin tehtävän edellisen osan tulostus.

Tämän lisäksi luodaan tiedosto tulos.csv, jonka muoto on seuraava:

\n12345678;pekka peloton;0\n12345687;jaana javanainen;1\n12345699;liisa virtanen;3\n

Ohjelman suoritus näyttää seuraavalta:

opiskelijatiedot: opiskelijat1.csv\ntehtävätiedot: tehtavat1.csv\nkoepisteet: koepisteet1.csv\nkurssin tiedot: kurssi1.txt\nTulokset talletettu tiedostoihin tulos.txt ja tulos.csv

Ohjelma siis ainoastaan kyselee tiedostojen nimet ja varsinaiset tulokset tallennetaan vain tiedostoihin.

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

Tehtäväpohjasta löytyy tiedosto sanat.txt, joka sisältää englanninkielisiä sanoja.

Tehtäväsi on kirjoittaa funktio hae_sanat(hakusana: str), joka palauttaa listana annetun hakusanan mukaiset sanat tiedostosta.

Hakusanassa voi käyttää pienten kirjainten lisäksi seuraavia erikoismerkkejä:

    \n
  • Piste . tarkoittaa, että mikä tahansa merkki käy (esim ca. vastaa vaikkapa sanoja cat ja car, p.ng sanoja ping ja pong ja .a.e sanoja sane, care tai late.
  • \n
  • Asteriski * tarkoittaa, että sanan alku- tai loppuosaksi käy mikä tahansa jono, esim. ca* vastaa vaikkapa sanoja california, cat, caring tai catapult. Vastaavasti hakusana *ane vastaa vaikkapa sanoja crane, insane tai aeroplane. Voit olettaa, että asteriski on aina joko hakusanan alussa tai lopussa, ja että hakusanassa esiintyy korkeintaan yksi asteriski.
  • \n
  • Jos hakusanassa ei ole erikoismerkkejä, haetaan vain täsmälleen hakusanaa vastaava sana.
  • \n

Sovitaan, että samassa hakusanassa ei voi käyttää molempia erikoismerkkejä.

Sanat ovat tiedostossa kokonaan pienillä kirjaimilla kirjoitettuna. Voit myös olettaa, että funktion parametri on annettu kokonaan pienillä kirjaimilla.

Jos yhtään tulosta ei löydy, funktio palauttaa tyhjän listan.

Vinkki: Pythonin merkkijonometodeista startswith() ja endswith() saattaa olla hyötyä tehtävässä, googlaa niiden toiminta tarvittaessa tarkemmin!

Esimerkki funktion kutsumisesta:

\nprint(hae_sanat(\"*vokes\"))\n

['convokes', 'equivokes', 'evokes', 'invokes', 'provokes', 'reinvokes', 'revokes']

Tee sanakirjaa mallintava ohjelma, johon voi syöttää uusia sanoja tai josta voi hakea syötettyjä sanoja.

Ohjelman tulee toimia näin:

1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: 1\nAnna sana suomeksi: auto\nAnna sana englanniksi: car\nSanapari lisätty\n1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: 1\nAnna sana suomeksi: roska\nAnna sana englanniksi: garbage\nSanapari lisätty\n1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: 1\nAnna sana suomeksi: laukku\nAnna sana englanniksi: bag\nSanapari lisätty\n1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: 2\nAnna sana: bag\nroska - garbage\nlaukku - bag\n1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: 2\nAnna sana: car\nauto - car\n1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: 2\nAnna sana: laukku\nlaukku - bag\n1 - Lisää sana, 2 - Hae sanaa, 3 - Poistu\nValinta: 3\nMoi!

Sanat tallennetaan tiedostoon sanakirja.txt. Ohjelma lukee tiedoston sisällön kun se käynnistetään. Uudet sanaparit lisätään tiedostoon aina tallennuksen yhteydessä.

Voit itse päättää tiedostoon tallennettavan tiedon muodon.

Huomaa, että paikallisten TMC-testien ajaminen voi tyhjentää sanakirja-tiedoston.

Huom: tässä tehtävässä (eikä missään muussakaan tehtävissä missä ei erikseen pyydetä funktioiden toteuttamista) mitään koodia ei tule sijoittaa\nif __name__ == \"__main__\"-lohkoon!

","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-6/2-tiedostojen-kirjoittaminen.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-6/3-virheet/page-data.json b/page-data/osa-6/3-virheet/page-data.json index 2d49031ca..86d0560b1 100644 --- a/page-data/osa-6/3-virheet/page-data.json +++ b/page-data/osa-6/3-virheet/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-6/3-virheet", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten virheellisiä syötteitä voidaan käsitellä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä tarkoitetaan poikkeuksella ohjelmoinnissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tunnistat tyypillisiä poikkeuksia Pythonissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käsitellä poikkeuksia omissa ohjelmissa"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmointiin liittyvät virheet voidaan jakaa kahteen ryhmään:"}]},{"type":"element","tagName":"ol","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Syntaksivirheet, jotka estävät ohjelman suorittamisen kokonaan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Suorituksen aikaiset virheet, jotka keskeyttävät ohjelman suorituksen"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ryhmän 1 virheet on yleensä helppoa korjata, koska Python-tulkki huomauttaa niistä, kun ohjelmaa yritetään suorittaa. Tällaisia virheitä ovat esimerkiksi puuttuva kaksoispiste silmukan alussa tai puuttuva lainausmerkki merkkijonon lopussa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ryhmän 2 virheet voivat olla hankalampia havaita, koska virhe voi tapahtua jossain vaiheessa ohjelman suorituksen aikana ja vain tietyissä tilanteissa. Ohjelma saattaa toimia yleensä hyvin mutta keskeytyä virheen takia jossain reunatapauksessa. Keskitymme seuraavaksi tällaisten virheiden käsittelyyn."}]},{"type":"element","tagName":"h2","properties":{"id":"syotteiden-tarkastaminen","style":"position:relative;"},"children":[{"type":"text","value":"Syötteiden tarkastaminen"},{"type":"element","tagName":"a","properties":{"href":"#syotteiden-tarkastaminen","ariaLabel":"syotteiden tarkastaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Usein virhetilanteet ohjelmien suorituksen aikana liittyvät jotenkin virheelliseen syötteeseen. Esimerkkejä virheellisistä syötteistä ovat"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"puuttuvat tai tyhjät arvot: esimerkiksi pituus nolla tai tyhjä merkkijono nimenä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"negatiiviset arvot: esimerkiksi –15 reseptin aineosan painona"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"puuttuva tai väärän niminen tiedosto"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"liian pienet tai liian suuret arvot"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"väärä indeksi (esim. viittaaminen indeksiin 3 merkkijonossa \"moi\")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"väärän tyyppiset arvot, esimerkiksi merkkijono luvun sijasta"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Useimpiin virheistä voidaan onneksi varautua ohjelmallisesti. Tarkastellaan esimerkkinä ohjelmaa, joka lukee käyttäjältä syötteenä tämän iän ja testaa, että se on sallituissa rajoissa (vähintään 0 ja korkeintaan 150):"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna ikäsi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"150"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ikä kelpaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Virheellinen ikä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna ikäsi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"25"}]},{"type":"text","value":"\nIkä kelpaa"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna ikäsi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-3"}]},{"type":"text","value":"\nVirheellinen ikä"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Syötteen tarkastamisessa (eli "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"validoinnissa"}]},{"type":"text","value":") ilmenee kuitenkin puutteita, jos syötteeksi annetaan esimerkiksi merkkijono:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna ikäsi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kakskytkolme"}]},{"type":"text","value":"\nValueError: invalid literal for int() with base 10: 'kakskytkolme'"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Virhe johtuu siitä, että funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"int"}]},{"type":"text","value":" ei pysty muuttamaan merkkijonoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kakskytkolme"}]},{"type":"text","value":" kokonaisluvuksi. Tämän seurauksena ohjelman suoritus keskeytyy yllä olevaan virheilmoitukseen."}]},{"type":"element","tagName":"h2","properties":{"id":"poikkeukset","style":"position:relative;"},"children":[{"type":"text","value":"Poikkeukset"},{"type":"element","tagName":"a","properties":{"href":"#poikkeukset","ariaLabel":"poikkeukset permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suorituksen aikaisia virheitä kutsutaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"poikkeuksiksi"}]},{"type":"text","value":" (exception). Ohjelman koodissa on mahdollista varautua poikkeuksiin ja käsitellä ne ilman, että ohjelman suoritus keskeytyy."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa poikkeukset käsitellään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"try"}]},{"type":"text","value":"- ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":"-lauseilla. Ideana on, että mikäli "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"try"}]},{"type":"text","value":"-lohkossa tapahtuu jokin poikkeus, Python tarkistaa, onko tälle poikkeukselle määritelty "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":"-lohkoa. Mikäli on, suoritetaan tämä lohko ja suoritus jatkuu sen jälkeen normaalisti."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muutetaan edellä esitettyä esimerkkiä siten, että ohjelma varautuu poikkeukseen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ValueError"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"try"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna ikäsi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"150"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ikä kelpaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Virheellinen ikä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna ikäsi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kakskytkolme"}]},{"type":"text","value":"\nVirheellinen ikä"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmassa voidaan siis "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"try"}]},{"type":"text","value":"-lauseella ilmoittaa, että seuraavan lohkon sisällä tapahtuva toiminta voi aiheuttaa virheen. Välittömästi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"try"}]},{"type":"text","value":"-lohkoa seuraavassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":"-lauseessa ilmoitetaan, mihin virheeseen varaudutaan. Edellisessä esimerkissä varauduttiin ainoastaan virheeseen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ValueError"}]},{"type":"text","value":" - jokin muu virhe olisi edelleen katkaissut ohjelman suorituksen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tapauksessa virhetilanteessa muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ika"}]},{"type":"text","value":" saa arvon -1, jolloin ohjelma tunnistaa oikein virheellisen iän, koska ehtona on, että ikä on vähintään 0."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lue_kokonaisluku"}]},{"type":"text","value":" lukee käyttäjältä kokonaisluvun varautuen siihen, että käyttäjä antaa virheellisen syötteen. Funktio kysyy lukua uudestaan niin kauan, kunnes käyttäjä lopulta antaa kelvollisen luvun."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lue_kokonaisluku"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"try"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n syote "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Syötä kokonaisluku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Virheellinen syöte\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue_kokonaisluku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kiitos!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"potenssiin kolme on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luku"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Syötä kokonaisluku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kolme"}]},{"type":"text","value":"\nVirheellinen syöte\nSyötä kokonaisluku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"aybabtu"}]},{"type":"text","value":"\nVirheellinen syöte\nSyötä kokonaisluku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nKiitos!\n5 potenssiin kolme on 125"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joissain tilanteissa saattaa olla tarvetta varautua poikkeukseen, mutta poikkeuksen tapahtuessa riittää \"ignoorata\" se, eli jättää koko asia huomiomatta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":"-lohkossa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos muuttaisimme edellistä esimerkkiä siten, että funktio hyväksyisi ainoastaan lukua 100 pienemmät kokonaisluvut, voisimme muuttaa toteutusta seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lue_pieni_kokonaisluku"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"try"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n syote "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Syötä kokonaisluku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" luku\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tämä komento ei tee mitään"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Virheellinen syöte\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue_pieni_kokonaisluku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"potenssiin kolme on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luku"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Syötä kokonaisluku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kolme"}]},{"type":"text","value":"\nVirheellinen syöte\nSyötä kokonaisluku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1000"}]},{"type":"text","value":"\nVirheellinen syöte\nSyötä kokonaisluku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nKiitos!\n5 potenssiin kolme on 125"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt siis poikkeuksen käsittelevässä lohkossa on ainoastaan komento "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pass"}]},{"type":"text","value":", joka ei tee mitään. Komento tarvitaan, sillä Python ei salli tyhjiä lohkoja."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Syötteen luku","tmcname":"osa06-17_syotteen_luku"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lue"}]},{"type":"text","value":", joka kysyy käyttäjältä syötettä, kunnes se on parametrien määrittelemällä välillä oleva kokonaisluku. Funktio palauttaa käyttäjän antaman syötteen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"syötä luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"syötit luvun:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"syötä luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"seitsemän"}]},{"type":"text","value":"\nSyötteen on oltava kokonaisluku väliltä 5...10\nsyötä luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-3"}]},{"type":"text","value":"\nSyötteen on oltava kokonaisluku väliltä 5...10\nsyötä luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"8"}]},{"type":"text","value":"\nsyötit luvun: 8"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"tyypillisia-virheita","style":"position:relative;"},"children":[{"type":"text","value":"Tyypillisiä virheitä"},{"type":"element","tagName":"a","properties":{"href":"#tyypillisia-virheita","ariaLabel":"tyypillisia virheita permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on listattu joitakin yleisiä virheitä ja syitä niiden ilmenemiselle:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ValueError"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä poikkeus voi johtua siitä, että funktion parametri on vääränlainen. Esimerkiksi kutsu "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"float(\"1,23\")"}]},{"type":"text","value":" tuottaa tämän poikkeuksen, koska Pythonissa desimaalierottimen tulee olla piste eikä pilkku."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"TypeError"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä poikkeus tapahtuu, kun arvo on väärän tyyppinen. Esimerkiksi kutsu "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"len(10)"}]},{"type":"text","value":" saa aikaan tämän poikkeuksen, koska funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"len"}]},{"type":"text","value":" haluaa parametrin, jolle voidaan laskea pituus (kuten merkkijonon tai listan)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"IndexError"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä poikkeus tapahtuu, jos yritetään viitata indeksiin, jota ei ole olemassa. Esimerkiksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"abc\"[5]"}]},{"type":"text","value":" aiheuttaa tämän poikkeuksen, koska merkkijonossa ei ole indeksiä 5."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ZeroDivisionError"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä poikkeus tapahtuu, jos yritetään jakaa nollalla. Yksi esimerkki on tilanne, jossa yritetään laskea listan arvojen keskiarvo kaavalla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sum(lista) / len(lista)"}]},{"type":"text","value":", mutta listan pituus on nolla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Tiedostojen poikkeukset"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedostojen käsittelyssä voi tulla vastaan esimerkiksi poikkeukset "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"FileNotFoundError"}]},{"type":"text","value":" (koetetaan lukea tiedostoa, jota ei ole olemassa), "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"io.UnsupportedOperation"}]},{"type":"text","value":" (tiedosto on avattu tilassa, joka ei salli operaatiota) tai "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"PermissionError"}]},{"type":"text","value":" (ohjelmalla ei ole oikeutta käsitellä tiedostoa)."}]},{"type":"element","tagName":"h2","properties":{"id":"useamman-poikkeuksen-kasittely","style":"position:relative;"},"children":[{"type":"text","value":"Useamman poikkeuksen käsittely"},{"type":"element","tagName":"a","properties":{"href":"#useamman-poikkeuksen-kasittely","ariaLabel":"useamman poikkeuksen kasittely permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yhtä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"try"}]},{"type":"text","value":"-lohkoa kohti voi olla useampia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":"-lauseita. Esimerkiksi seuraavassa ohjelmassa varaudutaan sekä poikkeukseen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"FileNotFoundException"}]},{"type":"text","value":" että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"PermissionError"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"try"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"esimerkki.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":" FileNotFoundError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tiedostoa esimerkki.txt ei löytynyt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":" PermissionError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ei oikeutta avata tiedostoa esimerkki.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aina ei ole tarpeen eritellä tapahtuneita virheitä. Esimerkiksi juuri tiedostoa avatessa saattaa riittää, että tiedetään virheen tapahtuneen, muttei ole niin tärkeää tietää, miksi virhe tapahtui. Kaikki mahdolliset virheet voi käsitellä käyttämällä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":"-lausetta määrittelemättä poikkeuksen tyyppiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"try"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"esimerkki.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"except"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tapahtui virhe tiedoston lukemisessa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että tällaisessa tapauksessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":"-lause käsittelee kaikki mahdolliset virheet, myös ohjelmoijan tekemät virheet lukuun ottamatta syntaksivirheitä, jotka estävät ohjelman suorittamisen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraava ohjelma heittää aina poikkeuksen, koska muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tiedosto"}]},{"type":"text","value":" nimi on kirjoitettu toisessa kohdassa väärin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tiedotso"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"try"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"esimerkki.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedotso"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"except"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tapahtui virhe tiedoston lukemisessa.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tästä näkee, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":" voi peittää varsinaisen virheen: tässä tapauksessa virheen syynä ei ole tiedoston käsittely vaan väärin kirjoitettu muuttuja."}]},{"type":"element","tagName":"h2","properties":{"id":"poikkeusten-valittyminen","style":"position:relative;"},"children":[{"type":"text","value":"Poikkeusten välittyminen"},{"type":"element","tagName":"a","properties":{"href":"#poikkeusten-valittyminen","ariaLabel":"poikkeusten valittyminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos funktion sisällä tapahtuu poikkeus, jota ei käsitellä, poikkeus välitetään funktion kutsujalle. Tätä jatketaan, kunnes ollaan pääohjelman tasolla. Jos poikkeusta ei tässäkään käsitellä sopivalla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":"-lauseella, ohjelman suoritus katkeaa ja poikkeus yleensä tulostetaan ruudulle."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraavassa ohjelmassa funktiossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"testi"}]},{"type":"text","value":" tapahtuva poikkeus käsitellään vasta pääohjelmassa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"testi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"try"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n testi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"except"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jotain meni pieleen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kolme"}]},{"type":"text","value":"\nJotain meni pieleen"}]}]},{"type":"element","tagName":"h2","properties":{"id":"poikkeusten-tuottaminen","style":"position:relative;"},"children":[{"type":"text","value":"Poikkeusten tuottaminen"},{"type":"element","tagName":"a","properties":{"href":"#poikkeusten-tuottaminen","ariaLabel":"poikkeusten tuottaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme myös tarvittaessa tuottaa poikkeuksen itse komennolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":". Vaikka virheiden tuottaminen varta vasten voi aluksi tuntua oudolta ajatukselta, mekanismi on itse asiassa hyvinkin hyödyllinen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi jos teemme funktion, jolle annetaan virheellinen parametri, voimme ilmaista tämän poikkeuksen avulla. Tämä voi olla parempi tapa kuin esimerkiksi palauttaa jokin virhearvo tai tulostaa viesti ruudulle, koska funktion käyttäjä ei välttämättä huomaisi asiaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa esimerkissä funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kertoma"}]},{"type":"text","value":" laskee parametrina annetun luvun kertoman (esimerkiksi luvun 5 kertoma on 1 * 2 * 3 * 4 * 5). Kuitenkin jos annettu luku on negatiivinen, funktio tuottaa poikkeuksen."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kertoma"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Negatiivinen syöte: \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*="}]},{"type":"text","value":" i\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" k\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kertoma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kertoma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kertoma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"text","value":"6\n720\nTraceback (most recent call last):\nFile \"testi.py\", line 11, in "},{"type":"element","tagName":"module","properties":{},"children":[{"type":"text","value":"\nprint(kertoma(-1))\nFile \"testi.py\", line 3, in kertoma\nraise ValueError(\"Negatiivinen syöte: \" + str(n))\nValueError: Negatiivinen syöte: -1"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Parametrien validointi ","tmcname":"osa06-18_parametrien_validointi"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"uusi_henkilo(nimi: str, ika: int)"}]},{"type":"text","value":", joka luo ja palauttaa uuden henkilö-tuplen. Tuplessa ensimmäinen alkio on nimi ja jälkimmäinen ikä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos funktion parametrit ovat virheelliset, sen tulee tuplen palauttamisen sijasta tuottaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ValueError"}]},{"type":"text","value":"-poikkeus."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Virheellisiä parametreja tässä tapauksessa ovat:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"nimi on tyhjä merkkijono"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"nimi ei koostu vähintään kahdesta sanasta"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"nimen pituus on yli 40 merkkiä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"ikä on negatiivinen luku"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"ikä on suurempi kuin 150"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Virheelliset lottonumerot","tmcname":"osa06-19_virheelliset_lottonumerot"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedostoon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lottonumerot.csv"}]},{"type":"text","value":" on tallennettu lottonumeroita seuraavan esimerkin mukaisesti:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"viikko 1;5,7,11,13,23,24,30\nviikko 2;9,13,14,24,34,35,37\n...jne..."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aluksi pitäisi olla siis otsikko "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viikko x"}]},{"type":"text","value":", ja sen jälkeen seitsemän numeroa väliltä 1...39."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedosto on kuitenkin osittain korruptoitunut. Seuraavat rivit ovat esimerkkejä virheellisistä riveistä (huomaa, että tehtäväpohjassa olevassa tiedostossa ei ole juuri näitä virheitä):"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Viikkonumero pielessä:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"viikko zzc;1,5,13,22,24,25,26"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Numero tai numeroita pielessä:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"viikko 22;1,**,5,6,13,2b,34"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Liian vähän numeroita:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"viikko 13;4,6,17,19,24,33"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Liian pieniä tai suuria numeroita:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"viikko 39;5,9,15,35,39,41,105"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rivissä esiintyy sama numero kahdesti:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"viikko 41;5,12,3,35,12,14,36"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suodata_virheelliset()"}]},{"type":"text","value":", joka luo tiedoston "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"korjatut_numerot.csv"}]},{"type":"text","value":". Tiedostoon on kopioitu kelvolliset rivit alkuperäisestä tiedostosta."}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, miten virheellisiä syötteitä voidaan käsitellä
  • \n
  • Tiedät, mitä tarkoitetaan poikkeuksella ohjelmoinnissa
  • \n
  • Tunnistat tyypillisiä poikkeuksia Pythonissa
  • \n
  • Osaat käsitellä poikkeuksia omissa ohjelmissa
  • \n

Ohjelmointiin liittyvät virheet voidaan jakaa kahteen ryhmään:

    \n
  1. Syntaksivirheet, jotka estävät ohjelman suorittamisen kokonaan
  2. \n
  3. Suorituksen aikaiset virheet, jotka keskeyttävät ohjelman suorituksen
  4. \n

Ryhmän 1 virheet on yleensä helppoa korjata, koska Python-tulkki huomauttaa niistä, kun ohjelmaa yritetään suorittaa. Tällaisia virheitä ovat esimerkiksi puuttuva kaksoispiste silmukan alussa tai puuttuva lainausmerkki merkkijonon lopussa.

Ryhmän 2 virheet voivat olla hankalampia havaita, koska virhe voi tapahtua jossain vaiheessa ohjelman suorituksen aikana ja vain tietyissä tilanteissa. Ohjelma saattaa toimia yleensä hyvin mutta keskeytyä virheen takia jossain reunatapauksessa. Keskitymme seuraavaksi tällaisten virheiden käsittelyyn.

Syötteiden tarkastaminen

Usein virhetilanteet ohjelmien suorituksen aikana liittyvät jotenkin virheelliseen syötteeseen. Esimerkkejä virheellisistä syötteistä ovat

    \n
  • puuttuvat tai tyhjät arvot: esimerkiksi pituus nolla tai tyhjä merkkijono nimenä
  • \n
  • negatiiviset arvot: esimerkiksi –15 reseptin aineosan painona
  • \n
  • puuttuva tai väärän niminen tiedosto
  • \n
  • liian pienet tai liian suuret arvot
  • \n
  • väärä indeksi (esim. viittaaminen indeksiin 3 merkkijonossa \"moi\")
  • \n
  • väärän tyyppiset arvot, esimerkiksi merkkijono luvun sijasta
  • \n

Useimpiin virheistä voidaan onneksi varautua ohjelmallisesti. Tarkastellaan esimerkkinä ohjelmaa, joka lukee käyttäjältä syötteenä tämän iän ja testaa, että se on sallituissa rajoissa (vähintään 0 ja korkeintaan 150):

ika = int(input(\"Anna ikäsi: \"))\nif ika >= 0 and ika <= 150:\n    print(\"Ikä kelpaa\")\nelse:\n    print(\"Virheellinen ikä\")

Anna ikäsi: 25\nIkä kelpaa

Anna ikäsi: -3\nVirheellinen ikä

Syötteen tarkastamisessa (eli validoinnissa) ilmenee kuitenkin puutteita, jos syötteeksi annetaan esimerkiksi merkkijono:

Anna ikäsi: kakskytkolme\nValueError: invalid literal for int() with base 10: 'kakskytkolme'

Virhe johtuu siitä, että funktio int ei pysty muuttamaan merkkijonoa kakskytkolme kokonaisluvuksi. Tämän seurauksena ohjelman suoritus keskeytyy yllä olevaan virheilmoitukseen.

Poikkeukset

Ohjelman suorituksen aikaisia virheitä kutsutaan poikkeuksiksi (exception). Ohjelman koodissa on mahdollista varautua poikkeuksiin ja käsitellä ne ilman, että ohjelman suoritus keskeytyy.

Pythonissa poikkeukset käsitellään try- ja except-lauseilla. Ideana on, että mikäli try-lohkossa tapahtuu jokin poikkeus, Python tarkistaa, onko tälle poikkeukselle määritelty except-lohkoa. Mikäli on, suoritetaan tämä lohko ja suoritus jatkuu sen jälkeen normaalisti.

Muutetaan edellä esitettyä esimerkkiä siten, että ohjelma varautuu poikkeukseen ValueError:

try:\n    ika = int(input(\"Anna ikäsi: \"))\nexcept ValueError:\n    ika = -1\n\nif ika >= 0 and ika <= 150:\n    print(\"Ikä kelpaa\")\nelse:\n    print(\"Virheellinen ikä\")

Anna ikäsi: kakskytkolme\nVirheellinen ikä

Ohjelmassa voidaan siis try-lauseella ilmoittaa, että seuraavan lohkon sisällä tapahtuva toiminta voi aiheuttaa virheen. Välittömästi try-lohkoa seuraavassa except-lauseessa ilmoitetaan, mihin virheeseen varaudutaan. Edellisessä esimerkissä varauduttiin ainoastaan virheeseen ValueError - jokin muu virhe olisi edelleen katkaissut ohjelman suorituksen.

Tässä tapauksessa virhetilanteessa muuttuja ika saa arvon -1, jolloin ohjelma tunnistaa oikein virheellisen iän, koska ehtona on, että ikä on vähintään 0.

Seuraava funktio lue_kokonaisluku lukee käyttäjältä kokonaisluvun varautuen siihen, että käyttäjä antaa virheellisen syötteen. Funktio kysyy lukua uudestaan niin kauan, kunnes käyttäjä lopulta antaa kelvollisen luvun.

def lue_kokonaisluku():\n    while True:\n        try:\n            syote = input(\"Syötä kokonaisluku: \")\n            return int(syote)\n        except ValueError:\n            print(\"Virheellinen syöte\")\n\nluku = lue_kokonaisluku()\nprint(\"Kiitos!\")\nprint(luku, \"potenssiin kolme on\", luku**3)

Syötä kokonaisluku: kolme\nVirheellinen syöte\nSyötä kokonaisluku: aybabtu\nVirheellinen syöte\nSyötä kokonaisluku: 5\nKiitos!\n5 potenssiin kolme on 125

Joissain tilanteissa saattaa olla tarvetta varautua poikkeukseen, mutta poikkeuksen tapahtuessa riittää \"ignoorata\" se, eli jättää koko asia huomiomatta except-lohkossa.

Jos muuttaisimme edellistä esimerkkiä siten, että funktio hyväksyisi ainoastaan lukua 100 pienemmät kokonaisluvut, voisimme muuttaa toteutusta seuraavasti:

def lue_pieni_kokonaisluku():\n    while True:\n        try:\n            syote = input(\"Syötä kokonaisluku: \")\n            luku = int(syote)\n            if luku < 100:\n                return luku\n        except ValueError:\n            pass # tämä komento ei tee mitään\n\n        print(\"Virheellinen syöte\")\n\nluku = lue_pieni_kokonaisluku()\nprint(luku, \"potenssiin kolme on\", luku**3)

Syötä kokonaisluku: kolme\nVirheellinen syöte\nSyötä kokonaisluku: 1000\nVirheellinen syöte\nSyötä kokonaisluku: 5\nKiitos!\n5 potenssiin kolme on 125

Nyt siis poikkeuksen käsittelevässä lohkossa on ainoastaan komento pass, joka ei tee mitään. Komento tarvitaan, sillä Python ei salli tyhjiä lohkoja.

Tee funktio lue, joka kysyy käyttäjältä syötettä, kunnes se on parametrien määrittelemällä välillä oleva kokonaisluku. Funktio palauttaa käyttäjän antaman syötteen.

Funktio toimii seuraavasti:

luku = lue(\"syötä luku: \", 5, 10)\nprint(\"syötit luvun:\", luku)

syötä luku: seitsemän\nSyötteen on oltava kokonaisluku väliltä 5...10\nsyötä luku: -3\nSyötteen on oltava kokonaisluku väliltä 5...10\nsyötä luku: 8\nsyötit luvun: 8

Tyypillisiä virheitä

Seuraavassa on listattu joitakin yleisiä virheitä ja syitä niiden ilmenemiselle:

ValueError

Tämä poikkeus voi johtua siitä, että funktion parametri on vääränlainen. Esimerkiksi kutsu float(\"1,23\") tuottaa tämän poikkeuksen, koska Pythonissa desimaalierottimen tulee olla piste eikä pilkku.

TypeError

Tämä poikkeus tapahtuu, kun arvo on väärän tyyppinen. Esimerkiksi kutsu len(10) saa aikaan tämän poikkeuksen, koska funktio len haluaa parametrin, jolle voidaan laskea pituus (kuten merkkijonon tai listan).

IndexError

Tämä poikkeus tapahtuu, jos yritetään viitata indeksiin, jota ei ole olemassa. Esimerkiksi \"abc\"[5] aiheuttaa tämän poikkeuksen, koska merkkijonossa ei ole indeksiä 5.

ZeroDivisionError

Tämä poikkeus tapahtuu, jos yritetään jakaa nollalla. Yksi esimerkki on tilanne, jossa yritetään laskea listan arvojen keskiarvo kaavalla sum(lista) / len(lista), mutta listan pituus on nolla.

Tiedostojen poikkeukset

Tiedostojen käsittelyssä voi tulla vastaan esimerkiksi poikkeukset FileNotFoundError (koetetaan lukea tiedostoa, jota ei ole olemassa), io.UnsupportedOperation (tiedosto on avattu tilassa, joka ei salli operaatiota) tai PermissionError (ohjelmalla ei ole oikeutta käsitellä tiedostoa).

Useamman poikkeuksen käsittely

Yhtä try-lohkoa kohti voi olla useampia except-lauseita. Esimerkiksi seuraavassa ohjelmassa varaudutaan sekä poikkeukseen FileNotFoundException että PermissionError:

try:\n    with open(\"esimerkki.txt\") as tiedosto:\n        for rivi in tiedosto:\n            print(rivi)\nexcept FileNotFoundError:\n    print(\"Tiedostoa esimerkki.txt ei löytynyt\")\nexcept PermissionError:\n    print(\"Ei oikeutta avata tiedostoa esimerkki.txt\")

Aina ei ole tarpeen eritellä tapahtuneita virheitä. Esimerkiksi juuri tiedostoa avatessa saattaa riittää, että tiedetään virheen tapahtuneen, muttei ole niin tärkeää tietää, miksi virhe tapahtui. Kaikki mahdolliset virheet voi käsitellä käyttämällä except-lausetta määrittelemättä poikkeuksen tyyppiä:

\ntry:\n    with open(\"esimerkki.txt\") as tiedosto:\n        for rivi in tiedosto:\n            print(rivi)\nexcept:\n    print(\"Tapahtui virhe tiedoston lukemisessa\")\n

Huomaa, että tällaisessa tapauksessa except-lause käsittelee kaikki mahdolliset virheet, myös ohjelmoijan tekemät virheet lukuun ottamatta syntaksivirheitä, jotka estävät ohjelman suorittamisen.

Esimerkiksi seuraava ohjelma heittää aina poikkeuksen, koska muuttujan tiedosto nimi on kirjoitettu toisessa kohdassa väärin tiedotso.

try:\n    with open(\"esimerkki.txt\") as tiedosto:\n        for rivi in tiedotso:\n            print(rivi)\nexcept:\n    print(\"Tapahtui virhe tiedoston lukemisessa.\")

Tästä näkee, että except voi peittää varsinaisen virheen: tässä tapauksessa virheen syynä ei ole tiedoston käsittely vaan väärin kirjoitettu muuttuja.

Poikkeusten välittyminen

Jos funktion sisällä tapahtuu poikkeus, jota ei käsitellä, poikkeus välitetään funktion kutsujalle. Tätä jatketaan, kunnes ollaan pääohjelman tasolla. Jos poikkeusta ei tässäkään käsitellä sopivalla except-lauseella, ohjelman suoritus katkeaa ja poikkeus yleensä tulostetaan ruudulle.

Esimerkiksi seuraavassa ohjelmassa funktiossa testi tapahtuva poikkeus käsitellään vasta pääohjelmassa:

def testi(x):\n    print(int(x) + 1)\n\ntry:\n    luku = input(\"Anna luku: \")\n    testi(luku)\nexcept:\n    print(\"Jotain meni pieleen\")

Anna luku: kolme\nJotain meni pieleen

Poikkeusten tuottaminen

Voimme myös tarvittaessa tuottaa poikkeuksen itse komennolla raise. Vaikka virheiden tuottaminen varta vasten voi aluksi tuntua oudolta ajatukselta, mekanismi on itse asiassa hyvinkin hyödyllinen.

Esimerkiksi jos teemme funktion, jolle annetaan virheellinen parametri, voimme ilmaista tämän poikkeuksen avulla. Tämä voi olla parempi tapa kuin esimerkiksi palauttaa jokin virhearvo tai tulostaa viesti ruudulle, koska funktion käyttäjä ei välttämättä huomaisi asiaa.

Seuraavassa esimerkissä funktio kertoma laskee parametrina annetun luvun kertoman (esimerkiksi luvun 5 kertoma on 1 * 2 * 3 * 4 * 5). Kuitenkin jos annettu luku on negatiivinen, funktio tuottaa poikkeuksen.

def kertoma(n):\n    if n < 0:\n        raise ValueError(\"Negatiivinen syöte: \" + str(n))\n    k = 1\n    for i in range(2, n + 1):\n        k *= i\n    return k\n\nprint(kertoma(3))\nprint(kertoma(6))\nprint(kertoma(-1))
6\n720\nTraceback (most recent call last):\nFile \"testi.py\", line 11, in \nprint(kertoma(-1))\nFile \"testi.py\", line 3, in kertoma\nraise ValueError(\"Negatiivinen syöte: \" + str(n))\nValueError: Negatiivinen syöte: -1

Kirjoita funktio uusi_henkilo(nimi: str, ika: int), joka luo ja palauttaa uuden henkilö-tuplen. Tuplessa ensimmäinen alkio on nimi ja jälkimmäinen ikä.

Jos funktion parametrit ovat virheelliset, sen tulee tuplen palauttamisen sijasta tuottaa ValueError-poikkeus.

Virheellisiä parametreja tässä tapauksessa ovat:

    \n
  • nimi on tyhjä merkkijono
  • \n
  • nimi ei koostu vähintään kahdesta sanasta
  • \n
  • nimen pituus on yli 40 merkkiä
  • \n
  • ikä on negatiivinen luku
  • \n
  • ikä on suurempi kuin 150
  • \n

Tiedostoon lottonumerot.csv on tallennettu lottonumeroita seuraavan esimerkin mukaisesti:

viikko 1;5,7,11,13,23,24,30\nviikko 2;9,13,14,24,34,35,37\n...jne...

Aluksi pitäisi olla siis otsikko viikko x, ja sen jälkeen seitsemän numeroa väliltä 1...39.

Tiedosto on kuitenkin osittain korruptoitunut. Seuraavat rivit ovat esimerkkejä virheellisistä riveistä (huomaa, että tehtäväpohjassa olevassa tiedostossa ei ole juuri näitä virheitä):

Viikkonumero pielessä:

viikko zzc;1,5,13,22,24,25,26

Numero tai numeroita pielessä:

viikko 22;1,**,5,6,13,2b,34

Liian vähän numeroita:

viikko 13;4,6,17,19,24,33

Liian pieniä tai suuria numeroita:

viikko 39;5,9,15,35,39,41,105

Rivissä esiintyy sama numero kahdesti:

viikko 41;5,12,3,35,12,14,36

Kirjoita funktio suodata_virheelliset(), joka luo tiedoston korjatut_numerot.csv. Tiedostoon on kopioitu kelvolliset rivit alkuperäisestä tiedostosta.

","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-6/3-virheet.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten virheellisiä syötteitä voidaan käsitellä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä tarkoitetaan poikkeuksella ohjelmoinnissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tunnistat tyypillisiä poikkeuksia Pythonissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käsitellä poikkeuksia omissa ohjelmissa"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmointiin liittyvät virheet voidaan jakaa kahteen ryhmään:"}]},{"type":"element","tagName":"ol","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Syntaksivirheet, jotka estävät ohjelman suorittamisen kokonaan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Suorituksen aikaiset virheet, jotka keskeyttävät ohjelman suorituksen"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ryhmän 1 virheet on yleensä helppoa korjata, koska Python-tulkki huomauttaa niistä, kun ohjelmaa yritetään suorittaa. Tällaisia virheitä ovat esimerkiksi puuttuva kaksoispiste silmukan alussa tai puuttuva lainausmerkki merkkijonon lopussa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ryhmän 2 virheet voivat olla hankalampia havaita, koska virhe voi tapahtua jossain vaiheessa ohjelman suorituksen aikana ja vain tietyissä tilanteissa. Ohjelma saattaa toimia yleensä hyvin mutta keskeytyä virheen takia jossain reunatapauksessa. Keskitymme seuraavaksi tällaisten virheiden käsittelyyn."}]},{"type":"element","tagName":"h2","properties":{"id":"syotteiden-tarkastaminen","style":"position:relative;"},"children":[{"type":"text","value":"Syötteiden tarkastaminen"},{"type":"element","tagName":"a","properties":{"href":"#syotteiden-tarkastaminen","ariaLabel":"syotteiden tarkastaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Usein virhetilanteet ohjelmien suorituksen aikana liittyvät jotenkin virheelliseen syötteeseen. Esimerkkejä virheellisistä syötteistä ovat"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"puuttuvat tai tyhjät arvot: esimerkiksi pituus nolla tai tyhjä merkkijono nimenä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"negatiiviset arvot: esimerkiksi –15 reseptin aineosan painona"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"puuttuva tai väärän niminen tiedosto"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"liian pienet tai liian suuret arvot"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"väärä indeksi (esim. viittaaminen indeksiin 3 merkkijonossa \"moi\")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"väärän tyyppiset arvot, esimerkiksi merkkijono luvun sijasta"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Useimpiin virheistä voidaan onneksi varautua ohjelmallisesti. Tarkastellaan esimerkkinä ohjelmaa, joka lukee käyttäjältä syötteenä tämän iän ja testaa, että se on sallituissa rajoissa (vähintään 0 ja korkeintaan 150):"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna ikäsi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"150"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ikä kelpaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Virheellinen ikä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna ikäsi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"25"}]},{"type":"text","value":"\nIkä kelpaa"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna ikäsi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-3"}]},{"type":"text","value":"\nVirheellinen ikä"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Syötteen tarkastamisessa (eli "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"validoinnissa"}]},{"type":"text","value":") ilmenee kuitenkin puutteita, jos syötteeksi annetaan esimerkiksi merkkijono:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna ikäsi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kakskytkolme"}]},{"type":"text","value":"\nValueError: invalid literal for int() with base 10: 'kakskytkolme'"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Virhe johtuu siitä, että funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"int"}]},{"type":"text","value":" ei pysty muuttamaan merkkijonoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kakskytkolme"}]},{"type":"text","value":" kokonaisluvuksi. Tämän seurauksena ohjelman suoritus keskeytyy yllä olevaan virheilmoitukseen."}]},{"type":"element","tagName":"h2","properties":{"id":"poikkeukset","style":"position:relative;"},"children":[{"type":"text","value":"Poikkeukset"},{"type":"element","tagName":"a","properties":{"href":"#poikkeukset","ariaLabel":"poikkeukset permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman suorituksen aikaisia virheitä kutsutaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"poikkeuksiksi"}]},{"type":"text","value":" (exception). Ohjelman koodissa on mahdollista varautua poikkeuksiin ja käsitellä ne ilman, että ohjelman suoritus keskeytyy."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa poikkeukset käsitellään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"try"}]},{"type":"text","value":"- ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":"-lauseilla. Ideana on, että mikäli "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"try"}]},{"type":"text","value":"-lohkossa tapahtuu jokin poikkeus, Python tarkistaa, onko tälle poikkeukselle määritelty "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":"-lohkoa. Mikäli on, suoritetaan tämä lohko ja suoritus jatkuu sen jälkeen normaalisti."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muutetaan edellä esitettyä esimerkkiä siten, että ohjelma varautuu poikkeukseen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ValueError"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"try"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna ikäsi: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" ika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"150"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ikä kelpaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Virheellinen ikä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna ikäsi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kakskytkolme"}]},{"type":"text","value":"\nVirheellinen ikä"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmassa voidaan siis "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"try"}]},{"type":"text","value":"-lauseella ilmoittaa, että seuraavan lohkon sisällä tapahtuva toiminta voi aiheuttaa virheen. Välittömästi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"try"}]},{"type":"text","value":"-lohkoa seuraavassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":"-lauseessa ilmoitetaan, mihin virheeseen varaudutaan. Edellisessä esimerkissä varauduttiin ainoastaan virheeseen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ValueError"}]},{"type":"text","value":" - jokin muu virhe olisi edelleen katkaissut ohjelman suorituksen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tapauksessa virhetilanteessa muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ika"}]},{"type":"text","value":" saa arvon -1, jolloin ohjelma tunnistaa oikein virheellisen iän, koska ehtona on, että ikä on vähintään 0."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lue_kokonaisluku"}]},{"type":"text","value":" lukee käyttäjältä kokonaisluvun varautuen siihen, että käyttäjä antaa virheellisen syötteen. Funktio kysyy lukua uudestaan niin kauan, kunnes käyttäjä lopulta antaa kelvollisen luvun."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lue_kokonaisluku"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"try"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n syote "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Syötä kokonaisluku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Virheellinen syöte\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue_kokonaisluku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kiitos!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"potenssiin kolme on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luku"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Syötä kokonaisluku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kolme"}]},{"type":"text","value":"\nVirheellinen syöte\nSyötä kokonaisluku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"aybabtu"}]},{"type":"text","value":"\nVirheellinen syöte\nSyötä kokonaisluku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nKiitos!\n5 potenssiin kolme on 125"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joissain tilanteissa saattaa olla tarvetta varautua poikkeukseen, mutta poikkeuksen tapahtuessa riittää \"ignoorata\" se, eli jättää koko asia huomiomatta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":"-lohkossa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos muuttaisimme edellistä esimerkkiä siten, että funktio hyväksyisi ainoastaan lukua 100 pienemmät kokonaisluvut, voisimme muuttaa toteutusta seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lue_pieni_kokonaisluku"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"try"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n syote "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Syötä kokonaisluku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" luku\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tämä komento ei tee mitään"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Virheellinen syöte\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue_pieni_kokonaisluku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"potenssiin kolme on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luku"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Syötä kokonaisluku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kolme"}]},{"type":"text","value":"\nVirheellinen syöte\nSyötä kokonaisluku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1000"}]},{"type":"text","value":"\nVirheellinen syöte\nSyötä kokonaisluku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nKiitos!\n5 potenssiin kolme on 125"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt siis poikkeuksen käsittelevässä lohkossa on ainoastaan komento "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pass"}]},{"type":"text","value":", joka ei tee mitään. Komento tarvitaan, sillä Python ei salli tyhjiä lohkoja."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Syötteen luku","tmcname":"osa06-17_syotteen_luku"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lue"}]},{"type":"text","value":", joka kysyy käyttäjältä syötettä, kunnes se on parametrien määrittelemällä välillä oleva kokonaisluku. Funktio palauttaa käyttäjän antaman syötteen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"syötä luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"syötit luvun:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"syötä luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"seitsemän"}]},{"type":"text","value":"\nSyötteen on oltava kokonaisluku väliltä 5...10\nsyötä luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-3"}]},{"type":"text","value":"\nSyötteen on oltava kokonaisluku väliltä 5...10\nsyötä luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"8"}]},{"type":"text","value":"\nsyötit luvun: 8"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"tyypillisia-virheita","style":"position:relative;"},"children":[{"type":"text","value":"Tyypillisiä virheitä"},{"type":"element","tagName":"a","properties":{"href":"#tyypillisia-virheita","ariaLabel":"tyypillisia virheita permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on listattu joitakin yleisiä virheitä ja syitä niiden ilmenemiselle:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ValueError"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä poikkeus voi johtua siitä, että funktion parametri on vääränlainen. Esimerkiksi kutsu "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"float(\"1,23\")"}]},{"type":"text","value":" tuottaa tämän poikkeuksen, koska Pythonissa desimaalierottimen tulee olla piste eikä pilkku."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"TypeError"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä poikkeus tapahtuu, kun arvo on väärän tyyppinen. Esimerkiksi kutsu "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"len(10)"}]},{"type":"text","value":" saa aikaan tämän poikkeuksen, koska funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"len"}]},{"type":"text","value":" haluaa parametrin, jolle voidaan laskea pituus (kuten merkkijonon tai listan)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"IndexError"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä poikkeus tapahtuu, jos yritetään viitata indeksiin, jota ei ole olemassa. Esimerkiksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"abc\"[5]"}]},{"type":"text","value":" aiheuttaa tämän poikkeuksen, koska merkkijonossa ei ole indeksiä 5."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ZeroDivisionError"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä poikkeus tapahtuu, jos yritetään jakaa nollalla. Yksi esimerkki on tilanne, jossa yritetään laskea listan arvojen keskiarvo kaavalla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sum(lista) / len(lista)"}]},{"type":"text","value":", mutta listan pituus on nolla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Tiedostojen poikkeukset"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedostojen käsittelyssä voi tulla vastaan esimerkiksi poikkeukset "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"FileNotFoundError"}]},{"type":"text","value":" (koetetaan lukea tiedostoa, jota ei ole olemassa), "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"io.UnsupportedOperation"}]},{"type":"text","value":" (tiedosto on avattu tilassa, joka ei salli operaatiota) tai "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"PermissionError"}]},{"type":"text","value":" (ohjelmalla ei ole oikeutta käsitellä tiedostoa)."}]},{"type":"element","tagName":"h2","properties":{"id":"useamman-poikkeuksen-kasittely","style":"position:relative;"},"children":[{"type":"text","value":"Useamman poikkeuksen käsittely"},{"type":"element","tagName":"a","properties":{"href":"#useamman-poikkeuksen-kasittely","ariaLabel":"useamman poikkeuksen kasittely permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yhtä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"try"}]},{"type":"text","value":"-lohkoa kohti voi olla useampia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":"-lauseita. Esimerkiksi seuraavassa ohjelmassa varaudutaan sekä poikkeukseen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"FileNotFoundException"}]},{"type":"text","value":" että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"PermissionError"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"try"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"esimerkki.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":" FileNotFoundError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tiedostoa esimerkki.txt ei löytynyt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":" PermissionError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ei oikeutta avata tiedostoa esimerkki.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aina ei ole tarpeen eritellä tapahtuneita virheitä. Esimerkiksi juuri tiedostoa avatessa saattaa riittää, että tiedetään virheen tapahtuneen, muttei ole niin tärkeää tietää, miksi virhe tapahtui. Kaikki mahdolliset virheet voi käsitellä käyttämällä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":"-lausetta määrittelemättä poikkeuksen tyyppiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"try"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"esimerkki.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"except"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tapahtui virhe tiedoston lukemisessa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että tällaisessa tapauksessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":"-lause käsittelee kaikki mahdolliset virheet, myös ohjelmoijan tekemät virheet lukuun ottamatta syntaksivirheitä, jotka estävät ohjelman suorittamisen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraava ohjelma heittää aina poikkeuksen, koska muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tiedosto"}]},{"type":"text","value":" nimi on kirjoitettu toisessa kohdassa väärin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tiedotso"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"try"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"esimerkki.txt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tiedotso"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"except"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tapahtui virhe tiedoston lukemisessa.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tästä näkee, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":" voi peittää varsinaisen virheen: tässä tapauksessa virheen syynä ei ole tiedoston käsittely vaan väärin kirjoitettu muuttuja."}]},{"type":"element","tagName":"h2","properties":{"id":"poikkeusten-valittyminen","style":"position:relative;"},"children":[{"type":"text","value":"Poikkeusten välittyminen"},{"type":"element","tagName":"a","properties":{"href":"#poikkeusten-valittyminen","ariaLabel":"poikkeusten valittyminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos funktion sisällä tapahtuu poikkeus, jota ei käsitellä, poikkeus välitetään funktion kutsujalle. Tätä jatketaan, kunnes ollaan pääohjelman tasolla. Jos poikkeusta ei tässäkään käsitellä sopivalla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"except"}]},{"type":"text","value":"-lauseella, ohjelman suoritus katkeaa ja poikkeus yleensä tulostetaan ruudulle."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraavassa ohjelmassa funktiossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"testi"}]},{"type":"text","value":" tapahtuva poikkeus käsitellään vasta pääohjelmassa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"testi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"try"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n testi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"except"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jotain meni pieleen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kolme"}]},{"type":"text","value":"\nJotain meni pieleen"}]}]},{"type":"element","tagName":"h2","properties":{"id":"poikkeusten-tuottaminen","style":"position:relative;"},"children":[{"type":"text","value":"Poikkeusten tuottaminen"},{"type":"element","tagName":"a","properties":{"href":"#poikkeusten-tuottaminen","ariaLabel":"poikkeusten tuottaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme myös tarvittaessa tuottaa poikkeuksen itse komennolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":". Vaikka virheiden tuottaminen varta vasten voi aluksi tuntua oudolta ajatukselta, mekanismi on itse asiassa hyvinkin hyödyllinen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi jos teemme funktion, jolle annetaan virheellinen parametri, voimme ilmaista tämän poikkeuksen avulla. Tämä voi olla parempi tapa kuin esimerkiksi palauttaa jokin virhearvo tai tulostaa viesti ruudulle, koska funktion käyttäjä ei välttämättä huomaisi asiaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa esimerkissä funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kertoma"}]},{"type":"text","value":" laskee parametrina annetun luvun kertoman (esimerkiksi luvun 5 kertoma on 1 * 2 * 3 * 4 * 5). Kuitenkin jos annettu luku on negatiivinen, funktio tuottaa poikkeuksen."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kertoma"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Negatiivinen syöte: \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" n "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n k "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*="}]},{"type":"text","value":" i\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" k\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kertoma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kertoma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kertoma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"text","value":"6\n720\nTraceback (most recent call last):\nFile \"testi.py\", line 11, in "},{"type":"element","tagName":"module","properties":{},"children":[{"type":"text","value":"\nprint(kertoma(-1))\nFile \"testi.py\", line 3, in kertoma\nraise ValueError(\"Negatiivinen syöte: \" + str(n))\nValueError: Negatiivinen syöte: -1"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Parametrien validointi ","tmcname":"osa06-18_parametrien_validointi"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"uusi_henkilo(nimi: str, ika: int)"}]},{"type":"text","value":", joka luo ja palauttaa uuden henkilö-tuplen. Tuplessa ensimmäinen alkio on nimi ja jälkimmäinen ikä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos funktion parametrit ovat virheelliset, sen tulee tuplen palauttamisen sijasta tuottaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ValueError"}]},{"type":"text","value":"-poikkeus."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Virheellisiä parametreja tässä tapauksessa ovat:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"nimi on tyhjä merkkijono"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"nimi ei koostu vähintään kahdesta sanasta"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"nimen pituus on yli 40 merkkiä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"ikä on negatiivinen luku"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"ikä on suurempi kuin 150"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Virheelliset lottonumerot","tmcname":"osa06-19_virheelliset_lottonumerot"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedostoon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lottonumerot.csv"}]},{"type":"text","value":" on tallennettu lottonumeroita seuraavan esimerkin mukaisesti:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"viikko 1;5,7,11,13,23,24,30\nviikko 2;9,13,14,24,34,35,37\n...jne..."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aluksi pitäisi olla siis otsikko "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viikko x"}]},{"type":"text","value":", ja sen jälkeen seitsemän numeroa väliltä 1...39."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedosto on kuitenkin osittain korruptoitunut. Seuraavat rivit ovat esimerkkejä virheellisistä riveistä (huomaa, että tehtäväpohjassa olevassa tiedostossa ei ole juuri näitä virheitä):"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Viikkonumero pielessä:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"viikko zzc;1,5,13,22,24,25,26"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Numero tai numeroita pielessä:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"viikko 22;1,**,5,6,13,2b,34"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Liian vähän numeroita:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"viikko 13;4,6,17,19,24,33"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Liian pieniä tai suuria numeroita:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"viikko 39;5,9,15,35,39,41,105"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rivissä esiintyy sama numero kahdesti:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"viikko 41;5,12,3,35,12,14,36"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suodata_virheelliset()"}]},{"type":"text","value":", joka luo tiedoston "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"korjatut_numerot.csv"}]},{"type":"text","value":". Tiedostoon on kopioitu kelvolliset rivit alkuperäisestä tiedostosta."}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, miten virheellisiä syötteitä voidaan käsitellä
  • \n
  • Tiedät, mitä tarkoitetaan poikkeuksella ohjelmoinnissa
  • \n
  • Tunnistat tyypillisiä poikkeuksia Pythonissa
  • \n
  • Osaat käsitellä poikkeuksia omissa ohjelmissa
  • \n

Ohjelmointiin liittyvät virheet voidaan jakaa kahteen ryhmään:

    \n
  1. Syntaksivirheet, jotka estävät ohjelman suorittamisen kokonaan
  2. \n
  3. Suorituksen aikaiset virheet, jotka keskeyttävät ohjelman suorituksen
  4. \n

Ryhmän 1 virheet on yleensä helppoa korjata, koska Python-tulkki huomauttaa niistä, kun ohjelmaa yritetään suorittaa. Tällaisia virheitä ovat esimerkiksi puuttuva kaksoispiste silmukan alussa tai puuttuva lainausmerkki merkkijonon lopussa.

Ryhmän 2 virheet voivat olla hankalampia havaita, koska virhe voi tapahtua jossain vaiheessa ohjelman suorituksen aikana ja vain tietyissä tilanteissa. Ohjelma saattaa toimia yleensä hyvin mutta keskeytyä virheen takia jossain reunatapauksessa. Keskitymme seuraavaksi tällaisten virheiden käsittelyyn.

Syötteiden tarkastaminen

Usein virhetilanteet ohjelmien suorituksen aikana liittyvät jotenkin virheelliseen syötteeseen. Esimerkkejä virheellisistä syötteistä ovat

    \n
  • puuttuvat tai tyhjät arvot: esimerkiksi pituus nolla tai tyhjä merkkijono nimenä
  • \n
  • negatiiviset arvot: esimerkiksi –15 reseptin aineosan painona
  • \n
  • puuttuva tai väärän niminen tiedosto
  • \n
  • liian pienet tai liian suuret arvot
  • \n
  • väärä indeksi (esim. viittaaminen indeksiin 3 merkkijonossa \"moi\")
  • \n
  • väärän tyyppiset arvot, esimerkiksi merkkijono luvun sijasta
  • \n

Useimpiin virheistä voidaan onneksi varautua ohjelmallisesti. Tarkastellaan esimerkkinä ohjelmaa, joka lukee käyttäjältä syötteenä tämän iän ja testaa, että se on sallituissa rajoissa (vähintään 0 ja korkeintaan 150):

ika = int(input(\"Anna ikäsi: \"))\nif ika >= 0 and ika <= 150:\n    print(\"Ikä kelpaa\")\nelse:\n    print(\"Virheellinen ikä\")

Anna ikäsi: 25\nIkä kelpaa

Anna ikäsi: -3\nVirheellinen ikä

Syötteen tarkastamisessa (eli validoinnissa) ilmenee kuitenkin puutteita, jos syötteeksi annetaan esimerkiksi merkkijono:

Anna ikäsi: kakskytkolme\nValueError: invalid literal for int() with base 10: 'kakskytkolme'

Virhe johtuu siitä, että funktio int ei pysty muuttamaan merkkijonoa kakskytkolme kokonaisluvuksi. Tämän seurauksena ohjelman suoritus keskeytyy yllä olevaan virheilmoitukseen.

Poikkeukset

Ohjelman suorituksen aikaisia virheitä kutsutaan poikkeuksiksi (exception). Ohjelman koodissa on mahdollista varautua poikkeuksiin ja käsitellä ne ilman, että ohjelman suoritus keskeytyy.

Pythonissa poikkeukset käsitellään try- ja except-lauseilla. Ideana on, että mikäli try-lohkossa tapahtuu jokin poikkeus, Python tarkistaa, onko tälle poikkeukselle määritelty except-lohkoa. Mikäli on, suoritetaan tämä lohko ja suoritus jatkuu sen jälkeen normaalisti.

Muutetaan edellä esitettyä esimerkkiä siten, että ohjelma varautuu poikkeukseen ValueError:

try:\n    ika = int(input(\"Anna ikäsi: \"))\nexcept ValueError:\n    ika = -1\n\nif ika >= 0 and ika <= 150:\n    print(\"Ikä kelpaa\")\nelse:\n    print(\"Virheellinen ikä\")

Anna ikäsi: kakskytkolme\nVirheellinen ikä

Ohjelmassa voidaan siis try-lauseella ilmoittaa, että seuraavan lohkon sisällä tapahtuva toiminta voi aiheuttaa virheen. Välittömästi try-lohkoa seuraavassa except-lauseessa ilmoitetaan, mihin virheeseen varaudutaan. Edellisessä esimerkissä varauduttiin ainoastaan virheeseen ValueError - jokin muu virhe olisi edelleen katkaissut ohjelman suorituksen.

Tässä tapauksessa virhetilanteessa muuttuja ika saa arvon -1, jolloin ohjelma tunnistaa oikein virheellisen iän, koska ehtona on, että ikä on vähintään 0.

Seuraava funktio lue_kokonaisluku lukee käyttäjältä kokonaisluvun varautuen siihen, että käyttäjä antaa virheellisen syötteen. Funktio kysyy lukua uudestaan niin kauan, kunnes käyttäjä lopulta antaa kelvollisen luvun.

def lue_kokonaisluku():\n    while True:\n        try:\n            syote = input(\"Syötä kokonaisluku: \")\n            return int(syote)\n        except ValueError:\n            print(\"Virheellinen syöte\")\n\nluku = lue_kokonaisluku()\nprint(\"Kiitos!\")\nprint(luku, \"potenssiin kolme on\", luku**3)

Syötä kokonaisluku: kolme\nVirheellinen syöte\nSyötä kokonaisluku: aybabtu\nVirheellinen syöte\nSyötä kokonaisluku: 5\nKiitos!\n5 potenssiin kolme on 125

Joissain tilanteissa saattaa olla tarvetta varautua poikkeukseen, mutta poikkeuksen tapahtuessa riittää \"ignoorata\" se, eli jättää koko asia huomiomatta except-lohkossa.

Jos muuttaisimme edellistä esimerkkiä siten, että funktio hyväksyisi ainoastaan lukua 100 pienemmät kokonaisluvut, voisimme muuttaa toteutusta seuraavasti:

def lue_pieni_kokonaisluku():\n    while True:\n        try:\n            syote = input(\"Syötä kokonaisluku: \")\n            luku = int(syote)\n            if luku < 100:\n                return luku\n        except ValueError:\n            pass # tämä komento ei tee mitään\n\n        print(\"Virheellinen syöte\")\n\nluku = lue_pieni_kokonaisluku()\nprint(luku, \"potenssiin kolme on\", luku**3)

Syötä kokonaisluku: kolme\nVirheellinen syöte\nSyötä kokonaisluku: 1000\nVirheellinen syöte\nSyötä kokonaisluku: 5\nKiitos!\n5 potenssiin kolme on 125

Nyt siis poikkeuksen käsittelevässä lohkossa on ainoastaan komento pass, joka ei tee mitään. Komento tarvitaan, sillä Python ei salli tyhjiä lohkoja.

Tee funktio lue, joka kysyy käyttäjältä syötettä, kunnes se on parametrien määrittelemällä välillä oleva kokonaisluku. Funktio palauttaa käyttäjän antaman syötteen.

Funktio toimii seuraavasti:

luku = lue(\"syötä luku: \", 5, 10)\nprint(\"syötit luvun:\", luku)

syötä luku: seitsemän\nSyötteen on oltava kokonaisluku väliltä 5...10\nsyötä luku: -3\nSyötteen on oltava kokonaisluku väliltä 5...10\nsyötä luku: 8\nsyötit luvun: 8

Tyypillisiä virheitä

Seuraavassa on listattu joitakin yleisiä virheitä ja syitä niiden ilmenemiselle:

ValueError

Tämä poikkeus voi johtua siitä, että funktion parametri on vääränlainen. Esimerkiksi kutsu float(\"1,23\") tuottaa tämän poikkeuksen, koska Pythonissa desimaalierottimen tulee olla piste eikä pilkku.

TypeError

Tämä poikkeus tapahtuu, kun arvo on väärän tyyppinen. Esimerkiksi kutsu len(10) saa aikaan tämän poikkeuksen, koska funktio len haluaa parametrin, jolle voidaan laskea pituus (kuten merkkijonon tai listan).

IndexError

Tämä poikkeus tapahtuu, jos yritetään viitata indeksiin, jota ei ole olemassa. Esimerkiksi \"abc\"[5] aiheuttaa tämän poikkeuksen, koska merkkijonossa ei ole indeksiä 5.

ZeroDivisionError

Tämä poikkeus tapahtuu, jos yritetään jakaa nollalla. Yksi esimerkki on tilanne, jossa yritetään laskea listan arvojen keskiarvo kaavalla sum(lista) / len(lista), mutta listan pituus on nolla.

Tiedostojen poikkeukset

Tiedostojen käsittelyssä voi tulla vastaan esimerkiksi poikkeukset FileNotFoundError (koetetaan lukea tiedostoa, jota ei ole olemassa), io.UnsupportedOperation (tiedosto on avattu tilassa, joka ei salli operaatiota) tai PermissionError (ohjelmalla ei ole oikeutta käsitellä tiedostoa).

Useamman poikkeuksen käsittely

Yhtä try-lohkoa kohti voi olla useampia except-lauseita. Esimerkiksi seuraavassa ohjelmassa varaudutaan sekä poikkeukseen FileNotFoundException että PermissionError:

try:\n    with open(\"esimerkki.txt\") as tiedosto:\n        for rivi in tiedosto:\n            print(rivi)\nexcept FileNotFoundError:\n    print(\"Tiedostoa esimerkki.txt ei löytynyt\")\nexcept PermissionError:\n    print(\"Ei oikeutta avata tiedostoa esimerkki.txt\")

Aina ei ole tarpeen eritellä tapahtuneita virheitä. Esimerkiksi juuri tiedostoa avatessa saattaa riittää, että tiedetään virheen tapahtuneen, muttei ole niin tärkeää tietää, miksi virhe tapahtui. Kaikki mahdolliset virheet voi käsitellä käyttämällä except-lausetta määrittelemättä poikkeuksen tyyppiä:

\ntry:\n    with open(\"esimerkki.txt\") as tiedosto:\n        for rivi in tiedosto:\n            print(rivi)\nexcept:\n    print(\"Tapahtui virhe tiedoston lukemisessa\")\n

Huomaa, että tällaisessa tapauksessa except-lause käsittelee kaikki mahdolliset virheet, myös ohjelmoijan tekemät virheet lukuun ottamatta syntaksivirheitä, jotka estävät ohjelman suorittamisen.

Esimerkiksi seuraava ohjelma heittää aina poikkeuksen, koska muuttujan tiedosto nimi on kirjoitettu toisessa kohdassa väärin tiedotso.

try:\n    with open(\"esimerkki.txt\") as tiedosto:\n        for rivi in tiedotso:\n            print(rivi)\nexcept:\n    print(\"Tapahtui virhe tiedoston lukemisessa.\")

Tästä näkee, että except voi peittää varsinaisen virheen: tässä tapauksessa virheen syynä ei ole tiedoston käsittely vaan väärin kirjoitettu muuttuja.

Poikkeusten välittyminen

Jos funktion sisällä tapahtuu poikkeus, jota ei käsitellä, poikkeus välitetään funktion kutsujalle. Tätä jatketaan, kunnes ollaan pääohjelman tasolla. Jos poikkeusta ei tässäkään käsitellä sopivalla except-lauseella, ohjelman suoritus katkeaa ja poikkeus yleensä tulostetaan ruudulle.

Esimerkiksi seuraavassa ohjelmassa funktiossa testi tapahtuva poikkeus käsitellään vasta pääohjelmassa:

def testi(x):\n    print(int(x) + 1)\n\ntry:\n    luku = input(\"Anna luku: \")\n    testi(luku)\nexcept:\n    print(\"Jotain meni pieleen\")

Anna luku: kolme\nJotain meni pieleen

Poikkeusten tuottaminen

Voimme myös tarvittaessa tuottaa poikkeuksen itse komennolla raise. Vaikka virheiden tuottaminen varta vasten voi aluksi tuntua oudolta ajatukselta, mekanismi on itse asiassa hyvinkin hyödyllinen.

Esimerkiksi jos teemme funktion, jolle annetaan virheellinen parametri, voimme ilmaista tämän poikkeuksen avulla. Tämä voi olla parempi tapa kuin esimerkiksi palauttaa jokin virhearvo tai tulostaa viesti ruudulle, koska funktion käyttäjä ei välttämättä huomaisi asiaa.

Seuraavassa esimerkissä funktio kertoma laskee parametrina annetun luvun kertoman (esimerkiksi luvun 5 kertoma on 1 * 2 * 3 * 4 * 5). Kuitenkin jos annettu luku on negatiivinen, funktio tuottaa poikkeuksen.

def kertoma(n):\n    if n < 0:\n        raise ValueError(\"Negatiivinen syöte: \" + str(n))\n    k = 1\n    for i in range(2, n + 1):\n        k *= i\n    return k\n\nprint(kertoma(3))\nprint(kertoma(6))\nprint(kertoma(-1))
6\n720\nTraceback (most recent call last):\nFile \"testi.py\", line 11, in \nprint(kertoma(-1))\nFile \"testi.py\", line 3, in kertoma\nraise ValueError(\"Negatiivinen syöte: \" + str(n))\nValueError: Negatiivinen syöte: -1

Kirjoita funktio uusi_henkilo(nimi: str, ika: int), joka luo ja palauttaa uuden henkilö-tuplen. Tuplessa ensimmäinen alkio on nimi ja jälkimmäinen ikä.

Jos funktion parametrit ovat virheelliset, sen tulee tuplen palauttamisen sijasta tuottaa ValueError-poikkeus.

Virheellisiä parametreja tässä tapauksessa ovat:

    \n
  • nimi on tyhjä merkkijono
  • \n
  • nimi ei koostu vähintään kahdesta sanasta
  • \n
  • nimen pituus on yli 40 merkkiä
  • \n
  • ikä on negatiivinen luku
  • \n
  • ikä on suurempi kuin 150
  • \n

Tiedostoon lottonumerot.csv on tallennettu lottonumeroita seuraavan esimerkin mukaisesti:

viikko 1;5,7,11,13,23,24,30\nviikko 2;9,13,14,24,34,35,37\n...jne...

Aluksi pitäisi olla siis otsikko viikko x, ja sen jälkeen seitsemän numeroa väliltä 1...39.

Tiedosto on kuitenkin osittain korruptoitunut. Seuraavat rivit ovat esimerkkejä virheellisistä riveistä (huomaa, että tehtäväpohjassa olevassa tiedostossa ei ole juuri näitä virheitä):

Viikkonumero pielessä:

viikko zzc;1,5,13,22,24,25,26

Numero tai numeroita pielessä:

viikko 22;1,**,5,6,13,2b,34

Liian vähän numeroita:

viikko 13;4,6,17,19,24,33

Liian pieniä tai suuria numeroita:

viikko 39;5,9,15,35,39,41,105

Rivissä esiintyy sama numero kahdesti:

viikko 41;5,12,3,35,12,14,36

Kirjoita funktio suodata_virheelliset(), joka luo tiedoston korjatut_numerot.csv. Tiedostoon on kopioitu kelvolliset rivit alkuperäisestä tiedostosta.

","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-6/3-virheet.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-6/4-paikalliset-muuttujat/page-data.json b/page-data/osa-6/4-paikalliset-muuttujat/page-data.json index d4b910119..662e5ca2b 100644 --- a/page-data/osa-6/4-paikalliset-muuttujat/page-data.json +++ b/page-data/osa-6/4-paikalliset-muuttujat/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-6/4-paikalliset-muuttujat", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät mitä tarkoitetaan paikallisella muuttujalla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten muuttujan näkyvyysalue vaikuttaa sen käyttöön"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä Pythonissa tekee avainsana "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"global"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää paikallisia ja globaaleja muuttujia oikein"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttujan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"näkyvyysalue"}]},{"type":"text","value":" ("},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"scope"}]},{"type":"text","value":") tarkoittaa, missä ohjelman osissa muuttujaa voi käyttää. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Paikallinen"}]},{"type":"text","value":" muuttuja on muuttuja, joka on näkyvissä vain tietyn rajatun alueen sisällä ohjelmassa. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Globaali"}]},{"type":"text","value":" muuttuja on puolestaan käytettävissä missä tahansa ohjelman osassa."}]},{"type":"element","tagName":"h2","properties":{"id":"paikalliset-muuttujat","style":"position:relative;"},"children":[{"type":"text","value":"Paikalliset muuttujat"},{"type":"element","tagName":"a","properties":{"href":"#paikalliset-muuttujat","ariaLabel":"paikalliset muuttujat permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa funktion sisällä määritellyt muuttujat ovat funktion paikallisia muuttujia. Tämä koskee sekä parametreja että funktion lohkon sisällä esiteltyjä muuttujia. Paikallisuus tarkoittaa, että muuttuja "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei ole olemassa funktion ulkopuolella"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraavassa ohjelmassa yritys viitata muuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":" pääohjelmassa antaa virheen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"testi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"5\nNameError: name 'x' is not defined"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmassa muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":" on siis olemassa vain funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"testi"}]},{"type":"text","value":" suorituksen ajan eikä siihen pääse käsiksi muista funktioista tai pääohjelmasta."}]},{"type":"element","tagName":"h2","properties":{"id":"globaalit-muuttujat","style":"position:relative;"},"children":[{"type":"text","value":"Globaalit muuttujat"},{"type":"element","tagName":"a","properties":{"href":"#globaalit-muuttujat","ariaLabel":"globaalit muuttujat permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pääohjelmassa eli kaikkien funktioiden ulkopuolella määritellyt muuttujat ovat globaaleja muuttujia. Globaalin muuttujan arvo voidaan lukea funktiossa. Esimerkiksi seuraava toimii:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"testi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nx "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\ntesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuitenkaan globaalia muuttujaa ei voi muuttaa suoraan. Esimerkiksi seuraava funktio "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei vaikuta"}]},{"type":"text","value":" globaaliin muuttujaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"testi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nx "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\ntesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"5\n3"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tapauksessa funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"testi"}]},{"type":"text","value":" luo paikallisen muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":", joka saa arvon 5. Tämä on kuitenkin eri muuttuja kuin pääohjelmassa oleva muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Entä miten toimii seuraava koodi?"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"testi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\n\nx "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\ntesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"UnboundLocalError: local variable 'x' referenced before assignment"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"testi"}]},{"type":"text","value":" annetaan arvo muuttujalle "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":", jolloin Python päättelee, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":" on funktion paikallinen muuttuja (eikä globaali muuttuja). Koska muuttujaan yritetään viitata ennen arvon asettamista, tapahtuu virhe."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos kuitenkin haluamme muuttaa funktiossa globaalia muuttujaa, tämä onnistuu avainsanan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"global"}]},{"type":"text","value":" avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"testi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"global"}]},{"type":"text","value":" x\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nx "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\ntesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3\n3"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt funktiossa tehty muutos "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x = 3"}]},{"type":"text","value":" vaikuttaa myös pääohjelmaan, eli kaikissa ohjelman kohdissa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":" viittaa samaan muuttujaan."}]},{"type":"element","tagName":"h2","properties":{"id":"milloin-kayttaa-globaalia-muuttujaa","style":"position:relative;"},"children":[{"type":"text","value":"Milloin käyttää globaalia muuttujaa?"},{"type":"element","tagName":"a","properties":{"href":"#milloin-kayttaa-globaalia-muuttujaa","ariaLabel":"milloin kayttaa globaalia muuttujaa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Globaalien muuttujien tarkoituksena ei ole korvata funktion parametreja tai paluuarvoa. Esimerkiksi on sinänsä mahdollista tehdä seuraava funktio, joka tallentaa laskun tuloksen globaaliin muuttujaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"laske_summa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"global"}]},{"type":"text","value":" tulos\n tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" b\n\nlaske_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Parempi tapa on kuitenkin toteuttaa funktio kuten ennenkin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"laske_summa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" b\n\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" laske_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jälkimmäisen tavan etuna on, että funktio on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"itsenäinen"}]},{"type":"text","value":" kokonaisuus, jolle annetaan tietyt parametrit ja joka palauttaa tietyn tuloksen. Funktiolla ei ole sivuvaikutuksia, minkä ansiosta sitä voi testata muusta koodista riippumattomasti."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuitenkin globaali muuttuja voi olla hyödyllinen, jos halutaan pitää yllä jotain funktioille yhteistä \"ylemmän tason\" tietoa. Tässä on yksi esimerkki asiasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"laske_summa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"global"}]},{"type":"text","value":" laskuri\n laskuri "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" b\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"laske_erotus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"global"}]},{"type":"text","value":" laskuri\n laskuri "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" b\n\n\nlaskuri "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"laske_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"laske_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"laske_erotus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"laske_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Funktioita kutsuttiin\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" laskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kertaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"text","value":"\n5\n10\n3\n1\nFunktioita kutsuttiin 4 kertaakertaa"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä haluamme pitää ohjelman suorituksen aikana kirjaa siitä, montako kertaa funktioita on kutsuttu ohjelman eri kohdista. Nyt globaali muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"laskuri"}]},{"type":"text","value":" on kätevä, koska voimme kasvattaa sen arvoa jokaisella funktion kutsukerralla ja katsoa globaalista muuttujasta, montako kertaa funktiota on kutsuttu."}]},{"type":"element","tagName":"h2","properties":{"id":"tiedon-valittaminen-funktiosta-toiseen-revisited","style":"position:relative;"},"children":[{"type":"text","value":"Tiedon välittäminen funktiosta toiseen revisited"},{"type":"element","tagName":"a","properties":{"href":"#tiedon-valittaminen-funktiosta-toiseen-revisited","ariaLabel":"tiedon valittaminen funktiosta toiseen revisited permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos ohjelma koostuu useista funktioista, nousee esiin kysymys miten tietoa siirretään funktiosta toiseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on jo pari osaa sitten nähty esimerkki ohjelmasta, joka lukee käyttäjältä joukon kokonaislukuarvoja. Sen jälkeen ohjelma tulostaa arvot ja tekee niille vielä \"analyysin\". Ohjelma on jaettu kolmeen erilliseen funktioon:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lue_kayttajalta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"syötä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" lukua:\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" maara\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" i"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" luvut\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"luvut ovat: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"analysoi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n ka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sum"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"lukuja yhteensä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", keskikarvo "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"ka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", pienin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"min"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ja suurin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"max"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# funktioita käyttävä \"pääohjelma\""}]},{"type":"text","value":"\nsyotteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue_kayttajalta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nanalyysin_tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" analysoi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"analyysin_tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuoritus"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"syötä 5 lukua:\nanna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\nanna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"34"}]},{"type":"text","value":"\nanna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-32"}]},{"type":"text","value":"\nanna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"99"}]},{"type":"text","value":"\nanna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-53"}]},{"type":"text","value":"\nluvut ovat:\n10\n34\n-32\n99\n-53\nlukuja yhteensä 5, keskikarvo 11.6, pienin- 53 ja suurin 99"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Perusperiaatteena ohjelmassa on se, että pääohjelma \"tallettaa\" ohjelman käsittelemän tiedon, eli tässä tapauksessa käyttäjän syöttämät luvut muuttujassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"syotteet"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos lukuja on tarve käsitellä jossain funktiossa, ne välitetään sinne parametrina. Näin tapahtuu funktioissa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"analysoi"}]},{"type":"text","value":".\nJos taas funktio tuottaa tietoa, jota muut ohjelman osat tarvitsevat, palauttaa funktio datan returnilla. Näin tekevät käyttäjän syötteen lukeva funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lue_kayttajalta"}]},{"type":"text","value":" sekä analyysin tekevä funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"analysoi"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olisi periaatteessa mahdollista, että funktiot käyttäisivät avainsanaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"global"}]},{"type":"text","value":" hyväksikäyttäen suoraan \"pääohjelman\" globaalia muuttujaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"syotteet"}]},{"type":"text","value":". Se "},{"type":"element","tagName":"a","properties":{"href":"https://softwareengineering.stackexchange.com/questions/148108/why-is-global-state-so-evil","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"ei kuitenkaan ole ollenkaan järkevää"}]},{"type":"text","value":", sillä jos usea funktio pääsee sorkkimaan globaalia muuttujaa, voi ohjelmassa alkaa tapahtua jotain hallitsematonta, varsinkin kun funktioiden määrä kasvaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedon välitys funktioihin ja niistä ulos on siis järkevintä hoitaa parametrien ja paluuarvojen avulla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos haluaisimme tehdä edellisen esimerkin ohjelman siten, että sen \"pääohjelma\" eriytettäisiin omaan funktioon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"main"}]},{"type":"text","value":", siirrettäisiin ohjelman käsittelemä data pääohjelmaa edustavan funktion sisäiseksi muuttujaksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lue_kayttajalta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"syötä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" lukua:\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" maara\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" i"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" luvut\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"luvut ovat: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"analysoi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n ka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sum"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"lukuja yhteensä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" keskikarvo "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"ka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" pienin"}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"min"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ja suurin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"max"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# pääohjelmaa edustava funktio"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"main"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n syotteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue_kayttajalta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n analyysin_tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" analysoi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"analyysin_tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ohjelman käynnistys"}]},{"type":"text","value":"\nmain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918"},"children":[]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa lopuksi osion loppukyselyyn:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät mitä tarkoitetaan paikallisella muuttujalla
  • \n
  • Tiedät, miten muuttujan näkyvyysalue vaikuttaa sen käyttöön
  • \n
  • Tiedät, mitä Pythonissa tekee avainsana global
  • \n
  • Osaat käyttää paikallisia ja globaaleja muuttujia oikein
  • \n

Muuttujan näkyvyysalue (scope) tarkoittaa, missä ohjelman osissa muuttujaa voi käyttää. Paikallinen muuttuja on muuttuja, joka on näkyvissä vain tietyn rajatun alueen sisällä ohjelmassa. Globaali muuttuja on puolestaan käytettävissä missä tahansa ohjelman osassa.

Paikalliset muuttujat

Pythonissa funktion sisällä määritellyt muuttujat ovat funktion paikallisia muuttujia. Tämä koskee sekä parametreja että funktion lohkon sisällä esiteltyjä muuttujia. Paikallisuus tarkoittaa, että muuttuja ei ole olemassa funktion ulkopuolella.

Esimerkiksi seuraavassa ohjelmassa yritys viitata muuttujaan x pääohjelmassa antaa virheen:

def testi():\n    x = 5\n    print(x)\n\ntesti()\nprint(x)

5\nNameError: name 'x' is not defined

Ohjelmassa muuttuja x on siis olemassa vain funktion testi suorituksen ajan eikä siihen pääse käsiksi muista funktioista tai pääohjelmasta.

Globaalit muuttujat

Pääohjelmassa eli kaikkien funktioiden ulkopuolella määritellyt muuttujat ovat globaaleja muuttujia. Globaalin muuttujan arvo voidaan lukea funktiossa. Esimerkiksi seuraava toimii:

def testi():\n    print(x)\n\nx = 3\ntesti()

3

Kuitenkaan globaalia muuttujaa ei voi muuttaa suoraan. Esimerkiksi seuraava funktio ei vaikuta globaaliin muuttujaan:

def testi():\n    x = 5\n    print(x)\n\nx = 3\ntesti()\nprint(x)

5\n3

Tässä tapauksessa funktio testi luo paikallisen muuttujan x, joka saa arvon 5. Tämä on kuitenkin eri muuttuja kuin pääohjelmassa oleva muuttuja x.

Entä miten toimii seuraava koodi?

def testi():\n    print(x)\n    x = 5\n\nx = 3\ntesti()\nprint(x)

UnboundLocalError: local variable 'x' referenced before assignment

Funktiossa testi annetaan arvo muuttujalle x, jolloin Python päättelee, että x on funktion paikallinen muuttuja (eikä globaali muuttuja). Koska muuttujaan yritetään viitata ennen arvon asettamista, tapahtuu virhe.

Jos kuitenkin haluamme muuttaa funktiossa globaalia muuttujaa, tämä onnistuu avainsanan global avulla:

def testi():\n    global x\n    x = 3\n    print(x)\n\nx = 5\ntesti()\nprint(x)

3\n3

Nyt funktiossa tehty muutos x = 3 vaikuttaa myös pääohjelmaan, eli kaikissa ohjelman kohdissa x viittaa samaan muuttujaan.

Milloin käyttää globaalia muuttujaa?

Globaalien muuttujien tarkoituksena ei ole korvata funktion parametreja tai paluuarvoa. Esimerkiksi on sinänsä mahdollista tehdä seuraava funktio, joka tallentaa laskun tuloksen globaaliin muuttujaan:

def laske_summa(a, b):\n    global tulos\n    tulos = a + b\n\nlaske_summa(2, 3)\nprint(tulos)

Parempi tapa on kuitenkin toteuttaa funktio kuten ennenkin:

def laske_summa(a, b):\n    return a + b\n\ntulos = laske_summa(2, 3)\nprint(tulos)

Jälkimmäisen tavan etuna on, että funktio on itsenäinen kokonaisuus, jolle annetaan tietyt parametrit ja joka palauttaa tietyn tuloksen. Funktiolla ei ole sivuvaikutuksia, minkä ansiosta sitä voi testata muusta koodista riippumattomasti.

Kuitenkin globaali muuttuja voi olla hyödyllinen, jos halutaan pitää yllä jotain funktioille yhteistä \"ylemmän tason\" tietoa. Tässä on yksi esimerkki asiasta:

def laske_summa(a, b):\n    global laskuri\n    laskuri += 1\n    return a + b\n\ndef laske_erotus(a, b):\n    global laskuri\n    laskuri += 1\n    return a - b\n\n\nlaskuri = 0\nprint(laske_summa(2, 3))\nprint(laske_summa(5, 5))\nprint(laske_erotus(5, 2))\nprint(laske_summa(1, 0))\nprint(\"Funktioita kutsuttiin\", laskuri, \"kertaa\")
\n5\n10\n3\n1\nFunktioita kutsuttiin 4 kertaa

Tässä haluamme pitää ohjelman suorituksen aikana kirjaa siitä, montako kertaa funktioita on kutsuttu ohjelman eri kohdista. Nyt globaali muuttuja laskuri on kätevä, koska voimme kasvattaa sen arvoa jokaisella funktion kutsukerralla ja katsoa globaalista muuttujasta, montako kertaa funktiota on kutsuttu.

Tiedon välittäminen funktiosta toiseen revisited

Jos ohjelma koostuu useista funktioista, nousee esiin kysymys miten tietoa siirretään funktiosta toiseen.

Seuraavassa on jo pari osaa sitten nähty esimerkki ohjelmasta, joka lukee käyttäjältä joukon kokonaislukuarvoja. Sen jälkeen ohjelma tulostaa arvot ja tekee niille vielä \"analyysin\". Ohjelma on jaettu kolmeen erilliseen funktioon:

def lue_kayttajalta(maara: int):\n    print(f\"syötä {maara} lukua:\")\n    luvut = []\n\n    i = maara\n    while i>0:\n        luku = int(input(\"anna luku: \"))\n        luvut.append(luku)\n        i -= 1\n\n    return luvut\n\ndef tulosta(luvut: list):\n    print(\"luvut ovat: \")\n    for luku in luvut:\n        print(luku)\n\ndef analysoi(luvut: list):\n    ka = sum(luvut) / len(luvut)\n    return f\"lukuja yhteensä {len(luvut)}, keskikarvo {ka}, pienin {min(luvut)} ja suurin {max(luvut)}\"\n\n# funktioita käyttävä  \"pääohjelma\"\nsyotteet = lue_kayttajalta(5)\ntulosta(syotteet)\nanalyysin_tulos = analysoi(syotteet)\nprint(analyysin_tulos)

Esimerkkisuoritus

syötä 5 lukua:\nanna luku: 10\nanna luku: 34\nanna luku: -32\nanna luku: 99\nanna luku: -53\nluvut ovat:\n10\n34\n-32\n99\n-53\nlukuja yhteensä 5, keskikarvo 11.6, pienin- 53 ja suurin 99

Perusperiaatteena ohjelmassa on se, että pääohjelma \"tallettaa\" ohjelman käsittelemän tiedon, eli tässä tapauksessa käyttäjän syöttämät luvut muuttujassa syotteet.

Jos lukuja on tarve käsitellä jossain funktiossa, ne välitetään sinne parametrina. Näin tapahtuu funktioissa tulosta ja analysoi.\nJos taas funktio tuottaa tietoa, jota muut ohjelman osat tarvitsevat, palauttaa funktio datan returnilla. Näin tekevät käyttäjän syötteen lukeva funktio lue_kayttajalta sekä analyysin tekevä funktio analysoi.

Olisi periaatteessa mahdollista, että funktiot käyttäisivät avainsanaa global hyväksikäyttäen suoraan \"pääohjelman\" globaalia muuttujaa syotteet. Se ei kuitenkaan ole ollenkaan järkevää, sillä jos usea funktio pääsee sorkkimaan globaalia muuttujaa, voi ohjelmassa alkaa tapahtua jotain hallitsematonta, varsinkin kun funktioiden määrä kasvaa.

Tiedon välitys funktioihin ja niistä ulos on siis järkevintä hoitaa parametrien ja paluuarvojen avulla.

Jos haluaisimme tehdä edellisen esimerkin ohjelman siten, että sen \"pääohjelma\" eriytettäisiin omaan funktioon main, siirrettäisiin ohjelman käsittelemä data pääohjelmaa edustavan funktion sisäiseksi muuttujaksi:

def lue_kayttajalta(maara: int):\n    print(f\"syötä {maara} lukua:\")\n    luvut = []\n\n    i = maara\n    while i>0:\n        luku = int(input(\"anna luku: \"))\n        luvut.append(luku)\n        i -= 1\n\n    return luvut\n\ndef tulosta(luvut: list):\n    print(\"luvut ovat: \")\n    for luku in luvut:\n        print(luku)\n\ndef analysoi(luvut: list):\n    ka = sum(luvut) / len(luvut)\n    return f\"lukuja yhteensä {len(luvut)} keskikarvo {ka} pienin{min(luvut)} ja suurin {max(luvut)}\"\n\n# pääohjelmaa edustava funktio\ndef main():\n    syotteet = lue_kayttajalta(5)\n    tulosta(syotteet)\n    analyysin_tulos = analysoi(syotteet)\n\n    print(analyysin_tulos)\n\n# ohjelman käynnistys\nmain()

Vastaa lopuksi osion loppukyselyyn:

","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-6/4-muuttujien-nakyvyys.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät mitä tarkoitetaan paikallisella muuttujalla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten muuttujan näkyvyysalue vaikuttaa sen käyttöön"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä Pythonissa tekee avainsana "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"global"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää paikallisia ja globaaleja muuttujia oikein"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttujan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"näkyvyysalue"}]},{"type":"text","value":" ("},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"scope"}]},{"type":"text","value":") tarkoittaa, missä ohjelman osissa muuttujaa voi käyttää. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Paikallinen"}]},{"type":"text","value":" muuttuja on muuttuja, joka on näkyvissä vain tietyn rajatun alueen sisällä ohjelmassa. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Globaali"}]},{"type":"text","value":" muuttuja on puolestaan käytettävissä missä tahansa ohjelman osassa."}]},{"type":"element","tagName":"h2","properties":{"id":"paikalliset-muuttujat","style":"position:relative;"},"children":[{"type":"text","value":"Paikalliset muuttujat"},{"type":"element","tagName":"a","properties":{"href":"#paikalliset-muuttujat","ariaLabel":"paikalliset muuttujat permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa funktion sisällä määritellyt muuttujat ovat funktion paikallisia muuttujia. Tämä koskee sekä parametreja että funktion lohkon sisällä esiteltyjä muuttujia. Paikallisuus tarkoittaa, että muuttuja "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei ole olemassa funktion ulkopuolella"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraavassa ohjelmassa yritys viitata muuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":" pääohjelmassa antaa virheen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"testi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"5\nNameError: name 'x' is not defined"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmassa muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":" on siis olemassa vain funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"testi"}]},{"type":"text","value":" suorituksen ajan eikä siihen pääse käsiksi muista funktioista tai pääohjelmasta."}]},{"type":"element","tagName":"h2","properties":{"id":"globaalit-muuttujat","style":"position:relative;"},"children":[{"type":"text","value":"Globaalit muuttujat"},{"type":"element","tagName":"a","properties":{"href":"#globaalit-muuttujat","ariaLabel":"globaalit muuttujat permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pääohjelmassa eli kaikkien funktioiden ulkopuolella määritellyt muuttujat ovat globaaleja muuttujia. Globaalin muuttujan arvo voidaan lukea funktiossa. Esimerkiksi seuraava toimii:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"testi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nx "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\ntesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuitenkaan globaalia muuttujaa ei voi muuttaa suoraan. Esimerkiksi seuraava funktio "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei vaikuta"}]},{"type":"text","value":" globaaliin muuttujaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"testi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nx "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\ntesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"5\n3"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tapauksessa funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"testi"}]},{"type":"text","value":" luo paikallisen muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":", joka saa arvon 5. Tämä on kuitenkin eri muuttuja kuin pääohjelmassa oleva muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Entä miten toimii seuraava koodi?"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"testi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\n\nx "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\ntesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"UnboundLocalError: local variable 'x' referenced before assignment"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"testi"}]},{"type":"text","value":" annetaan arvo muuttujalle "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":", jolloin Python päättelee, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":" on funktion paikallinen muuttuja (eikä globaali muuttuja). Koska muuttujaan yritetään viitata ennen arvon asettamista, tapahtuu virhe."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos kuitenkin haluamme muuttaa funktiossa globaalia muuttujaa, tämä onnistuu avainsanan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"global"}]},{"type":"text","value":" avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"testi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"global"}]},{"type":"text","value":" x\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nx "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\ntesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3\n3"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt funktiossa tehty muutos "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x = 3"}]},{"type":"text","value":" vaikuttaa myös pääohjelmaan, eli kaikissa ohjelman kohdissa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":" viittaa samaan muuttujaan."}]},{"type":"element","tagName":"h2","properties":{"id":"milloin-kayttaa-globaalia-muuttujaa","style":"position:relative;"},"children":[{"type":"text","value":"Milloin käyttää globaalia muuttujaa?"},{"type":"element","tagName":"a","properties":{"href":"#milloin-kayttaa-globaalia-muuttujaa","ariaLabel":"milloin kayttaa globaalia muuttujaa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Globaalien muuttujien tarkoituksena ei ole korvata funktion parametreja tai paluuarvoa. Esimerkiksi on sinänsä mahdollista tehdä seuraava funktio, joka tallentaa laskun tuloksen globaaliin muuttujaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"laske_summa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"global"}]},{"type":"text","value":" tulos\n tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" b\n\nlaske_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Parempi tapa on kuitenkin toteuttaa funktio kuten ennenkin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"laske_summa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" b\n\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" laske_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jälkimmäisen tavan etuna on, että funktio on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"itsenäinen"}]},{"type":"text","value":" kokonaisuus, jolle annetaan tietyt parametrit ja joka palauttaa tietyn tuloksen. Funktiolla ei ole sivuvaikutuksia, minkä ansiosta sitä voi testata muusta koodista riippumattomasti."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuitenkin globaali muuttuja voi olla hyödyllinen, jos halutaan pitää yllä jotain funktioille yhteistä \"ylemmän tason\" tietoa. Tässä on yksi esimerkki asiasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"laske_summa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"global"}]},{"type":"text","value":" laskuri\n laskuri "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" b\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"laske_erotus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"a"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" b"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"global"}]},{"type":"text","value":" laskuri\n laskuri "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" a "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" b\n\n\nlaskuri "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"laske_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"laske_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"laske_erotus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"laske_summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Funktioita kutsuttiin\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" laskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kertaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"text","value":"\n5\n10\n3\n1\nFunktioita kutsuttiin 4 kertaakertaa"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä haluamme pitää ohjelman suorituksen aikana kirjaa siitä, montako kertaa funktioita on kutsuttu ohjelman eri kohdista. Nyt globaali muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"laskuri"}]},{"type":"text","value":" on kätevä, koska voimme kasvattaa sen arvoa jokaisella funktion kutsukerralla ja katsoa globaalista muuttujasta, montako kertaa funktiota on kutsuttu."}]},{"type":"element","tagName":"h2","properties":{"id":"tiedon-valittaminen-funktiosta-toiseen-revisited","style":"position:relative;"},"children":[{"type":"text","value":"Tiedon välittäminen funktiosta toiseen revisited"},{"type":"element","tagName":"a","properties":{"href":"#tiedon-valittaminen-funktiosta-toiseen-revisited","ariaLabel":"tiedon valittaminen funktiosta toiseen revisited permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos ohjelma koostuu useista funktioista, nousee esiin kysymys miten tietoa siirretään funktiosta toiseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on jo pari osaa sitten nähty esimerkki ohjelmasta, joka lukee käyttäjältä joukon kokonaislukuarvoja. Sen jälkeen ohjelma tulostaa arvot ja tekee niille vielä \"analyysin\". Ohjelma on jaettu kolmeen erilliseen funktioon:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lue_kayttajalta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"syötä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" lukua:\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" maara\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" i"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" luvut\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"luvut ovat: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"analysoi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n ka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sum"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"lukuja yhteensä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", keskikarvo "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"ka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", pienin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"min"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ja suurin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"max"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# funktioita käyttävä \"pääohjelma\""}]},{"type":"text","value":"\nsyotteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue_kayttajalta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nanalyysin_tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" analysoi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"analyysin_tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkisuoritus"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"syötä 5 lukua:\nanna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\nanna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"34"}]},{"type":"text","value":"\nanna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-32"}]},{"type":"text","value":"\nanna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"99"}]},{"type":"text","value":"\nanna luku: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-53"}]},{"type":"text","value":"\nluvut ovat:\n10\n34\n-32\n99\n-53\nlukuja yhteensä 5, keskikarvo 11.6, pienin- 53 ja suurin 99"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Perusperiaatteena ohjelmassa on se, että pääohjelma \"tallettaa\" ohjelman käsittelemän tiedon, eli tässä tapauksessa käyttäjän syöttämät luvut muuttujassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"syotteet"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos lukuja on tarve käsitellä jossain funktiossa, ne välitetään sinne parametrina. Näin tapahtuu funktioissa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"analysoi"}]},{"type":"text","value":".\nJos taas funktio tuottaa tietoa, jota muut ohjelman osat tarvitsevat, palauttaa funktio datan returnilla. Näin tekevät käyttäjän syötteen lukeva funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lue_kayttajalta"}]},{"type":"text","value":" sekä analyysin tekevä funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"analysoi"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olisi periaatteessa mahdollista, että funktiot käyttäisivät avainsanaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"global"}]},{"type":"text","value":" hyväksikäyttäen suoraan \"pääohjelman\" globaalia muuttujaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"syotteet"}]},{"type":"text","value":". Se "},{"type":"element","tagName":"a","properties":{"href":"https://softwareengineering.stackexchange.com/questions/148108/why-is-global-state-so-evil","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"ei kuitenkaan ole ollenkaan järkevää"}]},{"type":"text","value":", sillä jos usea funktio pääsee sorkkimaan globaalia muuttujaa, voi ohjelmassa alkaa tapahtua jotain hallitsematonta, varsinkin kun funktioiden määrä kasvaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedon välitys funktioihin ja niistä ulos on siis järkevintä hoitaa parametrien ja paluuarvojen avulla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos haluaisimme tehdä edellisen esimerkin ohjelman siten, että sen \"pääohjelma\" eriytettäisiin omaan funktioon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"main"}]},{"type":"text","value":", siirrettäisiin ohjelman käsittelemä data pääohjelmaa edustavan funktion sisäiseksi muuttujaksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lue_kayttajalta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"syötä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" lukua:\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" maara\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" i"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n luku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"anna luku: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" luvut\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"luvut ovat: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" luku "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"analysoi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n ka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sum"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"lukuja yhteensä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" keskikarvo "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"ka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" pienin"}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"min"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ja suurin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"max"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# pääohjelmaa edustava funktio"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"main"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n syotteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lue_kayttajalta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n analyysin_tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" analysoi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syotteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"analyysin_tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ohjelman käynnistys"}]},{"type":"text","value":"\nmain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918"},"children":[]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa lopuksi osion loppukyselyyn:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät mitä tarkoitetaan paikallisella muuttujalla
  • \n
  • Tiedät, miten muuttujan näkyvyysalue vaikuttaa sen käyttöön
  • \n
  • Tiedät, mitä Pythonissa tekee avainsana global
  • \n
  • Osaat käyttää paikallisia ja globaaleja muuttujia oikein
  • \n

Muuttujan näkyvyysalue (scope) tarkoittaa, missä ohjelman osissa muuttujaa voi käyttää. Paikallinen muuttuja on muuttuja, joka on näkyvissä vain tietyn rajatun alueen sisällä ohjelmassa. Globaali muuttuja on puolestaan käytettävissä missä tahansa ohjelman osassa.

Paikalliset muuttujat

Pythonissa funktion sisällä määritellyt muuttujat ovat funktion paikallisia muuttujia. Tämä koskee sekä parametreja että funktion lohkon sisällä esiteltyjä muuttujia. Paikallisuus tarkoittaa, että muuttuja ei ole olemassa funktion ulkopuolella.

Esimerkiksi seuraavassa ohjelmassa yritys viitata muuttujaan x pääohjelmassa antaa virheen:

def testi():\n    x = 5\n    print(x)\n\ntesti()\nprint(x)

5\nNameError: name 'x' is not defined

Ohjelmassa muuttuja x on siis olemassa vain funktion testi suorituksen ajan eikä siihen pääse käsiksi muista funktioista tai pääohjelmasta.

Globaalit muuttujat

Pääohjelmassa eli kaikkien funktioiden ulkopuolella määritellyt muuttujat ovat globaaleja muuttujia. Globaalin muuttujan arvo voidaan lukea funktiossa. Esimerkiksi seuraava toimii:

def testi():\n    print(x)\n\nx = 3\ntesti()

3

Kuitenkaan globaalia muuttujaa ei voi muuttaa suoraan. Esimerkiksi seuraava funktio ei vaikuta globaaliin muuttujaan:

def testi():\n    x = 5\n    print(x)\n\nx = 3\ntesti()\nprint(x)

5\n3

Tässä tapauksessa funktio testi luo paikallisen muuttujan x, joka saa arvon 5. Tämä on kuitenkin eri muuttuja kuin pääohjelmassa oleva muuttuja x.

Entä miten toimii seuraava koodi?

def testi():\n    print(x)\n    x = 5\n\nx = 3\ntesti()\nprint(x)

UnboundLocalError: local variable 'x' referenced before assignment

Funktiossa testi annetaan arvo muuttujalle x, jolloin Python päättelee, että x on funktion paikallinen muuttuja (eikä globaali muuttuja). Koska muuttujaan yritetään viitata ennen arvon asettamista, tapahtuu virhe.

Jos kuitenkin haluamme muuttaa funktiossa globaalia muuttujaa, tämä onnistuu avainsanan global avulla:

def testi():\n    global x\n    x = 3\n    print(x)\n\nx = 5\ntesti()\nprint(x)

3\n3

Nyt funktiossa tehty muutos x = 3 vaikuttaa myös pääohjelmaan, eli kaikissa ohjelman kohdissa x viittaa samaan muuttujaan.

Milloin käyttää globaalia muuttujaa?

Globaalien muuttujien tarkoituksena ei ole korvata funktion parametreja tai paluuarvoa. Esimerkiksi on sinänsä mahdollista tehdä seuraava funktio, joka tallentaa laskun tuloksen globaaliin muuttujaan:

def laske_summa(a, b):\n    global tulos\n    tulos = a + b\n\nlaske_summa(2, 3)\nprint(tulos)

Parempi tapa on kuitenkin toteuttaa funktio kuten ennenkin:

def laske_summa(a, b):\n    return a + b\n\ntulos = laske_summa(2, 3)\nprint(tulos)

Jälkimmäisen tavan etuna on, että funktio on itsenäinen kokonaisuus, jolle annetaan tietyt parametrit ja joka palauttaa tietyn tuloksen. Funktiolla ei ole sivuvaikutuksia, minkä ansiosta sitä voi testata muusta koodista riippumattomasti.

Kuitenkin globaali muuttuja voi olla hyödyllinen, jos halutaan pitää yllä jotain funktioille yhteistä \"ylemmän tason\" tietoa. Tässä on yksi esimerkki asiasta:

def laske_summa(a, b):\n    global laskuri\n    laskuri += 1\n    return a + b\n\ndef laske_erotus(a, b):\n    global laskuri\n    laskuri += 1\n    return a - b\n\n\nlaskuri = 0\nprint(laske_summa(2, 3))\nprint(laske_summa(5, 5))\nprint(laske_erotus(5, 2))\nprint(laske_summa(1, 0))\nprint(\"Funktioita kutsuttiin\", laskuri, \"kertaa\")
\n5\n10\n3\n1\nFunktioita kutsuttiin 4 kertaa

Tässä haluamme pitää ohjelman suorituksen aikana kirjaa siitä, montako kertaa funktioita on kutsuttu ohjelman eri kohdista. Nyt globaali muuttuja laskuri on kätevä, koska voimme kasvattaa sen arvoa jokaisella funktion kutsukerralla ja katsoa globaalista muuttujasta, montako kertaa funktiota on kutsuttu.

Tiedon välittäminen funktiosta toiseen revisited

Jos ohjelma koostuu useista funktioista, nousee esiin kysymys miten tietoa siirretään funktiosta toiseen.

Seuraavassa on jo pari osaa sitten nähty esimerkki ohjelmasta, joka lukee käyttäjältä joukon kokonaislukuarvoja. Sen jälkeen ohjelma tulostaa arvot ja tekee niille vielä \"analyysin\". Ohjelma on jaettu kolmeen erilliseen funktioon:

def lue_kayttajalta(maara: int):\n    print(f\"syötä {maara} lukua:\")\n    luvut = []\n\n    i = maara\n    while i>0:\n        luku = int(input(\"anna luku: \"))\n        luvut.append(luku)\n        i -= 1\n\n    return luvut\n\ndef tulosta(luvut: list):\n    print(\"luvut ovat: \")\n    for luku in luvut:\n        print(luku)\n\ndef analysoi(luvut: list):\n    ka = sum(luvut) / len(luvut)\n    return f\"lukuja yhteensä {len(luvut)}, keskikarvo {ka}, pienin {min(luvut)} ja suurin {max(luvut)}\"\n\n# funktioita käyttävä  \"pääohjelma\"\nsyotteet = lue_kayttajalta(5)\ntulosta(syotteet)\nanalyysin_tulos = analysoi(syotteet)\nprint(analyysin_tulos)

Esimerkkisuoritus

syötä 5 lukua:\nanna luku: 10\nanna luku: 34\nanna luku: -32\nanna luku: 99\nanna luku: -53\nluvut ovat:\n10\n34\n-32\n99\n-53\nlukuja yhteensä 5, keskikarvo 11.6, pienin- 53 ja suurin 99

Perusperiaatteena ohjelmassa on se, että pääohjelma \"tallettaa\" ohjelman käsittelemän tiedon, eli tässä tapauksessa käyttäjän syöttämät luvut muuttujassa syotteet.

Jos lukuja on tarve käsitellä jossain funktiossa, ne välitetään sinne parametrina. Näin tapahtuu funktioissa tulosta ja analysoi.\nJos taas funktio tuottaa tietoa, jota muut ohjelman osat tarvitsevat, palauttaa funktio datan returnilla. Näin tekevät käyttäjän syötteen lukeva funktio lue_kayttajalta sekä analyysin tekevä funktio analysoi.

Olisi periaatteessa mahdollista, että funktiot käyttäisivät avainsanaa global hyväksikäyttäen suoraan \"pääohjelman\" globaalia muuttujaa syotteet. Se ei kuitenkaan ole ollenkaan järkevää, sillä jos usea funktio pääsee sorkkimaan globaalia muuttujaa, voi ohjelmassa alkaa tapahtua jotain hallitsematonta, varsinkin kun funktioiden määrä kasvaa.

Tiedon välitys funktioihin ja niistä ulos on siis järkevintä hoitaa parametrien ja paluuarvojen avulla.

Jos haluaisimme tehdä edellisen esimerkin ohjelman siten, että sen \"pääohjelma\" eriytettäisiin omaan funktioon main, siirrettäisiin ohjelman käsittelemä data pääohjelmaa edustavan funktion sisäiseksi muuttujaksi:

def lue_kayttajalta(maara: int):\n    print(f\"syötä {maara} lukua:\")\n    luvut = []\n\n    i = maara\n    while i>0:\n        luku = int(input(\"anna luku: \"))\n        luvut.append(luku)\n        i -= 1\n\n    return luvut\n\ndef tulosta(luvut: list):\n    print(\"luvut ovat: \")\n    for luku in luvut:\n        print(luku)\n\ndef analysoi(luvut: list):\n    ka = sum(luvut) / len(luvut)\n    return f\"lukuja yhteensä {len(luvut)} keskikarvo {ka} pienin{min(luvut)} ja suurin {max(luvut)}\"\n\n# pääohjelmaa edustava funktio\ndef main():\n    syotteet = lue_kayttajalta(5)\n    tulosta(syotteet)\n    analyysin_tulos = analysoi(syotteet)\n\n    print(analyysin_tulos)\n\n# ohjelman käynnistys\nmain()

Vastaa lopuksi osion loppukyselyyn:

","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-6/4-muuttujien-nakyvyys.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-6/page-data.json b/page-data/osa-6/page-data.json index b7012220c..14f38f771 100644 --- a/page-data/osa-6/page-data.json +++ b/page-data/osa-6/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-part-overview-template-js", "path": "/osa-6", - "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-6","title":"Osa 6"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-6/index.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-6","title":"Osa 6"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-6/index.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-7/1-moduulit/page-data.json b/page-data/osa-7/1-moduulit/page-data.json index 7c78a9975..ea39c7a08 100644 --- a/page-data/osa-7/1-moduulit/page-data.json +++ b/page-data/osa-7/1-moduulit/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-7/1-moduulit", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mikä on moduuli"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat ottaa käyttöön moduulin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":"-lauseella"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten moduulin sisällöstä voi etsiä tietoa"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"debugging-revisited","style":"position:relative;"},"children":[{"type":"text","value":"Debugging revisited"},{"type":"element","tagName":"a","properties":{"href":"#debugging-revisited","ariaLabel":"debugging revisited permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kurssilla on jo moneen otteeseen puhuttu erilaisista debuggausmenetelmistä. "},{"type":"element","tagName":"a","properties":{"href":"http://www.pythontutor.com/visualize.html#mode=edit","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Visualisaattori"}]},{"type":"text","value":" on jo monille tuttu ja vanha kunnon "},{"type":"element","tagName":"a","properties":{"href":"osa-2/1-ohjelmoinnin-termeja#debuggaaminen"},"children":[{"type":"text","value":"debuggaustulostus"}]},{"type":"text","value":" toimii aina. Visual Studio Coden "},{"type":"element","tagName":"a","properties":{"href":"/osa-4/1-vscode#debuggeri"},"children":[{"type":"text","value":"debuggeriakin"}]},{"type":"text","value":" monet ovat jo kokeilleet. Debuggerilla voi olla vaikeuksia selvitä tiedostoja käsittelevästä koodista, mutta siihenkin on olemassa "},{"type":"element","tagName":"a","properties":{"href":"/osa-6/1-tiedostojen-lukeminen#tiedostoja-lukevan-koodin-debuggaus"},"children":[{"type":"text","value":"lääke"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonin versio 3.7 tarjoaa vielä yhden erittäin helppokäyttöisen tavan debuggaukseen, komennon "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/functions.html?highlight=breakpoint#breakpoint","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"breakpoint()"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit lisätä komennon mihin kohtaan tahansa ohjelmaasi, ja kun suoritat ohjelman, pysähtyy suoritus komennon kohdalle. Seuraavassa esimerkki viime viikon tehtävän debuggaamisesta:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/f9eb8b0c4a4f642d316973fc108cae86/ec5f6/7_1_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 62.173913043478265%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAABYlAAAWJQFJUiTwAAABeklEQVQoz43R247bIBQFUH/HhKu5GIMNPr40mQwYT+yM2qn6/79TxcnDqGqrLB0J8bBB2qdofQCAHvq+g7ZxlbUhdHYnhKCUsr/i3GheSCEQQozxvoMGAgx9bQzGmBCC/w0hpJUulFJaKoAAXees894zxu/h/0AIhbYppJQl56fTcd221geEEHkCRqi27hZWSo7TeDyefAhSSkopeU7BOWeM8pKzsiyFkEIS8nTY1rWzzlSmCyF4b4xxe88PZSkfZ+mcizEOwwAA1lpjTDEdv71fLjGllPNbiinPaZ7nJcc53a9vKQ7jOE3TsJt23vu2bYvleP55uX5eth/LusV5PadrzNeUP+blY16uKZ9hHKEHgKG//dnvvPdN0xS/XvMacyurinCFmcJ0H6bJbRRhNb7NCzqgL+7bLj7TkrfVQ6drw6TgSspKk5IfMDoQ/EIwJcRRgSmhXzwK+96/jr4Luu6MrblwQjVS11xUlFeUa8odLRsq0P7KH23/Bv61bj0zKY2KAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/f9eb8b0c4a4f642d316973fc108cae86/a0b58/7_1_1.webp 230w","/static/f9eb8b0c4a4f642d316973fc108cae86/bc10c/7_1_1.webp 460w","/static/f9eb8b0c4a4f642d316973fc108cae86/966d8/7_1_1.webp 920w","/static/f9eb8b0c4a4f642d316973fc108cae86/445df/7_1_1.webp 1380w","/static/f9eb8b0c4a4f642d316973fc108cae86/78de1/7_1_1.webp 1840w","/static/f9eb8b0c4a4f642d316973fc108cae86/a02b9/7_1_1.webp 1852w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/f9eb8b0c4a4f642d316973fc108cae86/81c8e/7_1_1.png 230w","/static/f9eb8b0c4a4f642d316973fc108cae86/08a84/7_1_1.png 460w","/static/f9eb8b0c4a4f642d316973fc108cae86/c0255/7_1_1.png 920w","/static/f9eb8b0c4a4f642d316973fc108cae86/b1001/7_1_1.png 1380w","/static/f9eb8b0c4a4f642d316973fc108cae86/161ec/7_1_1.png 1840w","/static/f9eb8b0c4a4f642d316973fc108cae86/ec5f6/7_1_1.png 1852w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/f9eb8b0c4a4f642d316973fc108cae86/c0255/7_1_1.png","alt":"7 1 1","title":"7 1 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun koodi pysähtyy breakpoint()-komentoon, avautuu samalla konsolinäkymä, johon on mahdollista kirjoittaa mitä tahansa koodia ja kokeilla miten se toimisi ohjelman kyseisessä kohdassa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Komento on erityisen kätevä jos ohjelmasi jokin rivi aiheuttaa virheen, etkä ole ihan varma mistä virhe johtuu. Näissä tilanteissa kannattaa laittaa breakpoint-kutsu juuri ennen virheellistä riviä. Sen jälkeen on debuggerin konsolissa helppo kokeilla, mikä olisi oikea komento juuri siinä kohtaa suoritettavaksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodin suoritusta on myös mahdollista jatkaa pysähtymisen jälkeen. Esimerkiksi konsoliin annettu komento "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"continue"}]},{"type":"text","value":" tai sen lyhennetty versio "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"c"}]},{"type":"text","value":" jatkaa suoritusta seuraavaan breakpointiin asti. Seuraavassa esimerkki siitä, kun silmukkaa käydään läpi muutamaan kertaan:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/0ec6d7f1917313cc4582ecd977846154/c7bb6/7_1_2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 44.78260869565218%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA/ElEQVQoz42R22rDMAyG8xi7iGMpPqSuHZ8SzErrOlfd5WDQ93+VkXjLOhij34XQjyX9Qm5Yz0ajvbdqQwhBCOmeo0HEcTQ5X1JKgNB1HX2Cn2ajjyFGY91BKQDo/nImhLRtSzaqXJsB4IW2HVCOPWMMEevgfXwFEesrAFBKa2y0MXeV3qSfD5r1TAixmn+z12mt53k2xiilOOdCCERscs63S5l8GIN3zllr/cY0TSGEYRiklMMG5/xRCiGavJSP07IM9ojbWr+p54EHdrmufTqf7+X2/lpKSLPz1rnqHGP03u9WSqk9VqSUTbmWmGZ+GGiPgFANAb6S///5E+mjTgE+v0lMAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/0ec6d7f1917313cc4582ecd977846154/a0b58/7_1_2.webp 230w","/static/0ec6d7f1917313cc4582ecd977846154/bc10c/7_1_2.webp 460w","/static/0ec6d7f1917313cc4582ecd977846154/966d8/7_1_2.webp 920w","/static/0ec6d7f1917313cc4582ecd977846154/445df/7_1_2.webp 1380w","/static/0ec6d7f1917313cc4582ecd977846154/78de1/7_1_2.webp 1840w","/static/0ec6d7f1917313cc4582ecd977846154/ca269/7_1_2.webp 1986w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/0ec6d7f1917313cc4582ecd977846154/81c8e/7_1_2.png 230w","/static/0ec6d7f1917313cc4582ecd977846154/08a84/7_1_2.png 460w","/static/0ec6d7f1917313cc4582ecd977846154/c0255/7_1_2.png 920w","/static/0ec6d7f1917313cc4582ecd977846154/b1001/7_1_2.png 1380w","/static/0ec6d7f1917313cc4582ecd977846154/161ec/7_1_2.png 1840w","/static/0ec6d7f1917313cc4582ecd977846154/c7bb6/7_1_2.png 1986w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/0ec6d7f1917313cc4582ecd977846154/c0255/7_1_2.png","alt":"7 1 2","title":"7 1 2","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muut debuggerikonsolin komennot selviävät "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/pdb.html#debugger-commands","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"täältä"}]},{"type":"text","value":" tai antamalla debuggerkonsolissa komento "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"help"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/19fd7ec3fff52d6018519fac3d868e78/ca98b/7_1_3.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 42.608695652173914%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA5klEQVQoz4WPy07EMAxF+yF9pHnHTds4cVxpkNixYc3/fwuiURGgmeGsbEvH9u0WAAeg12XD5IIHAKnUdA9mJqJ1XUMIWmtrbXe83N7L7cMSCWuGqR+G8WI4+W7FSVvUJl2p9TXXt8S07nlPAUIT+r6fpmme50e7vuSM6BfYqRDzlvaUUjjx3m/bBgB/hF8yIjJzrRURY4zNPI4DEUspWutnMhGllBDRe99eHcexBZNSCiHGx3S11pxzjFEpNV807Wfg+zIz55yttVJKY4w+McYopZxz/1xupnMOAJxz/qLVQognmT8B8I9MXlB9in4AAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/19fd7ec3fff52d6018519fac3d868e78/a0b58/7_1_3.webp 230w","/static/19fd7ec3fff52d6018519fac3d868e78/bc10c/7_1_3.webp 460w","/static/19fd7ec3fff52d6018519fac3d868e78/966d8/7_1_3.webp 920w","/static/19fd7ec3fff52d6018519fac3d868e78/445df/7_1_3.webp 1380w","/static/19fd7ec3fff52d6018519fac3d868e78/78de1/7_1_3.webp 1840w","/static/19fd7ec3fff52d6018519fac3d868e78/28038/7_1_3.webp 1968w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/19fd7ec3fff52d6018519fac3d868e78/81c8e/7_1_3.png 230w","/static/19fd7ec3fff52d6018519fac3d868e78/08a84/7_1_3.png 460w","/static/19fd7ec3fff52d6018519fac3d868e78/c0255/7_1_3.png 920w","/static/19fd7ec3fff52d6018519fac3d868e78/b1001/7_1_3.png 1380w","/static/19fd7ec3fff52d6018519fac3d868e78/161ec/7_1_3.png 1840w","/static/19fd7ec3fff52d6018519fac3d868e78/ca98b/7_1_3.png 1968w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/19fd7ec3fff52d6018519fac3d868e78/c0255/7_1_3.png","alt":"7 1 3","title":"7 1 3","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Komento "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"exit"}]},{"type":"text","value":" siis lopettaa ohjelman suorituksen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun lopetat debuggaamisen, muista poistaa koodista komento "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"breakpoint()"}]},{"type":"text","value":"!"}]},{"type":"element","tagName":"h2","properties":{"id":"moduulin-kayttaminen","style":"position:relative;"},"children":[{"type":"text","value":"Moduulin käyttäminen"},{"type":"element","tagName":"a","properties":{"href":"#moduulin-kayttaminen","ariaLabel":"moduulin kayttaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python-kieli sisältää itsessään joukon valmiita funktioita, esimerkiksi merkkijonojen ja listojen pituuden kertovan funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"len"}]},{"type":"text","value":" sekä alkioiden summan laskevan funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sum"}]},{"type":"text","value":". Python-kielen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"standardikirjasto"}]},{"type":"text","value":" on kokoelma monenlaisia hyödyllisiä funktioita ja olioita joiden avulla kielen \"ilmaisuvoimaa\" on helppo laajentaa. Olemme jo käyttäneet muutamassa tehtävässä standardikirjastosta eräitä matemaattisia operaatioita tarjoavia funktioita esim. neliöjuurten laskemisessa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Standardikirjasto muodostuu "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"moduuleista"}]},{"type":"text","value":", joihin on ryhmitelty eri aiheisiin liittyviä funktioita ja luokkia. Tutustumme tässä osassa joihinkin hyödyllisiin moduuleihin ja opimme myös tekemään moduulin itse."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Komento "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" ottaa käyttöön halutun moduulin. Tarkastellaan esimerkkinä moduulia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"math"}]},{"type":"text","value":", jossa on matemaattisia funktioita. Seuraava koodi laskee luvun neliöjuuren funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sqrt"}]},{"type":"text","value":" ja logaritmin funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"log"}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" math\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# luvun 5 neliöjuuri"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sqrt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# luvun 8 logaritmi (2-kantainen)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"log"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2.23606797749979\n3.0"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska funktiot ovat moduulissa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"math"}]},{"type":"text","value":", niihin viitataan koodissa nimillä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"math.sqrt"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"math.log"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"h2","properties":{"id":"moduulin-osien-valinta","style":"position:relative;"},"children":[{"type":"text","value":"Moduulin osien valinta"},{"type":"element","tagName":"a","properties":{"href":"#moduulin-osien-valinta","ariaLabel":"moduulin osien valinta permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen tapa käyttää moduulia on valita sieltä mukaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":"-komennolla tiettyjä osia, joita haluamme käyttää. Esimerkiksi seuraava koodi ottaa käyttöön funktiot "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sqrt"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"log"}]},{"type":"text","value":" moduulista "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"math"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" math "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" sqrt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" log\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sqrt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"log"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän tavan etuna on, että voimme käyttää funktioita suoraan ilman "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"math"}]},{"type":"text","value":"-etuliitettä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme myös ottaa suoraan käytettäväksi "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kaiken"}]},{"type":"text","value":" moduulin sisällön tähden avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" math "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sqrt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"log"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä tapa voi olla kätevä testailussa ja pienissä ohjelmissa, mutta siinä on omat ongelmansa, kuten näemme myöhemmin."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Hypotenuusa","tmcname":"osa07-01_hypotenuusa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hypotenuusa(kateetti1: float, kateetti2: float)"}]},{"type":"text","value":", joka saa parametrikseen suorakulmaisen kolmion kateettien pituudet. Funktio palauttaa kolmion hypotenuusan pituuden."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ratkaisu lasketaan "},{"type":"element","tagName":"a","properties":{"href":"https://fi.wikipedia.org/wiki/Pythagoraan_lause","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Pythagoraan"}]},{"type":"text","value":" lauseen avulla. Saat laskettua neliöjuuren "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"math"}]},{"type":"text","value":"-moduulin funktion avulla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkejä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"hypotenuusa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# 5.0"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"hypotenuusa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# 13.0"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"hypotenuusa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# 1.4142135623730951"}]}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"moduulin-sisalto","style":"position:relative;"},"children":[{"type":"text","value":"Moduulin sisältö"},{"type":"element","tagName":"a","properties":{"href":"#moduulin-sisalto","ariaLabel":"moduulin sisalto permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonin dokumentaatio kertoo jokaisesta standardikirjaston moduulista, mitä moduuli sisältää ja kuinka sitä käytetään. Esimerkiksi moduulin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"math"}]},{"type":"text","value":" dokumentaatio on tässä:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/math.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"https://docs.python.org/3/library/math.html"}]}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme myös tutkia funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"dir"}]},{"type":"text","value":" avulla moduulin sisältöä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" math\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"dir"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio antaa listan nimistä, jotka moduuli määrittelee:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['__doc__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'hypot', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Erikoismerkit","tmcname":"osa07-02_erikoismerkit"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moduulissa "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/string.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"string"}]},{"type":"text","value":" on merkkijonovakioita, jotka määrittelevät tiettyjä merkkiryhmiä (esim. pienet kirjaimet ja välimerkit). Tutustu näihin vakioihin ja kirjoita niitä käyttäen funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"jaa_merkkeihin(merkkijono: str)"}]},{"type":"text","value":", joka saa parametrikseen merkkijonon. Funktio palauttaa tuplen, jossa parametrina saadun merkkijonon merkit on jaettu kolmeen eri merkkijonoon:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ensimmäisessä jonossa on kaikki pienet ja suuret englanninkieliset kirjaimet (vakio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ascii_letters"}]},{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Toisessa jonossa on kaikki vakiossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"punctuation"}]},{"type":"text","value":" määritellyt välimerkit"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Kolmannessa jonossa on kaikki merkit (mukaan lukien esim. välilyönnit), jotka eivät kuulu kahteen edelliseen ryhmään"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkit tulee tallentaa palautettuihin merkkijonoihin siinä järjestyksessä kuin ne esiintyvät alkuperäisessä merkkijonossa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" jaa_merkkeihin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tämä on testi!!! Toimiiko, mitä?\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"TmontestiToimiikomit\n!!!,?\nää ä"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Murtoluvuilla laskeminen","tmcname":"osa07-03_murtoluvuilla_laskeminen"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tutustu Pythonin moduuliin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"fractions"}]},{"type":"text","value":" ja toteuta sen avulla funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"jaa_palasiksi(maara: int)"}]},{"type":"text","value":", joka saa parametrikseen palasten määrän. Funktio jakaa luvun 1 parametrin mukaisesti yhtä suuriin murtolukupalasiin ja palauttaa nämä palaset listassa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" p "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" jaa_palasiksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jaa_palasiksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1/3\n1/3\n1/3"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[Fraction(1, 5), Fraction(1, 5), Fraction(1, 5), Fraction(1, 5), Fraction(1, 5)]"}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, mikä on moduuli
  • \n
  • Osaat ottaa käyttöön moduulin import-lauseella
  • \n
  • Tiedät, miten moduulin sisällöstä voi etsiä tietoa
  • \n

Debugging revisited

Kurssilla on jo moneen otteeseen puhuttu erilaisista debuggausmenetelmistä. Visualisaattori on jo monille tuttu ja vanha kunnon debuggaustulostus toimii aina. Visual Studio Coden debuggeriakin monet ovat jo kokeilleet. Debuggerilla voi olla vaikeuksia selvitä tiedostoja käsittelevästä koodista, mutta siihenkin on olemassa lääke.

Pythonin versio 3.7 tarjoaa vielä yhden erittäin helppokäyttöisen tavan debuggaukseen, komennon breakpoint().

Voit lisätä komennon mihin kohtaan tahansa ohjelmaasi, ja kun suoritat ohjelman, pysähtyy suoritus komennon kohdalle. Seuraavassa esimerkki viime viikon tehtävän debuggaamisesta:

\n \n \n \n \n \n \"7\n \n \n

Kun koodi pysähtyy breakpoint()-komentoon, avautuu samalla konsolinäkymä, johon on mahdollista kirjoittaa mitä tahansa koodia ja kokeilla miten se toimisi ohjelman kyseisessä kohdassa.

Komento on erityisen kätevä jos ohjelmasi jokin rivi aiheuttaa virheen, etkä ole ihan varma mistä virhe johtuu. Näissä tilanteissa kannattaa laittaa breakpoint-kutsu juuri ennen virheellistä riviä. Sen jälkeen on debuggerin konsolissa helppo kokeilla, mikä olisi oikea komento juuri siinä kohtaa suoritettavaksi.

Koodin suoritusta on myös mahdollista jatkaa pysähtymisen jälkeen. Esimerkiksi konsoliin annettu komento continue tai sen lyhennetty versio c jatkaa suoritusta seuraavaan breakpointiin asti. Seuraavassa esimerkki siitä, kun silmukkaa käydään läpi muutamaan kertaan:

\n \n \n \n \n \n \"7\n \n \n

Muut debuggerikonsolin komennot selviävät täältä tai antamalla debuggerkonsolissa komento help:

\n \n

Tee funktio hypotenuusa(kateetti1: float, kateetti2: float), joka saa parametrikseen suorakulmaisen kolmion kateettien pituudet. Funktio palauttaa kolmion hypotenuusan pituuden.

Ratkaisu lasketaan Pythagoraan lauseen avulla. Saat laskettua neliöjuuren math-moduulin funktion avulla.

Esimerkkejä:

print(hypotenuusa(3,4)) # 5.0\nprint(hypotenuusa(5,12)) # 13.0\nprint(hypotenuusa(1,1)) # 1.4142135623730951

Moduulin sisältö

Pythonin dokumentaatio kertoo jokaisesta standardikirjaston moduulista, mitä moduuli sisältää ja kuinka sitä käytetään. Esimerkiksi moduulin math dokumentaatio on tässä:

Voimme myös tutkia funktion dir avulla moduulin sisältöä:

import math\n\nprint(dir(math))

Funktio antaa listan nimistä, jotka moduuli määrittelee:

['__doc__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'hypot', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']

Moduulissa string on merkkijonovakioita, jotka määrittelevät tiettyjä merkkiryhmiä (esim. pienet kirjaimet ja välimerkit). Tutustu näihin vakioihin ja kirjoita niitä käyttäen funktio jaa_merkkeihin(merkkijono: str), joka saa parametrikseen merkkijonon. Funktio palauttaa tuplen, jossa parametrina saadun merkkijonon merkit on jaettu kolmeen eri merkkijonoon:

    \n
  • Ensimmäisessä jonossa on kaikki pienet ja suuret englanninkieliset kirjaimet (vakio ascii_letters)
  • \n
  • Toisessa jonossa on kaikki vakiossa punctuation määritellyt välimerkit
  • \n
  • Kolmannessa jonossa on kaikki merkit (mukaan lukien esim. välilyönnit), jotka eivät kuulu kahteen edelliseen ryhmään
  • \n

Merkit tulee tallentaa palautettuihin merkkijonoihin siinä järjestyksessä kuin ne esiintyvät alkuperäisessä merkkijonossa.

Esimerkki:

osat = jaa_merkkeihin(\"Tämä on testi!!! Toimiiko, mitä?\")\nprint(osat[0])\nprint(osat[1])\nprint(osat[2])

TmontestiToimiikomit\n!!!,?\nää ä

Tutustu Pythonin moduuliin fractions ja toteuta sen avulla funktio jaa_palasiksi(maara: int), joka saa parametrikseen palasten määrän. Funktio jakaa luvun 1 parametrin mukaisesti yhtä suuriin murtolukupalasiin ja palauttaa nämä palaset listassa.

Esimerkki:

for p in jaa_palasiksi(3):\n    print(p)\n\nprint()\n\nprint(jaa_palasiksi(5))

1/3\n1/3\n1/3

[Fraction(1, 5), Fraction(1, 5), Fraction(1, 5), Fraction(1, 5), Fraction(1, 5)]

","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-7/1-moduulit.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mikä on moduuli"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat ottaa käyttöön moduulin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":"-lauseella"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten moduulin sisällöstä voi etsiä tietoa"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"debugging-revisited","style":"position:relative;"},"children":[{"type":"text","value":"Debugging revisited"},{"type":"element","tagName":"a","properties":{"href":"#debugging-revisited","ariaLabel":"debugging revisited permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kurssilla on jo moneen otteeseen puhuttu erilaisista debuggausmenetelmistä. "},{"type":"element","tagName":"a","properties":{"href":"http://www.pythontutor.com/visualize.html#mode=edit","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Visualisaattori"}]},{"type":"text","value":" on jo monille tuttu ja vanha kunnon "},{"type":"element","tagName":"a","properties":{"href":"osa-2/1-ohjelmoinnin-termeja#debuggaaminen"},"children":[{"type":"text","value":"debuggaustulostus"}]},{"type":"text","value":" toimii aina. Visual Studio Coden "},{"type":"element","tagName":"a","properties":{"href":"/osa-4/1-vscode#debuggeri"},"children":[{"type":"text","value":"debuggeriakin"}]},{"type":"text","value":" monet ovat jo kokeilleet. Debuggerilla voi olla vaikeuksia selvitä tiedostoja käsittelevästä koodista, mutta siihenkin on olemassa "},{"type":"element","tagName":"a","properties":{"href":"/osa-6/1-tiedostojen-lukeminen#tiedostoja-lukevan-koodin-debuggaus"},"children":[{"type":"text","value":"lääke"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonin versio 3.7 tarjoaa vielä yhden erittäin helppokäyttöisen tavan debuggaukseen, komennon "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/functions.html?highlight=breakpoint#breakpoint","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"breakpoint()"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit lisätä komennon mihin kohtaan tahansa ohjelmaasi, ja kun suoritat ohjelman, pysähtyy suoritus komennon kohdalle. Seuraavassa esimerkki viime viikon tehtävän debuggaamisesta:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/f9eb8b0c4a4f642d316973fc108cae86/ec5f6/7_1_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 62.173913043478265%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAABYlAAAWJQFJUiTwAAABeklEQVQoz43R247bIBQFUH/HhKu5GIMNPr40mQwYT+yM2qn6/79TxcnDqGqrLB0J8bBB2qdofQCAHvq+g7ZxlbUhdHYnhKCUsr/i3GheSCEQQozxvoMGAgx9bQzGmBCC/w0hpJUulFJaKoAAXees894zxu/h/0AIhbYppJQl56fTcd221geEEHkCRqi27hZWSo7TeDyefAhSSkopeU7BOWeM8pKzsiyFkEIS8nTY1rWzzlSmCyF4b4xxe88PZSkfZ+mcizEOwwAA1lpjTDEdv71fLjGllPNbiinPaZ7nJcc53a9vKQ7jOE3TsJt23vu2bYvleP55uX5eth/LusV5PadrzNeUP+blY16uKZ9hHKEHgKG//dnvvPdN0xS/XvMacyurinCFmcJ0H6bJbRRhNb7NCzqgL+7bLj7TkrfVQ6drw6TgSspKk5IfMDoQ/EIwJcRRgSmhXzwK+96/jr4Luu6MrblwQjVS11xUlFeUa8odLRsq0P7KH23/Bv61bj0zKY2KAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/f9eb8b0c4a4f642d316973fc108cae86/a0b58/7_1_1.webp 230w","/static/f9eb8b0c4a4f642d316973fc108cae86/bc10c/7_1_1.webp 460w","/static/f9eb8b0c4a4f642d316973fc108cae86/966d8/7_1_1.webp 920w","/static/f9eb8b0c4a4f642d316973fc108cae86/445df/7_1_1.webp 1380w","/static/f9eb8b0c4a4f642d316973fc108cae86/78de1/7_1_1.webp 1840w","/static/f9eb8b0c4a4f642d316973fc108cae86/a02b9/7_1_1.webp 1852w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/f9eb8b0c4a4f642d316973fc108cae86/81c8e/7_1_1.png 230w","/static/f9eb8b0c4a4f642d316973fc108cae86/08a84/7_1_1.png 460w","/static/f9eb8b0c4a4f642d316973fc108cae86/c0255/7_1_1.png 920w","/static/f9eb8b0c4a4f642d316973fc108cae86/b1001/7_1_1.png 1380w","/static/f9eb8b0c4a4f642d316973fc108cae86/161ec/7_1_1.png 1840w","/static/f9eb8b0c4a4f642d316973fc108cae86/ec5f6/7_1_1.png 1852w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/f9eb8b0c4a4f642d316973fc108cae86/c0255/7_1_1.png","alt":"7 1 1","title":"7 1 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun koodi pysähtyy breakpoint()-komentoon, avautuu samalla konsolinäkymä, johon on mahdollista kirjoittaa mitä tahansa koodia ja kokeilla miten se toimisi ohjelman kyseisessä kohdassa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Komento on erityisen kätevä jos ohjelmasi jokin rivi aiheuttaa virheen, etkä ole ihan varma mistä virhe johtuu. Näissä tilanteissa kannattaa laittaa breakpoint-kutsu juuri ennen virheellistä riviä. Sen jälkeen on debuggerin konsolissa helppo kokeilla, mikä olisi oikea komento juuri siinä kohtaa suoritettavaksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodin suoritusta on myös mahdollista jatkaa pysähtymisen jälkeen. Esimerkiksi konsoliin annettu komento "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"continue"}]},{"type":"text","value":" tai sen lyhennetty versio "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"c"}]},{"type":"text","value":" jatkaa suoritusta seuraavaan breakpointiin asti. Seuraavassa esimerkki siitä, kun silmukkaa käydään läpi muutamaan kertaan:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/0ec6d7f1917313cc4582ecd977846154/c7bb6/7_1_2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 44.78260869565218%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA/ElEQVQoz42R22rDMAyG8xi7iGMpPqSuHZ8SzErrOlfd5WDQ93+VkXjLOhij34XQjyX9Qm5Yz0ajvbdqQwhBCOmeo0HEcTQ5X1JKgNB1HX2Cn2ajjyFGY91BKQDo/nImhLRtSzaqXJsB4IW2HVCOPWMMEevgfXwFEesrAFBKa2y0MXeV3qSfD5r1TAixmn+z12mt53k2xiilOOdCCERscs63S5l8GIN3zllr/cY0TSGEYRiklMMG5/xRCiGavJSP07IM9ojbWr+p54EHdrmufTqf7+X2/lpKSLPz1rnqHGP03u9WSqk9VqSUTbmWmGZ+GGiPgFANAb6S///5E+mjTgE+v0lMAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/0ec6d7f1917313cc4582ecd977846154/a0b58/7_1_2.webp 230w","/static/0ec6d7f1917313cc4582ecd977846154/bc10c/7_1_2.webp 460w","/static/0ec6d7f1917313cc4582ecd977846154/966d8/7_1_2.webp 920w","/static/0ec6d7f1917313cc4582ecd977846154/445df/7_1_2.webp 1380w","/static/0ec6d7f1917313cc4582ecd977846154/78de1/7_1_2.webp 1840w","/static/0ec6d7f1917313cc4582ecd977846154/ca269/7_1_2.webp 1986w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/0ec6d7f1917313cc4582ecd977846154/81c8e/7_1_2.png 230w","/static/0ec6d7f1917313cc4582ecd977846154/08a84/7_1_2.png 460w","/static/0ec6d7f1917313cc4582ecd977846154/c0255/7_1_2.png 920w","/static/0ec6d7f1917313cc4582ecd977846154/b1001/7_1_2.png 1380w","/static/0ec6d7f1917313cc4582ecd977846154/161ec/7_1_2.png 1840w","/static/0ec6d7f1917313cc4582ecd977846154/c7bb6/7_1_2.png 1986w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/0ec6d7f1917313cc4582ecd977846154/c0255/7_1_2.png","alt":"7 1 2","title":"7 1 2","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muut debuggerikonsolin komennot selviävät "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/pdb.html#debugger-commands","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"täältä"}]},{"type":"text","value":" tai antamalla debuggerkonsolissa komento "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"help"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/19fd7ec3fff52d6018519fac3d868e78/ca98b/7_1_3.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 42.608695652173914%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA5klEQVQoz4WPy07EMAxF+yF9pHnHTds4cVxpkNixYc3/fwuiURGgmeGsbEvH9u0WAAeg12XD5IIHAKnUdA9mJqJ1XUMIWmtrbXe83N7L7cMSCWuGqR+G8WI4+W7FSVvUJl2p9TXXt8S07nlPAUIT+r6fpmme50e7vuSM6BfYqRDzlvaUUjjx3m/bBgB/hF8yIjJzrRURY4zNPI4DEUspWutnMhGllBDRe99eHcexBZNSCiHGx3S11pxzjFEpNV807Wfg+zIz55yttVJKY4w+McYopZxz/1xupnMOAJxz/qLVQognmT8B8I9MXlB9in4AAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/19fd7ec3fff52d6018519fac3d868e78/a0b58/7_1_3.webp 230w","/static/19fd7ec3fff52d6018519fac3d868e78/bc10c/7_1_3.webp 460w","/static/19fd7ec3fff52d6018519fac3d868e78/966d8/7_1_3.webp 920w","/static/19fd7ec3fff52d6018519fac3d868e78/445df/7_1_3.webp 1380w","/static/19fd7ec3fff52d6018519fac3d868e78/78de1/7_1_3.webp 1840w","/static/19fd7ec3fff52d6018519fac3d868e78/28038/7_1_3.webp 1968w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/19fd7ec3fff52d6018519fac3d868e78/81c8e/7_1_3.png 230w","/static/19fd7ec3fff52d6018519fac3d868e78/08a84/7_1_3.png 460w","/static/19fd7ec3fff52d6018519fac3d868e78/c0255/7_1_3.png 920w","/static/19fd7ec3fff52d6018519fac3d868e78/b1001/7_1_3.png 1380w","/static/19fd7ec3fff52d6018519fac3d868e78/161ec/7_1_3.png 1840w","/static/19fd7ec3fff52d6018519fac3d868e78/ca98b/7_1_3.png 1968w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/19fd7ec3fff52d6018519fac3d868e78/c0255/7_1_3.png","alt":"7 1 3","title":"7 1 3","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Komento "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"exit"}]},{"type":"text","value":" siis lopettaa ohjelman suorituksen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun lopetat debuggaamisen, muista poistaa koodista komento "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"breakpoint()"}]},{"type":"text","value":"!"}]},{"type":"element","tagName":"h2","properties":{"id":"moduulin-kayttaminen","style":"position:relative;"},"children":[{"type":"text","value":"Moduulin käyttäminen"},{"type":"element","tagName":"a","properties":{"href":"#moduulin-kayttaminen","ariaLabel":"moduulin kayttaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python-kieli sisältää itsessään joukon valmiita funktioita, esimerkiksi merkkijonojen ja listojen pituuden kertovan funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"len"}]},{"type":"text","value":" sekä alkioiden summan laskevan funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sum"}]},{"type":"text","value":". Python-kielen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"standardikirjasto"}]},{"type":"text","value":" on kokoelma monenlaisia hyödyllisiä funktioita ja olioita joiden avulla kielen \"ilmaisuvoimaa\" on helppo laajentaa. Olemme jo käyttäneet muutamassa tehtävässä standardikirjastosta eräitä matemaattisia operaatioita tarjoavia funktioita esim. neliöjuurten laskemisessa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Standardikirjasto muodostuu "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"moduuleista"}]},{"type":"text","value":", joihin on ryhmitelty eri aiheisiin liittyviä funktioita ja luokkia. Tutustumme tässä osassa joihinkin hyödyllisiin moduuleihin ja opimme myös tekemään moduulin itse."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Komento "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" ottaa käyttöön halutun moduulin. Tarkastellaan esimerkkinä moduulia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"math"}]},{"type":"text","value":", jossa on matemaattisia funktioita. Seuraava koodi laskee luvun neliöjuuren funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sqrt"}]},{"type":"text","value":" ja logaritmin funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"log"}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" math\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# luvun 5 neliöjuuri"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sqrt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# luvun 8 logaritmi (2-kantainen)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"log"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2.23606797749979\n3.0"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska funktiot ovat moduulissa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"math"}]},{"type":"text","value":", niihin viitataan koodissa nimillä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"math.sqrt"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"math.log"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"h2","properties":{"id":"moduulin-osien-valinta","style":"position:relative;"},"children":[{"type":"text","value":"Moduulin osien valinta"},{"type":"element","tagName":"a","properties":{"href":"#moduulin-osien-valinta","ariaLabel":"moduulin osien valinta permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen tapa käyttää moduulia on valita sieltä mukaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":"-komennolla tiettyjä osia, joita haluamme käyttää. Esimerkiksi seuraava koodi ottaa käyttöön funktiot "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sqrt"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"log"}]},{"type":"text","value":" moduulista "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"math"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" math "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" sqrt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" log\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sqrt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"log"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän tavan etuna on, että voimme käyttää funktioita suoraan ilman "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"math"}]},{"type":"text","value":"-etuliitettä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme myös ottaa suoraan käytettäväksi "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kaiken"}]},{"type":"text","value":" moduulin sisällön tähden avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" math "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sqrt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"log"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä tapa voi olla kätevä testailussa ja pienissä ohjelmissa, mutta siinä on omat ongelmansa, kuten näemme myöhemmin."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Hypotenuusa","tmcname":"osa07-01_hypotenuusa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hypotenuusa(kateetti1: float, kateetti2: float)"}]},{"type":"text","value":", joka saa parametrikseen suorakulmaisen kolmion kateettien pituudet. Funktio palauttaa kolmion hypotenuusan pituuden."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ratkaisu lasketaan "},{"type":"element","tagName":"a","properties":{"href":"https://fi.wikipedia.org/wiki/Pythagoraan_lause","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Pythagoraan"}]},{"type":"text","value":" lauseen avulla. Saat laskettua neliöjuuren "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"math"}]},{"type":"text","value":"-moduulin funktion avulla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkejä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"hypotenuusa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# 5.0"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"hypotenuusa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# 13.0"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"hypotenuusa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# 1.4142135623730951"}]}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"moduulin-sisalto","style":"position:relative;"},"children":[{"type":"text","value":"Moduulin sisältö"},{"type":"element","tagName":"a","properties":{"href":"#moduulin-sisalto","ariaLabel":"moduulin sisalto permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonin dokumentaatio kertoo jokaisesta standardikirjaston moduulista, mitä moduuli sisältää ja kuinka sitä käytetään. Esimerkiksi moduulin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"math"}]},{"type":"text","value":" dokumentaatio on tässä:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/math.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"https://docs.python.org/3/library/math.html"}]}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme myös tutkia funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"dir"}]},{"type":"text","value":" avulla moduulin sisältöä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" math\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"dir"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio antaa listan nimistä, jotka moduuli määrittelee:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['__doc__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'hypot', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Erikoismerkit","tmcname":"osa07-02_erikoismerkit"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moduulissa "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/string.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"string"}]},{"type":"text","value":" on merkkijonovakioita, jotka määrittelevät tiettyjä merkkiryhmiä (esim. pienet kirjaimet ja välimerkit). Tutustu näihin vakioihin ja kirjoita niitä käyttäen funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"jaa_merkkeihin(merkkijono: str)"}]},{"type":"text","value":", joka saa parametrikseen merkkijonon. Funktio palauttaa tuplen, jossa parametrina saadun merkkijonon merkit on jaettu kolmeen eri merkkijonoon:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ensimmäisessä jonossa on kaikki pienet ja suuret englanninkieliset kirjaimet (vakio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ascii_letters"}]},{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Toisessa jonossa on kaikki vakiossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"punctuation"}]},{"type":"text","value":" määritellyt välimerkit"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Kolmannessa jonossa on kaikki merkit (mukaan lukien esim. välilyönnit), jotka eivät kuulu kahteen edelliseen ryhmään"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkit tulee tallentaa palautettuihin merkkijonoihin siinä järjestyksessä kuin ne esiintyvät alkuperäisessä merkkijonossa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" jaa_merkkeihin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tämä on testi!!! Toimiiko, mitä?\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"TmontestiToimiikomit\n!!!,?\nää ä"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Murtoluvuilla laskeminen","tmcname":"osa07-03_murtoluvuilla_laskeminen"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tutustu Pythonin moduuliin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"fractions"}]},{"type":"text","value":" ja toteuta sen avulla funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"jaa_palasiksi(maara: int)"}]},{"type":"text","value":", joka saa parametrikseen palasten määrän. Funktio jakaa luvun 1 parametrin mukaisesti yhtä suuriin murtolukupalasiin ja palauttaa nämä palaset listassa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" p "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" jaa_palasiksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jaa_palasiksi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1/3\n1/3\n1/3"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[Fraction(1, 5), Fraction(1, 5), Fraction(1, 5), Fraction(1, 5), Fraction(1, 5)]"}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, mikä on moduuli
  • \n
  • Osaat ottaa käyttöön moduulin import-lauseella
  • \n
  • Tiedät, miten moduulin sisällöstä voi etsiä tietoa
  • \n

Debugging revisited

Kurssilla on jo moneen otteeseen puhuttu erilaisista debuggausmenetelmistä. Visualisaattori on jo monille tuttu ja vanha kunnon debuggaustulostus toimii aina. Visual Studio Coden debuggeriakin monet ovat jo kokeilleet. Debuggerilla voi olla vaikeuksia selvitä tiedostoja käsittelevästä koodista, mutta siihenkin on olemassa lääke.

Pythonin versio 3.7 tarjoaa vielä yhden erittäin helppokäyttöisen tavan debuggaukseen, komennon breakpoint().

Voit lisätä komennon mihin kohtaan tahansa ohjelmaasi, ja kun suoritat ohjelman, pysähtyy suoritus komennon kohdalle. Seuraavassa esimerkki viime viikon tehtävän debuggaamisesta:

\n \n \n \n \n \n \"7\n \n \n

Kun koodi pysähtyy breakpoint()-komentoon, avautuu samalla konsolinäkymä, johon on mahdollista kirjoittaa mitä tahansa koodia ja kokeilla miten se toimisi ohjelman kyseisessä kohdassa.

Komento on erityisen kätevä jos ohjelmasi jokin rivi aiheuttaa virheen, etkä ole ihan varma mistä virhe johtuu. Näissä tilanteissa kannattaa laittaa breakpoint-kutsu juuri ennen virheellistä riviä. Sen jälkeen on debuggerin konsolissa helppo kokeilla, mikä olisi oikea komento juuri siinä kohtaa suoritettavaksi.

Koodin suoritusta on myös mahdollista jatkaa pysähtymisen jälkeen. Esimerkiksi konsoliin annettu komento continue tai sen lyhennetty versio c jatkaa suoritusta seuraavaan breakpointiin asti. Seuraavassa esimerkki siitä, kun silmukkaa käydään läpi muutamaan kertaan:

\n \n \n \n \n \n \"7\n \n \n

Muut debuggerikonsolin komennot selviävät täältä tai antamalla debuggerkonsolissa komento help:

\n \n

Tee funktio hypotenuusa(kateetti1: float, kateetti2: float), joka saa parametrikseen suorakulmaisen kolmion kateettien pituudet. Funktio palauttaa kolmion hypotenuusan pituuden.

Ratkaisu lasketaan Pythagoraan lauseen avulla. Saat laskettua neliöjuuren math-moduulin funktion avulla.

Esimerkkejä:

print(hypotenuusa(3,4)) # 5.0\nprint(hypotenuusa(5,12)) # 13.0\nprint(hypotenuusa(1,1)) # 1.4142135623730951

Moduulin sisältö

Pythonin dokumentaatio kertoo jokaisesta standardikirjaston moduulista, mitä moduuli sisältää ja kuinka sitä käytetään. Esimerkiksi moduulin math dokumentaatio on tässä:

Voimme myös tutkia funktion dir avulla moduulin sisältöä:

import math\n\nprint(dir(math))

Funktio antaa listan nimistä, jotka moduuli määrittelee:

['__doc__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'hypot', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']

Moduulissa string on merkkijonovakioita, jotka määrittelevät tiettyjä merkkiryhmiä (esim. pienet kirjaimet ja välimerkit). Tutustu näihin vakioihin ja kirjoita niitä käyttäen funktio jaa_merkkeihin(merkkijono: str), joka saa parametrikseen merkkijonon. Funktio palauttaa tuplen, jossa parametrina saadun merkkijonon merkit on jaettu kolmeen eri merkkijonoon:

    \n
  • Ensimmäisessä jonossa on kaikki pienet ja suuret englanninkieliset kirjaimet (vakio ascii_letters)
  • \n
  • Toisessa jonossa on kaikki vakiossa punctuation määritellyt välimerkit
  • \n
  • Kolmannessa jonossa on kaikki merkit (mukaan lukien esim. välilyönnit), jotka eivät kuulu kahteen edelliseen ryhmään
  • \n

Merkit tulee tallentaa palautettuihin merkkijonoihin siinä järjestyksessä kuin ne esiintyvät alkuperäisessä merkkijonossa.

Esimerkki:

osat = jaa_merkkeihin(\"Tämä on testi!!! Toimiiko, mitä?\")\nprint(osat[0])\nprint(osat[1])\nprint(osat[2])

TmontestiToimiikomit\n!!!,?\nää ä

Tutustu Pythonin moduuliin fractions ja toteuta sen avulla funktio jaa_palasiksi(maara: int), joka saa parametrikseen palasten määrän. Funktio jakaa luvun 1 parametrin mukaisesti yhtä suuriin murtolukupalasiin ja palauttaa nämä palaset listassa.

Esimerkki:

for p in jaa_palasiksi(3):\n    print(p)\n\nprint()\n\nprint(jaa_palasiksi(5))

1/3\n1/3\n1/3

[Fraction(1, 5), Fraction(1, 5), Fraction(1, 5), Fraction(1, 5), Fraction(1, 5)]

","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-7/1-moduulit.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-7/2-satunnaisuus/page-data.json b/page-data/osa-7/2-satunnaisuus/page-data.json index efe6e295b..a411169d6 100644 --- a/page-data/osa-7/2-satunnaisuus/page-data.json +++ b/page-data/osa-7/2-satunnaisuus/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-7/2-satunnaisuus", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tunnet moduulin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"random"}]},{"type":"text","value":" funktioita"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat hyödyntää satunnaisuutta omissa ohjelmissasi"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä luvussa tutustutaan standardikirjaston moduuliin "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/random.html?highlight=random#module-random","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"random"}]},{"type":"text","value":", joka tarjoaa välineistöä satunnaislukujen generointiin ja muuhun satunnaiseen toiminnallisuuteen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä ja seuraavissa luvuissa esiteltävien funktioiden yhteyteen on lisäilty linkkejä standardikirjaston "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"dokumentaatioon"}]},{"type":"text","value":". Linkkejä kannattaa klikkailla ja pikkuhiljaa totutella siihen, miltä dokumentaatio näyttää."}]},{"type":"element","tagName":"h2","properties":{"id":"luvun-arpominen","style":"position:relative;"},"children":[{"type":"text","value":"Luvun arpominen"},{"type":"element","tagName":"a","properties":{"href":"#luvun-arpominen","ariaLabel":"luvun arpominen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/random.html?highlight=random#random.randint","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"randint(a, b)"}]},{"type":"text","value":" antaa satunnaisen kokonaisluvun väliltä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":"..."},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":". Esimerkiksi seuraava ohjelma simuloi nopan heittämistä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" random "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" randint\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Noppa antaa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" randint"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulos voisi olla vaikkapa:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Noppa antaa: 4"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma puolestaan heittää noppaa kymmenen kertaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" random "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" randint\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Noppa antaa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" randint"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulos voisi olla seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Noppa antaa: 5\nNoppa antaa: 4\nNoppa antaa: 3\nNoppa antaa: 2\nNoppa antaa: 3\nNoppa antaa: 4\nNoppa antaa: 6\nNoppa antaa: 4\nNoppa antaa: 4\nNoppa antaa: 3"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"randint"}]},{"type":"text","value":" toimii eri logiikalla kuin aiemmin käyttämämme funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"range"}]},{"type":"text","value":", joka luo lukuvälin. Kun kutsumme funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"randint(1, 6)"}]},{"type":"text","value":", lukuväli on 1...6, mutta kun kutsumme funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"range(1, 6)"}]},{"type":"text","value":", lukuväli on 1...5."}]},{"type":"element","tagName":"h2","properties":{"id":"lisaa-funktioita","style":"position:relative;"},"children":[{"type":"text","value":"Lisää funktioita"},{"type":"element","tagName":"a","properties":{"href":"#lisaa-funktioita","ariaLabel":"lisaa funktioita permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/random.html?highlight=random#random.shuffle","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"shuffle"}]},{"type":"text","value":" sekoittaa sille annetun tietorakenteen. Esimerkiksi seuraava ohjelma sekoittaa listalla olevat sanat:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" random "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" shuffle\n\nsanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"apina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"cembalo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nshuffle"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['banaani', 'apina', 'cembalo']"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"choice"}]},{"type":"text","value":" puolestaan valitsee satunnaisen alkion tietorakenteesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" random "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" choice\n\nsanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"apina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"cembalo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"choice"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"'cembalo'"}]}]},{"type":"element","tagName":"h2","properties":{"id":"lottorivin-arvonta","style":"position:relative;"},"children":[{"type":"text","value":"Lottorivin arvonta"},{"type":"element","tagName":"a","properties":{"href":"#lottorivin-arvonta","ariaLabel":"lottorivin arvonta permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkinä tilannetta, jossa haluamme arpoa lottorivin. Lotossa on yhteensä 40 numeroa, joista arvotaan 7 numeroa riviin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yksinkertainen tapa koettaa arpoa lottorivi on seuraava:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" random "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" randint\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"randint"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"40"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä ei ole kuitenkaan toimiva tapa, koska sama numero saattaa tulla useita kertoja riviin. Tarvitsemme jonkin menetelmän, joka varmistaa, että jokainen numero on eri numero."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yksi mahdollisuus on tallentaa arvotut numerot listaan ja lisätä uusi numero listaan vain, jos sitä ei vielä ole siellä. Voimme jatkaa tätä, kunnes listassa on 7 numeroa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" random "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" randint\n\nrivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n uusi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" randint"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"40"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" uusi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"uusi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme kuitenkin toteuttaa arvonnan myös lyhyemmin funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"shuffle"}]},{"type":"text","value":" avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" random "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" shuffle\n\nkaikki "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"41"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nshuffle"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kaikki"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nrivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kaikki"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä ideana on, että luomme ensin listan, jossa on kaikki numerot väliltä 1–40. Tämän jälkeen sekoitamme listan ja valitsemme sitten 7 ensimmäistä numeroa riviin. Tämän ansiosta meidän ei tarvitse tehdä silmukkaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Itse asiassa voimme toteuttaa arvonnan vielä helpommin, koska Pythonin standardikirjastossa on myös funktio "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/random.html?highlight=random#random.sample","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"sample"}]},{"type":"text","value":", joka valitsee annetusta tietorakenteesta halutun määrän alkioita:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" random "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" sample\n\nkaikki_luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"41"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nrivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sample"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kaikki_luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Lottonumerot","tmcname":"osa07-04_lottonumerot"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lottonumerot(maara: int, alaraja: int, ylaraja: int)"}]},{"type":"text","value":", joka arpoo annetun määrän satunnaislukuja väliltä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"alaraja"}]},{"type":"text","value":"..."},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ylaraja"}]},{"type":"text","value":", tallentaa ne listaan ja palauttaa listan. Lukujen tulee olla palautetussa listassa suuruusjärjestyksessä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska kyseessä ovat lottonumerot, sama numero ei saa esiintyä listassa kahta kertaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" numero "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lottonumerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"40"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4\n7\n11\n16\n22\n29\n38"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"mista-satunnaisluvut-tulevat","style":"position:relative;"},"children":[{"type":"text","value":"Mistä satunnaisluvut tulevat?"},{"type":"element","tagName":"a","properties":{"href":"#mista-satunnaisluvut-tulevat","ariaLabel":"mista satunnaisluvut tulevat permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moduulin "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/random.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"random"}]},{"type":"text","value":" toiminta perustuu algoritmiin, joka tuottaa satunnaislukuja tietyn lähtöarvon ja matemaattisten operaatioiden avulla. Lähtöarvoa kutsutaan myös nimellä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"siemenarvo"}]},{"type":"text","value":" (engl. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"seed value"}]},{"type":"text","value":")."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme halutessamme antaa siemenarvon itse funktiolla "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/random.html?highlight=random#random.seed","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"seed"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" random "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" randint"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" seed\n\nseed"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1337"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tästä tulee aina sama satunnaisluku"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"randint"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun annamme siemenarvon itse, satunnaisuutta käyttävät funktiot antavat samat tulokset ohjelman jokaisella suorituskerralla. Tulokset voivat kuitenkin riippua käytetystä Pythonin versiosta."}]},{"type":"element","tagName":"text-box","properties":{"variant":"info","name":"Aito satunnaisuus"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos tarkkoja ollaan, moduulin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"random"}]},{"type":"text","value":" muodostamat luvut eivät ole aitoja satunnaislukuja, vaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"pseudosatunnaislukuja"}]},{"type":"text","value":". Tietokoneen avulla on vaikea arpoa täysin satunnaisia lukuja, koska sen toiminta on kaikilta osin ennustettavissa. Monissa käyttötarkoituksissa luvut ovat kuitenkin tarpeeksi satunnaisia. Aitoja satunnaislukuja muodostettaessa lähteenä käytetään yleensä jotain tietokoneen ulkopuolista satunnaista ilmiötä, esimerkiksi radioaktiivista taustasäteilyä tai äänentasoa."}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"text","value":"Lisätietoa löydät esimerkiksi sivulta "},{"type":"element","tagName":"a","properties":{"href":"https://www.random.org/randomness/"},"children":[{"type":"text","value":"random.org"}]},{"type":"text","value":"."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Salasanan arpoja, osa 1","tmcname":"osa07-05_salasanan_arpoja_1"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio, jonka avulla on mahdollista luoda halutun pituisia satunnaisista pienistä kirjaimista (väliltä a-z) muodostettuja salasanoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luo_salasana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"lttehepy\nolsxttjl\ncbjncrzo\ndwxqjdgu\ngpfdcecs\njabyvgar\nxnbbonbl\nktmsjyww\nejhprmel\nrjkoacib"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Salasanan arpoja, osa 2","tmcname":"osa07-06_salasanan_arpoja_2"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee paranneltu versio edellisen tehtävän funktiosta. Funktio saa nyt kolme parametria:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"jos toinen parametri on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", salasanassa on myös (yksi tai useampi) numero"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"jos kolmas parametri on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", salasanassa on myös (yksi tai useampi) erikoismerkki joukosta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"!?=+-()#"}]}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Salasanassa täytyy olla parametreista riippumatta aina vähintään yksi kirjain. Voit olettaa, että funktiota kutsutaan aina parametreilla, joilla on mahdollista tuottaa halutunlaisia salasanoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luo_hyva_salasana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2?0n+u31\nu=m4nl94\nn#=i6r#(\nda9?zvm?\n7h)!)g?!\na=59x2n5\n(jr6n3b5\n9n(4i+2!\n32+qba#=\nn?b0a7ey"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Noppasimulaatio","tmcname":"osa07-07_noppasimulaatio"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehdään tässä tehtävässä muutamia funktioita, joita on mahdollista käyttää nopanheittoon liittyvissä peleissä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Normaalin nopan sijaan tehtävässä käytetään ns. epätransitiivisia noppia, joista on lisää tietoa esim. "},{"type":"element","tagName":"a","properties":{"href":"https://singingbanana.com/dice/article.htm","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"tässä artikkelissa"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"a","properties":{"href":"https://www.youtube.com/watch?v=LrIp6CKUlH8","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"tässä videossa"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käytössä on kolme noppaa:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Nopassa A on numerot 3, 3, 3, 3, 3, 6"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Nopassa B on numerot 2, 2, 2, 5, 5, 5"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Nopassa C on numerot 1, 4, 4, 4, 4, 4"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"heita(noppa: str)"}]},{"type":"text","value":", joka heittää parametrinsa kertomaa noppaa. Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"heita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"A\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" end"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"heita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"B\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" end"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"heita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"C\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" end"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 6 3 6 3\n2 2 5 2 2 5 5 2 2 5 2 5 5 5 2 5 2 2 2 2\n4 4 4 4 4 1 1 4 4 4 1 4 4 4 4 4 4 4 4 4"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee vielä funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pelaa(noppa1: str, noppa2: str, kertaa: int)"}]},{"type":"text","value":" joka heittää kokonaisluvun kertoman määrän parametreina olevia noppia. Funktio palauttaa tuplen, joka kertoo nopan 1 voittojen lukumäärän, nopan 2 voittojen lukumäärän ja tasapelien lukumäärän."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pelaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"A\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"C\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pelaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"B\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"B\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"(292, 708, 0)\n(249, 273, 478)"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Satunnaiset sanat","tmcname":"osa07-08_satunnaiset_sanat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on annettu tiedosto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sanat.txt"}]},{"type":"text","value":", joka sisältää englannin kielen sanoja, yksi sana joka rivillä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sanat(n: int, alku: str)"}]},{"type":"text","value":", joka palauttaa listassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"n"}]},{"type":"text","value":" kappaletta satunnaisia sanoja tiedostosta. Kaikkien palautettujen sanojen tulee alkaa annetulla merkkijonolla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos funktiota esim. kutsuttaisiin parametreilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sanat(3, \"ca\")"}]},{"type":"text","value":", se voisi palauttaa listassa esim. sanat \"cat\", \"car\" ja \"carbon\". Sama sana ei saa esiintyä listassa kahdesti."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos annetulla merkkijonolla alkavia sanoja ei löydy tarpeeksi annetun kokoisen ryhmän muodostamiseen, funktio tuottaa poikkeuksen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ValueError"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ca\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"cat\ncar\ncarbon"}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tunnet moduulin random funktioita
  • \n
  • Osaat hyödyntää satunnaisuutta omissa ohjelmissasi
  • \n

Tässä luvussa tutustutaan standardikirjaston moduuliin random, joka tarjoaa välineistöä satunnaislukujen generointiin ja muuhun satunnaiseen toiminnallisuuteen.

Tässä ja seuraavissa luvuissa esiteltävien funktioiden yhteyteen on lisäilty linkkejä standardikirjaston dokumentaatioon. Linkkejä kannattaa klikkailla ja pikkuhiljaa totutella siihen, miltä dokumentaatio näyttää.

Luvun arpominen

Funktio randint(a, b) antaa satunnaisen kokonaisluvun väliltä a...b. Esimerkiksi seuraava ohjelma simuloi nopan heittämistä:

from random import randint\n\nprint(\"Noppa antaa:\", randint(1, 6))

Ohjelman tulos voisi olla vaikkapa:

Noppa antaa: 4

Seuraava ohjelma puolestaan heittää noppaa kymmenen kertaa:

from random import randint\n\nfor i in range(10):\n    print(\"Noppa antaa:\", randint(1, 6))

Ohjelman tulos voisi olla seuraava:

Noppa antaa: 5\nNoppa antaa: 4\nNoppa antaa: 3\nNoppa antaa: 2\nNoppa antaa: 3\nNoppa antaa: 4\nNoppa antaa: 6\nNoppa antaa: 4\nNoppa antaa: 4\nNoppa antaa: 3

Huomaa, että funktio randint toimii eri logiikalla kuin aiemmin käyttämämme funktio range, joka luo lukuvälin. Kun kutsumme funktiota randint(1, 6), lukuväli on 1...6, mutta kun kutsumme funktiota range(1, 6), lukuväli on 1...5.

Lisää funktioita

Funktio shuffle sekoittaa sille annetun tietorakenteen. Esimerkiksi seuraava ohjelma sekoittaa listalla olevat sanat:

from random import shuffle\n\nsanat = [\"apina\", \"banaani\", \"cembalo\"]\nshuffle(sanat)\nprint(sanat)

['banaani', 'apina', 'cembalo']

Funktio choice puolestaan valitsee satunnaisen alkion tietorakenteesta:

from random import choice\n\nsanat = [\"apina\", \"banaani\", \"cembalo\"]\nprint(choice(sanat))

'cembalo'

Lottorivin arvonta

Tarkastellaan esimerkkinä tilannetta, jossa haluamme arpoa lottorivin. Lotossa on yhteensä 40 numeroa, joista arvotaan 7 numeroa riviin.

Yksinkertainen tapa koettaa arpoa lottorivi on seuraava:

from random import randint\n\nfor i in range(7):\n    print(randint(1, 40))

Tämä ei ole kuitenkaan toimiva tapa, koska sama numero saattaa tulla useita kertoja riviin. Tarvitsemme jonkin menetelmän, joka varmistaa, että jokainen numero on eri numero.

Yksi mahdollisuus on tallentaa arvotut numerot listaan ja lisätä uusi numero listaan vain, jos sitä ei vielä ole siellä. Voimme jatkaa tätä, kunnes listassa on 7 numeroa:

from random import randint\n\nrivi = []\nwhile len(rivi) < 7:\n    uusi = randint(1, 40)\n    if uusi not in rivi:\n        rivi.append(uusi)\n\nprint(rivi)

Voimme kuitenkin toteuttaa arvonnan myös lyhyemmin funktion shuffle avulla:

from random import shuffle\n\nkaikki = list(range(1, 41))\nshuffle(kaikki)\nrivi = kaikki[0:7]\nprint(rivi)

Tässä ideana on, että luomme ensin listan, jossa on kaikki numerot väliltä 1–40. Tämän jälkeen sekoitamme listan ja valitsemme sitten 7 ensimmäistä numeroa riviin. Tämän ansiosta meidän ei tarvitse tehdä silmukkaa.

Itse asiassa voimme toteuttaa arvonnan vielä helpommin, koska Pythonin standardikirjastossa on myös funktio sample, joka valitsee annetusta tietorakenteesta halutun määrän alkioita:

from random import sample\n\nkaikki_luvut = list(range(1, 41))\nrivi = sample(kaikki_luvut, 7)\nprint(rivi)

Tee funktio lottonumerot(maara: int, alaraja: int, ylaraja: int), joka arpoo annetun määrän satunnaislukuja väliltä alaraja...ylaraja, tallentaa ne listaan ja palauttaa listan. Lukujen tulee olla palautetussa listassa suuruusjärjestyksessä.

Koska kyseessä ovat lottonumerot, sama numero ei saa esiintyä listassa kahta kertaa.

Esimerkki:

for numero in lottonumerot(7, 1, 40):\n    print(numero)

4\n7\n11\n16\n22\n29\n38

Mistä satunnaisluvut tulevat?

Moduulin random toiminta perustuu algoritmiin, joka tuottaa satunnaislukuja tietyn lähtöarvon ja matemaattisten operaatioiden avulla. Lähtöarvoa kutsutaan myös nimellä siemenarvo (engl. seed value).

Voimme halutessamme antaa siemenarvon itse funktiolla seed:

from random import randint, seed\n\nseed(1337)\n# tästä tulee aina sama satunnaisluku\nprint(randint(1, 100))

Kun annamme siemenarvon itse, satunnaisuutta käyttävät funktiot antavat samat tulokset ohjelman jokaisella suorituskerralla. Tulokset voivat kuitenkin riippua käytetystä Pythonin versiosta.

Jos tarkkoja ollaan, moduulin random muodostamat luvut eivät ole aitoja satunnaislukuja, vaan pseudosatunnaislukuja. Tietokoneen avulla on vaikea arpoa täysin satunnaisia lukuja, koska sen toiminta on kaikilta osin ennustettavissa. Monissa käyttötarkoituksissa luvut ovat kuitenkin tarpeeksi satunnaisia. Aitoja satunnaislukuja muodostettaessa lähteenä käytetään yleensä jotain tietokoneen ulkopuolista satunnaista ilmiötä, esimerkiksi radioaktiivista taustasäteilyä tai äänentasoa.

Lisätietoa löydät esimerkiksi sivulta random.org.

Tee funktio, jonka avulla on mahdollista luoda halutun pituisia satunnaisista pienistä kirjaimista (väliltä a-z) muodostettuja salasanoja.

Esimerkki:

for i in range(10):\n    print(luo_salasana(8))

lttehepy\nolsxttjl\ncbjncrzo\ndwxqjdgu\ngpfdcecs\njabyvgar\nxnbbonbl\nktmsjyww\nejhprmel\nrjkoacib

Tee paranneltu versio edellisen tehtävän funktiosta. Funktio saa nyt kolme parametria:

    \n
  • jos toinen parametri on True, salasanassa on myös (yksi tai useampi) numero
  • \n
  • jos kolmas parametri on True, salasanassa on myös (yksi tai useampi) erikoismerkki joukosta !?=+-()#
  • \n

Salasanassa täytyy olla parametreista riippumatta aina vähintään yksi kirjain. Voit olettaa, että funktiota kutsutaan aina parametreilla, joilla on mahdollista tuottaa halutunlaisia salasanoja.

Esimerkki:

for i in range(10):\n    print(luo_hyva_salasana(8, True, True))

2?0n+u31\nu=m4nl94\nn#=i6r#(\nda9?zvm?\n7h)!)g?!\na=59x2n5\n(jr6n3b5\n9n(4i+2!\n32+qba#=\nn?b0a7ey

Tehdään tässä tehtävässä muutamia funktioita, joita on mahdollista käyttää nopanheittoon liittyvissä peleissä.

Normaalin nopan sijaan tehtävässä käytetään ns. epätransitiivisia noppia, joista on lisää tietoa esim. tässä artikkelissa tai tässä videossa.

Käytössä on kolme noppaa:

    \n
  • Nopassa A on numerot 3, 3, 3, 3, 3, 6
  • \n
  • Nopassa B on numerot 2, 2, 2, 5, 5, 5
  • \n
  • Nopassa C on numerot 1, 4, 4, 4, 4, 4
  • \n

Tee funktio heita(noppa: str), joka heittää parametrinsa kertomaa noppaa. Esimerkki:

for i in range(20):\n    print(heita(\"A\"), \" \", end=\"\")\nprint()\nfor i in range(20):\n    print(heita(\"B\"), \" \", end=\"\")\nprint()\nfor i in range(20):\n    print(heita(\"C\"), \" \", end=\"\")

3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 6 3 6 3\n2 2 5 2 2 5 5 2 2 5 2 5 5 5 2 5 2 2 2 2\n4 4 4 4 4 1 1 4 4 4 1 4 4 4 4 4 4 4 4 4

Tee vielä funktio pelaa(noppa1: str, noppa2: str, kertaa: int) joka heittää kokonaisluvun kertoman määrän parametreina olevia noppia. Funktio palauttaa tuplen, joka kertoo nopan 1 voittojen lukumäärän, nopan 2 voittojen lukumäärän ja tasapelien lukumäärän.

tulos = pelaa(\"A\", \"C\", 1000)\nprint(tulos)\ntulos = pelaa(\"B\", \"B\", 1000)\nprint(tulos)

(292, 708, 0)\n(249, 273, 478)

Tehtäväpohjassa on annettu tiedosto sanat.txt, joka sisältää englannin kielen sanoja, yksi sana joka rivillä.

Kirjoita funktio sanat(n: int, alku: str), joka palauttaa listassa n kappaletta satunnaisia sanoja tiedostosta. Kaikkien palautettujen sanojen tulee alkaa annetulla merkkijonolla.

Jos funktiota esim. kutsuttaisiin parametreilla sanat(3, \"ca\"), se voisi palauttaa listassa esim. sanat \"cat\", \"car\" ja \"carbon\". Sama sana ei saa esiintyä listassa kahdesti.

Jos annetulla merkkijonolla alkavia sanoja ei löydy tarpeeksi annetun kokoisen ryhmän muodostamiseen, funktio tuottaa poikkeuksen ValueError.

Esimerkki:

lista = sanat(3, \"ca\")\nfor sana in lista:\n    print(sana)

cat\ncar\ncarbon

","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-7/2-satunnaisuus.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tunnet moduulin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"random"}]},{"type":"text","value":" funktioita"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat hyödyntää satunnaisuutta omissa ohjelmissasi"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä luvussa tutustutaan standardikirjaston moduuliin "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/random.html?highlight=random#module-random","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"random"}]},{"type":"text","value":", joka tarjoaa välineistöä satunnaislukujen generointiin ja muuhun satunnaiseen toiminnallisuuteen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä ja seuraavissa luvuissa esiteltävien funktioiden yhteyteen on lisäilty linkkejä standardikirjaston "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"dokumentaatioon"}]},{"type":"text","value":". Linkkejä kannattaa klikkailla ja pikkuhiljaa totutella siihen, miltä dokumentaatio näyttää."}]},{"type":"element","tagName":"h2","properties":{"id":"luvun-arpominen","style":"position:relative;"},"children":[{"type":"text","value":"Luvun arpominen"},{"type":"element","tagName":"a","properties":{"href":"#luvun-arpominen","ariaLabel":"luvun arpominen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/random.html?highlight=random#random.randint","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"randint(a, b)"}]},{"type":"text","value":" antaa satunnaisen kokonaisluvun väliltä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":"..."},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":". Esimerkiksi seuraava ohjelma simuloi nopan heittämistä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" random "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" randint\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Noppa antaa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" randint"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulos voisi olla vaikkapa:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Noppa antaa: 4"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava ohjelma puolestaan heittää noppaa kymmenen kertaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" random "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" randint\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Noppa antaa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" randint"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulos voisi olla seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Noppa antaa: 5\nNoppa antaa: 4\nNoppa antaa: 3\nNoppa antaa: 2\nNoppa antaa: 3\nNoppa antaa: 4\nNoppa antaa: 6\nNoppa antaa: 4\nNoppa antaa: 4\nNoppa antaa: 3"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"randint"}]},{"type":"text","value":" toimii eri logiikalla kuin aiemmin käyttämämme funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"range"}]},{"type":"text","value":", joka luo lukuvälin. Kun kutsumme funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"randint(1, 6)"}]},{"type":"text","value":", lukuväli on 1...6, mutta kun kutsumme funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"range(1, 6)"}]},{"type":"text","value":", lukuväli on 1...5."}]},{"type":"element","tagName":"h2","properties":{"id":"lisaa-funktioita","style":"position:relative;"},"children":[{"type":"text","value":"Lisää funktioita"},{"type":"element","tagName":"a","properties":{"href":"#lisaa-funktioita","ariaLabel":"lisaa funktioita permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/random.html?highlight=random#random.shuffle","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"shuffle"}]},{"type":"text","value":" sekoittaa sille annetun tietorakenteen. Esimerkiksi seuraava ohjelma sekoittaa listalla olevat sanat:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" random "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" shuffle\n\nsanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"apina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"cembalo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nshuffle"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['banaani', 'apina', 'cembalo']"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"choice"}]},{"type":"text","value":" puolestaan valitsee satunnaisen alkion tietorakenteesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" random "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" choice\n\nsanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"apina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaani\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"cembalo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"choice"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"'cembalo'"}]}]},{"type":"element","tagName":"h2","properties":{"id":"lottorivin-arvonta","style":"position:relative;"},"children":[{"type":"text","value":"Lottorivin arvonta"},{"type":"element","tagName":"a","properties":{"href":"#lottorivin-arvonta","ariaLabel":"lottorivin arvonta permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkinä tilannetta, jossa haluamme arpoa lottorivin. Lotossa on yhteensä 40 numeroa, joista arvotaan 7 numeroa riviin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yksinkertainen tapa koettaa arpoa lottorivi on seuraava:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" random "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" randint\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"randint"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"40"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä ei ole kuitenkaan toimiva tapa, koska sama numero saattaa tulla useita kertoja riviin. Tarvitsemme jonkin menetelmän, joka varmistaa, että jokainen numero on eri numero."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yksi mahdollisuus on tallentaa arvotut numerot listaan ja lisätä uusi numero listaan vain, jos sitä ei vielä ole siellä. Voimme jatkaa tätä, kunnes listassa on 7 numeroa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" random "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" randint\n\nrivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n uusi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" randint"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"40"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" uusi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"uusi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme kuitenkin toteuttaa arvonnan myös lyhyemmin funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"shuffle"}]},{"type":"text","value":" avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" random "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" shuffle\n\nkaikki "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"41"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nshuffle"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kaikki"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nrivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kaikki"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä ideana on, että luomme ensin listan, jossa on kaikki numerot väliltä 1–40. Tämän jälkeen sekoitamme listan ja valitsemme sitten 7 ensimmäistä numeroa riviin. Tämän ansiosta meidän ei tarvitse tehdä silmukkaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Itse asiassa voimme toteuttaa arvonnan vielä helpommin, koska Pythonin standardikirjastossa on myös funktio "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/random.html?highlight=random#random.sample","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"sample"}]},{"type":"text","value":", joka valitsee annetusta tietorakenteesta halutun määrän alkioita:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" random "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" sample\n\nkaikki_luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"41"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nrivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sample"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kaikki_luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Lottonumerot","tmcname":"osa07-04_lottonumerot"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lottonumerot(maara: int, alaraja: int, ylaraja: int)"}]},{"type":"text","value":", joka arpoo annetun määrän satunnaislukuja väliltä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"alaraja"}]},{"type":"text","value":"..."},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ylaraja"}]},{"type":"text","value":", tallentaa ne listaan ja palauttaa listan. Lukujen tulee olla palautetussa listassa suuruusjärjestyksessä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska kyseessä ovat lottonumerot, sama numero ei saa esiintyä listassa kahta kertaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" numero "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lottonumerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"40"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"4\n7\n11\n16\n22\n29\n38"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"mista-satunnaisluvut-tulevat","style":"position:relative;"},"children":[{"type":"text","value":"Mistä satunnaisluvut tulevat?"},{"type":"element","tagName":"a","properties":{"href":"#mista-satunnaisluvut-tulevat","ariaLabel":"mista satunnaisluvut tulevat permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moduulin "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/random.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"random"}]},{"type":"text","value":" toiminta perustuu algoritmiin, joka tuottaa satunnaislukuja tietyn lähtöarvon ja matemaattisten operaatioiden avulla. Lähtöarvoa kutsutaan myös nimellä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"siemenarvo"}]},{"type":"text","value":" (engl. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"seed value"}]},{"type":"text","value":")."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme halutessamme antaa siemenarvon itse funktiolla "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/random.html?highlight=random#random.seed","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"seed"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" random "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" randint"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" seed\n\nseed"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1337"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tästä tulee aina sama satunnaisluku"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"randint"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun annamme siemenarvon itse, satunnaisuutta käyttävät funktiot antavat samat tulokset ohjelman jokaisella suorituskerralla. Tulokset voivat kuitenkin riippua käytetystä Pythonin versiosta."}]},{"type":"element","tagName":"text-box","properties":{"variant":"info","name":"Aito satunnaisuus"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos tarkkoja ollaan, moduulin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"random"}]},{"type":"text","value":" muodostamat luvut eivät ole aitoja satunnaislukuja, vaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"pseudosatunnaislukuja"}]},{"type":"text","value":". Tietokoneen avulla on vaikea arpoa täysin satunnaisia lukuja, koska sen toiminta on kaikilta osin ennustettavissa. Monissa käyttötarkoituksissa luvut ovat kuitenkin tarpeeksi satunnaisia. Aitoja satunnaislukuja muodostettaessa lähteenä käytetään yleensä jotain tietokoneen ulkopuolista satunnaista ilmiötä, esimerkiksi radioaktiivista taustasäteilyä tai äänentasoa."}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"text","value":"Lisätietoa löydät esimerkiksi sivulta "},{"type":"element","tagName":"a","properties":{"href":"https://www.random.org/randomness/"},"children":[{"type":"text","value":"random.org"}]},{"type":"text","value":"."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Salasanan arpoja, osa 1","tmcname":"osa07-05_salasanan_arpoja_1"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio, jonka avulla on mahdollista luoda halutun pituisia satunnaisista pienistä kirjaimista (väliltä a-z) muodostettuja salasanoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luo_salasana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"lttehepy\nolsxttjl\ncbjncrzo\ndwxqjdgu\ngpfdcecs\njabyvgar\nxnbbonbl\nktmsjyww\nejhprmel\nrjkoacib"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Salasanan arpoja, osa 2","tmcname":"osa07-06_salasanan_arpoja_2"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee paranneltu versio edellisen tehtävän funktiosta. Funktio saa nyt kolme parametria:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"jos toinen parametri on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", salasanassa on myös (yksi tai useampi) numero"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"jos kolmas parametri on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", salasanassa on myös (yksi tai useampi) erikoismerkki joukosta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"!?=+-()#"}]}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Salasanassa täytyy olla parametreista riippumatta aina vähintään yksi kirjain. Voit olettaa, että funktiota kutsutaan aina parametreilla, joilla on mahdollista tuottaa halutunlaisia salasanoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luo_hyva_salasana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2?0n+u31\nu=m4nl94\nn#=i6r#(\nda9?zvm?\n7h)!)g?!\na=59x2n5\n(jr6n3b5\n9n(4i+2!\n32+qba#=\nn?b0a7ey"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Noppasimulaatio","tmcname":"osa07-07_noppasimulaatio"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehdään tässä tehtävässä muutamia funktioita, joita on mahdollista käyttää nopanheittoon liittyvissä peleissä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Normaalin nopan sijaan tehtävässä käytetään ns. epätransitiivisia noppia, joista on lisää tietoa esim. "},{"type":"element","tagName":"a","properties":{"href":"https://singingbanana.com/dice/article.htm","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"tässä artikkelissa"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"a","properties":{"href":"https://www.youtube.com/watch?v=LrIp6CKUlH8","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"tässä videossa"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käytössä on kolme noppaa:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Nopassa A on numerot 3, 3, 3, 3, 3, 6"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Nopassa B on numerot 2, 2, 2, 5, 5, 5"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Nopassa C on numerot 1, 4, 4, 4, 4, 4"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"heita(noppa: str)"}]},{"type":"text","value":", joka heittää parametrinsa kertomaa noppaa. Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"heita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"A\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" end"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"heita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"B\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" end"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"heita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"C\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" end"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 6 3 6 3\n2 2 5 2 2 5 5 2 2 5 2 5 5 5 2 5 2 2 2 2\n4 4 4 4 4 1 1 4 4 4 1 4 4 4 4 4 4 4 4 4"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee vielä funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pelaa(noppa1: str, noppa2: str, kertaa: int)"}]},{"type":"text","value":" joka heittää kokonaisluvun kertoman määrän parametreina olevia noppia. Funktio palauttaa tuplen, joka kertoo nopan 1 voittojen lukumäärän, nopan 2 voittojen lukumäärän ja tasapelien lukumäärän."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pelaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"A\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"C\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pelaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"B\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"B\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"(292, 708, 0)\n(249, 273, 478)"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Satunnaiset sanat","tmcname":"osa07-08_satunnaiset_sanat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on annettu tiedosto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sanat.txt"}]},{"type":"text","value":", joka sisältää englannin kielen sanoja, yksi sana joka rivillä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sanat(n: int, alku: str)"}]},{"type":"text","value":", joka palauttaa listassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"n"}]},{"type":"text","value":" kappaletta satunnaisia sanoja tiedostosta. Kaikkien palautettujen sanojen tulee alkaa annetulla merkkijonolla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos funktiota esim. kutsuttaisiin parametreilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sanat(3, \"ca\")"}]},{"type":"text","value":", se voisi palauttaa listassa esim. sanat \"cat\", \"car\" ja \"carbon\". Sama sana ei saa esiintyä listassa kahdesti."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos annetulla merkkijonolla alkavia sanoja ei löydy tarpeeksi annetun kokoisen ryhmän muodostamiseen, funktio tuottaa poikkeuksen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ValueError"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ca\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"cat\ncar\ncarbon"}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tunnet moduulin random funktioita
  • \n
  • Osaat hyödyntää satunnaisuutta omissa ohjelmissasi
  • \n

Tässä luvussa tutustutaan standardikirjaston moduuliin random, joka tarjoaa välineistöä satunnaislukujen generointiin ja muuhun satunnaiseen toiminnallisuuteen.

Tässä ja seuraavissa luvuissa esiteltävien funktioiden yhteyteen on lisäilty linkkejä standardikirjaston dokumentaatioon. Linkkejä kannattaa klikkailla ja pikkuhiljaa totutella siihen, miltä dokumentaatio näyttää.

Luvun arpominen

Funktio randint(a, b) antaa satunnaisen kokonaisluvun väliltä a...b. Esimerkiksi seuraava ohjelma simuloi nopan heittämistä:

from random import randint\n\nprint(\"Noppa antaa:\", randint(1, 6))

Ohjelman tulos voisi olla vaikkapa:

Noppa antaa: 4

Seuraava ohjelma puolestaan heittää noppaa kymmenen kertaa:

from random import randint\n\nfor i in range(10):\n    print(\"Noppa antaa:\", randint(1, 6))

Ohjelman tulos voisi olla seuraava:

Noppa antaa: 5\nNoppa antaa: 4\nNoppa antaa: 3\nNoppa antaa: 2\nNoppa antaa: 3\nNoppa antaa: 4\nNoppa antaa: 6\nNoppa antaa: 4\nNoppa antaa: 4\nNoppa antaa: 3

Huomaa, että funktio randint toimii eri logiikalla kuin aiemmin käyttämämme funktio range, joka luo lukuvälin. Kun kutsumme funktiota randint(1, 6), lukuväli on 1...6, mutta kun kutsumme funktiota range(1, 6), lukuväli on 1...5.

Lisää funktioita

Funktio shuffle sekoittaa sille annetun tietorakenteen. Esimerkiksi seuraava ohjelma sekoittaa listalla olevat sanat:

from random import shuffle\n\nsanat = [\"apina\", \"banaani\", \"cembalo\"]\nshuffle(sanat)\nprint(sanat)

['banaani', 'apina', 'cembalo']

Funktio choice puolestaan valitsee satunnaisen alkion tietorakenteesta:

from random import choice\n\nsanat = [\"apina\", \"banaani\", \"cembalo\"]\nprint(choice(sanat))

'cembalo'

Lottorivin arvonta

Tarkastellaan esimerkkinä tilannetta, jossa haluamme arpoa lottorivin. Lotossa on yhteensä 40 numeroa, joista arvotaan 7 numeroa riviin.

Yksinkertainen tapa koettaa arpoa lottorivi on seuraava:

from random import randint\n\nfor i in range(7):\n    print(randint(1, 40))

Tämä ei ole kuitenkaan toimiva tapa, koska sama numero saattaa tulla useita kertoja riviin. Tarvitsemme jonkin menetelmän, joka varmistaa, että jokainen numero on eri numero.

Yksi mahdollisuus on tallentaa arvotut numerot listaan ja lisätä uusi numero listaan vain, jos sitä ei vielä ole siellä. Voimme jatkaa tätä, kunnes listassa on 7 numeroa:

from random import randint\n\nrivi = []\nwhile len(rivi) < 7:\n    uusi = randint(1, 40)\n    if uusi not in rivi:\n        rivi.append(uusi)\n\nprint(rivi)

Voimme kuitenkin toteuttaa arvonnan myös lyhyemmin funktion shuffle avulla:

from random import shuffle\n\nkaikki = list(range(1, 41))\nshuffle(kaikki)\nrivi = kaikki[0:7]\nprint(rivi)

Tässä ideana on, että luomme ensin listan, jossa on kaikki numerot väliltä 1–40. Tämän jälkeen sekoitamme listan ja valitsemme sitten 7 ensimmäistä numeroa riviin. Tämän ansiosta meidän ei tarvitse tehdä silmukkaa.

Itse asiassa voimme toteuttaa arvonnan vielä helpommin, koska Pythonin standardikirjastossa on myös funktio sample, joka valitsee annetusta tietorakenteesta halutun määrän alkioita:

from random import sample\n\nkaikki_luvut = list(range(1, 41))\nrivi = sample(kaikki_luvut, 7)\nprint(rivi)

Tee funktio lottonumerot(maara: int, alaraja: int, ylaraja: int), joka arpoo annetun määrän satunnaislukuja väliltä alaraja...ylaraja, tallentaa ne listaan ja palauttaa listan. Lukujen tulee olla palautetussa listassa suuruusjärjestyksessä.

Koska kyseessä ovat lottonumerot, sama numero ei saa esiintyä listassa kahta kertaa.

Esimerkki:

for numero in lottonumerot(7, 1, 40):\n    print(numero)

4\n7\n11\n16\n22\n29\n38

Mistä satunnaisluvut tulevat?

Moduulin random toiminta perustuu algoritmiin, joka tuottaa satunnaislukuja tietyn lähtöarvon ja matemaattisten operaatioiden avulla. Lähtöarvoa kutsutaan myös nimellä siemenarvo (engl. seed value).

Voimme halutessamme antaa siemenarvon itse funktiolla seed:

from random import randint, seed\n\nseed(1337)\n# tästä tulee aina sama satunnaisluku\nprint(randint(1, 100))

Kun annamme siemenarvon itse, satunnaisuutta käyttävät funktiot antavat samat tulokset ohjelman jokaisella suorituskerralla. Tulokset voivat kuitenkin riippua käytetystä Pythonin versiosta.

Jos tarkkoja ollaan, moduulin random muodostamat luvut eivät ole aitoja satunnaislukuja, vaan pseudosatunnaislukuja. Tietokoneen avulla on vaikea arpoa täysin satunnaisia lukuja, koska sen toiminta on kaikilta osin ennustettavissa. Monissa käyttötarkoituksissa luvut ovat kuitenkin tarpeeksi satunnaisia. Aitoja satunnaislukuja muodostettaessa lähteenä käytetään yleensä jotain tietokoneen ulkopuolista satunnaista ilmiötä, esimerkiksi radioaktiivista taustasäteilyä tai äänentasoa.

Lisätietoa löydät esimerkiksi sivulta random.org.

Tee funktio, jonka avulla on mahdollista luoda halutun pituisia satunnaisista pienistä kirjaimista (väliltä a-z) muodostettuja salasanoja.

Esimerkki:

for i in range(10):\n    print(luo_salasana(8))

lttehepy\nolsxttjl\ncbjncrzo\ndwxqjdgu\ngpfdcecs\njabyvgar\nxnbbonbl\nktmsjyww\nejhprmel\nrjkoacib

Tee paranneltu versio edellisen tehtävän funktiosta. Funktio saa nyt kolme parametria:

    \n
  • jos toinen parametri on True, salasanassa on myös (yksi tai useampi) numero
  • \n
  • jos kolmas parametri on True, salasanassa on myös (yksi tai useampi) erikoismerkki joukosta !?=+-()#
  • \n

Salasanassa täytyy olla parametreista riippumatta aina vähintään yksi kirjain. Voit olettaa, että funktiota kutsutaan aina parametreilla, joilla on mahdollista tuottaa halutunlaisia salasanoja.

Esimerkki:

for i in range(10):\n    print(luo_hyva_salasana(8, True, True))

2?0n+u31\nu=m4nl94\nn#=i6r#(\nda9?zvm?\n7h)!)g?!\na=59x2n5\n(jr6n3b5\n9n(4i+2!\n32+qba#=\nn?b0a7ey

Tehdään tässä tehtävässä muutamia funktioita, joita on mahdollista käyttää nopanheittoon liittyvissä peleissä.

Normaalin nopan sijaan tehtävässä käytetään ns. epätransitiivisia noppia, joista on lisää tietoa esim. tässä artikkelissa tai tässä videossa.

Käytössä on kolme noppaa:

    \n
  • Nopassa A on numerot 3, 3, 3, 3, 3, 6
  • \n
  • Nopassa B on numerot 2, 2, 2, 5, 5, 5
  • \n
  • Nopassa C on numerot 1, 4, 4, 4, 4, 4
  • \n

Tee funktio heita(noppa: str), joka heittää parametrinsa kertomaa noppaa. Esimerkki:

for i in range(20):\n    print(heita(\"A\"), \" \", end=\"\")\nprint()\nfor i in range(20):\n    print(heita(\"B\"), \" \", end=\"\")\nprint()\nfor i in range(20):\n    print(heita(\"C\"), \" \", end=\"\")

3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 6 3 6 3\n2 2 5 2 2 5 5 2 2 5 2 5 5 5 2 5 2 2 2 2\n4 4 4 4 4 1 1 4 4 4 1 4 4 4 4 4 4 4 4 4

Tee vielä funktio pelaa(noppa1: str, noppa2: str, kertaa: int) joka heittää kokonaisluvun kertoman määrän parametreina olevia noppia. Funktio palauttaa tuplen, joka kertoo nopan 1 voittojen lukumäärän, nopan 2 voittojen lukumäärän ja tasapelien lukumäärän.

tulos = pelaa(\"A\", \"C\", 1000)\nprint(tulos)\ntulos = pelaa(\"B\", \"B\", 1000)\nprint(tulos)

(292, 708, 0)\n(249, 273, 478)

Tehtäväpohjassa on annettu tiedosto sanat.txt, joka sisältää englannin kielen sanoja, yksi sana joka rivillä.

Kirjoita funktio sanat(n: int, alku: str), joka palauttaa listassa n kappaletta satunnaisia sanoja tiedostosta. Kaikkien palautettujen sanojen tulee alkaa annetulla merkkijonolla.

Jos funktiota esim. kutsuttaisiin parametreilla sanat(3, \"ca\"), se voisi palauttaa listassa esim. sanat \"cat\", \"car\" ja \"carbon\". Sama sana ei saa esiintyä listassa kahdesti.

Jos annetulla merkkijonolla alkavia sanoja ei löydy tarpeeksi annetun kokoisen ryhmän muodostamiseen, funktio tuottaa poikkeuksen ValueError.

Esimerkki:

lista = sanat(3, \"ca\")\nfor sana in lista:\n    print(sana)

cat\ncar\ncarbon

","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-7/2-satunnaisuus.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-7/3-aikojen-kasittely/page-data.json b/page-data/osa-7/3-aikojen-kasittely/page-data.json index 6637e32ab..2508fcd04 100644 --- a/page-data/osa-7/3-aikojen-kasittely/page-data.json +++ b/page-data/osa-7/3-aikojen-kasittely/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-7/3-aikojen-kasittely", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät tavan käsitellä päivämääriä ja kellonaikoja Pythonissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat muodostaa ja käyttää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"datetime"}]},{"type":"text","value":"-olioita"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat vertailla päivämääriä ja kellonaikoja toisiinsa ja laskea niiden erotuksia"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"aikaolio","style":"position:relative;"},"children":[{"type":"text","value":"Aikaolio"},{"type":"element","tagName":"a","properties":{"href":"#aikaolio","ariaLabel":"aikaolio permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moduulin "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/datetime.html?highlight=datetime#datetime.datetime","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"datetime"}]},{"type":"text","value":" funktio "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/datetime.html?highlight=datetime#datetime.datetime.now","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"now"}]},{"type":"text","value":" antaa aikaolion, jossa on nykyinen päivämäärä ja kellonaika. Voimme esimerkiksi tulostaa nykyhetken päivämäärän ja kellonajan näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" datetime\n\naika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"now"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"aika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2020-10-13 12:46:49.311393"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen tapa muodostaa aikaolio on määrittää ajanhetki itse:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" datetime\n\naika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1952"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"aika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1952-12-24 00:00:00"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun emme antaneet kellonaikaa, oletuksena on, että kyseessä on keskiyö."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme hakea aikaoliosta ajan osia tähän tapaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" datetime\n\naika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1952"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Päivä:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" aika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"day"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kuukausi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" aika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"month"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vuosi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" aika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"year"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Päivä: 24\nKuukausi: 12\nVuosi: 1952"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aikaoliolle voidaan antaa myös kellonaika halutulla tarkkuudella. Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" datetime\n\npv1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"30"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"13"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"00"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# 30.6.2020 klo 13.00"}]},{"type":"text","value":"\npv2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"30"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"18"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"45"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# 30.6.2020 klo 18.45"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"aikojen-vertailu-ja-ero","style":"position:relative;"},"children":[{"type":"text","value":"Aikojen vertailu ja ero"},{"type":"element","tagName":"a","properties":{"href":"#aikojen-vertailu-ja-ero","ariaLabel":"aikojen vertailu ja ero permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme vertailla aikoja samaan tapaan kuin lukuja käyttämällä tuttuja vertailuoperaattoreita:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" datetime\n\nnyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"now"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\njuhannus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" juhannus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ei ole vielä juhannus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" nyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" juhannus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hyvää juhannusta!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" nyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" juhannus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Juhannus on mennyt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Juhannus on mennyt"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme myös laskea kahden ajankohdan eron vähennyslaskuna:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" datetime\n\nnyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"now"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\njuhannus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" juhannus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" nyt\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Juhannukseen on vielä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" ero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"days"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"päivää\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Juhannukseen on vielä 37 päivää"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että vähennyslaskun tuloksena on "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/datetime.html?highlight=datetime#timedelta-objects","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"timedelta"}]},{"type":"text","value":"-olio, jolta voi kysyä vain rajoitetusti ajan yksikköjä. Voimme kysyä päivien määrän, mutta emme voi kysyä esimerkiksi vuosien määrää, koska vuoden pituus vaihtelee."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Timedelta-olion avulla on myös mahdollista selvittää, mikä ajanhetki saadaan kun tietty aika (viikkoina ja päivinä) lisätään johonkin ajanhetkeen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" timedelta\njuhannus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nviikko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" timedelta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"days"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nviikon_paasta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" juhannus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" viikko\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kun viikko juhannuksesta kuluu on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" viikon_paasta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npitka_aika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" timedelta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"weeks"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"32"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" days"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kun juhannuksesta kuluu 32 viikkoa ja 15 päivää on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" juhannus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" pitka_aika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun viikko juhannuksesta kuluu on 2020-06-27 00:00:00\nKun juhannuksesta kuluu 32 viikkoa ja 15 päivää on 2021-02-14 00:00:00"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Timedelta-olio toimii viikkojen ja päivien lisäksi tarkemmallakin tasolla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"now"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkeskiyo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"30"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nerotus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" keskiyo"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"nyt\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"keskiyöhön on vielä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"erotus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"seconds"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" sekuntia\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"keskiyöhön on vielä 8188 sekuntia"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kuinka vanha","tmcname":"osa07-09_kuinka_vanha"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjän syntymäajan (erikseen päivä, kuukausi ja vuosi) ja tulostaa, kuinka monta päivää vanha käyttäjä oli 31.12.1999 seuraavan esimerkin mukaisesti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Päivä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\nKuukausi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"9"}]},{"type":"text","value":"\nVuosi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1979"}]},{"type":"text","value":"\nOlit 7417 päivää vanha, kun vuosituhat vaihtui."}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Päivä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"28"}]},{"type":"text","value":"\nKuukausi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nVuosi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2005"}]},{"type":"text","value":"\nEt ollut syntynyt, kun vuosituhat vaihtui."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa, että kaikki annetut päivä-kuukausi-vuosi-yhdistelmät ovat mahdollisia (eli käyttäjä ei siis anna esim. syötettä 31.2.1999)."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Henkilötunnus oikein?","tmcname":"osa07-10_henkilotunnus_oikein"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"onko_validi(hetu: str)"}]},{"type":"text","value":", joka palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":" sen mukaan, onko annettu henkilötunnus oikea. Henkilötunnus on muotoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ppkkvvXyyyz"}]},{"type":"text","value":", jossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ppkkvv"}]},{"type":"text","value":" kertoo syntymäajan (päivä/kuukausi/vuosi), "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"X"}]},{"type":"text","value":" on syntymävuosisadasta riippuva välimerkki, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"yyy"}]},{"type":"text","value":" henkilökohtainen yksilönumero ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"z"}]},{"type":"text","value":" tarkistemerkki."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee tarkastaa, että"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"alkuosassa on ppkkvv-muodossa oleva päivämäärä, joka on olemassa oleva päivämäärä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"välimerkki on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" (1800-luku), "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" (1900-luku) tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"A"}]},{"type":"text","value":" (2000-luku) ja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"lopussa oleva tarkastusmerkki on oikein."}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastusmerkki lasketaan jakamalla syntymäajasta ja yksilönumerosta muodostuva numerosarja 31:llä ja ottamalla tästä jakojäännös. Merkki valitaan sitten jakojäännöksen mukaisesta indeksistä merkkijonosta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"0123456789ABCDEFHJKLMNPRSTUVWXY"}]},{"type":"text","value":". Esimerkiksi jos jakojäännös on 12, valitaan indeksissä 12 oleva merkki "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"C"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisätietoa laskemisesta löydät esimerkiksi "},{"type":"element","tagName":"a","properties":{"href":"https://dvv.fi/henkilotunnus","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Digi- ja väestötietoviraston sivuilta"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"HUOM!"}]},{"type":"text","value":" Pidä huolta, ettet jaa omaa henkilötunnustasi esimerkiksi testikoodin mukana, jos kysyt neuvoja tehtävään kurssin keskustelualueella tai muualla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oikeamuotoisia henkilötunnuksia testaamiseen ovat esimerkiksi seuraavat:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"230827-906F"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"120488+246L"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"310823A9877"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"aikojen-muotoilu","style":"position:relative;"},"children":[{"type":"text","value":"Aikojen muotoilu"},{"type":"element","tagName":"a","properties":{"href":"#aikojen-muotoilu","ariaLabel":"aikojen muotoilu permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme muotoilla ajanhetken haluamallamme tavalla "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/datetime.html?highlight=datetime#datetime.date.strftime","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"strftime"}]},{"type":"text","value":"-metodin avulla. Esimerkiksi seuraava koodi tulostaa nykyisen päivämäärän muodossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pp.kk.vvvv"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" datetime\n\naika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"now"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"aika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"strftime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"%d.%m.%Y\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"04.02.2020"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ajan muotoilussa käytetään tiettyjä kirjainlyhenteitä. Seuraavassa listassa on joitakin mahdollisia lyhenteitä (täydellinen lista on Pythonin "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/time.html#time.strftime","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"dokumentaatiossa"}]},{"type":"text","value":"):"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"left"},"children":[{"type":"text","value":"Lyhenne"}]},{"type":"element","tagName":"th","properties":{"align":"left"},"children":[{"type":"text","value":"Merkitys"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"%d"}]}]},{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"text","value":"päivä (01–31)"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"%m"}]}]},{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"text","value":"kuukausi (01–12)"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"%Y"}]}]},{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"text","value":"vuosi nelinumeroisena"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"%H"}]}]},{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"text","value":"tunnit 24 tunnin formaatissa"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"%M"}]}]},{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"text","value":"minuutit (00–59)"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"%S"}]}]},{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"text","value":"sekunnit (00–59)"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme myös tehdä muotoilun toiseen suuntaan, jos esimerkiksi haluamme muuttaa käyttäjän antaman ajanhetken aikaolioksi. Tämä onnistuu metodilla "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/datetime.html?highlight=datetime#datetime.datetime.strptime","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"strptime"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" datetime\n\nsyote "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna syntymäpäiväsi muodossa pv.kk.vvvv: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\naika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"strptime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"%d.%m.%Y\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" aika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Synnyit viime vuosituhannella\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Synnyit tällä vuosituhannella\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna syntymäpäiväsi muodossa pv.kk.vvvv: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5.11.1986"}]},{"type":"text","value":"\nSynnyit viime vuosituhannella"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Ruutuaika","tmcname":"osa07-11_ruutuaika"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmassa kirjoitetaan käyttäjän määrittelemään tiedostoon \"ruutuaikoja\", eli käyttäjän television, tietokoneen ja mobiililaitteen ääressä tiettyinä päivinä viettämää aikaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma toimii seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedosto: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kesakuun_loppu.txt"}]},{"type":"text","value":"\nAloituspäivä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"24.6.2020"}]},{"type":"text","value":"\nMontako päivää: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nAnna ruutuajat kunakin päivänä minuutteina (TV tietokone mobiililaite):\nRuutuaika 24.06.2020: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"60 120 0"}]},{"type":"text","value":"\nRuutuaika 25.06.2020: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0 0 0"}]},{"type":"text","value":"\nRuutuaika 26.06.2020: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"180 0 0"}]},{"type":"text","value":"\nRuutuaika 27.06.2020: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"25 240 15"}]},{"type":"text","value":"\nRuutuaika 28.06.2020: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"45 90 5"}]},{"type":"text","value":"\nTiedot tallennettu tiedostoon kesakuun_loppu.txt"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kunkin päivän riville on siis annettu välilyönnillä eroteltuna kolme minuuttimäärää."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma tallentaa tilaston ruutuajoista tiedostoon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kesakuun_loppu.txt"}]},{"type":"text","value":", joka näyttää yllä olevalla syötteellä seuraavalta:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ajanjakso: 24.06.2020-28.06.2020\nYht. minuutteja: 780\nKeskim. minuutteja: 156.0\n24.06.2020: 60/120/0\n25.06.2020: 0/0/0\n26.06.2020: 180/0/0\n27.06.2020: 25/240/15\n28.06.2020: 45/90/5"}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät tavan käsitellä päivämääriä ja kellonaikoja Pythonissa
  • \n
  • Osaat muodostaa ja käyttää datetime-olioita
  • \n
  • Osaat vertailla päivämääriä ja kellonaikoja toisiinsa ja laskea niiden erotuksia
  • \n

Aikaolio

Moduulin datetime funktio now antaa aikaolion, jossa on nykyinen päivämäärä ja kellonaika. Voimme esimerkiksi tulostaa nykyhetken päivämäärän ja kellonajan näin:

from datetime import datetime\n\naika = datetime.now()\nprint(aika)

2020-10-13 12:46:49.311393

Toinen tapa muodostaa aikaolio on määrittää ajanhetki itse:

from datetime import datetime\n\naika = datetime(1952, 12, 24)\nprint(aika)

1952-12-24 00:00:00

Kun emme antaneet kellonaikaa, oletuksena on, että kyseessä on keskiyö.

Voimme hakea aikaoliosta ajan osia tähän tapaan:

from datetime import datetime\n\naika = datetime(1952, 12, 24)\nprint(\"Päivä:\", aika.day)\nprint(\"Kuukausi:\", aika.month)\nprint(\"Vuosi:\", aika.year)

Päivä: 24\nKuukausi: 12\nVuosi: 1952

Aikaoliolle voidaan antaa myös kellonaika halutulla tarkkuudella. Esimerkiksi:

from datetime import datetime\n\npv1 = datetime(2020, 6, 30, 13, 00) # 30.6.2020 klo 13.00\npv2 = datetime(2020, 6, 30, 18, 45) # 30.6.2020 klo 18.45

Aikojen vertailu ja ero

Voimme vertailla aikoja samaan tapaan kuin lukuja käyttämällä tuttuja vertailuoperaattoreita:

from datetime import datetime\n\nnyt = datetime.now()\njuhannus = datetime(2020, 6, 20)\n\nif nyt < juhannus:\n    print(\"Ei ole vielä juhannus\")\nelif nyt == juhannus:\n    print(\"Hyvää juhannusta!\")\nelif nyt > juhannus:\n    print(\"Juhannus on mennyt\")

Juhannus on mennyt

Voimme myös laskea kahden ajankohdan eron vähennyslaskuna:

from datetime import datetime\n\nnyt = datetime.now()\njuhannus = datetime(2020, 6, 20)\n\nero = juhannus - nyt\nprint(\"Juhannukseen on vielä\", ero.days, \"päivää\")

Juhannukseen on vielä 37 päivää

Huomaa, että vähennyslaskun tuloksena on timedelta-olio, jolta voi kysyä vain rajoitetusti ajan yksikköjä. Voimme kysyä päivien määrän, mutta emme voi kysyä esimerkiksi vuosien määrää, koska vuoden pituus vaihtelee.

Timedelta-olion avulla on myös mahdollista selvittää, mikä ajanhetki saadaan kun tietty aika (viikkoina ja päivinä) lisätään johonkin ajanhetkeen:

from datetime import datetime, timedelta\njuhannus = datetime(2020, 6, 20)\n\nviikko = timedelta(days=7)\nviikon_paasta = juhannus + viikko\n\nprint(\"Kun viikko juhannuksesta kuluu on\", viikon_paasta)\n\npitka_aika = timedelta(weeks=32, days=15)\n\nprint(\"Kun juhannuksesta kuluu 32 viikkoa ja 15 päivää on\", juhannus + pitka_aika)

Kun viikko juhannuksesta kuluu on 2020-06-27 00:00:00\nKun juhannuksesta kuluu 32 viikkoa ja 15 päivää on 2021-02-14 00:00:00

Timedelta-olio toimii viikkojen ja päivien lisäksi tarkemmallakin tasolla:

nyt = datetime.now()\nkeskiyo = datetime(2020, 6, 30)\nerotus = keskiyo-nyt\nprint(f\"keskiyöhön on vielä {erotus.seconds} sekuntia\")

keskiyöhön on vielä 8188 sekuntia

Tee ohjelma, joka kysyy käyttäjän syntymäajan (erikseen päivä, kuukausi ja vuosi) ja tulostaa, kuinka monta päivää vanha käyttäjä oli 31.12.1999 seuraavan esimerkin mukaisesti:

Päivä: 10\nKuukausi: 9\nVuosi: 1979\nOlit 7417 päivää vanha, kun vuosituhat vaihtui.

Päivä: 28\nKuukausi: 3\nVuosi: 2005\nEt ollut syntynyt, kun vuosituhat vaihtui.

Voit olettaa, että kaikki annetut päivä-kuukausi-vuosi-yhdistelmät ovat mahdollisia (eli käyttäjä ei siis anna esim. syötettä 31.2.1999).

Tee funktio onko_validi(hetu: str), joka palauttaa True tai False sen mukaan, onko annettu henkilötunnus oikea. Henkilötunnus on muotoa ppkkvvXyyyz, jossa ppkkvv kertoo syntymäajan (päivä/kuukausi/vuosi), X on syntymävuosisadasta riippuva välimerkki, yyy henkilökohtainen yksilönumero ja z tarkistemerkki.

Ohjelman tulee tarkastaa, että

    \n
  • alkuosassa on ppkkvv-muodossa oleva päivämäärä, joka on olemassa oleva päivämäärä
  • \n
  • välimerkki on + (1800-luku), - (1900-luku) tai A (2000-luku) ja
  • \n
  • lopussa oleva tarkastusmerkki on oikein.
  • \n

Tarkastusmerkki lasketaan jakamalla syntymäajasta ja yksilönumerosta muodostuva numerosarja 31:llä ja ottamalla tästä jakojäännös. Merkki valitaan sitten jakojäännöksen mukaisesta indeksistä merkkijonosta 0123456789ABCDEFHJKLMNPRSTUVWXY. Esimerkiksi jos jakojäännös on 12, valitaan indeksissä 12 oleva merkki C.

Lisätietoa laskemisesta löydät esimerkiksi Digi- ja väestötietoviraston sivuilta.

HUOM! Pidä huolta, ettet jaa omaa henkilötunnustasi esimerkiksi testikoodin mukana, jos kysyt neuvoja tehtävään kurssin keskustelualueella tai muualla.

Oikeamuotoisia henkilötunnuksia testaamiseen ovat esimerkiksi seuraavat:

    \n
  • 230827-906F
  • \n
  • 120488+246L
  • \n
  • 310823A9877
  • \n

Aikojen muotoilu

Voimme muotoilla ajanhetken haluamallamme tavalla strftime-metodin avulla. Esimerkiksi seuraava koodi tulostaa nykyisen päivämäärän muodossa pp.kk.vvvv:

from datetime import datetime\n\naika = datetime.now()\nprint(aika.strftime(\"%d.%m.%Y\"))

04.02.2020

Ajan muotoilussa käytetään tiettyjä kirjainlyhenteitä. Seuraavassa listassa on joitakin mahdollisia lyhenteitä (täydellinen lista on Pythonin dokumentaatiossa):

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LyhenneMerkitys
%dpäivä (01–31)
%mkuukausi (01–12)
%Yvuosi nelinumeroisena
%Htunnit 24 tunnin formaatissa
%Mminuutit (00–59)
%Ssekunnit (00–59)

Voimme myös tehdä muotoilun toiseen suuntaan, jos esimerkiksi haluamme muuttaa käyttäjän antaman ajanhetken aikaolioksi. Tämä onnistuu metodilla strptime:

from datetime import datetime\n\nsyote = input(\"Anna syntymäpäiväsi muodossa pv.kk.vvvv: \")\naika = datetime.strptime(syote, \"%d.%m.%Y\")\n\nif aika < datetime(2000, 1, 1):\n    print(\"Synnyit viime vuosituhannella\")\nelse:\n    print(\"Synnyit tällä vuosituhannella\")

Anna syntymäpäiväsi muodossa pv.kk.vvvv: 5.11.1986\nSynnyit viime vuosituhannella

Ohjelmassa kirjoitetaan käyttäjän määrittelemään tiedostoon \"ruutuaikoja\", eli käyttäjän television, tietokoneen ja mobiililaitteen ääressä tiettyinä päivinä viettämää aikaa.

Ohjelma toimii seuraavasti:

Tiedosto: kesakuun_loppu.txt\nAloituspäivä: 24.6.2020\nMontako päivää: 5\nAnna ruutuajat kunakin päivänä minuutteina (TV tietokone mobiililaite):\nRuutuaika 24.06.2020: 60 120 0\nRuutuaika 25.06.2020: 0 0 0\nRuutuaika 26.06.2020: 180 0 0\nRuutuaika 27.06.2020: 25 240 15\nRuutuaika 28.06.2020: 45 90 5\nTiedot tallennettu tiedostoon kesakuun_loppu.txt

Kunkin päivän riville on siis annettu välilyönnillä eroteltuna kolme minuuttimäärää.

Ohjelma tallentaa tilaston ruutuajoista tiedostoon kesakuun_loppu.txt, joka näyttää yllä olevalla syötteellä seuraavalta:

Ajanjakso: 24.06.2020-28.06.2020\nYht. minuutteja: 780\nKeskim. minuutteja: 156.0\n24.06.2020: 60/120/0\n25.06.2020: 0/0/0\n26.06.2020: 180/0/0\n27.06.2020: 25/240/15\n28.06.2020: 45/90/5

","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-7/3-ajanhetket.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät tavan käsitellä päivämääriä ja kellonaikoja Pythonissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat muodostaa ja käyttää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"datetime"}]},{"type":"text","value":"-olioita"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat vertailla päivämääriä ja kellonaikoja toisiinsa ja laskea niiden erotuksia"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"aikaolio","style":"position:relative;"},"children":[{"type":"text","value":"Aikaolio"},{"type":"element","tagName":"a","properties":{"href":"#aikaolio","ariaLabel":"aikaolio permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moduulin "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/datetime.html?highlight=datetime#datetime.datetime","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"datetime"}]},{"type":"text","value":" funktio "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/datetime.html?highlight=datetime#datetime.datetime.now","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"now"}]},{"type":"text","value":" antaa aikaolion, jossa on nykyinen päivämäärä ja kellonaika. Voimme esimerkiksi tulostaa nykyhetken päivämäärän ja kellonajan näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" datetime\n\naika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"now"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"aika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2020-10-13 12:46:49.311393"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen tapa muodostaa aikaolio on määrittää ajanhetki itse:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" datetime\n\naika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1952"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"aika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1952-12-24 00:00:00"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun emme antaneet kellonaikaa, oletuksena on, että kyseessä on keskiyö."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme hakea aikaoliosta ajan osia tähän tapaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" datetime\n\naika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1952"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Päivä:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" aika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"day"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kuukausi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" aika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"month"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vuosi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" aika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"year"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Päivä: 24\nKuukausi: 12\nVuosi: 1952"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aikaoliolle voidaan antaa myös kellonaika halutulla tarkkuudella. Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" datetime\n\npv1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"30"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"13"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"00"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# 30.6.2020 klo 13.00"}]},{"type":"text","value":"\npv2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"30"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"18"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"45"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# 30.6.2020 klo 18.45"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"aikojen-vertailu-ja-ero","style":"position:relative;"},"children":[{"type":"text","value":"Aikojen vertailu ja ero"},{"type":"element","tagName":"a","properties":{"href":"#aikojen-vertailu-ja-ero","ariaLabel":"aikojen vertailu ja ero permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme vertailla aikoja samaan tapaan kuin lukuja käyttämällä tuttuja vertailuoperaattoreita:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" datetime\n\nnyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"now"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\njuhannus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" juhannus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ei ole vielä juhannus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" nyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" juhannus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hyvää juhannusta!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"elif"}]},{"type":"text","value":" nyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" juhannus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Juhannus on mennyt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Juhannus on mennyt"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme myös laskea kahden ajankohdan eron vähennyslaskuna:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" datetime\n\nnyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"now"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\njuhannus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" juhannus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" nyt\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Juhannukseen on vielä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" ero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"days"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"päivää\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Juhannukseen on vielä 37 päivää"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että vähennyslaskun tuloksena on "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/datetime.html?highlight=datetime#timedelta-objects","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"timedelta"}]},{"type":"text","value":"-olio, jolta voi kysyä vain rajoitetusti ajan yksikköjä. Voimme kysyä päivien määrän, mutta emme voi kysyä esimerkiksi vuosien määrää, koska vuoden pituus vaihtelee."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Timedelta-olion avulla on myös mahdollista selvittää, mikä ajanhetki saadaan kun tietty aika (viikkoina ja päivinä) lisätään johonkin ajanhetkeen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" timedelta\njuhannus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nviikko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" timedelta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"days"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nviikon_paasta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" juhannus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" viikko\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kun viikko juhannuksesta kuluu on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" viikon_paasta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npitka_aika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" timedelta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"weeks"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"32"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" days"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kun juhannuksesta kuluu 32 viikkoa ja 15 päivää on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" juhannus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" pitka_aika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun viikko juhannuksesta kuluu on 2020-06-27 00:00:00\nKun juhannuksesta kuluu 32 viikkoa ja 15 päivää on 2021-02-14 00:00:00"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Timedelta-olio toimii viikkojen ja päivien lisäksi tarkemmallakin tasolla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"now"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkeskiyo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"30"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nerotus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" keskiyo"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"nyt\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"keskiyöhön on vielä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"erotus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"seconds"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" sekuntia\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"keskiyöhön on vielä 8188 sekuntia"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kuinka vanha","tmcname":"osa07-09_kuinka_vanha"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy käyttäjän syntymäajan (erikseen päivä, kuukausi ja vuosi) ja tulostaa, kuinka monta päivää vanha käyttäjä oli 31.12.1999 seuraavan esimerkin mukaisesti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Päivä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\nKuukausi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"9"}]},{"type":"text","value":"\nVuosi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1979"}]},{"type":"text","value":"\nOlit 7417 päivää vanha, kun vuosituhat vaihtui."}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Päivä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"28"}]},{"type":"text","value":"\nKuukausi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\nVuosi: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2005"}]},{"type":"text","value":"\nEt ollut syntynyt, kun vuosituhat vaihtui."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa, että kaikki annetut päivä-kuukausi-vuosi-yhdistelmät ovat mahdollisia (eli käyttäjä ei siis anna esim. syötettä 31.2.1999)."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Henkilötunnus oikein?","tmcname":"osa07-10_henkilotunnus_oikein"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"onko_validi(hetu: str)"}]},{"type":"text","value":", joka palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":" sen mukaan, onko annettu henkilötunnus oikea. Henkilötunnus on muotoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ppkkvvXyyyz"}]},{"type":"text","value":", jossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ppkkvv"}]},{"type":"text","value":" kertoo syntymäajan (päivä/kuukausi/vuosi), "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"X"}]},{"type":"text","value":" on syntymävuosisadasta riippuva välimerkki, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"yyy"}]},{"type":"text","value":" henkilökohtainen yksilönumero ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"z"}]},{"type":"text","value":" tarkistemerkki."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee tarkastaa, että"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"alkuosassa on ppkkvv-muodossa oleva päivämäärä, joka on olemassa oleva päivämäärä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"välimerkki on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" (1800-luku), "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" (1900-luku) tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"A"}]},{"type":"text","value":" (2000-luku) ja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"lopussa oleva tarkastusmerkki on oikein."}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastusmerkki lasketaan jakamalla syntymäajasta ja yksilönumerosta muodostuva numerosarja 31:llä ja ottamalla tästä jakojäännös. Merkki valitaan sitten jakojäännöksen mukaisesta indeksistä merkkijonosta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"0123456789ABCDEFHJKLMNPRSTUVWXY"}]},{"type":"text","value":". Esimerkiksi jos jakojäännös on 12, valitaan indeksissä 12 oleva merkki "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"C"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisätietoa laskemisesta löydät esimerkiksi "},{"type":"element","tagName":"a","properties":{"href":"https://dvv.fi/henkilotunnus","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Digi- ja väestötietoviraston sivuilta"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"HUOM!"}]},{"type":"text","value":" Pidä huolta, ettet jaa omaa henkilötunnustasi esimerkiksi testikoodin mukana, jos kysyt neuvoja tehtävään kurssin keskustelualueella tai muualla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oikeamuotoisia henkilötunnuksia testaamiseen ovat esimerkiksi seuraavat:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"230827-906F"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"120488+246L"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"310823A9877"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"aikojen-muotoilu","style":"position:relative;"},"children":[{"type":"text","value":"Aikojen muotoilu"},{"type":"element","tagName":"a","properties":{"href":"#aikojen-muotoilu","ariaLabel":"aikojen muotoilu permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme muotoilla ajanhetken haluamallamme tavalla "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/datetime.html?highlight=datetime#datetime.date.strftime","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"strftime"}]},{"type":"text","value":"-metodin avulla. Esimerkiksi seuraava koodi tulostaa nykyisen päivämäärän muodossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pp.kk.vvvv"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" datetime\n\naika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"now"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"aika"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"strftime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"%d.%m.%Y\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"04.02.2020"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ajan muotoilussa käytetään tiettyjä kirjainlyhenteitä. Seuraavassa listassa on joitakin mahdollisia lyhenteitä (täydellinen lista on Pythonin "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/time.html#time.strftime","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"dokumentaatiossa"}]},{"type":"text","value":"):"}]},{"type":"text","value":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"type":"element","tagName":"table","properties":{},"children":[{"type":"element","tagName":"thead","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"th","properties":{"align":"left"},"children":[{"type":"text","value":"Lyhenne"}]},{"type":"element","tagName":"th","properties":{"align":"left"},"children":[{"type":"text","value":"Merkitys"}]}]}]},{"type":"element","tagName":"tbody","properties":{},"children":[{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"%d"}]}]},{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"text","value":"päivä (01–31)"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"%m"}]}]},{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"text","value":"kuukausi (01–12)"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"%Y"}]}]},{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"text","value":"vuosi nelinumeroisena"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"%H"}]}]},{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"text","value":"tunnit 24 tunnin formaatissa"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"%M"}]}]},{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"text","value":"minuutit (00–59)"}]}]},{"type":"element","tagName":"tr","properties":{},"children":[{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"%S"}]}]},{"type":"element","tagName":"td","properties":{"align":"left"},"children":[{"type":"text","value":"sekunnit (00–59)"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme myös tehdä muotoilun toiseen suuntaan, jos esimerkiksi haluamme muuttaa käyttäjän antaman ajanhetken aikaolioksi. Tämä onnistuu metodilla "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/datetime.html?highlight=datetime#datetime.datetime.strptime","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"strptime"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" datetime\n\nsyote "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna syntymäpäiväsi muodossa pv.kk.vvvv: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\naika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"strptime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"syote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"%d.%m.%Y\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" aika "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" datetime"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Synnyit viime vuosituhannella\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Synnyit tällä vuosituhannella\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna syntymäpäiväsi muodossa pv.kk.vvvv: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5.11.1986"}]},{"type":"text","value":"\nSynnyit viime vuosituhannella"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Ruutuaika","tmcname":"osa07-11_ruutuaika"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmassa kirjoitetaan käyttäjän määrittelemään tiedostoon \"ruutuaikoja\", eli käyttäjän television, tietokoneen ja mobiililaitteen ääressä tiettyinä päivinä viettämää aikaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma toimii seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedosto: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"kesakuun_loppu.txt"}]},{"type":"text","value":"\nAloituspäivä: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"24.6.2020"}]},{"type":"text","value":"\nMontako päivää: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\nAnna ruutuajat kunakin päivänä minuutteina (TV tietokone mobiililaite):\nRuutuaika 24.06.2020: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"60 120 0"}]},{"type":"text","value":"\nRuutuaika 25.06.2020: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0 0 0"}]},{"type":"text","value":"\nRuutuaika 26.06.2020: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"180 0 0"}]},{"type":"text","value":"\nRuutuaika 27.06.2020: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"25 240 15"}]},{"type":"text","value":"\nRuutuaika 28.06.2020: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"45 90 5"}]},{"type":"text","value":"\nTiedot tallennettu tiedostoon kesakuun_loppu.txt"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kunkin päivän riville on siis annettu välilyönnillä eroteltuna kolme minuuttimäärää."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma tallentaa tilaston ruutuajoista tiedostoon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kesakuun_loppu.txt"}]},{"type":"text","value":", joka näyttää yllä olevalla syötteellä seuraavalta:"}]},{"type":"element","tagName":"sample-data","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ajanjakso: 24.06.2020-28.06.2020\nYht. minuutteja: 780\nKeskim. minuutteja: 156.0\n24.06.2020: 60/120/0\n25.06.2020: 0/0/0\n26.06.2020: 180/0/0\n27.06.2020: 25/240/15\n28.06.2020: 45/90/5"}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät tavan käsitellä päivämääriä ja kellonaikoja Pythonissa
  • \n
  • Osaat muodostaa ja käyttää datetime-olioita
  • \n
  • Osaat vertailla päivämääriä ja kellonaikoja toisiinsa ja laskea niiden erotuksia
  • \n

Aikaolio

Moduulin datetime funktio now antaa aikaolion, jossa on nykyinen päivämäärä ja kellonaika. Voimme esimerkiksi tulostaa nykyhetken päivämäärän ja kellonajan näin:

from datetime import datetime\n\naika = datetime.now()\nprint(aika)

2020-10-13 12:46:49.311393

Toinen tapa muodostaa aikaolio on määrittää ajanhetki itse:

from datetime import datetime\n\naika = datetime(1952, 12, 24)\nprint(aika)

1952-12-24 00:00:00

Kun emme antaneet kellonaikaa, oletuksena on, että kyseessä on keskiyö.

Voimme hakea aikaoliosta ajan osia tähän tapaan:

from datetime import datetime\n\naika = datetime(1952, 12, 24)\nprint(\"Päivä:\", aika.day)\nprint(\"Kuukausi:\", aika.month)\nprint(\"Vuosi:\", aika.year)

Päivä: 24\nKuukausi: 12\nVuosi: 1952

Aikaoliolle voidaan antaa myös kellonaika halutulla tarkkuudella. Esimerkiksi:

from datetime import datetime\n\npv1 = datetime(2020, 6, 30, 13, 00) # 30.6.2020 klo 13.00\npv2 = datetime(2020, 6, 30, 18, 45) # 30.6.2020 klo 18.45

Aikojen vertailu ja ero

Voimme vertailla aikoja samaan tapaan kuin lukuja käyttämällä tuttuja vertailuoperaattoreita:

from datetime import datetime\n\nnyt = datetime.now()\njuhannus = datetime(2020, 6, 20)\n\nif nyt < juhannus:\n    print(\"Ei ole vielä juhannus\")\nelif nyt == juhannus:\n    print(\"Hyvää juhannusta!\")\nelif nyt > juhannus:\n    print(\"Juhannus on mennyt\")

Juhannus on mennyt

Voimme myös laskea kahden ajankohdan eron vähennyslaskuna:

from datetime import datetime\n\nnyt = datetime.now()\njuhannus = datetime(2020, 6, 20)\n\nero = juhannus - nyt\nprint(\"Juhannukseen on vielä\", ero.days, \"päivää\")

Juhannukseen on vielä 37 päivää

Huomaa, että vähennyslaskun tuloksena on timedelta-olio, jolta voi kysyä vain rajoitetusti ajan yksikköjä. Voimme kysyä päivien määrän, mutta emme voi kysyä esimerkiksi vuosien määrää, koska vuoden pituus vaihtelee.

Timedelta-olion avulla on myös mahdollista selvittää, mikä ajanhetki saadaan kun tietty aika (viikkoina ja päivinä) lisätään johonkin ajanhetkeen:

from datetime import datetime, timedelta\njuhannus = datetime(2020, 6, 20)\n\nviikko = timedelta(days=7)\nviikon_paasta = juhannus + viikko\n\nprint(\"Kun viikko juhannuksesta kuluu on\", viikon_paasta)\n\npitka_aika = timedelta(weeks=32, days=15)\n\nprint(\"Kun juhannuksesta kuluu 32 viikkoa ja 15 päivää on\", juhannus + pitka_aika)

Kun viikko juhannuksesta kuluu on 2020-06-27 00:00:00\nKun juhannuksesta kuluu 32 viikkoa ja 15 päivää on 2021-02-14 00:00:00

Timedelta-olio toimii viikkojen ja päivien lisäksi tarkemmallakin tasolla:

nyt = datetime.now()\nkeskiyo = datetime(2020, 6, 30)\nerotus = keskiyo-nyt\nprint(f\"keskiyöhön on vielä {erotus.seconds} sekuntia\")

keskiyöhön on vielä 8188 sekuntia

Tee ohjelma, joka kysyy käyttäjän syntymäajan (erikseen päivä, kuukausi ja vuosi) ja tulostaa, kuinka monta päivää vanha käyttäjä oli 31.12.1999 seuraavan esimerkin mukaisesti:

Päivä: 10\nKuukausi: 9\nVuosi: 1979\nOlit 7417 päivää vanha, kun vuosituhat vaihtui.

Päivä: 28\nKuukausi: 3\nVuosi: 2005\nEt ollut syntynyt, kun vuosituhat vaihtui.

Voit olettaa, että kaikki annetut päivä-kuukausi-vuosi-yhdistelmät ovat mahdollisia (eli käyttäjä ei siis anna esim. syötettä 31.2.1999).

Tee funktio onko_validi(hetu: str), joka palauttaa True tai False sen mukaan, onko annettu henkilötunnus oikea. Henkilötunnus on muotoa ppkkvvXyyyz, jossa ppkkvv kertoo syntymäajan (päivä/kuukausi/vuosi), X on syntymävuosisadasta riippuva välimerkki, yyy henkilökohtainen yksilönumero ja z tarkistemerkki.

Ohjelman tulee tarkastaa, että

    \n
  • alkuosassa on ppkkvv-muodossa oleva päivämäärä, joka on olemassa oleva päivämäärä
  • \n
  • välimerkki on + (1800-luku), - (1900-luku) tai A (2000-luku) ja
  • \n
  • lopussa oleva tarkastusmerkki on oikein.
  • \n

Tarkastusmerkki lasketaan jakamalla syntymäajasta ja yksilönumerosta muodostuva numerosarja 31:llä ja ottamalla tästä jakojäännös. Merkki valitaan sitten jakojäännöksen mukaisesta indeksistä merkkijonosta 0123456789ABCDEFHJKLMNPRSTUVWXY. Esimerkiksi jos jakojäännös on 12, valitaan indeksissä 12 oleva merkki C.

Lisätietoa laskemisesta löydät esimerkiksi Digi- ja väestötietoviraston sivuilta.

HUOM! Pidä huolta, ettet jaa omaa henkilötunnustasi esimerkiksi testikoodin mukana, jos kysyt neuvoja tehtävään kurssin keskustelualueella tai muualla.

Oikeamuotoisia henkilötunnuksia testaamiseen ovat esimerkiksi seuraavat:

    \n
  • 230827-906F
  • \n
  • 120488+246L
  • \n
  • 310823A9877
  • \n

Aikojen muotoilu

Voimme muotoilla ajanhetken haluamallamme tavalla strftime-metodin avulla. Esimerkiksi seuraava koodi tulostaa nykyisen päivämäärän muodossa pp.kk.vvvv:

from datetime import datetime\n\naika = datetime.now()\nprint(aika.strftime(\"%d.%m.%Y\"))

04.02.2020

Ajan muotoilussa käytetään tiettyjä kirjainlyhenteitä. Seuraavassa listassa on joitakin mahdollisia lyhenteitä (täydellinen lista on Pythonin dokumentaatiossa):

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LyhenneMerkitys
%dpäivä (01–31)
%mkuukausi (01–12)
%Yvuosi nelinumeroisena
%Htunnit 24 tunnin formaatissa
%Mminuutit (00–59)
%Ssekunnit (00–59)

Voimme myös tehdä muotoilun toiseen suuntaan, jos esimerkiksi haluamme muuttaa käyttäjän antaman ajanhetken aikaolioksi. Tämä onnistuu metodilla strptime:

from datetime import datetime\n\nsyote = input(\"Anna syntymäpäiväsi muodossa pv.kk.vvvv: \")\naika = datetime.strptime(syote, \"%d.%m.%Y\")\n\nif aika < datetime(2000, 1, 1):\n    print(\"Synnyit viime vuosituhannella\")\nelse:\n    print(\"Synnyit tällä vuosituhannella\")

Anna syntymäpäiväsi muodossa pv.kk.vvvv: 5.11.1986\nSynnyit viime vuosituhannella

Ohjelmassa kirjoitetaan käyttäjän määrittelemään tiedostoon \"ruutuaikoja\", eli käyttäjän television, tietokoneen ja mobiililaitteen ääressä tiettyinä päivinä viettämää aikaa.

Ohjelma toimii seuraavasti:

Tiedosto: kesakuun_loppu.txt\nAloituspäivä: 24.6.2020\nMontako päivää: 5\nAnna ruutuajat kunakin päivänä minuutteina (TV tietokone mobiililaite):\nRuutuaika 24.06.2020: 60 120 0\nRuutuaika 25.06.2020: 0 0 0\nRuutuaika 26.06.2020: 180 0 0\nRuutuaika 27.06.2020: 25 240 15\nRuutuaika 28.06.2020: 45 90 5\nTiedot tallennettu tiedostoon kesakuun_loppu.txt

Kunkin päivän riville on siis annettu välilyönnillä eroteltuna kolme minuuttimäärää.

Ohjelma tallentaa tilaston ruutuajoista tiedostoon kesakuun_loppu.txt, joka näyttää yllä olevalla syötteellä seuraavalta:

Ajanjakso: 24.06.2020-28.06.2020\nYht. minuutteja: 780\nKeskim. minuutteja: 156.0\n24.06.2020: 60/120/0\n25.06.2020: 0/0/0\n26.06.2020: 180/0/0\n27.06.2020: 25/240/15\n28.06.2020: 45/90/5

","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-7/3-ajanhetket.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-7/4-datan-kasittely/page-data.json b/page-data/osa-7/4-datan-kasittely/page-data.json index f56c8be5f..7857a68c0 100644 --- a/page-data/osa-7/4-datan-kasittely/page-data.json +++ b/page-data/osa-7/4-datan-kasittely/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-7/4-datan-kasittely", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää moduulia CSV-tiedoston käsittelyyn"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää moduulia JSON-tiedoston käsittelyyn"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat hakea netissä olevan tiedoston sisällön"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"csv-tiedoston-lukeminen","style":"position:relative;"},"children":[{"type":"text","value":"CSV-tiedoston lukeminen"},{"type":"element","tagName":"a","properties":{"href":"#csv-tiedoston-lukeminen","ariaLabel":"csv tiedoston lukeminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olemme tähän mennessä käsitelleet CSV-tiedostoja omalla koodilla, mutta tähän on myös valmis moduuli "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/csv.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"csv"}]},{"type":"text","value":", jota voi käyttää näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" csv\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"testi.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" csv"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"reader"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" delimiter"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\";\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yllä oleva koodi lukee rivit CSV-tiedostosta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"testi.csv"}]},{"type":"text","value":", jossa erotinmerkki on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":";"}]},{"type":"text","value":". Esimerkiksi jos tiedoston sisältö on"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"x"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-x"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-x"]},"children":[{"type":"text","value":"012121212;5\n012345678;2\n015151515;4"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"niin koodi antaa seuraavan tuloksen:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['012121212', '5']\n['012345678', '2']\n['015151515', '4']"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mitä hyötyä on käyttää moduulia sen sijaan, että toteuttaa lukemisen itse "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"split"}]},{"type":"text","value":"-funktiolla? Yksi hyöty on, että moduulin toteutus toimii myös silloin, kun arvona on merkkijono, jonka sisällä on erotinmerkki. Esimerkiksi jos tiedoston sisältö on"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"x"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-x"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-x"]},"children":[{"type":"text","value":"\"aaa;bbb\";\"ccc;ddd\""}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"niin koodin tulos on:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['aaa;bbb', 'ccc;ddd']"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos vain jakaisimme rivin osiin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":";"}]},{"type":"text","value":"-merkkien kohdista, lukeminen ei toimisi oikein, koska myös merkkijonot jakaantuisivat."}]},{"type":"element","tagName":"h2","properties":{"id":"json-tiedoston-lukeminen","style":"position:relative;"},"children":[{"type":"text","value":"JSON-tiedoston lukeminen"},{"type":"element","tagName":"a","properties":{"href":"#json-tiedoston-lukeminen","ariaLabel":"json tiedoston lukeminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"CSV-muodon lisäksi on olemassa muitakin koneluettavia tiedostomuotoja. Eräs näistä on erityisesti tietojen siirrossa yleisesti käytetty "},{"type":"element","tagName":"a","properties":{"href":"https://www.json.org/json-en.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"JSON"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"JSON-tiedostot ovat tekstitiedostoja, joilla on tietty tarkka muoto. Seuraavassa esimerkkinä JSON-tiedosto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kurssit.json"}]},{"type":"text","value":", jossa on tietoa kursseista:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"x"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-x"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-x"]},"children":[{"type":"text","value":"[\n {\n \"nimi\": \"Ohjelmoinnin perusteet\",\n \"tunnus\": \"Ohpe\",\n \"periodit\": [1, 3]\n },\n {\n \"nimi\": \"Ohjelmoinnin jatkokurssi\",\n \"tunnus\": \"Ohja\",\n \"periodit\": [2, 4]\n },\n {\n \"nimi\": \"Tietokantasovellus\",\n \"tunnus\": \"Tsoha\",\n \"periodit\": [1, 2, 3, 4]\n }\n]"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"JSON-tiedostot näyttävät kohtuullisen tutulta Pythonin käyttäjille. Itse asiassa tiedoston sisältö vastaa Pythonin listaa, jonka sisällä on kolme sanakirjaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Standardikirjastossa on JSON-tiedostojen käsittelyyn moduuli "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/json.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"json"}]},{"type":"text","value":". Siinä oleva funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"loads"}]},{"type":"text","value":" muuttaa merkkijonona annetun JSON-datan Pythonin tietorakenteiksi. Esimerkiksi koodin"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" json\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kurssit.json\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n data "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"read"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkurssit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" json"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"loads"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"data"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kurssit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tulos on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[{'nimi': 'Ohjelmoinnin perusteet', 'tunnus': 'Ohpe', 'periodit': [1, 3]}, {'nimi': 'Ohjelmoinnin jatkokurssi', 'tunnus': 'Ohja', 'periodit': [2, 4]}, {'nimi': 'Tietokantasovellus', 'tunnus': 'Tsoha', 'periodit': [1, 2, 3, 4]}]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodia voisi jatkaa vaikka seuraavasti, jolloin koodi tulostaa jokaisen kurssin nimen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" kurssi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" kurssit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kurssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmoinnin perusteet\nOhjelmoinnin jatkokurssi\nTietokantasovellus"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"JSON-tiedoston käsittely","tmcname":"osa07-12_jsontiedostot"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan JSON-tiedostoa, jossa on tietoa opiskelijoista seuraavassa muodossa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"json"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-json"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-json"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Pythonisti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"ika\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"27"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"harrastukset\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodaus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kutominen\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jaana Javanainen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"ika\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"harrastukset\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodaus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kalliokiipeily\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lukeminen\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta_henkilot(tiedosto: str)"}]},{"type":"text","value":", joka lukee esimerkin tavalla muodostetun JSON-tiedoston (jonka sisältönä voi olla mielivaltainen määrä henkilöitä) ja tulostaa ne seuraavassa muodossa:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka Pythonisti 27 vuotta (koodaus, kutominen)\nJaana Javanainen 24 vuotta (koodaus, kalliokiipeily, lukeminen)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Harrastukset tulee luetella samassa järjestyksessä kuin ne on annettu JSON-tiedostossa."}]}]},{"type":"element","tagName":"h2","properties":{"id":"netissa-olevan-tiedoston-hakeminen","style":"position:relative;"},"children":[{"type":"text","value":"Netissä olevan tiedoston hakeminen"},{"type":"element","tagName":"a","properties":{"href":"#netissa-olevan-tiedoston-hakeminen","ariaLabel":"netissa olevan tiedoston hakeminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonin standardikirjaston funktion "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/urllib.request.html#urllib.request.urlopen","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"urllib.request.urlopen"}]},{"type":"text","value":" avulla on helppo hakea internetistä sisältöä ohjelmista käsin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esim. seuraava koodi tulostaa Helsingin yliopiston etusivun sisällön:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" urllib"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"request\n\npyynto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" urllib"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"request"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"urlopen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"https://helsinki.fi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pyynto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"read"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ihmisille tarkoitetut sivut tosin eivät tulostu kovin selkeinä, mutta internetissä on myös runsaasti koneluettavaa dataa, joka on usein JSON-muodossa."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kurssien tilastot","tmcname":"osa07-13_kurssistatistiikka"},"children":[{"type":"element","tagName":"h4","properties":{"id":"tieto-kursseista","style":"position:relative;"},"children":[{"type":"text","value":"tieto kursseista"},{"type":"element","tagName":"a","properties":{"href":"#tieto-kursseista","ariaLabel":"tieto kursseista permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Osoitteesta "},{"type":"element","tagName":"a","properties":{"href":"https://studies.cs.helsinki.fi/stats-mock/api/courses","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"https://studies.cs.helsinki.fi/stats-mock/api/courses"}]},{"type":"text","value":" löytyy JSON-muodossa muutaman laitoksen verkkokurssin perustiedot."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae_kaikki()"}]},{"type":"text","value":" joka hakee ja palauttaa kaikkien menossa olevien kurssien (kentän "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"enabled"}]},{"type":"text","value":" arvona "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":") tiedot listana tupleja. Paluuarvon muoto on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"[\n ('Full Stack Open 2020', 'ofs2019', 2020, 201),\n ('DevOps with Docker 2019', 'docker2019', 2019, 36),\n ('DevOps with Docker 2020', 'docker2020', 2020, 36),\n ('Beta DevOps with Kubernetes', 'beta-dwk-20', 2020, 28)\n]\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jokainen tuple siis sisältää seuraavat arvot:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"kurssin koko nimi ("},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"fullName"}]},{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"nimi ("},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"name"}]},{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"vuosi ("},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"year"}]},{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"harjoitusten ("},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"exercises"}]},{"type":"text","value":") yhteenlaskettu määrä"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Huom"}]},{"type":"text","value":": Tämän tehtävän testien toimivuuden osalta on oleellista, että haet tiedot funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"urllib.request.urlopen"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Huom2:"}]},{"type":"text","value":" Testeissä käytetään myös ovelaa kikkaa, joka hieman muuttaa internetistä tulevaa dataa ja tämän avulla varmistaa, että et huijaa tehtävässäsi palauttamalla \"kovakoodattua\" dataa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Huom3:"}]},{"type":"text","value":" Jotkut Mac-käyttäjät ovat törmänneet tehtävässä seuraavaan ongelmaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"sh"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-sh"]},"children":[{"type":"text","value":"File "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/urllib/request.py\""}]},{"type":"text","value":", line "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1353"}]},{"type":"text","value":", "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" do_open\n raise URLError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"err"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nurllib.error.URLError: "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"urlopen error "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"SSL: CERTIFICATE_VERIFY_FAILED"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" certificate verify failed: unable to get "},{"type":"element","tagName":"span","properties":{"className":["token","builtin","class-name"]},"children":[{"type":"text","value":"local"}]},{"type":"text","value":" issuer certificate "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"_ssl.c:1124"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ongelman ratkaisutapa riippuu siitä miten python on asennettu koneellesi. Joissain tapauksissa toimii seuraava:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"sh"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","builtin","class-name"]},"children":[{"type":"text","value":"cd"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"/Applications/Python 3.8/\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"sudo"}]},{"type":"text","value":" \"./Install Certificates.command"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että cd-komennon polku riippuu käyttämästäsi Pythonin versiosta. Se voi olla myös \"/Applications/Python 3.8/\"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://stackoverflow.com/questions/27835619/urllib-and-ssl-certificate-verify-failed-error","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Täällä"}]},{"type":"text","value":" on ehdotettu useita erilaisia ratkaisuja ongelmaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eräs kikka jota voit kokeilla, on seuraava:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" urllib"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"request\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" json\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" ssl "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# lisää tämä kirjasto importeihin"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hae_kaikki"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ja tämä rivi funktioiden alkuun"}]},{"type":"text","value":"\n context "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" ssl"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_create_unverified_context"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muu koodi"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen tapa kiertää ongelma on seuraava:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" urllib"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"request\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" certifi "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# lisää tämä kirjasto importeihin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" json\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hae_kaikki"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osoite "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"https://studies.cs.helsinki.fi/stats-mock/api/courses\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# lisätään kutsuun toinen parametri"}]},{"type":"text","value":"\n pyynto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" urllib"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"request"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"urlopen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osoite"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" cafile"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":"certifi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"where"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muu koodi"}]}]}]}]},{"type":"element","tagName":"h4","properties":{"id":"yhden-kurssin-tiedot","style":"position:relative;"},"children":[{"type":"text","value":"yhden kurssin tiedot"},{"type":"element","tagName":"a","properties":{"href":"#yhden-kurssin-tiedot","ariaLabel":"yhden kurssin tiedot permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kunkin kurssin JSON-muotoinen tehtävästatistiikka löytyy omasta osoitteesta, joka saadaan vaihtamalla kurssin kenttä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"name"}]},{"type":"text","value":" seuraavassa tähtien paikalle "},{"type":"element","tagName":"a","properties":{"href":"https://studies.cs.helsinki.fi/stats-mock/api/courses/****/stats","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"https://studies.cs.helsinki.fi/stats-mock/api/courses/****/stats"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi kurssin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"docker2019"}]},{"type":"text","value":" tiedot ovat osoitteessa "},{"type":"element","tagName":"a","properties":{"href":"https://studies.cs.helsinki.fi/stats-mock/api/courses/docker2019/stats","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"https://studies.cs.helsinki.fi/stats-mock/api/courses/docker2019/stats"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelmaasi funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae_kurssi(kurssi: str)"}]},{"type":"text","value":", joka palauttaa kurssin tarkemman tehtävästatistiikan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun kutsutaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae_kurssi(\"docker2019\")"}]},{"type":"text","value":", funktio palauttaa sanakirjan, jonka sisältö on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"{\n 'viikkoja': 4,\n 'opiskelijoita': 220,\n 'tunteja': 5966,\n 'tunteja_keskimaarin': 27,\n 'tehtavia': 4988,\n 'tehtavia_keskimaarin': 22\n}\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanakirjaan tallennetut arvot määrittyvät seuraavasti:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viikkoja"}]},{"type":"text","value":": kurssia vastaavan JSON-olioiden määrä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"opiskelijoita"}]},{"type":"text","value":" viikkojen opiskelijamäärien maksimi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tunteja"}]},{"type":"text","value":": kakkien viikkojen tuntimäärien ("},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hour_total"}]},{"type":"text","value":") summa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tunteja_keskimaarin"}]},{"type":"text","value":": edellinen jaettuna opiskelijamäärällä (kokonaislukuna pyöristettynä alaspäin)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tehtavia"}]},{"type":"text","value":": kakkien viikkojen tehtävämäärien ("},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"exercise_total"}]},{"type":"text","value":") summa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tehtavia_keskimaarin"}]},{"type":"text","value":": edellinen jaettuna opiskelijamäärällä (kokonaislukuna pyöristettynä alaspäin)"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Huom"}]},{"type":"text","value":": Samat huomiot pätevät tähän osaan kuin edelliseen!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Huom2"}]},{"type":"text","value":": löydät "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/math.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"math"}]},{"type":"text","value":" -moduulista funktion, jonka avulla kokonaisluvun alaspäin pyöristäminen on helppoa"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kuka huijasi","tmcname":"osa07-14_kuka_huijasi"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedostossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tentin_aloitus.csv"}]},{"type":"text","value":" on tenttien aloitusaikoja muodossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tunnus;hh:mm"}]},{"type":"text","value":". Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"csv"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"jarmo;09:00"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"timo;18:42"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"kalle;13:23"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisäksi tiedostossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"palautus.csv"}]},{"type":"text","value":" on tehtävien palautusaikoja muodossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tunnus;tehtävä;pisteet;hh:mm"}]},{"type":"text","value":". Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"csv"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"jarmo;1;8;16:05"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"timo;2;10;21:22"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"jarmo;2;10;19:15"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"jne..."}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväsi on etsiä ne opiskelijat, jotka ovat käyttäneet tenttiin yli 3 tuntia aikaa, eli opiskelijat, joiden "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"jonkin"}]},{"type":"text","value":" tehtävän palautus on tehty yli 3 tuntia tentin aloitusajasta. Palautuksia voi siis olla useampi. Voit olettaa, että kaikki ajat ovat saman vuorokauden puolella."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"huijarit()"}]},{"type":"text","value":", joka palauttaa listan huijanneiden opiskelijoiden käyttäjätunnuksista."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kuka huijasi, versio 2","tmcname":"osa07-15_kuka_huijasi_2"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käytössäsi on edellisessä tehtävässä määritellyt datatiedostot. Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viralliset_pisteet()"}]},{"type":"text","value":", joka palauttaa sanakirjassa (dict) opiskelijoiden koepisteet seuraavien sääntöjen mukaan:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Jos samaan tehtävänumeroon on tehty useita palautuksia, korkeimman pistemäärän palautus otetaan huomioon"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Jos tehtäväpalautus on tehty yli 3 tuntia tentin aloittamisen jälkeen, palautusta ei huomioida ollenkaan"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtävät on numeroitu 1–8 ja jokaisesta tehtävästä voi saada 0–6 pistettä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Palautetussa sanakirjassa tunnus on avain ja tehtävien yhteispistemäärä arvo."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vinkki: sisäkkäiset sanakirjat (dict) ovat mainio työkalua tallennettaessa eri opiskelijoiden pisteitä ja aikoja."}]}]},{"type":"element","tagName":"h2","properties":{"id":"moduulien-etsiminen","style":"position:relative;"},"children":[{"type":"text","value":"Moduulien etsiminen"},{"type":"element","tagName":"a","properties":{"href":"#moduulien-etsiminen","ariaLabel":"moduulien etsiminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonin dokumentaatiosta löytyy tietoa kaikista standardikirjaston moduuleista:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"https://docs.python.org/3/library/"}]}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Standardikirjaston lisäksi verkosta löytyy lukuisia vapaasti käytettäviä kirjastoja eri tarpeisiin. Joitakin yleisesti käytettyjä moduuleja on täällä:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://wiki.python.org/moin/UsefulModules","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"https://wiki.python.org/moin/UsefulModules"}]}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Spellchecker, versio 2","tmcname":"osa07-16_spellchecker_versio2"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Teemme tässä tehtävässä hieman parannellun version edellisen osan tehtävästä Spellchecker."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellisen osan version tapaan ohjelma pyytää käyttäjää kirjoittamaan rivin englanninkielistä tekstiä. Ohjelma suorittaa tekstille oikeinkirjoitustarkistuksen ja tulostaa saman tekstin siten, että kaikki väärin kirjoitetut sanat on ympäröity tähdillä. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Tämän lisäksi ohjelma antaa listan korjausehdotuksia väärin kirjotettuihin sanoihin."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa kaksi käyttöesimerkkiä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"write text: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"We use ptython to make a spell checker"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"We use *ptython* to make a spell checker\nkorjausehdotukset:\nptython: python, pythons, typhon\n"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"write text: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"this is acually a good and usefull program"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"this is *acually* a good and *usefull* program\nkorjausehdotukset:\nacually: actually, tactually, factually\nusefull: usefully, useful, museful\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Korjausehdotukset etsitään standardikirjaston moduulin "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/difflib.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"difflib"}]},{"type":"text","value":" tarjoaman funktion "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/difflib.html#difflib.get_close_matches","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"get_close_matches"}]},{"type":"text","value":" avulla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Huom"}]},{"type":"text","value":": jotta testit toimisivat, käytä funktiota \"oletusasetuksilla\", eli antamalla sille kaksi parametria: virheellinen sana ja lista oikeista sanoista."}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd"},"children":[]}]}]},"html":"

Tämän osion jälkeen:

    \n
  • Osaat käyttää moduulia CSV-tiedoston käsittelyyn
  • \n
  • Osaat käyttää moduulia JSON-tiedoston käsittelyyn
  • \n
  • Osaat hakea netissä olevan tiedoston sisällön
  • \n

CSV-tiedoston lukeminen

Olemme tähän mennessä käsitelleet CSV-tiedostoja omalla koodilla, mutta tähän on myös valmis moduuli csv, jota voi käyttää näin:

import csv\n\nwith open(\"testi.csv\") as tiedosto:\n    for rivi in csv.reader(tiedosto, delimiter=\";\"):\n        print(rivi)

Yllä oleva koodi lukee rivit CSV-tiedostosta testi.csv, jossa erotinmerkki on ;. Esimerkiksi jos tiedoston sisältö on

012121212;5\n012345678;2\n015151515;4

niin koodi antaa seuraavan tuloksen:

['012121212', '5']\n['012345678', '2']\n['015151515', '4']

Mitä hyötyä on käyttää moduulia sen sijaan, että toteuttaa lukemisen itse split-funktiolla? Yksi hyöty on, että moduulin toteutus toimii myös silloin, kun arvona on merkkijono, jonka sisällä on erotinmerkki. Esimerkiksi jos tiedoston sisältö on

"aaa;bbb";"ccc;ddd"

niin koodin tulos on:

['aaa;bbb', 'ccc;ddd']

Jos vain jakaisimme rivin osiin ;-merkkien kohdista, lukeminen ei toimisi oikein, koska myös merkkijonot jakaantuisivat.

JSON-tiedoston lukeminen

CSV-muodon lisäksi on olemassa muitakin koneluettavia tiedostomuotoja. Eräs näistä on erityisesti tietojen siirrossa yleisesti käytetty JSON.

JSON-tiedostot ovat tekstitiedostoja, joilla on tietty tarkka muoto. Seuraavassa esimerkkinä JSON-tiedosto kurssit.json, jossa on tietoa kursseista:

[\n    {\n        "nimi": "Ohjelmoinnin perusteet",\n        "tunnus": "Ohpe",\n        "periodit": [1, 3]\n    },\n    {\n        "nimi": "Ohjelmoinnin jatkokurssi",\n        "tunnus": "Ohja",\n        "periodit": [2, 4]\n    },\n    {\n        "nimi": "Tietokantasovellus",\n        "tunnus": "Tsoha",\n        "periodit": [1, 2, 3, 4]\n    }\n]

JSON-tiedostot näyttävät kohtuullisen tutulta Pythonin käyttäjille. Itse asiassa tiedoston sisältö vastaa Pythonin listaa, jonka sisällä on kolme sanakirjaa.

Standardikirjastossa on JSON-tiedostojen käsittelyyn moduuli json. Siinä oleva funktio loads muuttaa merkkijonona annetun JSON-datan Pythonin tietorakenteiksi. Esimerkiksi koodin

import json\n\nwith open(\"kurssit.json\") as tiedosto:\n    data = tiedosto.read()\nkurssit = json.loads(data)\nprint(kurssit)

tulos on seuraava:

[{'nimi': 'Ohjelmoinnin perusteet', 'tunnus': 'Ohpe', 'periodit': [1, 3]}, {'nimi': 'Ohjelmoinnin jatkokurssi', 'tunnus': 'Ohja', 'periodit': [2, 4]}, {'nimi': 'Tietokantasovellus', 'tunnus': 'Tsoha', 'periodit': [1, 2, 3, 4]}]

Koodia voisi jatkaa vaikka seuraavasti, jolloin koodi tulostaa jokaisen kurssin nimen:

for kurssi in kurssit:\n    print(kurssi[\"nimi\"])

Ohjelmoinnin perusteet\nOhjelmoinnin jatkokurssi\nTietokantasovellus

Tarkastellaan JSON-tiedostoa, jossa on tietoa opiskelijoista seuraavassa muodossa:

[\n    {\n        \"nimi\": \"Pekka Pythonisti\",\n        \"ika\": 27,\n        \"harrastukset\": [\n            \"koodaus\",\n            \"kutominen\"\n        ]\n    },\n    {\n        \"nimi\": \"Jaana Javanainen\",\n        \"ika\": 24,\n        \"harrastukset\": [\n            \"koodaus\",\n            \"kalliokiipeily\",\n            \"lukeminen\"\n        ]\n    }\n]

Toteuta funktio tulosta_henkilot(tiedosto: str), joka lukee esimerkin tavalla muodostetun JSON-tiedoston (jonka sisältönä voi olla mielivaltainen määrä henkilöitä) ja tulostaa ne seuraavassa muodossa:

Pekka Pythonisti 27 vuotta (koodaus, kutominen)\nJaana Javanainen 24 vuotta (koodaus, kalliokiipeily, lukeminen)

Harrastukset tulee luetella samassa järjestyksessä kuin ne on annettu JSON-tiedostossa.

Netissä olevan tiedoston hakeminen

Pythonin standardikirjaston funktion urllib.request.urlopen avulla on helppo hakea internetistä sisältöä ohjelmista käsin.

Esim. seuraava koodi tulostaa Helsingin yliopiston etusivun sisällön:

import urllib.request\n\npyynto = urllib.request.urlopen(\"https://helsinki.fi\")\nprint(pyynto.read())

Ihmisille tarkoitetut sivut tosin eivät tulostu kovin selkeinä, mutta internetissä on myös runsaasti koneluettavaa dataa, joka on usein JSON-muodossa.

tieto kursseista

Osoitteesta https://studies.cs.helsinki.fi/stats-mock/api/courses löytyy JSON-muodossa muutaman laitoksen verkkokurssin perustiedot.

Tee funktio hae_kaikki() joka hakee ja palauttaa kaikkien menossa olevien kurssien (kentän enabled arvona True) tiedot listana tupleja. Paluuarvon muoto on seuraava:

\n[\n    ('Full Stack Open 2020', 'ofs2019', 2020, 201),\n    ('DevOps with Docker 2019', 'docker2019', 2019, 36),\n    ('DevOps with Docker 2020', 'docker2020', 2020, 36),\n    ('Beta DevOps with Kubernetes', 'beta-dwk-20', 2020, 28)\n]\n

Jokainen tuple siis sisältää seuraavat arvot:

    \n
  • kurssin koko nimi (fullName)
  • \n
  • nimi (name)
  • \n
  • vuosi (year)
  • \n
  • harjoitusten (exercises) yhteenlaskettu määrä
  • \n

Huom: Tämän tehtävän testien toimivuuden osalta on oleellista, että haet tiedot funktiolla urllib.request.urlopen.

Huom2: Testeissä käytetään myös ovelaa kikkaa, joka hieman muuttaa internetistä tulevaa dataa ja tämän avulla varmistaa, että et huijaa tehtävässäsi palauttamalla \"kovakoodattua\" dataa.

Huom3: Jotkut Mac-käyttäjät ovat törmänneet tehtävässä seuraavaan ongelmaan:

File \"/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/urllib/request.py\", line 1353, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1124)>

Ongelman ratkaisutapa riippuu siitä miten python on asennettu koneellesi. Joissain tapauksissa toimii seuraava:

cd \"/Applications/Python 3.8/\"\nsudo \"./Install Certificates.command

Huomaa, että cd-komennon polku riippuu käyttämästäsi Pythonin versiosta. Se voi olla myös \"/Applications/Python 3.8/\".

Täällä on ehdotettu useita erilaisia ratkaisuja ongelmaan.

Eräs kikka jota voit kokeilla, on seuraava:

import urllib.request\nimport json\nimport ssl # lisää tämä kirjasto importeihin\n\ndef hae_kaikki():\n    # ja tämä rivi funktioiden alkuun\n    context = ssl._create_unverified_context()\n    # muu koodi

Toinen tapa kiertää ongelma on seuraava:

import urllib.request\nimport certifi # lisää tämä kirjasto importeihin\nimport json\n\ndef hae_kaikki():\n   osoite = \"https://studies.cs.helsinki.fi/stats-mock/api/courses\"\n   # lisätään kutsuun toinen parametri\n   pyynto = urllib.request.urlopen(osoite, cafile=certifi.where())\n   # muu koodi

yhden kurssin tiedot

Kunkin kurssin JSON-muotoinen tehtävästatistiikka löytyy omasta osoitteesta, joka saadaan vaihtamalla kurssin kenttä name seuraavassa tähtien paikalle https://studies.cs.helsinki.fi/stats-mock/api/courses/****/stats

Esimerkiksi kurssin docker2019 tiedot ovat osoitteessa https://studies.cs.helsinki.fi/stats-mock/api/courses/docker2019/stats

Tee ohjelmaasi funktio hae_kurssi(kurssi: str), joka palauttaa kurssin tarkemman tehtävästatistiikan.

Kun kutsutaan hae_kurssi(\"docker2019\"), funktio palauttaa sanakirjan, jonka sisältö on seuraava:

\n{\n    'viikkoja': 4,\n    'opiskelijoita': 220,\n    'tunteja': 5966,\n    'tunteja_keskimaarin': 27,\n    'tehtavia': 4988,\n    'tehtavia_keskimaarin': 22\n}\n

Sanakirjaan tallennetut arvot määrittyvät seuraavasti:

    \n
  • viikkoja: kurssia vastaavan JSON-olioiden määrä
  • \n
  • opiskelijoita viikkojen opiskelijamäärien maksimi
  • \n
  • tunteja: kakkien viikkojen tuntimäärien (hour_total) summa
  • \n
  • tunteja_keskimaarin: edellinen jaettuna opiskelijamäärällä (kokonaislukuna pyöristettynä alaspäin)
  • \n
  • tehtavia: kakkien viikkojen tehtävämäärien (exercise_total) summa
  • \n
  • tehtavia_keskimaarin: edellinen jaettuna opiskelijamäärällä (kokonaislukuna pyöristettynä alaspäin)
  • \n

Huom: Samat huomiot pätevät tähän osaan kuin edelliseen!

Huom2: löydät math -moduulista funktion, jonka avulla kokonaisluvun alaspäin pyöristäminen on helppoa

Tiedostossa tentin_aloitus.csv on tenttien aloitusaikoja muodossa tunnus;hh:mm. Esimerkiksi:

jarmo;09:00\ntimo;18:42\nkalle;13:23

Lisäksi tiedostossa palautus.csv on tehtävien palautusaikoja muodossa tunnus;tehtävä;pisteet;hh:mm. Esimerkiksi:

jarmo;1;8;16:05\ntimo;2;10;21:22\njarmo;2;10;19:15\njne...

Tehtäväsi on etsiä ne opiskelijat, jotka ovat käyttäneet tenttiin yli 3 tuntia aikaa, eli opiskelijat, joiden jonkin tehtävän palautus on tehty yli 3 tuntia tentin aloitusajasta. Palautuksia voi siis olla useampi. Voit olettaa, että kaikki ajat ovat saman vuorokauden puolella.

Kirjoita funktio huijarit(), joka palauttaa listan huijanneiden opiskelijoiden käyttäjätunnuksista.

Käytössäsi on edellisessä tehtävässä määritellyt datatiedostot. Kirjoita funktio viralliset_pisteet(), joka palauttaa sanakirjassa (dict) opiskelijoiden koepisteet seuraavien sääntöjen mukaan:

    \n
  • Jos samaan tehtävänumeroon on tehty useita palautuksia, korkeimman pistemäärän palautus otetaan huomioon
  • \n
  • Jos tehtäväpalautus on tehty yli 3 tuntia tentin aloittamisen jälkeen, palautusta ei huomioida ollenkaan
  • \n

Tehtävät on numeroitu 1–8 ja jokaisesta tehtävästä voi saada 0–6 pistettä.

Palautetussa sanakirjassa tunnus on avain ja tehtävien yhteispistemäärä arvo.

Vinkki: sisäkkäiset sanakirjat (dict) ovat mainio työkalua tallennettaessa eri opiskelijoiden pisteitä ja aikoja.

Moduulien etsiminen

Pythonin dokumentaatiosta löytyy tietoa kaikista standardikirjaston moduuleista:

Standardikirjaston lisäksi verkosta löytyy lukuisia vapaasti käytettäviä kirjastoja eri tarpeisiin. Joitakin yleisesti käytettyjä moduuleja on täällä:

Teemme tässä tehtävässä hieman parannellun version edellisen osan tehtävästä Spellchecker.

Edellisen osan version tapaan ohjelma pyytää käyttäjää kirjoittamaan rivin englanninkielistä tekstiä. Ohjelma suorittaa tekstille oikeinkirjoitustarkistuksen ja tulostaa saman tekstin siten, että kaikki väärin kirjoitetut sanat on ympäröity tähdillä. Tämän lisäksi ohjelma antaa listan korjausehdotuksia väärin kirjotettuihin sanoihin.

Seuraavassa kaksi käyttöesimerkkiä:

write text: We use ptython to make a spell checker

\nWe use *ptython* to make a spell checker\nkorjausehdotukset:\nptython: python, pythons, typhon\n

write text: this is acually a good and usefull program

\nthis is *acually* a good and *usefull* program\nkorjausehdotukset:\nacually: actually, tactually, factually\nusefull: usefully, useful, museful\n

Korjausehdotukset etsitään standardikirjaston moduulin difflib tarjoaman funktion get_close_matches avulla.

Huom: jotta testit toimisivat, käytä funktiota \"oletusasetuksilla\", eli antamalla sille kaksi parametria: virheellinen sana ja lista oikeista sanoista.

","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-7/4-datan-kasittely.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää moduulia CSV-tiedoston käsittelyyn"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää moduulia JSON-tiedoston käsittelyyn"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat hakea netissä olevan tiedoston sisällön"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"csv-tiedoston-lukeminen","style":"position:relative;"},"children":[{"type":"text","value":"CSV-tiedoston lukeminen"},{"type":"element","tagName":"a","properties":{"href":"#csv-tiedoston-lukeminen","ariaLabel":"csv tiedoston lukeminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olemme tähän mennessä käsitelleet CSV-tiedostoja omalla koodilla, mutta tähän on myös valmis moduuli "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/csv.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"csv"}]},{"type":"text","value":", jota voi käyttää näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" csv\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"testi.csv\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" rivi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" csv"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"reader"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" delimiter"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\";\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"rivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yllä oleva koodi lukee rivit CSV-tiedostosta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"testi.csv"}]},{"type":"text","value":", jossa erotinmerkki on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":";"}]},{"type":"text","value":". Esimerkiksi jos tiedoston sisältö on"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"x"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-x"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-x"]},"children":[{"type":"text","value":"012121212;5\n012345678;2\n015151515;4"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"niin koodi antaa seuraavan tuloksen:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['012121212', '5']\n['012345678', '2']\n['015151515', '4']"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mitä hyötyä on käyttää moduulia sen sijaan, että toteuttaa lukemisen itse "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"split"}]},{"type":"text","value":"-funktiolla? Yksi hyöty on, että moduulin toteutus toimii myös silloin, kun arvona on merkkijono, jonka sisällä on erotinmerkki. Esimerkiksi jos tiedoston sisältö on"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"x"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-x"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-x"]},"children":[{"type":"text","value":"\"aaa;bbb\";\"ccc;ddd\""}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"niin koodin tulos on:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['aaa;bbb', 'ccc;ddd']"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos vain jakaisimme rivin osiin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":";"}]},{"type":"text","value":"-merkkien kohdista, lukeminen ei toimisi oikein, koska myös merkkijonot jakaantuisivat."}]},{"type":"element","tagName":"h2","properties":{"id":"json-tiedoston-lukeminen","style":"position:relative;"},"children":[{"type":"text","value":"JSON-tiedoston lukeminen"},{"type":"element","tagName":"a","properties":{"href":"#json-tiedoston-lukeminen","ariaLabel":"json tiedoston lukeminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"CSV-muodon lisäksi on olemassa muitakin koneluettavia tiedostomuotoja. Eräs näistä on erityisesti tietojen siirrossa yleisesti käytetty "},{"type":"element","tagName":"a","properties":{"href":"https://www.json.org/json-en.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"JSON"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"JSON-tiedostot ovat tekstitiedostoja, joilla on tietty tarkka muoto. Seuraavassa esimerkkinä JSON-tiedosto "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kurssit.json"}]},{"type":"text","value":", jossa on tietoa kursseista:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"x"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-x"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-x"]},"children":[{"type":"text","value":"[\n {\n \"nimi\": \"Ohjelmoinnin perusteet\",\n \"tunnus\": \"Ohpe\",\n \"periodit\": [1, 3]\n },\n {\n \"nimi\": \"Ohjelmoinnin jatkokurssi\",\n \"tunnus\": \"Ohja\",\n \"periodit\": [2, 4]\n },\n {\n \"nimi\": \"Tietokantasovellus\",\n \"tunnus\": \"Tsoha\",\n \"periodit\": [1, 2, 3, 4]\n }\n]"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"JSON-tiedostot näyttävät kohtuullisen tutulta Pythonin käyttäjille. Itse asiassa tiedoston sisältö vastaa Pythonin listaa, jonka sisällä on kolme sanakirjaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Standardikirjastossa on JSON-tiedostojen käsittelyyn moduuli "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/json.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"json"}]},{"type":"text","value":". Siinä oleva funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"loads"}]},{"type":"text","value":" muuttaa merkkijonona annetun JSON-datan Pythonin tietorakenteiksi. Esimerkiksi koodin"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" json\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"with"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"open"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kurssit.json\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"as"}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n data "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tiedosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"read"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkurssit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" json"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"loads"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"data"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kurssit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"tulos on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[{'nimi': 'Ohjelmoinnin perusteet', 'tunnus': 'Ohpe', 'periodit': [1, 3]}, {'nimi': 'Ohjelmoinnin jatkokurssi', 'tunnus': 'Ohja', 'periodit': [2, 4]}, {'nimi': 'Tietokantasovellus', 'tunnus': 'Tsoha', 'periodit': [1, 2, 3, 4]}]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodia voisi jatkaa vaikka seuraavasti, jolloin koodi tulostaa jokaisen kurssin nimen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" kurssi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" kurssit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kurssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmoinnin perusteet\nOhjelmoinnin jatkokurssi\nTietokantasovellus"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"JSON-tiedoston käsittely","tmcname":"osa07-12_jsontiedostot"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan JSON-tiedostoa, jossa on tietoa opiskelijoista seuraavassa muodossa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"json"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-json"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-json"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Pythonisti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"ika\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"27"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"harrastukset\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodaus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kutominen\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jaana Javanainen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"ika\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"harrastukset\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koodaus\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kalliokiipeily\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lukeminen\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta_henkilot(tiedosto: str)"}]},{"type":"text","value":", joka lukee esimerkin tavalla muodostetun JSON-tiedoston (jonka sisältönä voi olla mielivaltainen määrä henkilöitä) ja tulostaa ne seuraavassa muodossa:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka Pythonisti 27 vuotta (koodaus, kutominen)\nJaana Javanainen 24 vuotta (koodaus, kalliokiipeily, lukeminen)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Harrastukset tulee luetella samassa järjestyksessä kuin ne on annettu JSON-tiedostossa."}]}]},{"type":"element","tagName":"h2","properties":{"id":"netissa-olevan-tiedoston-hakeminen","style":"position:relative;"},"children":[{"type":"text","value":"Netissä olevan tiedoston hakeminen"},{"type":"element","tagName":"a","properties":{"href":"#netissa-olevan-tiedoston-hakeminen","ariaLabel":"netissa olevan tiedoston hakeminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonin standardikirjaston funktion "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/urllib.request.html#urllib.request.urlopen","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"urllib.request.urlopen"}]},{"type":"text","value":" avulla on helppo hakea internetistä sisältöä ohjelmista käsin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esim. seuraava koodi tulostaa Helsingin yliopiston etusivun sisällön:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" urllib"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"request\n\npyynto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" urllib"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"request"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"urlopen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"https://helsinki.fi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pyynto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"read"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ihmisille tarkoitetut sivut tosin eivät tulostu kovin selkeinä, mutta internetissä on myös runsaasti koneluettavaa dataa, joka on usein JSON-muodossa."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kurssien tilastot","tmcname":"osa07-13_kurssistatistiikka"},"children":[{"type":"element","tagName":"h4","properties":{"id":"tieto-kursseista","style":"position:relative;"},"children":[{"type":"text","value":"tieto kursseista"},{"type":"element","tagName":"a","properties":{"href":"#tieto-kursseista","ariaLabel":"tieto kursseista permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Osoitteesta "},{"type":"element","tagName":"a","properties":{"href":"https://studies.cs.helsinki.fi/stats-mock/api/courses","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"https://studies.cs.helsinki.fi/stats-mock/api/courses"}]},{"type":"text","value":" löytyy JSON-muodossa muutaman laitoksen verkkokurssin perustiedot."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae_kaikki()"}]},{"type":"text","value":" joka hakee ja palauttaa kaikkien menossa olevien kurssien (kentän "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"enabled"}]},{"type":"text","value":" arvona "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":") tiedot listana tupleja. Paluuarvon muoto on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"[\n ('Full Stack Open 2020', 'ofs2019', 2020, 201),\n ('DevOps with Docker 2019', 'docker2019', 2019, 36),\n ('DevOps with Docker 2020', 'docker2020', 2020, 36),\n ('Beta DevOps with Kubernetes', 'beta-dwk-20', 2020, 28)\n]\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jokainen tuple siis sisältää seuraavat arvot:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"kurssin koko nimi ("},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"fullName"}]},{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"nimi ("},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"name"}]},{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"vuosi ("},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"year"}]},{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"harjoitusten ("},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"exercises"}]},{"type":"text","value":") yhteenlaskettu määrä"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Huom"}]},{"type":"text","value":": Tämän tehtävän testien toimivuuden osalta on oleellista, että haet tiedot funktiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"urllib.request.urlopen"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Huom2:"}]},{"type":"text","value":" Testeissä käytetään myös ovelaa kikkaa, joka hieman muuttaa internetistä tulevaa dataa ja tämän avulla varmistaa, että et huijaa tehtävässäsi palauttamalla \"kovakoodattua\" dataa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Huom3:"}]},{"type":"text","value":" Jotkut Mac-käyttäjät ovat törmänneet tehtävässä seuraavaan ongelmaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"sh"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-sh"]},"children":[{"type":"text","value":"File "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/urllib/request.py\""}]},{"type":"text","value":", line "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1353"}]},{"type":"text","value":", "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" do_open\n raise URLError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"err"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nurllib.error.URLError: "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"urlopen error "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"SSL: CERTIFICATE_VERIFY_FAILED"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" certificate verify failed: unable to get "},{"type":"element","tagName":"span","properties":{"className":["token","builtin","class-name"]},"children":[{"type":"text","value":"local"}]},{"type":"text","value":" issuer certificate "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"_ssl.c:1124"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ongelman ratkaisutapa riippuu siitä miten python on asennettu koneellesi. Joissain tapauksissa toimii seuraava:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"sh"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-sh"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","builtin","class-name"]},"children":[{"type":"text","value":"cd"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"/Applications/Python 3.8/\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"sudo"}]},{"type":"text","value":" \"./Install Certificates.command"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että cd-komennon polku riippuu käyttämästäsi Pythonin versiosta. Se voi olla myös \"/Applications/Python 3.8/\"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://stackoverflow.com/questions/27835619/urllib-and-ssl-certificate-verify-failed-error","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Täällä"}]},{"type":"text","value":" on ehdotettu useita erilaisia ratkaisuja ongelmaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eräs kikka jota voit kokeilla, on seuraava:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" urllib"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"request\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" json\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" ssl "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# lisää tämä kirjasto importeihin"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hae_kaikki"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ja tämä rivi funktioiden alkuun"}]},{"type":"text","value":"\n context "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" ssl"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"_create_unverified_context"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muu koodi"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toinen tapa kiertää ongelma on seuraava:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" urllib"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"request\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" certifi "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# lisää tämä kirjasto importeihin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" json\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hae_kaikki"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osoite "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"https://studies.cs.helsinki.fi/stats-mock/api/courses\""}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# lisätään kutsuun toinen parametri"}]},{"type":"text","value":"\n pyynto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" urllib"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"request"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"urlopen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osoite"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" cafile"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":"certifi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"where"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muu koodi"}]}]}]}]},{"type":"element","tagName":"h4","properties":{"id":"yhden-kurssin-tiedot","style":"position:relative;"},"children":[{"type":"text","value":"yhden kurssin tiedot"},{"type":"element","tagName":"a","properties":{"href":"#yhden-kurssin-tiedot","ariaLabel":"yhden kurssin tiedot permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kunkin kurssin JSON-muotoinen tehtävästatistiikka löytyy omasta osoitteesta, joka saadaan vaihtamalla kurssin kenttä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"name"}]},{"type":"text","value":" seuraavassa tähtien paikalle "},{"type":"element","tagName":"a","properties":{"href":"https://studies.cs.helsinki.fi/stats-mock/api/courses/****/stats","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"https://studies.cs.helsinki.fi/stats-mock/api/courses/****/stats"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi kurssin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"docker2019"}]},{"type":"text","value":" tiedot ovat osoitteessa "},{"type":"element","tagName":"a","properties":{"href":"https://studies.cs.helsinki.fi/stats-mock/api/courses/docker2019/stats","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"https://studies.cs.helsinki.fi/stats-mock/api/courses/docker2019/stats"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelmaasi funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae_kurssi(kurssi: str)"}]},{"type":"text","value":", joka palauttaa kurssin tarkemman tehtävästatistiikan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun kutsutaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae_kurssi(\"docker2019\")"}]},{"type":"text","value":", funktio palauttaa sanakirjan, jonka sisältö on seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"{\n 'viikkoja': 4,\n 'opiskelijoita': 220,\n 'tunteja': 5966,\n 'tunteja_keskimaarin': 27,\n 'tehtavia': 4988,\n 'tehtavia_keskimaarin': 22\n}\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanakirjaan tallennetut arvot määrittyvät seuraavasti:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viikkoja"}]},{"type":"text","value":": kurssia vastaavan JSON-olioiden määrä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"opiskelijoita"}]},{"type":"text","value":" viikkojen opiskelijamäärien maksimi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tunteja"}]},{"type":"text","value":": kakkien viikkojen tuntimäärien ("},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hour_total"}]},{"type":"text","value":") summa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tunteja_keskimaarin"}]},{"type":"text","value":": edellinen jaettuna opiskelijamäärällä (kokonaislukuna pyöristettynä alaspäin)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tehtavia"}]},{"type":"text","value":": kakkien viikkojen tehtävämäärien ("},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"exercise_total"}]},{"type":"text","value":") summa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tehtavia_keskimaarin"}]},{"type":"text","value":": edellinen jaettuna opiskelijamäärällä (kokonaislukuna pyöristettynä alaspäin)"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Huom"}]},{"type":"text","value":": Samat huomiot pätevät tähän osaan kuin edelliseen!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Huom2"}]},{"type":"text","value":": löydät "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/math.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"math"}]},{"type":"text","value":" -moduulista funktion, jonka avulla kokonaisluvun alaspäin pyöristäminen on helppoa"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kuka huijasi","tmcname":"osa07-14_kuka_huijasi"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tiedostossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tentin_aloitus.csv"}]},{"type":"text","value":" on tenttien aloitusaikoja muodossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tunnus;hh:mm"}]},{"type":"text","value":". Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"csv"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"jarmo;09:00"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"timo;18:42"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"kalle;13:23"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisäksi tiedostossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"palautus.csv"}]},{"type":"text","value":" on tehtävien palautusaikoja muodossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tunnus;tehtävä;pisteet;hh:mm"}]},{"type":"text","value":". Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"csv"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-csv"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"jarmo;1;8;16:05"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"timo;2;10;21:22"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"jarmo;2;10;19:15"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","value"]},"children":[{"type":"text","value":"jne..."}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväsi on etsiä ne opiskelijat, jotka ovat käyttäneet tenttiin yli 3 tuntia aikaa, eli opiskelijat, joiden "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"jonkin"}]},{"type":"text","value":" tehtävän palautus on tehty yli 3 tuntia tentin aloitusajasta. Palautuksia voi siis olla useampi. Voit olettaa, että kaikki ajat ovat saman vuorokauden puolella."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"huijarit()"}]},{"type":"text","value":", joka palauttaa listan huijanneiden opiskelijoiden käyttäjätunnuksista."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kuka huijasi, versio 2","tmcname":"osa07-15_kuka_huijasi_2"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käytössäsi on edellisessä tehtävässä määritellyt datatiedostot. Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viralliset_pisteet()"}]},{"type":"text","value":", joka palauttaa sanakirjassa (dict) opiskelijoiden koepisteet seuraavien sääntöjen mukaan:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Jos samaan tehtävänumeroon on tehty useita palautuksia, korkeimman pistemäärän palautus otetaan huomioon"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Jos tehtäväpalautus on tehty yli 3 tuntia tentin aloittamisen jälkeen, palautusta ei huomioida ollenkaan"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtävät on numeroitu 1–8 ja jokaisesta tehtävästä voi saada 0–6 pistettä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Palautetussa sanakirjassa tunnus on avain ja tehtävien yhteispistemäärä arvo."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vinkki: sisäkkäiset sanakirjat (dict) ovat mainio työkalua tallennettaessa eri opiskelijoiden pisteitä ja aikoja."}]}]},{"type":"element","tagName":"h2","properties":{"id":"moduulien-etsiminen","style":"position:relative;"},"children":[{"type":"text","value":"Moduulien etsiminen"},{"type":"element","tagName":"a","properties":{"href":"#moduulien-etsiminen","ariaLabel":"moduulien etsiminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonin dokumentaatiosta löytyy tietoa kaikista standardikirjaston moduuleista:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"https://docs.python.org/3/library/"}]}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Standardikirjaston lisäksi verkosta löytyy lukuisia vapaasti käytettäviä kirjastoja eri tarpeisiin. Joitakin yleisesti käytettyjä moduuleja on täällä:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://wiki.python.org/moin/UsefulModules","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"https://wiki.python.org/moin/UsefulModules"}]}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Spellchecker, versio 2","tmcname":"osa07-16_spellchecker_versio2"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Teemme tässä tehtävässä hieman parannellun version edellisen osan tehtävästä Spellchecker."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellisen osan version tapaan ohjelma pyytää käyttäjää kirjoittamaan rivin englanninkielistä tekstiä. Ohjelma suorittaa tekstille oikeinkirjoitustarkistuksen ja tulostaa saman tekstin siten, että kaikki väärin kirjoitetut sanat on ympäröity tähdillä. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Tämän lisäksi ohjelma antaa listan korjausehdotuksia väärin kirjotettuihin sanoihin."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa kaksi käyttöesimerkkiä:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"write text: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"We use ptython to make a spell checker"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"We use *ptython* to make a spell checker\nkorjausehdotukset:\nptython: python, pythons, typhon\n"}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"write text: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"this is acually a good and usefull program"}]}]},{"type":"element","tagName":"pre","properties":{},"children":[{"type":"text","value":"this is *acually* a good and *usefull* program\nkorjausehdotukset:\nacually: actually, tactually, factually\nusefull: usefully, useful, museful\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Korjausehdotukset etsitään standardikirjaston moduulin "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/difflib.html","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"difflib"}]},{"type":"text","value":" tarjoaman funktion "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/difflib.html#difflib.get_close_matches","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"get_close_matches"}]},{"type":"text","value":" avulla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Huom"}]},{"type":"text","value":": jotta testit toimisivat, käytä funktiota \"oletusasetuksilla\", eli antamalla sille kaksi parametria: virheellinen sana ja lista oikeista sanoista."}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd"},"children":[]}]}]},"html":"

Tämän osion jälkeen:

    \n
  • Osaat käyttää moduulia CSV-tiedoston käsittelyyn
  • \n
  • Osaat käyttää moduulia JSON-tiedoston käsittelyyn
  • \n
  • Osaat hakea netissä olevan tiedoston sisällön
  • \n

CSV-tiedoston lukeminen

Olemme tähän mennessä käsitelleet CSV-tiedostoja omalla koodilla, mutta tähän on myös valmis moduuli csv, jota voi käyttää näin:

import csv\n\nwith open(\"testi.csv\") as tiedosto:\n    for rivi in csv.reader(tiedosto, delimiter=\";\"):\n        print(rivi)

Yllä oleva koodi lukee rivit CSV-tiedostosta testi.csv, jossa erotinmerkki on ;. Esimerkiksi jos tiedoston sisältö on

012121212;5\n012345678;2\n015151515;4

niin koodi antaa seuraavan tuloksen:

['012121212', '5']\n['012345678', '2']\n['015151515', '4']

Mitä hyötyä on käyttää moduulia sen sijaan, että toteuttaa lukemisen itse split-funktiolla? Yksi hyöty on, että moduulin toteutus toimii myös silloin, kun arvona on merkkijono, jonka sisällä on erotinmerkki. Esimerkiksi jos tiedoston sisältö on

"aaa;bbb";"ccc;ddd"

niin koodin tulos on:

['aaa;bbb', 'ccc;ddd']

Jos vain jakaisimme rivin osiin ;-merkkien kohdista, lukeminen ei toimisi oikein, koska myös merkkijonot jakaantuisivat.

JSON-tiedoston lukeminen

CSV-muodon lisäksi on olemassa muitakin koneluettavia tiedostomuotoja. Eräs näistä on erityisesti tietojen siirrossa yleisesti käytetty JSON.

JSON-tiedostot ovat tekstitiedostoja, joilla on tietty tarkka muoto. Seuraavassa esimerkkinä JSON-tiedosto kurssit.json, jossa on tietoa kursseista:

[\n    {\n        "nimi": "Ohjelmoinnin perusteet",\n        "tunnus": "Ohpe",\n        "periodit": [1, 3]\n    },\n    {\n        "nimi": "Ohjelmoinnin jatkokurssi",\n        "tunnus": "Ohja",\n        "periodit": [2, 4]\n    },\n    {\n        "nimi": "Tietokantasovellus",\n        "tunnus": "Tsoha",\n        "periodit": [1, 2, 3, 4]\n    }\n]

JSON-tiedostot näyttävät kohtuullisen tutulta Pythonin käyttäjille. Itse asiassa tiedoston sisältö vastaa Pythonin listaa, jonka sisällä on kolme sanakirjaa.

Standardikirjastossa on JSON-tiedostojen käsittelyyn moduuli json. Siinä oleva funktio loads muuttaa merkkijonona annetun JSON-datan Pythonin tietorakenteiksi. Esimerkiksi koodin

import json\n\nwith open(\"kurssit.json\") as tiedosto:\n    data = tiedosto.read()\nkurssit = json.loads(data)\nprint(kurssit)

tulos on seuraava:

[{'nimi': 'Ohjelmoinnin perusteet', 'tunnus': 'Ohpe', 'periodit': [1, 3]}, {'nimi': 'Ohjelmoinnin jatkokurssi', 'tunnus': 'Ohja', 'periodit': [2, 4]}, {'nimi': 'Tietokantasovellus', 'tunnus': 'Tsoha', 'periodit': [1, 2, 3, 4]}]

Koodia voisi jatkaa vaikka seuraavasti, jolloin koodi tulostaa jokaisen kurssin nimen:

for kurssi in kurssit:\n    print(kurssi[\"nimi\"])

Ohjelmoinnin perusteet\nOhjelmoinnin jatkokurssi\nTietokantasovellus

Tarkastellaan JSON-tiedostoa, jossa on tietoa opiskelijoista seuraavassa muodossa:

[\n    {\n        \"nimi\": \"Pekka Pythonisti\",\n        \"ika\": 27,\n        \"harrastukset\": [\n            \"koodaus\",\n            \"kutominen\"\n        ]\n    },\n    {\n        \"nimi\": \"Jaana Javanainen\",\n        \"ika\": 24,\n        \"harrastukset\": [\n            \"koodaus\",\n            \"kalliokiipeily\",\n            \"lukeminen\"\n        ]\n    }\n]

Toteuta funktio tulosta_henkilot(tiedosto: str), joka lukee esimerkin tavalla muodostetun JSON-tiedoston (jonka sisältönä voi olla mielivaltainen määrä henkilöitä) ja tulostaa ne seuraavassa muodossa:

Pekka Pythonisti 27 vuotta (koodaus, kutominen)\nJaana Javanainen 24 vuotta (koodaus, kalliokiipeily, lukeminen)

Harrastukset tulee luetella samassa järjestyksessä kuin ne on annettu JSON-tiedostossa.

Netissä olevan tiedoston hakeminen

Pythonin standardikirjaston funktion urllib.request.urlopen avulla on helppo hakea internetistä sisältöä ohjelmista käsin.

Esim. seuraava koodi tulostaa Helsingin yliopiston etusivun sisällön:

import urllib.request\n\npyynto = urllib.request.urlopen(\"https://helsinki.fi\")\nprint(pyynto.read())

Ihmisille tarkoitetut sivut tosin eivät tulostu kovin selkeinä, mutta internetissä on myös runsaasti koneluettavaa dataa, joka on usein JSON-muodossa.

tieto kursseista

Osoitteesta https://studies.cs.helsinki.fi/stats-mock/api/courses löytyy JSON-muodossa muutaman laitoksen verkkokurssin perustiedot.

Tee funktio hae_kaikki() joka hakee ja palauttaa kaikkien menossa olevien kurssien (kentän enabled arvona True) tiedot listana tupleja. Paluuarvon muoto on seuraava:

\n[\n    ('Full Stack Open 2020', 'ofs2019', 2020, 201),\n    ('DevOps with Docker 2019', 'docker2019', 2019, 36),\n    ('DevOps with Docker 2020', 'docker2020', 2020, 36),\n    ('Beta DevOps with Kubernetes', 'beta-dwk-20', 2020, 28)\n]\n

Jokainen tuple siis sisältää seuraavat arvot:

    \n
  • kurssin koko nimi (fullName)
  • \n
  • nimi (name)
  • \n
  • vuosi (year)
  • \n
  • harjoitusten (exercises) yhteenlaskettu määrä
  • \n

Huom: Tämän tehtävän testien toimivuuden osalta on oleellista, että haet tiedot funktiolla urllib.request.urlopen.

Huom2: Testeissä käytetään myös ovelaa kikkaa, joka hieman muuttaa internetistä tulevaa dataa ja tämän avulla varmistaa, että et huijaa tehtävässäsi palauttamalla \"kovakoodattua\" dataa.

Huom3: Jotkut Mac-käyttäjät ovat törmänneet tehtävässä seuraavaan ongelmaan:

File \"/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/urllib/request.py\", line 1353, in do_open\n    raise URLError(err)\nurllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1124)>

Ongelman ratkaisutapa riippuu siitä miten python on asennettu koneellesi. Joissain tapauksissa toimii seuraava:

cd \"/Applications/Python 3.8/\"\nsudo \"./Install Certificates.command

Huomaa, että cd-komennon polku riippuu käyttämästäsi Pythonin versiosta. Se voi olla myös \"/Applications/Python 3.8/\".

Täällä on ehdotettu useita erilaisia ratkaisuja ongelmaan.

Eräs kikka jota voit kokeilla, on seuraava:

import urllib.request\nimport json\nimport ssl # lisää tämä kirjasto importeihin\n\ndef hae_kaikki():\n    # ja tämä rivi funktioiden alkuun\n    context = ssl._create_unverified_context()\n    # muu koodi

Toinen tapa kiertää ongelma on seuraava:

import urllib.request\nimport certifi # lisää tämä kirjasto importeihin\nimport json\n\ndef hae_kaikki():\n   osoite = \"https://studies.cs.helsinki.fi/stats-mock/api/courses\"\n   # lisätään kutsuun toinen parametri\n   pyynto = urllib.request.urlopen(osoite, cafile=certifi.where())\n   # muu koodi

yhden kurssin tiedot

Kunkin kurssin JSON-muotoinen tehtävästatistiikka löytyy omasta osoitteesta, joka saadaan vaihtamalla kurssin kenttä name seuraavassa tähtien paikalle https://studies.cs.helsinki.fi/stats-mock/api/courses/****/stats

Esimerkiksi kurssin docker2019 tiedot ovat osoitteessa https://studies.cs.helsinki.fi/stats-mock/api/courses/docker2019/stats

Tee ohjelmaasi funktio hae_kurssi(kurssi: str), joka palauttaa kurssin tarkemman tehtävästatistiikan.

Kun kutsutaan hae_kurssi(\"docker2019\"), funktio palauttaa sanakirjan, jonka sisältö on seuraava:

\n{\n    'viikkoja': 4,\n    'opiskelijoita': 220,\n    'tunteja': 5966,\n    'tunteja_keskimaarin': 27,\n    'tehtavia': 4988,\n    'tehtavia_keskimaarin': 22\n}\n

Sanakirjaan tallennetut arvot määrittyvät seuraavasti:

    \n
  • viikkoja: kurssia vastaavan JSON-olioiden määrä
  • \n
  • opiskelijoita viikkojen opiskelijamäärien maksimi
  • \n
  • tunteja: kakkien viikkojen tuntimäärien (hour_total) summa
  • \n
  • tunteja_keskimaarin: edellinen jaettuna opiskelijamäärällä (kokonaislukuna pyöristettynä alaspäin)
  • \n
  • tehtavia: kakkien viikkojen tehtävämäärien (exercise_total) summa
  • \n
  • tehtavia_keskimaarin: edellinen jaettuna opiskelijamäärällä (kokonaislukuna pyöristettynä alaspäin)
  • \n

Huom: Samat huomiot pätevät tähän osaan kuin edelliseen!

Huom2: löydät math -moduulista funktion, jonka avulla kokonaisluvun alaspäin pyöristäminen on helppoa

Tiedostossa tentin_aloitus.csv on tenttien aloitusaikoja muodossa tunnus;hh:mm. Esimerkiksi:

jarmo;09:00\ntimo;18:42\nkalle;13:23

Lisäksi tiedostossa palautus.csv on tehtävien palautusaikoja muodossa tunnus;tehtävä;pisteet;hh:mm. Esimerkiksi:

jarmo;1;8;16:05\ntimo;2;10;21:22\njarmo;2;10;19:15\njne...

Tehtäväsi on etsiä ne opiskelijat, jotka ovat käyttäneet tenttiin yli 3 tuntia aikaa, eli opiskelijat, joiden jonkin tehtävän palautus on tehty yli 3 tuntia tentin aloitusajasta. Palautuksia voi siis olla useampi. Voit olettaa, että kaikki ajat ovat saman vuorokauden puolella.

Kirjoita funktio huijarit(), joka palauttaa listan huijanneiden opiskelijoiden käyttäjätunnuksista.

Käytössäsi on edellisessä tehtävässä määritellyt datatiedostot. Kirjoita funktio viralliset_pisteet(), joka palauttaa sanakirjassa (dict) opiskelijoiden koepisteet seuraavien sääntöjen mukaan:

    \n
  • Jos samaan tehtävänumeroon on tehty useita palautuksia, korkeimman pistemäärän palautus otetaan huomioon
  • \n
  • Jos tehtäväpalautus on tehty yli 3 tuntia tentin aloittamisen jälkeen, palautusta ei huomioida ollenkaan
  • \n

Tehtävät on numeroitu 1–8 ja jokaisesta tehtävästä voi saada 0–6 pistettä.

Palautetussa sanakirjassa tunnus on avain ja tehtävien yhteispistemäärä arvo.

Vinkki: sisäkkäiset sanakirjat (dict) ovat mainio työkalua tallennettaessa eri opiskelijoiden pisteitä ja aikoja.

Moduulien etsiminen

Pythonin dokumentaatiosta löytyy tietoa kaikista standardikirjaston moduuleista:

Standardikirjaston lisäksi verkosta löytyy lukuisia vapaasti käytettäviä kirjastoja eri tarpeisiin. Joitakin yleisesti käytettyjä moduuleja on täällä:

Teemme tässä tehtävässä hieman parannellun version edellisen osan tehtävästä Spellchecker.

Edellisen osan version tapaan ohjelma pyytää käyttäjää kirjoittamaan rivin englanninkielistä tekstiä. Ohjelma suorittaa tekstille oikeinkirjoitustarkistuksen ja tulostaa saman tekstin siten, että kaikki väärin kirjoitetut sanat on ympäröity tähdillä. Tämän lisäksi ohjelma antaa listan korjausehdotuksia väärin kirjotettuihin sanoihin.

Seuraavassa kaksi käyttöesimerkkiä:

write text: We use ptython to make a spell checker

\nWe use *ptython* to make a spell checker\nkorjausehdotukset:\nptython: python, pythons, typhon\n

write text: this is acually a good and usefull program

\nthis is *acually* a good and *usefull* program\nkorjausehdotukset:\nacually: actually, tactually, factually\nusefull: usefully, useful, museful\n

Korjausehdotukset etsitään standardikirjaston moduulin difflib tarjoaman funktion get_close_matches avulla.

Huom: jotta testit toimisivat, käytä funktiota \"oletusasetuksilla\", eli antamalla sille kaksi parametria: virheellinen sana ja lista oikeista sanoista.

","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-7/4-datan-kasittely.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-7/5-omat-moduulit/page-data.json b/page-data/osa-7/5-omat-moduulit/page-data.json index 19cfeee98..a6888c7d5 100644 --- a/page-data/osa-7/5-omat-moduulit/page-data.json +++ b/page-data/osa-7/5-omat-moduulit/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-7/5-omat-moduulit", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat luoda oman moduulin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä Pythonin muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__name__"}]},{"type":"text","value":" ja sen arvo "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__main__"}]},{"type":"text","value":" merkitsevät"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Omien moduulien tekeminen on helppoa Pythonissa, koska mikä tahansa Python-koodia sisältävä tiedosto voi toimia moduulina. Tarkastellaan esimerkkinä seuraavaa tiedostoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sanat.py"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"eka_sana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"vika_sana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"sanojen_maara"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme käyttää tässä tiedostossa olevia funktioita toisessa tiedostossa seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" sanat\n\nmjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vesihiisi sihisi hississä\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"eka_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vika_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanojen_maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vesihiisi\nhississä\n3"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että moduulin kooditiedoston pitää sijaita joko samassa hakemistossa ohjelman kanssa tai jossakin Pythonin oletushakemistossa, jotta sen voi ottaa käyttöön "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":"-komennolla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme käyttää omaa moduulia samalla periaatteella kuin standardikirjaston moduuleja. Esimerkiksi näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" sanat "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" eka_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vika_sana\n\nlause "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna lause: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Eka sana oli: \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" eka_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Viimeinen sana oli: \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" vika_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lause: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Python on metka ohjelmointikieli"}]},{"type":"text","value":"\nEka sana oli: Python\nViimeinen sana oli: ohjelmointikieli"}]}]},{"type":"element","tagName":"h2","properties":{"id":"hyotya-tyyppivihjeista","style":"position:relative;"},"children":[{"type":"text","value":"Hyötyä tyyppivihjeistä"},{"type":"element","tagName":"a","properties":{"href":"#hyotya-tyyppivihjeista","ariaLabel":"hyotya tyyppivihjeista permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moduulissa on hyödyllistä, että funktioissa käytetään tyyppivihjeitä. Kun joku muu käyttää moduulia editorilla, joka ymmärtää tyyppivihjeitä, ne helpottavat moduulin käyttämistä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi Visual Studio Code näyttää funktion tyypit näin koodia kirjoittaessa:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 519px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/7772b5ee03bb1ca30f17560902916121/b23ad/7_vihje.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 23.91304347826087%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAsklEQVQY032Q2w6DIBBE+Q4DmpSLilwEtG82sf//T9OwxD7VPpzM7IadJcv6vscdQojbPuec/DAMxOXZv0AuOKy12Pcn1jUh54JSCo7jhfN8I4RI/WmaEeMK7wNY3XRH13Wwcwvctp2ooc55Gq5B4zjBmJF8VWaMglIKWmtIKWGMofrq5ZKRc/7+poZJqfB4SNL2VpOvsBAsvHeIMWJZFqRUh1qdcoILrt1McNLKdbdffADLIo82jUnA7AAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/7772b5ee03bb1ca30f17560902916121/a0b58/7_vihje.webp 230w","/static/7772b5ee03bb1ca30f17560902916121/bc10c/7_vihje.webp 460w","/static/7772b5ee03bb1ca30f17560902916121/ad2dd/7_vihje.webp 519w"],"sizes":"(max-width: 519px) 100vw, 519px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/7772b5ee03bb1ca30f17560902916121/81c8e/7_vihje.png 230w","/static/7772b5ee03bb1ca30f17560902916121/08a84/7_vihje.png 460w","/static/7772b5ee03bb1ca30f17560902916121/b23ad/7_vihje.png 519w"],"sizes":"(max-width: 519px) 100vw, 519px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/7772b5ee03bb1ca30f17560902916121/b23ad/7_vihje.png","alt":"7 vihje","title":"7 vihje","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"h2","properties":{"id":"moduulin-paatason-koodi","style":"position:relative;"},"children":[{"type":"text","value":"Moduulin päätason koodi"},{"type":"element","tagName":"a","properties":{"href":"#moduulin-paatason-koodi","ariaLabel":"moduulin paatason koodi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos moduulissa on päätason koodia, joka ei ole funktion sisällä, koodi suoritetaan automaattisesti, kun moduuli otetaan mukaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":"-komennolla toisessa tiedostossa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oletetaan, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sanat.py"}]},{"type":"text","value":"-tiedostoon on kirjoitettu muutama testitapaus:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"eka_sana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"vika_sana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"sanojen_maara"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eka_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tämä on testi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vika_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tämä on testeistä toinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanojen_maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Yks kaks kolme neljä viisi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun moduuli otetaan nyt käyttöön "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":"-lauseella, suoritetaan automaattisesti myös moduulissa funktioiden ulkopuolella oleva koodi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" sanat\n\nmjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vesihiisi sihisi hississä\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"eka_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vika_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanojen_maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä\ntoinen\n5\nVesihiisi\nhississä\n3"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä ei ole hyvä, koska moduulin käyttäjän ohjelmaa sotkee moduulissa oleva testitulostus."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonista löytyy onneksi ratkaisu pulmaan. Ohjelmassa on mahdollista testata, suoritetaanko ohjelmaa itseään vai onko ohjelma otettu käyttöön moduulina "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":"-lauseella. Tämä onnistuu muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__name__"}]},{"type":"text","value":" avulla. Python tallentaa muuttujaan tiedon suoritettavasta ohjelmasta: jos ohjelmaa suoritetaan sellaisenaan, muuttujan arvo on merkkijono "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__main__"}]},{"type":"text","value":". Jos ohjelma on tuotu osaksi jotain toista ohjelmaa, muuttujan arvona on suoritettavan ohjelman nimi (eli tässä tapauksessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sanat"}]},{"type":"text","value":")."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moduuliin voidaan siis lisätä edellistä tietoa hyödyntäen ehtolause, jonka avulla testikoodi suoritetaan ainoastaan silloin, kun ohjelma ajetaan omana itsenään eikä toisen ohjelman osaksi tuotuna:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"eka_sana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"vika_sana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"sanojen_maara"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Testataan funktioiden toimintaa"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eka_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tämä on testi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vika_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tämä on testeistä toinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanojen_lkm"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Yks kaks kolme neljä viisi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt moduulin itsensä suorittaminen suorittaa testikutsut:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä\ntoinen\n5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun moduuli sen sijaan tuodaan osaksi jotain muuta ohjelmaa, testejä ei suoriteta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" sanat\n\nmjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vesihiisi sihisi hississä\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"eka_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vika_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanojen_maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vesihiisi\nhississä\n3"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Merkkiapuri","tmcname":"osa07-17_merkkiapuri"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee moduuli "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"merkkiapuri"}]},{"type":"text","value":", joka sisältää seuraavat funktiot:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vaihda_koko(merkkijono: str)"}]},{"type":"text","value":" saa parametrikseen merkkijonon. Funktio luo ja palauttaa uuden merkkijonon, jossa alkuperäisen merkkijonon pienet kirjaimet on muutettu isoiksi kirjaimiksi ja päinvastoin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"puolita(merkkijono: str)"}]},{"type":"text","value":" palauttaa tuplessa parametrinaan saamansa merkkijonon ensimmäisen ja toisen puolikkaan. Jos merkkijonossa on pariton määrä kirjaimia, ensimmäinen puolikas on lyhyempi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"poista_erikoismerkit(merkkijono: str)"}]},{"type":"text","value":" palauttaa merkkijonon, josta on poistettu kaikki muut merkit paitsi aakkoset [a...ö, A...Ö], numerot ja välilyönnit."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkejä moduulin toiminnasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" merkkiapuri\n\nmjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi kaikki!\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"merkkiapuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vaihda_koko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\np1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" p2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" merkkiapuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"puolita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nm2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" merkkiapuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"poista_erikoismerkit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tämä on testi, katsotaan miten käy!!!11!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"m2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"mOI KAIKKI!\nMoi k\naikki!\nTämä on testi katsotaan miten käy11"}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2"},"children":[]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa lopuksi osion loppukyselyyn:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat luoda oman moduulin
  • \n
  • Tiedät, mitä Pythonin muuttuja __name__ ja sen arvo __main__ merkitsevät
  • \n

Omien moduulien tekeminen on helppoa Pythonissa, koska mikä tahansa Python-koodia sisältävä tiedosto voi toimia moduulina. Tarkastellaan esimerkkinä seuraavaa tiedostoa sanat.py:

def eka_sana(mjono: str):\n    osat = mjono.split(\" \")\n    return osat[0]\n\ndef vika_sana(mjono: str):\n    osat = mjono.split(\" \")\n    return osat[-1]\n\ndef sanojen_maara(mjono: str):\n    osat = mjono.split(\" \")\n    return len(osat)

Voimme käyttää tässä tiedostossa olevia funktioita toisessa tiedostossa seuraavasti:

import sanat\n\nmjono = \"Vesihiisi sihisi hississä\"\n\nprint(sanat.eka_sana(mjono))\nprint(sanat.vika_sana(mjono))\nprint(sanat.sanojen_maara(mjono))

Vesihiisi\nhississä\n3

Huomaa, että moduulin kooditiedoston pitää sijaita joko samassa hakemistossa ohjelman kanssa tai jossakin Pythonin oletushakemistossa, jotta sen voi ottaa käyttöön import-komennolla.

Voimme käyttää omaa moduulia samalla periaatteella kuin standardikirjaston moduuleja. Esimerkiksi näin:

from sanat import eka_sana, vika_sana\n\nlause = input(\"Anna lause: \")\n\nprint(\"Eka sana oli: \" + eka_sana(lause))\nprint(\"Viimeinen sana oli: \" + vika_sana(lause))

Anna lause: Python on metka ohjelmointikieli\nEka sana oli: Python\nViimeinen sana oli: ohjelmointikieli

Hyötyä tyyppivihjeistä

Moduulissa on hyödyllistä, että funktioissa käytetään tyyppivihjeitä. Kun joku muu käyttää moduulia editorilla, joka ymmärtää tyyppivihjeitä, ne helpottavat moduulin käyttämistä.

Esimerkiksi Visual Studio Code näyttää funktion tyypit näin koodia kirjoittaessa:

\n \n \n \n \n \n \"7\n \n \n

Moduulin päätason koodi

Jos moduulissa on päätason koodia, joka ei ole funktion sisällä, koodi suoritetaan automaattisesti, kun moduuli otetaan mukaan import-komennolla toisessa tiedostossa.

Oletetaan, että sanat.py-tiedostoon on kirjoitettu muutama testitapaus:

def eka_sana(mjono: str):\n    osat = mjono.split(\" \")\n    return osat[0]\n\ndef vika_sana(mjono: str):\n    osat = mjono.split(\" \")\n    return osat[-1]\n\ndef sanojen_maara(mjono: str):\n    osat = mjono.split(\" \")\n    return len(osat)\n\nprint(eka_sana(\"Tämä on testi\"))\nprint(vika_sana(\"Tämä on testeistä toinen\"))\nprint(sanojen_maara(\"Yks kaks kolme neljä viisi\"))

Kun moduuli otetaan nyt käyttöön import-lauseella, suoritetaan automaattisesti myös moduulissa funktioiden ulkopuolella oleva koodi:

import sanat\n\nmjono = \"Vesihiisi sihisi hississä\"\n\nprint(sanat.eka_sana(mjono))\nprint(sanat.vika_sana(mjono))\nprint(sanat.sanojen_maara(mjono))

Tämä\ntoinen\n5\nVesihiisi\nhississä\n3

Tämä ei ole hyvä, koska moduulin käyttäjän ohjelmaa sotkee moduulissa oleva testitulostus.

Pythonista löytyy onneksi ratkaisu pulmaan. Ohjelmassa on mahdollista testata, suoritetaanko ohjelmaa itseään vai onko ohjelma otettu käyttöön moduulina import-lauseella. Tämä onnistuu muuttujan __name__ avulla. Python tallentaa muuttujaan tiedon suoritettavasta ohjelmasta: jos ohjelmaa suoritetaan sellaisenaan, muuttujan arvo on merkkijono __main__. Jos ohjelma on tuotu osaksi jotain toista ohjelmaa, muuttujan arvona on suoritettavan ohjelman nimi (eli tässä tapauksessa sanat).

Moduuliin voidaan siis lisätä edellistä tietoa hyödyntäen ehtolause, jonka avulla testikoodi suoritetaan ainoastaan silloin, kun ohjelma ajetaan omana itsenään eikä toisen ohjelman osaksi tuotuna:

def eka_sana(mjono: str) -> str:\n    osat = mjono.split(\" \")\n    return osat[0]\n\ndef vika_sana(mjono: str) -> str:\n    osat = mjono.split(\" \")\n    return osat[-1]\n\ndef sanojen_maara(mjono: str) -> int:\n    osat = mjono.split(\" \")\n    return len(osat)\n\nif __name__ == \"__main__\":\n    # Testataan funktioiden toimintaa\n    print(eka_sana(\"Tämä on testi\"))\n    print(vika_sana(\"Tämä on testeistä toinen\"))\n    print(sanojen_lkm(\"Yks kaks kolme neljä viisi\"))

Nyt moduulin itsensä suorittaminen suorittaa testikutsut:

Tämä\ntoinen\n5

Kun moduuli sen sijaan tuodaan osaksi jotain muuta ohjelmaa, testejä ei suoriteta:

import sanat\n\nmjono = \"Vesihiisi sihisi hississä\"\n\nprint(sanat.eka_sana(mjono))\nprint(sanat.vika_sana(mjono))\nprint(sanat.sanojen_maara(mjono))

Vesihiisi\nhississä\n3

Tee moduuli merkkiapuri, joka sisältää seuraavat funktiot:

Funktio vaihda_koko(merkkijono: str) saa parametrikseen merkkijonon. Funktio luo ja palauttaa uuden merkkijonon, jossa alkuperäisen merkkijonon pienet kirjaimet on muutettu isoiksi kirjaimiksi ja päinvastoin.

Funktio puolita(merkkijono: str) palauttaa tuplessa parametrinaan saamansa merkkijonon ensimmäisen ja toisen puolikkaan. Jos merkkijonossa on pariton määrä kirjaimia, ensimmäinen puolikas on lyhyempi.

Funktio poista_erikoismerkit(merkkijono: str) palauttaa merkkijonon, josta on poistettu kaikki muut merkit paitsi aakkoset [a...ö, A...Ö], numerot ja välilyönnit.

Esimerkkejä moduulin toiminnasta:

import merkkiapuri\n\nmjono = \"Moi kaikki!\"\n\nprint(merkkiapuri.vaihda_koko(mjono))\n\np1, p2 = merkkiapuri.puolita(mjono)\n\nprint(p1)\nprint(p2)\n\nm2 = merkkiapuri.poista_erikoismerkit(\"Tämä on testi, katsotaan miten käy!!!11!\")\nprint(m2)

mOI KAIKKI!\nMoi k\naikki!\nTämä on testi katsotaan miten käy11

Vastaa lopuksi osion loppukyselyyn:

","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-7/5-omat-moduulit.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat luoda oman moduulin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä Pythonin muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__name__"}]},{"type":"text","value":" ja sen arvo "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__main__"}]},{"type":"text","value":" merkitsevät"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Omien moduulien tekeminen on helppoa Pythonissa, koska mikä tahansa Python-koodia sisältävä tiedosto voi toimia moduulina. Tarkastellaan esimerkkinä seuraavaa tiedostoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sanat.py"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"eka_sana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"vika_sana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"sanojen_maara"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme käyttää tässä tiedostossa olevia funktioita toisessa tiedostossa seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" sanat\n\nmjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vesihiisi sihisi hississä\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"eka_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vika_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanojen_maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vesihiisi\nhississä\n3"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että moduulin kooditiedoston pitää sijaita joko samassa hakemistossa ohjelman kanssa tai jossakin Pythonin oletushakemistossa, jotta sen voi ottaa käyttöön "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":"-komennolla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voimme käyttää omaa moduulia samalla periaatteella kuin standardikirjaston moduuleja. Esimerkiksi näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" sanat "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" eka_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vika_sana\n\nlause "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"input"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Anna lause: \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Eka sana oli: \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" eka_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Viimeinen sana oli: \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" vika_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lause"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lause: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Python on metka ohjelmointikieli"}]},{"type":"text","value":"\nEka sana oli: Python\nViimeinen sana oli: ohjelmointikieli"}]}]},{"type":"element","tagName":"h2","properties":{"id":"hyotya-tyyppivihjeista","style":"position:relative;"},"children":[{"type":"text","value":"Hyötyä tyyppivihjeistä"},{"type":"element","tagName":"a","properties":{"href":"#hyotya-tyyppivihjeista","ariaLabel":"hyotya tyyppivihjeista permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moduulissa on hyödyllistä, että funktioissa käytetään tyyppivihjeitä. Kun joku muu käyttää moduulia editorilla, joka ymmärtää tyyppivihjeitä, ne helpottavat moduulin käyttämistä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi Visual Studio Code näyttää funktion tyypit näin koodia kirjoittaessa:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 519px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/7772b5ee03bb1ca30f17560902916121/b23ad/7_vihje.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 23.91304347826087%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAsklEQVQY032Q2w6DIBBE+Q4DmpSLilwEtG82sf//T9OwxD7VPpzM7IadJcv6vscdQojbPuec/DAMxOXZv0AuOKy12Pcn1jUh54JSCo7jhfN8I4RI/WmaEeMK7wNY3XRH13Wwcwvctp2ooc55Gq5B4zjBmJF8VWaMglIKWmtIKWGMofrq5ZKRc/7+poZJqfB4SNL2VpOvsBAsvHeIMWJZFqRUh1qdcoILrt1McNLKdbdffADLIo82jUnA7AAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/7772b5ee03bb1ca30f17560902916121/a0b58/7_vihje.webp 230w","/static/7772b5ee03bb1ca30f17560902916121/bc10c/7_vihje.webp 460w","/static/7772b5ee03bb1ca30f17560902916121/ad2dd/7_vihje.webp 519w"],"sizes":"(max-width: 519px) 100vw, 519px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/7772b5ee03bb1ca30f17560902916121/81c8e/7_vihje.png 230w","/static/7772b5ee03bb1ca30f17560902916121/08a84/7_vihje.png 460w","/static/7772b5ee03bb1ca30f17560902916121/b23ad/7_vihje.png 519w"],"sizes":"(max-width: 519px) 100vw, 519px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/7772b5ee03bb1ca30f17560902916121/b23ad/7_vihje.png","alt":"7 vihje","title":"7 vihje","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"h2","properties":{"id":"moduulin-paatason-koodi","style":"position:relative;"},"children":[{"type":"text","value":"Moduulin päätason koodi"},{"type":"element","tagName":"a","properties":{"href":"#moduulin-paatason-koodi","ariaLabel":"moduulin paatason koodi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos moduulissa on päätason koodia, joka ei ole funktion sisällä, koodi suoritetaan automaattisesti, kun moduuli otetaan mukaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":"-komennolla toisessa tiedostossa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oletetaan, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sanat.py"}]},{"type":"text","value":"-tiedostoon on kirjoitettu muutama testitapaus:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"eka_sana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"vika_sana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"sanojen_maara"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eka_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tämä on testi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vika_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tämä on testeistä toinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanojen_maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Yks kaks kolme neljä viisi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun moduuli otetaan nyt käyttöön "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":"-lauseella, suoritetaan automaattisesti myös moduulissa funktioiden ulkopuolella oleva koodi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" sanat\n\nmjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vesihiisi sihisi hississä\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"eka_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vika_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanojen_maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä\ntoinen\n5\nVesihiisi\nhississä\n3"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä ei ole hyvä, koska moduulin käyttäjän ohjelmaa sotkee moduulissa oleva testitulostus."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonista löytyy onneksi ratkaisu pulmaan. Ohjelmassa on mahdollista testata, suoritetaanko ohjelmaa itseään vai onko ohjelma otettu käyttöön moduulina "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":"-lauseella. Tämä onnistuu muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__name__"}]},{"type":"text","value":" avulla. Python tallentaa muuttujaan tiedon suoritettavasta ohjelmasta: jos ohjelmaa suoritetaan sellaisenaan, muuttujan arvo on merkkijono "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__main__"}]},{"type":"text","value":". Jos ohjelma on tuotu osaksi jotain toista ohjelmaa, muuttujan arvona on suoritettavan ohjelman nimi (eli tässä tapauksessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sanat"}]},{"type":"text","value":")."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moduuliin voidaan siis lisätä edellistä tietoa hyödyntäen ehtolause, jonka avulla testikoodi suoritetaan ainoastaan silloin, kun ohjelma ajetaan omana itsenään eikä toisen ohjelman osaksi tuotuna:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"eka_sana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"vika_sana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"sanojen_maara"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n osat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"osat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Testataan funktioiden toimintaa"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eka_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tämä on testi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vika_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tämä on testeistä toinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanojen_lkm"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Yks kaks kolme neljä viisi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt moduulin itsensä suorittaminen suorittaa testikutsut:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä\ntoinen\n5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun moduuli sen sijaan tuodaan osaksi jotain muuta ohjelmaa, testejä ei suoriteta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" sanat\n\nmjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vesihiisi sihisi hississä\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"eka_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vika_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanojen_maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vesihiisi\nhississä\n3"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Merkkiapuri","tmcname":"osa07-17_merkkiapuri"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee moduuli "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"merkkiapuri"}]},{"type":"text","value":", joka sisältää seuraavat funktiot:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vaihda_koko(merkkijono: str)"}]},{"type":"text","value":" saa parametrikseen merkkijonon. Funktio luo ja palauttaa uuden merkkijonon, jossa alkuperäisen merkkijonon pienet kirjaimet on muutettu isoiksi kirjaimiksi ja päinvastoin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"puolita(merkkijono: str)"}]},{"type":"text","value":" palauttaa tuplessa parametrinaan saamansa merkkijonon ensimmäisen ja toisen puolikkaan. Jos merkkijonossa on pariton määrä kirjaimia, ensimmäinen puolikas on lyhyempi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"poista_erikoismerkit(merkkijono: str)"}]},{"type":"text","value":" palauttaa merkkijonon, josta on poistettu kaikki muut merkit paitsi aakkoset [a...ö, A...Ö], numerot ja välilyönnit."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkejä moduulin toiminnasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" merkkiapuri\n\nmjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi kaikki!\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"merkkiapuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vaihda_koko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\np1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" p2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" merkkiapuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"puolita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mjono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"p2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nm2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" merkkiapuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"poista_erikoismerkit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tämä on testi, katsotaan miten käy!!!11!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"m2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"mOI KAIKKI!\nMoi k\naikki!\nTämä on testi katsotaan miten käy11"}]}]}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2"},"children":[]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa lopuksi osion loppukyselyyn:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat luoda oman moduulin
  • \n
  • Tiedät, mitä Pythonin muuttuja __name__ ja sen arvo __main__ merkitsevät
  • \n

Omien moduulien tekeminen on helppoa Pythonissa, koska mikä tahansa Python-koodia sisältävä tiedosto voi toimia moduulina. Tarkastellaan esimerkkinä seuraavaa tiedostoa sanat.py:

def eka_sana(mjono: str):\n    osat = mjono.split(\" \")\n    return osat[0]\n\ndef vika_sana(mjono: str):\n    osat = mjono.split(\" \")\n    return osat[-1]\n\ndef sanojen_maara(mjono: str):\n    osat = mjono.split(\" \")\n    return len(osat)

Voimme käyttää tässä tiedostossa olevia funktioita toisessa tiedostossa seuraavasti:

import sanat\n\nmjono = \"Vesihiisi sihisi hississä\"\n\nprint(sanat.eka_sana(mjono))\nprint(sanat.vika_sana(mjono))\nprint(sanat.sanojen_maara(mjono))

Vesihiisi\nhississä\n3

Huomaa, että moduulin kooditiedoston pitää sijaita joko samassa hakemistossa ohjelman kanssa tai jossakin Pythonin oletushakemistossa, jotta sen voi ottaa käyttöön import-komennolla.

Voimme käyttää omaa moduulia samalla periaatteella kuin standardikirjaston moduuleja. Esimerkiksi näin:

from sanat import eka_sana, vika_sana\n\nlause = input(\"Anna lause: \")\n\nprint(\"Eka sana oli: \" + eka_sana(lause))\nprint(\"Viimeinen sana oli: \" + vika_sana(lause))

Anna lause: Python on metka ohjelmointikieli\nEka sana oli: Python\nViimeinen sana oli: ohjelmointikieli

Hyötyä tyyppivihjeistä

Moduulissa on hyödyllistä, että funktioissa käytetään tyyppivihjeitä. Kun joku muu käyttää moduulia editorilla, joka ymmärtää tyyppivihjeitä, ne helpottavat moduulin käyttämistä.

Esimerkiksi Visual Studio Code näyttää funktion tyypit näin koodia kirjoittaessa:

\n \n \n \n \n \n \"7\n \n \n

Moduulin päätason koodi

Jos moduulissa on päätason koodia, joka ei ole funktion sisällä, koodi suoritetaan automaattisesti, kun moduuli otetaan mukaan import-komennolla toisessa tiedostossa.

Oletetaan, että sanat.py-tiedostoon on kirjoitettu muutama testitapaus:

def eka_sana(mjono: str):\n    osat = mjono.split(\" \")\n    return osat[0]\n\ndef vika_sana(mjono: str):\n    osat = mjono.split(\" \")\n    return osat[-1]\n\ndef sanojen_maara(mjono: str):\n    osat = mjono.split(\" \")\n    return len(osat)\n\nprint(eka_sana(\"Tämä on testi\"))\nprint(vika_sana(\"Tämä on testeistä toinen\"))\nprint(sanojen_maara(\"Yks kaks kolme neljä viisi\"))

Kun moduuli otetaan nyt käyttöön import-lauseella, suoritetaan automaattisesti myös moduulissa funktioiden ulkopuolella oleva koodi:

import sanat\n\nmjono = \"Vesihiisi sihisi hississä\"\n\nprint(sanat.eka_sana(mjono))\nprint(sanat.vika_sana(mjono))\nprint(sanat.sanojen_maara(mjono))

Tämä\ntoinen\n5\nVesihiisi\nhississä\n3

Tämä ei ole hyvä, koska moduulin käyttäjän ohjelmaa sotkee moduulissa oleva testitulostus.

Pythonista löytyy onneksi ratkaisu pulmaan. Ohjelmassa on mahdollista testata, suoritetaanko ohjelmaa itseään vai onko ohjelma otettu käyttöön moduulina import-lauseella. Tämä onnistuu muuttujan __name__ avulla. Python tallentaa muuttujaan tiedon suoritettavasta ohjelmasta: jos ohjelmaa suoritetaan sellaisenaan, muuttujan arvo on merkkijono __main__. Jos ohjelma on tuotu osaksi jotain toista ohjelmaa, muuttujan arvona on suoritettavan ohjelman nimi (eli tässä tapauksessa sanat).

Moduuliin voidaan siis lisätä edellistä tietoa hyödyntäen ehtolause, jonka avulla testikoodi suoritetaan ainoastaan silloin, kun ohjelma ajetaan omana itsenään eikä toisen ohjelman osaksi tuotuna:

def eka_sana(mjono: str) -> str:\n    osat = mjono.split(\" \")\n    return osat[0]\n\ndef vika_sana(mjono: str) -> str:\n    osat = mjono.split(\" \")\n    return osat[-1]\n\ndef sanojen_maara(mjono: str) -> int:\n    osat = mjono.split(\" \")\n    return len(osat)\n\nif __name__ == \"__main__\":\n    # Testataan funktioiden toimintaa\n    print(eka_sana(\"Tämä on testi\"))\n    print(vika_sana(\"Tämä on testeistä toinen\"))\n    print(sanojen_lkm(\"Yks kaks kolme neljä viisi\"))

Nyt moduulin itsensä suorittaminen suorittaa testikutsut:

Tämä\ntoinen\n5

Kun moduuli sen sijaan tuodaan osaksi jotain muuta ohjelmaa, testejä ei suoriteta:

import sanat\n\nmjono = \"Vesihiisi sihisi hississä\"\n\nprint(sanat.eka_sana(mjono))\nprint(sanat.vika_sana(mjono))\nprint(sanat.sanojen_maara(mjono))

Vesihiisi\nhississä\n3

Tee moduuli merkkiapuri, joka sisältää seuraavat funktiot:

Funktio vaihda_koko(merkkijono: str) saa parametrikseen merkkijonon. Funktio luo ja palauttaa uuden merkkijonon, jossa alkuperäisen merkkijonon pienet kirjaimet on muutettu isoiksi kirjaimiksi ja päinvastoin.

Funktio puolita(merkkijono: str) palauttaa tuplessa parametrinaan saamansa merkkijonon ensimmäisen ja toisen puolikkaan. Jos merkkijonossa on pariton määrä kirjaimia, ensimmäinen puolikas on lyhyempi.

Funktio poista_erikoismerkit(merkkijono: str) palauttaa merkkijonon, josta on poistettu kaikki muut merkit paitsi aakkoset [a...ö, A...Ö], numerot ja välilyönnit.

Esimerkkejä moduulin toiminnasta:

import merkkiapuri\n\nmjono = \"Moi kaikki!\"\n\nprint(merkkiapuri.vaihda_koko(mjono))\n\np1, p2 = merkkiapuri.puolita(mjono)\n\nprint(p1)\nprint(p2)\n\nm2 = merkkiapuri.poista_erikoismerkit(\"Tämä on testi, katsotaan miten käy!!!11!\")\nprint(m2)

mOI KAIKKI!\nMoi k\naikki!\nTämä on testi katsotaan miten käy11

Vastaa lopuksi osion loppukyselyyn:

","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-7/5-omat-moduulit.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-7/6-lisaa-pythonista/page-data.json b/page-data/osa-7/6-lisaa-pythonista/page-data.json index f2c8b7619..d5e96cb7f 100644 --- a/page-data/osa-7/6-lisaa-pythonista/page-data.json +++ b/page-data/osa-7/6-lisaa-pythonista/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-7/6-lisaa-pythonista", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät lisää Pythonin ominaisuuksia"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tähän lukuun on koottu vielä joukko erinäisiä hyödyllisiä Pythoniin liittyviä ominaisuuksia."}]},{"type":"element","tagName":"h2","properties":{"id":"yhden-rivin-ehto","style":"position:relative;"},"children":[{"type":"text","value":"Yhden rivin ehto"},{"type":"element","tagName":"a","properties":{"href":"#yhden-rivin-ehto","ariaLabel":"yhden rivin ehto permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavat koodit toimivat samalla tavalla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"parillinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pariton\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"parillinen\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pariton\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jälkimmäisessä koodissa on yhden rivin ehto muotoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a if [ehto] else b"}]},{"type":"text","value":". Tällaisen lausekkeen arvo on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":", jos ehto pätee, ja muuten "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sama rakenne on joskus hyödyllinen kun tehdään ehdollinen sijoituslause. Esimerkiksi jos haluaisimme joko kasvattaa muuttujaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"y"}]},{"type":"text","value":" tai nollata sen riippuen muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":" arvon parillisuudesta, sen sijaan että kirjoittaisimme"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"sama voitaisiin tehdä yhden rivin ehdolla seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"tyhja-komento","style":"position:relative;"},"children":[{"type":"text","value":"Tyhjä komento"},{"type":"element","tagName":"a","properties":{"href":"#tyhja-komento","ariaLabel":"tyhja komento permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Komento "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pass"}]},{"type":"text","value":" ei tee mitään. Voimme tehdä sen avulla esimerkiksi funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"testi"}]},{"type":"text","value":", joka ei tee mitään:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"testi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että lohko ei voi olla tyhjä eli seuraava koodi ei toimisi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"testi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"silmukan-else-osa","style":"position:relative;"},"children":[{"type":"text","value":"Silmukan else-osa"},{"type":"element","tagName":"a","properties":{"href":"#silmukan-else-osa","ariaLabel":"silmukan else osa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kiinnostava Pythonin ominaisuus on, että ehtolauseen lisäksi myös silmukassa voi olla else-osa. Tämä osa suoritetaan, jos silmukka pääsee loppuun."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraava koodi etsii listalta parillista lukua. Jos sellainen löytyy, koodi tulostaa luvun ja silmukka päättyy. Kuitenkin jos lukua ei löytynyt, tästä tulee ilmoitus lopuksi."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"löytyi parillinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ei löytynyt parillista\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Perinteinen tapa tehdä tällainen silmukka olisi käyttää apumuuttujaa, joka muistaa, löytyikö haluttua asiaa silmukan aikana:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nloytyi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"löytyi parillinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n loytyi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" loytyi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ei löytynyt parillista\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuitenkin silmukan else-osan avulla vältymme muuttujan tekemiseltä."}]},{"type":"element","tagName":"h2","properties":{"id":"funktion-oletusparametri","style":"position:relative;"},"children":[{"type":"text","value":"Funktion oletusparametri"},{"type":"element","tagName":"a","properties":{"href":"#funktion-oletusparametri","ariaLabel":"funktion oletusparametri permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion parametrilla voi olla oletusarvo, joka tulee käyttöön silloin, jos parametria ei anneta. Näin on esimerkiksi seuraavassa funktiossa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tervehdi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moikka,\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntervehdi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntervehdi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntervehdi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Matti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moikka, Emilia\nMoikka, Erkki\nMoikka, Matti"}]}]},{"type":"element","tagName":"h2","properties":{"id":"muuttuva-maara-parametreja","style":"position:relative;"},"children":[{"type":"text","value":"Muuttuva määrä parametreja"},{"type":"element","tagName":"a","properties":{"href":"#muuttuva-maara-parametreja","ariaLabel":"muuttuva maara parametreja permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiolla voi olla myös muuttuva määrä parametreja, mikä merkitään laittamalla tähti parametrin eteen. Tällöin kaikki loput parametrit kasautuvat listaksi tähän parametriin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraava funktio kertoo parametrien määrän ja summan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"testi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Annoit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"parametria\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Niiden summa on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sum"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Annoit 5 parametria\nNiiden summa on 15"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Oma ohjelmointikieli","tmcname":"osa07-18_oma_ohjelmointikieli"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä toteutetaan oman ohjelmointikielen suorittaja. Voit käyttää tehtävässä kaikkia kurssilla oppimiasi taitoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma muodostuu riveistä, joista jokainen on yksi seuraavista:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"PRINT [arvo]"}]},{"type":"text","value":": tulostaa annetun arvon"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"MOV [muuttuja] [arvo]"}]},{"type":"text","value":": asettaa muuttujaan annetun arvon"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ADD [muuttuja] [arvo]"}]},{"type":"text","value":": lisää muuttujaan annetun arvon"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"SUB [muuttuja] [arvo}"}]},{"type":"text","value":": vähentää muuttujasta annetun arvon"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"MUL [muuttuja] [arvo]"}]},{"type":"text","value":": kertoo muuttujan annetulla arvolla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[kohta]:"}]},{"type":"text","value":": määrittelee kohdan, johon voidaan hypätä muualta"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"JUMP [kohta]"}]},{"type":"text","value":": hyppää annettuun kohtaan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"IF [ehto] JUMP [kohta]"}]},{"type":"text","value":": jos ehto pätee, hyppää annettuun kohtaan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"END"}]},{"type":"text","value":": lopettaa ohjelman"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmaa suoritetaan rivi kerrallaan ensimmäisestä rivistä aloittaen. Ohjelma päättyy, kun vastaan tulee komento "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"END"}]},{"type":"text","value":" tai suoritus menee ohjelman viimeisen rivin yli."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jokaisessa ohjelmassa on 26 muuttujaa, joiden nimet ovat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"A"}]},{"type":"text","value":"..."},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Z"}]},{"type":"text","value":". Jokaisen muuttujan arvo on 0 ohjelman alussa. Merkintä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[muuttuja]"}]},{"type":"text","value":" viittaa tällaiseen muuttujaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kaikki ohjelman käsittelemät arvot ovat kokonaislukuja. Merkintä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[arvo]"}]},{"type":"text","value":" viittaa joko muuttujaan tai kokonaislukuna annettuun arvoon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkintä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[kohta]"}]},{"type":"text","value":" on mikä tahansa kohdan nimi, joka muodostuu pienistä kirjaimista "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":"..."},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"z"}]},{"type":"text","value":" sekä numeroista "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"..."},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"9"}]},{"type":"text","value":". Kahdella kohdalla ei saa olla samaa nimeä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkintä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[ehto]"}]},{"type":"text","value":" tarkoittaa ehtoa muotoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[arvo] [vertailu] [arvo]"}]},{"type":"text","value":". Tässä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[vertailu]"}]},{"type":"text","value":" on aina yksi seuraavista: "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"!="}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suorita(ohjelma)"}]},{"type":"text","value":", jolle annetaan ohjelma listana. Jokainen listan alkio on yksi ohjelman rivi. Funktion tulee palauttaa listana kaikki "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"PRINT"}]},{"type":"text","value":"-komentojen tulokset ohjelman suorituksen aikana."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa, että funktiolle annettu ohjelma on oikeanmuotoinen, eli funktion ei tarvitse toteuttaa virheenkäsittelyä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtävästä on saatavilla kaksi pistettä: saat yhden pisteen, jos komennot "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"PRINT"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"MOV"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ADD"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"SUB"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"MUL"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"END"}]},{"type":"text","value":" toimivat, ja vielä toisen pisteen, jos myös loput silmukoihin liittyvät komennot toimivat."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki 1:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ohjelma1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nohjelma1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MOV A 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MOV B 2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"PRINT A\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"PRINT B\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ADD A B\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"PRINT A\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"END\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" suorita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ohjelma1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 2, 3]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki 2:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ohjelma2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nohjelma2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MOV A 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MOV B 10\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"alku:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"IF A >= B JUMP loppu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"PRINT A\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"PRINT B\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ADD A 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"SUB B 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"JUMP alku\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"loppu:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"END\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" suorita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ohjelma2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 10, 2, 9, 3, 8, 4, 7, 5, 6]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki 3 (kertoma):"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ohjelma3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nohjelma3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MOV A 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MOV B 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"alku:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"PRINT A\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ADD B 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MUL A B\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"IF B <= 10 JUMP alku\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"END\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" suorita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ohjelma3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki 4 (alkuluvut):"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ohjelma4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MOV N 50\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"PRINT 2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MOV A 3\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"alku:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MOV B 2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MOV Z 0\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"testi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MOV C B\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"uusi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"IF C == A JUMP virhe\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"IF C > A JUMP ohi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ADD C B\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"JUMP uusi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"virhe:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MOV Z 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"JUMP ohi2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ohi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ADD B 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"IF B < A JUMP testi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ohi2:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"IF Z == 1 JUMP ohi3\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"PRINT A\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ohi3:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ADD A 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"IF A <= N JUMP alku\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" suorita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa kurssin lopuksi loppukyselyyn. Kyselyn tuloksia käytetään kurssimateriaalin kehittämiseen."}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät lisää Pythonin ominaisuuksia
  • \n

Tähän lukuun on koottu vielä joukko erinäisiä hyödyllisiä Pythoniin liittyviä ominaisuuksia.

Yhden rivin ehto

Seuraavat koodit toimivat samalla tavalla:

if x%2 == 0:\n    print(\"parillinen\")\nelse:\n    print(\"pariton\")
print(\"parillinen\" if x%2 == 0 else \"pariton\")

Jälkimmäisessä koodissa on yhden rivin ehto muotoa a if [ehto] else b. Tällaisen lausekkeen arvo on a, jos ehto pätee, ja muuten b.

Sama rakenne on joskus hyödyllinen kun tehdään ehdollinen sijoituslause. Esimerkiksi jos haluaisimme joko kasvattaa muuttujaa y tai nollata sen riippuen muuttujan x arvon parillisuudesta, sen sijaan että kirjoittaisimme

if x%2 == 0:\n    y += 1\nelse:\n    y = 0

sama voitaisiin tehdä yhden rivin ehdolla seuraavasti

y = y + 1 if x%2 == 0 else 0

Tyhjä komento

Komento pass ei tee mitään. Voimme tehdä sen avulla esimerkiksi funktion testi, joka ei tee mitään:

def testi():\n    pass

Huomaa, että lohko ei voi olla tyhjä eli seuraava koodi ei toimisi:

def testi():

Silmukan else-osa

Kiinnostava Pythonin ominaisuus on, että ehtolauseen lisäksi myös silmukassa voi olla else-osa. Tämä osa suoritetaan, jos silmukka pääsee loppuun.

Esimerkiksi seuraava koodi etsii listalta parillista lukua. Jos sellainen löytyy, koodi tulostaa luvun ja silmukka päättyy. Kuitenkin jos lukua ei löytynyt, tästä tulee ilmoitus lopuksi.

lista = [3,5,2,8,1]\nfor x in lista:\n    if x%2 == 0:\n        print(\"löytyi parillinen\", x)\n        break\nelse:\n    print(\"ei löytynyt parillista\")

Perinteinen tapa tehdä tällainen silmukka olisi käyttää apumuuttujaa, joka muistaa, löytyikö haluttua asiaa silmukan aikana:

lista = [3,5,2,8,1]\nloytyi = False\nfor x in lista:\n    if x%2 == 0:\n        print(\"löytyi parillinen\", x)\n        loytyi = True\n        break\nif not loytyi:\n    print(\"ei löytynyt parillista\")

Kuitenkin silmukan else-osan avulla vältymme muuttujan tekemiseltä.

Funktion oletusparametri

Funktion parametrilla voi olla oletusarvo, joka tulee käyttöön silloin, jos parametria ei anneta. Näin on esimerkiksi seuraavassa funktiossa:

def tervehdi(nimi=\"Emilia\"):\n    print(\"Moikka,\", nimi)\n\ntervehdi()\ntervehdi(\"Erkki\")\ntervehdi(\"Matti\")

Moikka, Emilia\nMoikka, Erkki\nMoikka, Matti

Muuttuva määrä parametreja

Funktiolla voi olla myös muuttuva määrä parametreja, mikä merkitään laittamalla tähti parametrin eteen. Tällöin kaikki loput parametrit kasautuvat listaksi tähän parametriin.

Esimerkiksi seuraava funktio kertoo parametrien määrän ja summan:

def testi(*lista):\n    print(\"Annoit\", len(lista), \"parametria\")\n    print(\"Niiden summa on\", sum(lista))\n\ntesti(1, 2, 3, 4, 5)

Annoit 5 parametria\nNiiden summa on 15

Tässä tehtävässä toteutetaan oman ohjelmointikielen suorittaja. Voit käyttää tehtävässä kaikkia kurssilla oppimiasi taitoja.

Ohjelma muodostuu riveistä, joista jokainen on yksi seuraavista:

    \n
  • PRINT [arvo]: tulostaa annetun arvon
  • \n
  • MOV [muuttuja] [arvo]: asettaa muuttujaan annetun arvon
  • \n
  • ADD [muuttuja] [arvo]: lisää muuttujaan annetun arvon
  • \n
  • SUB [muuttuja] [arvo}: vähentää muuttujasta annetun arvon
  • \n
  • MUL [muuttuja] [arvo]: kertoo muuttujan annetulla arvolla
  • \n
  • [kohta]:: määrittelee kohdan, johon voidaan hypätä muualta
  • \n
  • JUMP [kohta]: hyppää annettuun kohtaan
  • \n
  • IF [ehto] JUMP [kohta]: jos ehto pätee, hyppää annettuun kohtaan
  • \n
  • END: lopettaa ohjelman
  • \n

Ohjelmaa suoritetaan rivi kerrallaan ensimmäisestä rivistä aloittaen. Ohjelma päättyy, kun vastaan tulee komento END tai suoritus menee ohjelman viimeisen rivin yli.

Jokaisessa ohjelmassa on 26 muuttujaa, joiden nimet ovat A...Z. Jokaisen muuttujan arvo on 0 ohjelman alussa. Merkintä [muuttuja] viittaa tällaiseen muuttujaan.

Kaikki ohjelman käsittelemät arvot ovat kokonaislukuja. Merkintä [arvo] viittaa joko muuttujaan tai kokonaislukuna annettuun arvoon.

Merkintä [kohta] on mikä tahansa kohdan nimi, joka muodostuu pienistä kirjaimista a...z sekä numeroista 0...9. Kahdella kohdalla ei saa olla samaa nimeä.

Merkintä [ehto] tarkoittaa ehtoa muotoa [arvo] [vertailu] [arvo]. Tässä [vertailu] on aina yksi seuraavista: ==, !=, <, <=, > tai >=.

Tee funktio suorita(ohjelma), jolle annetaan ohjelma listana. Jokainen listan alkio on yksi ohjelman rivi. Funktion tulee palauttaa listana kaikki PRINT-komentojen tulokset ohjelman suorituksen aikana.

Voit olettaa, että funktiolle annettu ohjelma on oikeanmuotoinen, eli funktion ei tarvitse toteuttaa virheenkäsittelyä.

Tehtävästä on saatavilla kaksi pistettä: saat yhden pisteen, jos komennot PRINT, MOV, ADD, SUB, MUL ja END toimivat, ja vielä toisen pisteen, jos myös loput silmukoihin liittyvät komennot toimivat.

Esimerkki 1:

ohjelma1 = []\nohjelma1.append(\"MOV A 1\")\nohjelma1.append(\"MOV B 2\")\nohjelma1.append(\"PRINT A\")\nohjelma1.append(\"PRINT B\")\nohjelma1.append(\"ADD A B\")\nohjelma1.append(\"PRINT A\")\nohjelma1.append(\"END\")\ntulos = suorita(ohjelma1)\nprint(tulos)

[1, 2, 3]

Esimerkki 2:

ohjelma2 = []\nohjelma2.append(\"MOV A 1\")\nohjelma2.append(\"MOV B 10\")\nohjelma2.append(\"alku:\")\nohjelma2.append(\"IF A >= B JUMP loppu\")\nohjelma2.append(\"PRINT A\")\nohjelma2.append(\"PRINT B\")\nohjelma2.append(\"ADD A 1\")\nohjelma2.append(\"SUB B 1\")\nohjelma2.append(\"JUMP alku\")\nohjelma2.append(\"loppu:\")\nohjelma2.append(\"END\")\ntulos = suorita(ohjelma2)\nprint(tulos)

[1, 10, 2, 9, 3, 8, 4, 7, 5, 6]

Esimerkki 3 (kertoma):

ohjelma3 = []\nohjelma3.append(\"MOV A 1\")\nohjelma3.append(\"MOV B 1\")\nohjelma3.append(\"alku:\")\nohjelma3.append(\"PRINT A\")\nohjelma3.append(\"ADD B 1\")\nohjelma3.append(\"MUL A B\")\nohjelma3.append(\"IF B <= 10 JUMP alku\")\nohjelma3.append(\"END\")\ntulos = suorita(ohjelma3)\nprint(tulos)

[1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]

Esimerkki 4 (alkuluvut):

ohjelma4 = []\nohjelma4.append(\"MOV N 50\")\nohjelma4.append(\"PRINT 2\")\nohjelma4.append(\"MOV A 3\")\nohjelma4.append(\"alku:\")\nohjelma4.append(\"MOV B 2\")\nohjelma4.append(\"MOV Z 0\")\nohjelma4.append(\"testi:\")\nohjelma4.append(\"MOV C B\")\nohjelma4.append(\"uusi:\")\nohjelma4.append(\"IF C == A JUMP virhe\")\nohjelma4.append(\"IF C > A JUMP ohi\")\nohjelma4.append(\"ADD C B\")\nohjelma4.append(\"JUMP uusi\")\nohjelma4.append(\"virhe:\")\nohjelma4.append(\"MOV Z 1\")\nohjelma4.append(\"JUMP ohi2\")\nohjelma4.append(\"ohi:\")\nohjelma4.append(\"ADD B 1\")\nohjelma4.append(\"IF B < A JUMP testi\")\nohjelma4.append(\"ohi2:\")\nohjelma4.append(\"IF Z == 1 JUMP ohi3\")\nohjelma4.append(\"PRINT A\")\nohjelma4.append(\"ohi3:\")\nohjelma4.append(\"ADD A 1\")\nohjelma4.append(\"IF A <= N JUMP alku\")\ntulos = suorita(ohjelma4)\nprint(tulos)

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]

Vastaa kurssin lopuksi loppukyselyyn. Kyselyn tuloksia käytetään kurssimateriaalin kehittämiseen.

","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-7/6-lisaa-pythonista.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät lisää Pythonin ominaisuuksia"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tähän lukuun on koottu vielä joukko erinäisiä hyödyllisiä Pythoniin liittyviä ominaisuuksia."}]},{"type":"element","tagName":"h2","properties":{"id":"yhden-rivin-ehto","style":"position:relative;"},"children":[{"type":"text","value":"Yhden rivin ehto"},{"type":"element","tagName":"a","properties":{"href":"#yhden-rivin-ehto","ariaLabel":"yhden rivin ehto permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavat koodit toimivat samalla tavalla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"parillinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pariton\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"parillinen\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pariton\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jälkimmäisessä koodissa on yhden rivin ehto muotoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a if [ehto] else b"}]},{"type":"text","value":". Tällaisen lausekkeen arvo on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":", jos ehto pätee, ja muuten "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"b"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sama rakenne on joskus hyödyllinen kun tehdään ehdollinen sijoituslause. Esimerkiksi jos haluaisimme joko kasvattaa muuttujaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"y"}]},{"type":"text","value":" tai nollata sen riippuen muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":" arvon parillisuudesta, sen sijaan että kirjoittaisimme"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"sama voitaisiin tehdä yhden rivin ehdolla seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"tyhja-komento","style":"position:relative;"},"children":[{"type":"text","value":"Tyhjä komento"},{"type":"element","tagName":"a","properties":{"href":"#tyhja-komento","ariaLabel":"tyhja komento permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Komento "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pass"}]},{"type":"text","value":" ei tee mitään. Voimme tehdä sen avulla esimerkiksi funktion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"testi"}]},{"type":"text","value":", joka ei tee mitään:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"testi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että lohko ei voi olla tyhjä eli seuraava koodi ei toimisi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"testi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"silmukan-else-osa","style":"position:relative;"},"children":[{"type":"text","value":"Silmukan else-osa"},{"type":"element","tagName":"a","properties":{"href":"#silmukan-else-osa","ariaLabel":"silmukan else osa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kiinnostava Pythonin ominaisuus on, että ehtolauseen lisäksi myös silmukassa voi olla else-osa. Tämä osa suoritetaan, jos silmukka pääsee loppuun."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraava koodi etsii listalta parillista lukua. Jos sellainen löytyy, koodi tulostaa luvun ja silmukka päättyy. Kuitenkin jos lukua ei löytynyt, tästä tulee ilmoitus lopuksi."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"löytyi parillinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ei löytynyt parillista\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Perinteinen tapa tehdä tällainen silmukka olisi käyttää apumuuttujaa, joka muistaa, löytyikö haluttua asiaa silmukan aikana:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nloytyi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" x "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"%"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"löytyi parillinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n loytyi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"break"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" loytyi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ei löytynyt parillista\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuitenkin silmukan else-osan avulla vältymme muuttujan tekemiseltä."}]},{"type":"element","tagName":"h2","properties":{"id":"funktion-oletusparametri","style":"position:relative;"},"children":[{"type":"text","value":"Funktion oletusparametri"},{"type":"element","tagName":"a","properties":{"href":"#funktion-oletusparametri","ariaLabel":"funktion oletusparametri permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktion parametrilla voi olla oletusarvo, joka tulee käyttöön silloin, jos parametria ei anneta. Näin on esimerkiksi seuraavassa funktiossa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tervehdi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moikka,\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntervehdi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntervehdi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntervehdi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Matti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Moikka, Emilia\nMoikka, Erkki\nMoikka, Matti"}]}]},{"type":"element","tagName":"h2","properties":{"id":"muuttuva-maara-parametreja","style":"position:relative;"},"children":[{"type":"text","value":"Muuttuva määrä parametreja"},{"type":"element","tagName":"a","properties":{"href":"#muuttuva-maara-parametreja","ariaLabel":"muuttuva maara parametreja permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiolla voi olla myös muuttuva määrä parametreja, mikä merkitään laittamalla tähti parametrin eteen. Tällöin kaikki loput parametrit kasautuvat listaksi tähän parametriin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi seuraava funktio kertoo parametrien määrän ja summan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"testi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Annoit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"parametria\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Niiden summa on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sum"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Annoit 5 parametria\nNiiden summa on 15"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Oma ohjelmointikieli","tmcname":"osa07-18_oma_ohjelmointikieli"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä toteutetaan oman ohjelmointikielen suorittaja. Voit käyttää tehtävässä kaikkia kurssilla oppimiasi taitoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma muodostuu riveistä, joista jokainen on yksi seuraavista:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"PRINT [arvo]"}]},{"type":"text","value":": tulostaa annetun arvon"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"MOV [muuttuja] [arvo]"}]},{"type":"text","value":": asettaa muuttujaan annetun arvon"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ADD [muuttuja] [arvo]"}]},{"type":"text","value":": lisää muuttujaan annetun arvon"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"SUB [muuttuja] [arvo}"}]},{"type":"text","value":": vähentää muuttujasta annetun arvon"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"MUL [muuttuja] [arvo]"}]},{"type":"text","value":": kertoo muuttujan annetulla arvolla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[kohta]:"}]},{"type":"text","value":": määrittelee kohdan, johon voidaan hypätä muualta"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"JUMP [kohta]"}]},{"type":"text","value":": hyppää annettuun kohtaan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"IF [ehto] JUMP [kohta]"}]},{"type":"text","value":": jos ehto pätee, hyppää annettuun kohtaan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"END"}]},{"type":"text","value":": lopettaa ohjelman"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmaa suoritetaan rivi kerrallaan ensimmäisestä rivistä aloittaen. Ohjelma päättyy, kun vastaan tulee komento "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"END"}]},{"type":"text","value":" tai suoritus menee ohjelman viimeisen rivin yli."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jokaisessa ohjelmassa on 26 muuttujaa, joiden nimet ovat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"A"}]},{"type":"text","value":"..."},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Z"}]},{"type":"text","value":". Jokaisen muuttujan arvo on 0 ohjelman alussa. Merkintä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[muuttuja]"}]},{"type":"text","value":" viittaa tällaiseen muuttujaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kaikki ohjelman käsittelemät arvot ovat kokonaislukuja. Merkintä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[arvo]"}]},{"type":"text","value":" viittaa joko muuttujaan tai kokonaislukuna annettuun arvoon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkintä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[kohta]"}]},{"type":"text","value":" on mikä tahansa kohdan nimi, joka muodostuu pienistä kirjaimista "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":"..."},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"z"}]},{"type":"text","value":" sekä numeroista "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"..."},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"9"}]},{"type":"text","value":". Kahdella kohdalla ei saa olla samaa nimeä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkintä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[ehto]"}]},{"type":"text","value":" tarkoittaa ehtoa muotoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[arvo] [vertailu] [arvo]"}]},{"type":"text","value":". Tässä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"[vertailu]"}]},{"type":"text","value":" on aina yksi seuraavista: "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"!="}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suorita(ohjelma)"}]},{"type":"text","value":", jolle annetaan ohjelma listana. Jokainen listan alkio on yksi ohjelman rivi. Funktion tulee palauttaa listana kaikki "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"PRINT"}]},{"type":"text","value":"-komentojen tulokset ohjelman suorituksen aikana."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa, että funktiolle annettu ohjelma on oikeanmuotoinen, eli funktion ei tarvitse toteuttaa virheenkäsittelyä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtävästä on saatavilla kaksi pistettä: saat yhden pisteen, jos komennot "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"PRINT"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"MOV"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ADD"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"SUB"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"MUL"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"END"}]},{"type":"text","value":" toimivat, ja vielä toisen pisteen, jos myös loput silmukoihin liittyvät komennot toimivat."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki 1:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ohjelma1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nohjelma1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MOV A 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MOV B 2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"PRINT A\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"PRINT B\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ADD A B\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"PRINT A\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"END\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" suorita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ohjelma1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 2, 3]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki 2:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ohjelma2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nohjelma2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MOV A 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MOV B 10\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"alku:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"IF A >= B JUMP loppu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"PRINT A\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"PRINT B\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ADD A 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"SUB B 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"JUMP alku\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"loppu:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"END\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" suorita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ohjelma2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 10, 2, 9, 3, 8, 4, 7, 5, 6]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki 3 (kertoma):"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ohjelma3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nohjelma3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MOV A 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MOV B 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"alku:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"PRINT A\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ADD B 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MUL A B\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"IF B <= 10 JUMP alku\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"END\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" suorita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ohjelma3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki 4 (alkuluvut):"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ohjelma4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MOV N 50\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"PRINT 2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MOV A 3\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"alku:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MOV B 2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MOV Z 0\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"testi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MOV C B\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"uusi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"IF C == A JUMP virhe\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"IF C > A JUMP ohi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ADD C B\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"JUMP uusi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"virhe:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"MOV Z 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"JUMP ohi2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ohi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ADD B 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"IF B < A JUMP testi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ohi2:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"IF Z == 1 JUMP ohi3\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"PRINT A\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ohi3:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ADD A 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"IF A <= N JUMP alku\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" suorita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ohjelma4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa kurssin lopuksi loppukyselyyn. Kyselyn tuloksia käytetään kurssimateriaalin kehittämiseen."}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät lisää Pythonin ominaisuuksia
  • \n

Tähän lukuun on koottu vielä joukko erinäisiä hyödyllisiä Pythoniin liittyviä ominaisuuksia.

Yhden rivin ehto

Seuraavat koodit toimivat samalla tavalla:

if x%2 == 0:\n    print(\"parillinen\")\nelse:\n    print(\"pariton\")
print(\"parillinen\" if x%2 == 0 else \"pariton\")

Jälkimmäisessä koodissa on yhden rivin ehto muotoa a if [ehto] else b. Tällaisen lausekkeen arvo on a, jos ehto pätee, ja muuten b.

Sama rakenne on joskus hyödyllinen kun tehdään ehdollinen sijoituslause. Esimerkiksi jos haluaisimme joko kasvattaa muuttujaa y tai nollata sen riippuen muuttujan x arvon parillisuudesta, sen sijaan että kirjoittaisimme

if x%2 == 0:\n    y += 1\nelse:\n    y = 0

sama voitaisiin tehdä yhden rivin ehdolla seuraavasti

y = y + 1 if x%2 == 0 else 0

Tyhjä komento

Komento pass ei tee mitään. Voimme tehdä sen avulla esimerkiksi funktion testi, joka ei tee mitään:

def testi():\n    pass

Huomaa, että lohko ei voi olla tyhjä eli seuraava koodi ei toimisi:

def testi():

Silmukan else-osa

Kiinnostava Pythonin ominaisuus on, että ehtolauseen lisäksi myös silmukassa voi olla else-osa. Tämä osa suoritetaan, jos silmukka pääsee loppuun.

Esimerkiksi seuraava koodi etsii listalta parillista lukua. Jos sellainen löytyy, koodi tulostaa luvun ja silmukka päättyy. Kuitenkin jos lukua ei löytynyt, tästä tulee ilmoitus lopuksi.

lista = [3,5,2,8,1]\nfor x in lista:\n    if x%2 == 0:\n        print(\"löytyi parillinen\", x)\n        break\nelse:\n    print(\"ei löytynyt parillista\")

Perinteinen tapa tehdä tällainen silmukka olisi käyttää apumuuttujaa, joka muistaa, löytyikö haluttua asiaa silmukan aikana:

lista = [3,5,2,8,1]\nloytyi = False\nfor x in lista:\n    if x%2 == 0:\n        print(\"löytyi parillinen\", x)\n        loytyi = True\n        break\nif not loytyi:\n    print(\"ei löytynyt parillista\")

Kuitenkin silmukan else-osan avulla vältymme muuttujan tekemiseltä.

Funktion oletusparametri

Funktion parametrilla voi olla oletusarvo, joka tulee käyttöön silloin, jos parametria ei anneta. Näin on esimerkiksi seuraavassa funktiossa:

def tervehdi(nimi=\"Emilia\"):\n    print(\"Moikka,\", nimi)\n\ntervehdi()\ntervehdi(\"Erkki\")\ntervehdi(\"Matti\")

Moikka, Emilia\nMoikka, Erkki\nMoikka, Matti

Muuttuva määrä parametreja

Funktiolla voi olla myös muuttuva määrä parametreja, mikä merkitään laittamalla tähti parametrin eteen. Tällöin kaikki loput parametrit kasautuvat listaksi tähän parametriin.

Esimerkiksi seuraava funktio kertoo parametrien määrän ja summan:

def testi(*lista):\n    print(\"Annoit\", len(lista), \"parametria\")\n    print(\"Niiden summa on\", sum(lista))\n\ntesti(1, 2, 3, 4, 5)

Annoit 5 parametria\nNiiden summa on 15

Tässä tehtävässä toteutetaan oman ohjelmointikielen suorittaja. Voit käyttää tehtävässä kaikkia kurssilla oppimiasi taitoja.

Ohjelma muodostuu riveistä, joista jokainen on yksi seuraavista:

    \n
  • PRINT [arvo]: tulostaa annetun arvon
  • \n
  • MOV [muuttuja] [arvo]: asettaa muuttujaan annetun arvon
  • \n
  • ADD [muuttuja] [arvo]: lisää muuttujaan annetun arvon
  • \n
  • SUB [muuttuja] [arvo}: vähentää muuttujasta annetun arvon
  • \n
  • MUL [muuttuja] [arvo]: kertoo muuttujan annetulla arvolla
  • \n
  • [kohta]:: määrittelee kohdan, johon voidaan hypätä muualta
  • \n
  • JUMP [kohta]: hyppää annettuun kohtaan
  • \n
  • IF [ehto] JUMP [kohta]: jos ehto pätee, hyppää annettuun kohtaan
  • \n
  • END: lopettaa ohjelman
  • \n

Ohjelmaa suoritetaan rivi kerrallaan ensimmäisestä rivistä aloittaen. Ohjelma päättyy, kun vastaan tulee komento END tai suoritus menee ohjelman viimeisen rivin yli.

Jokaisessa ohjelmassa on 26 muuttujaa, joiden nimet ovat A...Z. Jokaisen muuttujan arvo on 0 ohjelman alussa. Merkintä [muuttuja] viittaa tällaiseen muuttujaan.

Kaikki ohjelman käsittelemät arvot ovat kokonaislukuja. Merkintä [arvo] viittaa joko muuttujaan tai kokonaislukuna annettuun arvoon.

Merkintä [kohta] on mikä tahansa kohdan nimi, joka muodostuu pienistä kirjaimista a...z sekä numeroista 0...9. Kahdella kohdalla ei saa olla samaa nimeä.

Merkintä [ehto] tarkoittaa ehtoa muotoa [arvo] [vertailu] [arvo]. Tässä [vertailu] on aina yksi seuraavista: ==, !=, <, <=, > tai >=.

Tee funktio suorita(ohjelma), jolle annetaan ohjelma listana. Jokainen listan alkio on yksi ohjelman rivi. Funktion tulee palauttaa listana kaikki PRINT-komentojen tulokset ohjelman suorituksen aikana.

Voit olettaa, että funktiolle annettu ohjelma on oikeanmuotoinen, eli funktion ei tarvitse toteuttaa virheenkäsittelyä.

Tehtävästä on saatavilla kaksi pistettä: saat yhden pisteen, jos komennot PRINT, MOV, ADD, SUB, MUL ja END toimivat, ja vielä toisen pisteen, jos myös loput silmukoihin liittyvät komennot toimivat.

Esimerkki 1:

ohjelma1 = []\nohjelma1.append(\"MOV A 1\")\nohjelma1.append(\"MOV B 2\")\nohjelma1.append(\"PRINT A\")\nohjelma1.append(\"PRINT B\")\nohjelma1.append(\"ADD A B\")\nohjelma1.append(\"PRINT A\")\nohjelma1.append(\"END\")\ntulos = suorita(ohjelma1)\nprint(tulos)

[1, 2, 3]

Esimerkki 2:

ohjelma2 = []\nohjelma2.append(\"MOV A 1\")\nohjelma2.append(\"MOV B 10\")\nohjelma2.append(\"alku:\")\nohjelma2.append(\"IF A >= B JUMP loppu\")\nohjelma2.append(\"PRINT A\")\nohjelma2.append(\"PRINT B\")\nohjelma2.append(\"ADD A 1\")\nohjelma2.append(\"SUB B 1\")\nohjelma2.append(\"JUMP alku\")\nohjelma2.append(\"loppu:\")\nohjelma2.append(\"END\")\ntulos = suorita(ohjelma2)\nprint(tulos)

[1, 10, 2, 9, 3, 8, 4, 7, 5, 6]

Esimerkki 3 (kertoma):

ohjelma3 = []\nohjelma3.append(\"MOV A 1\")\nohjelma3.append(\"MOV B 1\")\nohjelma3.append(\"alku:\")\nohjelma3.append(\"PRINT A\")\nohjelma3.append(\"ADD B 1\")\nohjelma3.append(\"MUL A B\")\nohjelma3.append(\"IF B <= 10 JUMP alku\")\nohjelma3.append(\"END\")\ntulos = suorita(ohjelma3)\nprint(tulos)

[1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]

Esimerkki 4 (alkuluvut):

ohjelma4 = []\nohjelma4.append(\"MOV N 50\")\nohjelma4.append(\"PRINT 2\")\nohjelma4.append(\"MOV A 3\")\nohjelma4.append(\"alku:\")\nohjelma4.append(\"MOV B 2\")\nohjelma4.append(\"MOV Z 0\")\nohjelma4.append(\"testi:\")\nohjelma4.append(\"MOV C B\")\nohjelma4.append(\"uusi:\")\nohjelma4.append(\"IF C == A JUMP virhe\")\nohjelma4.append(\"IF C > A JUMP ohi\")\nohjelma4.append(\"ADD C B\")\nohjelma4.append(\"JUMP uusi\")\nohjelma4.append(\"virhe:\")\nohjelma4.append(\"MOV Z 1\")\nohjelma4.append(\"JUMP ohi2\")\nohjelma4.append(\"ohi:\")\nohjelma4.append(\"ADD B 1\")\nohjelma4.append(\"IF B < A JUMP testi\")\nohjelma4.append(\"ohi2:\")\nohjelma4.append(\"IF Z == 1 JUMP ohi3\")\nohjelma4.append(\"PRINT A\")\nohjelma4.append(\"ohi3:\")\nohjelma4.append(\"ADD A 1\")\nohjelma4.append(\"IF A <= N JUMP alku\")\ntulos = suorita(ohjelma4)\nprint(tulos)

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]

Vastaa kurssin lopuksi loppukyselyyn. Kyselyn tuloksia käytetään kurssimateriaalin kehittämiseen.

","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-7/6-lisaa-pythonista.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-7/page-data.json b/page-data/osa-7/page-data.json index 672bf4161..dc4281b0a 100644 --- a/page-data/osa-7/page-data.json +++ b/page-data/osa-7/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-part-overview-template-js", "path": "/osa-7", - "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-7","title":"Osa 7"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-7/index.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-7","title":"Osa 7"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-7/index.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-8/1-oliot-ja-metodit/page-data.json b/page-data/osa-8/1-oliot-ja-metodit/page-data.json index 9ec3331fd..83ff83f75 100644 --- a/page-data/osa-8/1-oliot-ja-metodit/page-data.json +++ b/page-data/osa-8/1-oliot-ja-metodit/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-8/1-oliot-ja-metodit", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä tarkoitetaan oliolla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ymmärrät, mitä tarkoitetaan olioiden itsenäisyydellä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat muodostaa ja käsitellä olioita"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä on Ohjelmoinnin jatkokurssin ensimmäinen osa, ja kurssilla käytetään VS Codea samaan tapaan kuin Ohjelmoinnin perusteissa. Jos et ole käyttänyt ennen VS Codea, löydät "},{"type":"element","tagName":"a","properties":{"href":"https://www.mooc.fi/fi/installation/vscode","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"tästä"}]},{"type":"text","value":" ohjeet ympäristön asentamiseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jatkokurssi ja peruskurssi ovat TMC:ssä yhtenä kurssina. Jos lopetit juuri peruskurssin tekemisen, jatkokurssin tehtävät löytyvät samasta kurssista. Tämän jatkokurssin ensimmäisen osan numero on "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Osa 8"}]},{"type":"text","value":". Mikäli et ole tehnyt tähän jatkokurssin liittyvää peruskurssia, valitse TMC-pluginissa organisaatioksi "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"MOOC"}]},{"type":"text","value":" ja kurssiksi "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Ohjelmoinnin MOOC 2023"}]},{"type":"text","value":" ja aloita kurssin tekeminen osasta 8."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten kurssin ensimmäisen puolikkaan aikana huomattiin, on usein hyödyllistä yhdistää samaan asiaan liittyvät tiedot yhdeksi kokonaisuudeksi. Esimerkiksi kirjaa on kätevä mallintaa vaikkapa tuplen tai sanakirjan avulla, kun kaikki kirjaan liittyvät tiedot voidaan tallentaa samaan rakenteeseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tuplea käyttämällä esimerkki voisi näyttää tältä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nuoruuteni näppäilyt\""}]},{"type":"text","value":"\nkirjailija "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"text","value":"\nvuosi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1992"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Yhdistetään yhdeksi tupleksi"}]},{"type":"text","value":"\nkirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirjailija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan kirjan nimi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanakirjassa on tässä yhteydessä se etu, että avaimina voidaan käyttää merkkijonoja kokonaislukujen sijasta. Näin ollen alkioille voidaan antaa niiden sisältöä kuvaavat nimet:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nuoruuteni näppäilyt\""}]},{"type":"text","value":"\nkirjailija "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"text","value":"\nvuosi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1992"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Yhdistetään yhdeksi sanakirjaksi"}]},{"type":"text","value":"\nkirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kirjailija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" kirjailija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vuosi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan kirjan nimi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Molemmissa tapauksissa tietojen tallentaminen tietorakenteeseen muodostaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"olion"}]},{"type":"text","value":". Olio on itsenäinen kokonaisuus, joka sisältää (tässä tapauksessa) toisiinsa liittyvää tietoa. Itsenäisyys tarkoittaa sitä, että olioon tehdyt muutokset eivät vaikuta muihin olioihin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos esimerkiksi muodostetaan sanakirjaa käyttäen kaksi kirjaoliota, ensimmäiseen kirjaan tehdyt muutokset eivät vaikuta toiseen kirjaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kirja1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vanhus ja Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kirjailija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ernest Pythonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vuosi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1952"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\nkirja2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Seitsemän Pythonia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kirjailija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aleksis Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vuosi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1894"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkirja1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jäähyväiset aaseille\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vanhus ja Python\nSeitsemän Pythonia\nJäähyväiset aaseille\nSeitsemän Pythonia"}]}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 341px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/74b678969e8df323e37bea6c8b4fae79/4c0ad/8_1_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 45.65217391304348%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAABRUlEQVQoz41Sa6uCUBD0//+U/oURERpaRollUmnlIx+V9qKay+zlXIg+eBeGg4tnZnfmaGip8/mMNE0RRRHKskQQBNhut0iSBGEYYrPZSJ/V7/ehrVYr+aFpGtR1/YHj8Yjlcon1eo1erwfTNOE4DgaDgYC9breL0WgkhOPxGBrVD4cD7vc7rtfrBy6Xi0wRx7Fcnk6nmM1mmM/nIlhVlYDTsmzbhvaflbkSL3ELnvy+3W4iqISfzyeGwyG01+sF4v1+f4HFSYqiwOl0Qp7nIsCpSMo+T4I9WtM6IQnVhCSl51mWYb/fy7nb7SQwTmxZFjSmRPAi1RVUKL7vC4kyn6HQT13XJSSeTPfxePx6yFCozlCooqBCYiBch/4sFgt5NkyenpGE/il7GFrryiQkmWEYmEwm8ly4muu6f6lzas/z0Ol08AM2IqK5S7nUBQAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/74b678969e8df323e37bea6c8b4fae79/a0b58/8_1_1.webp 230w","/static/74b678969e8df323e37bea6c8b4fae79/5af35/8_1_1.webp 341w"],"sizes":"(max-width: 341px) 100vw, 341px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/74b678969e8df323e37bea6c8b4fae79/81c8e/8_1_1.png 230w","/static/74b678969e8df323e37bea6c8b4fae79/4c0ad/8_1_1.png 341w"],"sizes":"(max-width: 341px) 100vw, 341px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/74b678969e8df323e37bea6c8b4fae79/4c0ad/8_1_1.png","alt":"8 1 1","title":"8 1 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"text-box","properties":{"variant":"info","name":"Oliot Pythonissa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten kurssin ensimmäisen puolikkaan aikana kerrottiin, Pythonissa kaikki arvot ovat itse asiassa olioita. Tämä tarkoittaa, että muuttujan arvo on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"viittaus olioon"}]},{"type":"text","value":", ja varsinainen tieto on tallennettu olioon. Kun esimerkiksi alustetaan muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a = 3"}]},{"type":"text","value":", ei muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":" arvo ole 3 vaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"viittaus olioon, jonka sisältö on arvo 3"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Useimmissa muissa ohjelmointikielissä on olioiden lisäksi ns. perustyyppisiä arvoja (esimerkiksi kokonais- ja liukuluvut sekä totuusarvot), jotka tallennetaan sellaisenaan muuttujiin. Pythonissakin perustyyppiset oliot (kuten vaikkapa luvut, totuusarvot tai merkkijonot) ovat kuitenkin muuttumattomia eli "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"mutatoitumattomia"}]},{"type":"text","value":". Ohjelmoijan kannalta niiden käyttö ei siis käytännössä eroa perustyyppisistä arvoista."}]}]},{"type":"element","tagName":"h2","properties":{"id":"oliot-ja-metodit","style":"position:relative;"},"children":[{"type":"text","value":"Oliot ja metodit"},{"type":"element","tagName":"a","properties":{"href":"#oliot-ja-metodit","ariaLabel":"oliot ja metodit permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olioiden tietosisältöä voidaaan havainnoida ja muuttaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"metodien"}]},{"type":"text","value":" avulla. Metodi on funktio, jonka toiminta kohdistuu annettuun olioon. Metodin erottaa muista funktioista tapa, jolla sitä kutsutaan: ensin kirjoitetaan kohdeolio ja sen perään kutsuttava metodi pisteellä erotettuna. Esimerkiksi sanakirja-olion kaikki arvot voidaan palauttaa metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"values"}]},{"type":"text","value":" avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muodostetaan sanakirjatyyppinen kirjaolio"}]},{"type":"text","value":"\nkirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vanhus ja Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kirjailija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ernest Pythonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vuosi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1952"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan kaikki arvot"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodikutsu values() kirjoitetaan muuttujan perään"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# pisteellä erotettuna"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" arvo "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"values"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vanhus ja Python\nErnest Pythonen\n1952"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Samalla tavalla merkkijonometodit kohdistuvat siihen merkkijonoon, jonka kautta niitä kutsutaan. Esimerkiksi merkkijonon metodeja ovat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"count"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"find"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Keijo Keksitty\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan K-kirjaimien määrä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"count"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"K\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# K-kirjaimien määrä toisessa jonossa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Karkkilan Kolisevat Karjut\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"count"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"K\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Osajonon Keksitty indeksi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"find"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Keksitty\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tästä merkkijonosta osajonoa ei löydy"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ihan eri jono\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"find"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Keksitty\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2\n3\n6\n-1"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkkijonometodit palauttavat arvoja, mutta niiden avulla ei voida muuttaa merkkijonoa. Kuitenkin esimerkiksi lista-olion metodien avulla voidaan muuttaa listan sisältöä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Lisätään pari alkiota"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Poistetaan alkio alusta"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pop"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 2, 3, 5, 1]\n[2, 3, 5, 1]"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Pienin keskiarvo","tmcname":"osa08-01_pienin_keskiarvo"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pienin_keskiarvo(henkilo1: dict, henkilo2: dict, henkilo3: dict)"}]},{"type":"text","value":", joka saa parametrikseen kolme sanakirjaoliota."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jokaisessa sanakirjaoliossa on alkiot, joihin viittaavat nämä avaimet:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"text","value":": kilpailijan nimi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"tulos1\""}]},{"type":"text","value":": kilpailijan ensimmäinen tulos (kokonaisluku väliltä 1...10)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"tulos2\""}]},{"type":"text","value":": kilpailijan toinen tulos (kuten yllä)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"tulos3\""}]},{"type":"text","value":": kilpailijan kolmas tulos (kuten yllä)"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio laskee kaikkien kilpailijoiden tulosten keskiarvot ja palauttaa sen kilpailijan, jonka keskiarvo on pienin. Funktion palautusarvona on sanakirjaolio."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa, että vain yhdellä henkilöllä on pienin keskiarvo."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilo1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Keijo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tulos1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tulos2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tulos3\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\nhenkilo2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Reijo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tulos1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tulos2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tulos3\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\nhenkilo3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Veijo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tulos1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tulos2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tulos3\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pienin_keskiarvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"henkilo1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" henkilo2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" henkilo3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"{'nimi': 'Veijo', 'tulos1': 3, 'tulos2': 1, 'tulos3': 1}"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Rivien summat","tmcname":"osa08-02_rivien_summmat "},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Listan alkioiden arvot ovat viittauksia olioihin. Tämä pätee myös silloin, kun mallinnetaan matriisia: jokainen päälistan alkion arvo on viittaus toiseen listaan (jonka alkiot taas ovat viittauksia arvoihin)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rivien_summat(matriisi: list)"}]},{"type":"text","value":", joka saa parametrikseen kokonaislukuja sisältävän matriisin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio lisää jokaiselle matriisin riville uuden alkion, jonka arvo on rivin alkioiden summa. Funktio ei palauta mitään, vaan muokkaa parametrinaan saamaansa matriisia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"matriisi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nrivien_summat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[[1, 2, 3], [3, 4, 7]]"}]}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, mitä tarkoitetaan oliolla
  • \n
  • Ymmärrät, mitä tarkoitetaan olioiden itsenäisyydellä
  • \n
  • Osaat muodostaa ja käsitellä olioita
  • \n

Tämä on Ohjelmoinnin jatkokurssin ensimmäinen osa, ja kurssilla käytetään VS Codea samaan tapaan kuin Ohjelmoinnin perusteissa. Jos et ole käyttänyt ennen VS Codea, löydät tästä ohjeet ympäristön asentamiseen.

Jatkokurssi ja peruskurssi ovat TMC:ssä yhtenä kurssina. Jos lopetit juuri peruskurssin tekemisen, jatkokurssin tehtävät löytyvät samasta kurssista. Tämän jatkokurssin ensimmäisen osan numero on Osa 8. Mikäli et ole tehnyt tähän jatkokurssin liittyvää peruskurssia, valitse TMC-pluginissa organisaatioksi MOOC ja kurssiksi Ohjelmoinnin MOOC 2023 ja aloita kurssin tekeminen osasta 8.

Kuten kurssin ensimmäisen puolikkaan aikana huomattiin, on usein hyödyllistä yhdistää samaan asiaan liittyvät tiedot yhdeksi kokonaisuudeksi. Esimerkiksi kirjaa on kätevä mallintaa vaikkapa tuplen tai sanakirjan avulla, kun kaikki kirjaan liittyvät tiedot voidaan tallentaa samaan rakenteeseen.

Tuplea käyttämällä esimerkki voisi näyttää tältä:

nimi = \"Nuoruuteni näppäilyt\"\nkirjailija = \"Pekka Python\"\nvuosi = 1992\n\n# Yhdistetään yhdeksi tupleksi\nkirja = (nimi, kirjailija, vuosi)\n\n# Tulostetaan kirjan nimi\nprint(kirja[0])

Sanakirjassa on tässä yhteydessä se etu, että avaimina voidaan käyttää merkkijonoja kokonaislukujen sijasta. Näin ollen alkioille voidaan antaa niiden sisältöä kuvaavat nimet:

nimi = \"Nuoruuteni näppäilyt\"\nkirjailija = \"Pekka Python\"\nvuosi = 1992\n\n# Yhdistetään yhdeksi sanakirjaksi\nkirja = {\"nimi\": nimi, \"kirjailija\": kirjailija, \"vuosi\": vuosi}\n\n# Tulostetaan kirjan nimi\nprint(kirja[\"nimi\"])

Molemmissa tapauksissa tietojen tallentaminen tietorakenteeseen muodostaa olion. Olio on itsenäinen kokonaisuus, joka sisältää (tässä tapauksessa) toisiinsa liittyvää tietoa. Itsenäisyys tarkoittaa sitä, että olioon tehdyt muutokset eivät vaikuta muihin olioihin.

Jos esimerkiksi muodostetaan sanakirjaa käyttäen kaksi kirjaoliota, ensimmäiseen kirjaan tehdyt muutokset eivät vaikuta toiseen kirjaan:

kirja1 = {\"nimi\": \"Vanhus ja Python\", \"kirjailija\": \"Ernest Pythonen\", \"vuosi\": 1952}\nkirja2 = {\"nimi\": \"Seitsemän Pythonia\", \"kirjailija\": \"Aleksis Python\", \"vuosi\": 1894}\n\nprint(kirja1[\"nimi\"])\nprint(kirja2[\"nimi\"])\n\nkirja1[\"nimi\"] = \"Jäähyväiset aaseille\"\n\nprint(kirja1[\"nimi\"])\nprint(kirja2[\"nimi\"])

Vanhus ja Python\nSeitsemän Pythonia\nJäähyväiset aaseille\nSeitsemän Pythonia

\n \n \n \n \n \n \"8\n \n \n

Kuten kurssin ensimmäisen puolikkaan aikana kerrottiin, Pythonissa kaikki arvot ovat itse asiassa olioita. Tämä tarkoittaa, että muuttujan arvo on viittaus olioon, ja varsinainen tieto on tallennettu olioon. Kun esimerkiksi alustetaan muuttuja a = 3, ei muuttujan a arvo ole 3 vaan viittaus olioon, jonka sisältö on arvo 3.

Useimmissa muissa ohjelmointikielissä on olioiden lisäksi ns. perustyyppisiä arvoja (esimerkiksi kokonais- ja liukuluvut sekä totuusarvot), jotka tallennetaan sellaisenaan muuttujiin. Pythonissakin perustyyppiset oliot (kuten vaikkapa luvut, totuusarvot tai merkkijonot) ovat kuitenkin muuttumattomia eli mutatoitumattomia. Ohjelmoijan kannalta niiden käyttö ei siis käytännössä eroa perustyyppisistä arvoista.

Oliot ja metodit

Olioiden tietosisältöä voidaaan havainnoida ja muuttaa metodien avulla. Metodi on funktio, jonka toiminta kohdistuu annettuun olioon. Metodin erottaa muista funktioista tapa, jolla sitä kutsutaan: ensin kirjoitetaan kohdeolio ja sen perään kutsuttava metodi pisteellä erotettuna. Esimerkiksi sanakirja-olion kaikki arvot voidaan palauttaa metodin values avulla:

# muodostetaan sanakirjatyyppinen kirjaolio\nkirja = {\"nimi\": \"Vanhus ja Python\", \"kirjailija\": \"Ernest Pythonen\", \"vuosi\": 1952}\n\n# Tulostetaan kaikki arvot\n# Metodikutsu values() kirjoitetaan muuttujan perään\n# pisteellä erotettuna\nfor arvo in kirja.values():\n    print(arvo)

Vanhus ja Python\nErnest Pythonen\n1952

Samalla tavalla merkkijonometodit kohdistuvat siihen merkkijonoon, jonka kautta niitä kutsutaan. Esimerkiksi merkkijonon metodeja ovat count ja find:

nimi = \"Keijo Keksitty\"\n\n# Tulostetaan K-kirjaimien määrä\nprint(nimi.count(\"K\"))\n\n# K-kirjaimien määrä toisessa jonossa\nprint(\"Karkkilan Kolisevat Karjut\".count(\"K\"))\n\n# Osajonon Keksitty indeksi\nprint(nimi.find(\"Keksitty\"))\n\n# Tästä merkkijonosta osajonoa ei löydy\nprint(\"Ihan eri jono\".find(\"Keksitty\"))

2\n3\n6\n-1

Merkkijonometodit palauttavat arvoja, mutta niiden avulla ei voida muuttaa merkkijonoa. Kuitenkin esimerkiksi lista-olion metodien avulla voidaan muuttaa listan sisältöä:

lista = [1,2,3]\n\n# Lisätään pari alkiota\nlista.append(5)\nlista.append(1)\n\nprint(lista)\n\n# Poistetaan alkio alusta\nlista.pop(0)\n\nprint(lista)

[1, 2, 3, 5, 1]\n[2, 3, 5, 1]

Tee funktio pienin_keskiarvo(henkilo1: dict, henkilo2: dict, henkilo3: dict), joka saa parametrikseen kolme sanakirjaoliota.

Jokaisessa sanakirjaoliossa on alkiot, joihin viittaavat nämä avaimet:

    \n
  • \"nimi\": kilpailijan nimi
  • \n
  • \"tulos1\": kilpailijan ensimmäinen tulos (kokonaisluku väliltä 1...10)
  • \n
  • \"tulos2\": kilpailijan toinen tulos (kuten yllä)
  • \n
  • \"tulos3\": kilpailijan kolmas tulos (kuten yllä)
  • \n

Funktio laskee kaikkien kilpailijoiden tulosten keskiarvot ja palauttaa sen kilpailijan, jonka keskiarvo on pienin. Funktion palautusarvona on sanakirjaolio.

Voit olettaa, että vain yhdellä henkilöllä on pienin keskiarvo.

Esimerkki funktion kutsumisesta:

henkilo1 = {\"nimi\": \"Keijo\", \"tulos1\": 2, \"tulos2\": 3, \"tulos3\": 3}\nhenkilo2 = {\"nimi\": \"Reijo\", \"tulos1\": 5, \"tulos2\": 1, \"tulos3\": 8}\nhenkilo3 = {\"nimi\": \"Veijo\", \"tulos1\": 3, \"tulos2\": 1, \"tulos3\": 1}\n\nprint(pienin_keskiarvo(henkilo1, henkilo2, henkilo3))

{'nimi': 'Veijo', 'tulos1': 3, 'tulos2': 1, 'tulos3': 1}

Listan alkioiden arvot ovat viittauksia olioihin. Tämä pätee myös silloin, kun mallinnetaan matriisia: jokainen päälistan alkion arvo on viittaus toiseen listaan (jonka alkiot taas ovat viittauksia arvoihin).

Tee funktio rivien_summat(matriisi: list), joka saa parametrikseen kokonaislukuja sisältävän matriisin.

Funktio lisää jokaiselle matriisin riville uuden alkion, jonka arvo on rivin alkioiden summa. Funktio ei palauta mitään, vaan muokkaa parametrinaan saamaansa matriisia.

Esimerkki funktion kutsumisesta:

matriisi = [[1, 2], [3, 4]]\nrivien_summat(matriisi)\nprint(matriisi)

[[1, 2, 3], [3, 4, 7]]

","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-8/1-oliot-ja-metodit.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä tarkoitetaan oliolla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ymmärrät, mitä tarkoitetaan olioiden itsenäisyydellä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat muodostaa ja käsitellä olioita"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä on Ohjelmoinnin jatkokurssin ensimmäinen osa, ja kurssilla käytetään VS Codea samaan tapaan kuin Ohjelmoinnin perusteissa. Jos et ole käyttänyt ennen VS Codea, löydät "},{"type":"element","tagName":"a","properties":{"href":"https://www.mooc.fi/fi/installation/vscode","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"tästä"}]},{"type":"text","value":" ohjeet ympäristön asentamiseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jatkokurssi ja peruskurssi ovat TMC:ssä yhtenä kurssina. Jos lopetit juuri peruskurssin tekemisen, jatkokurssin tehtävät löytyvät samasta kurssista. Tämän jatkokurssin ensimmäisen osan numero on "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Osa 8"}]},{"type":"text","value":". Mikäli et ole tehnyt tähän jatkokurssin liittyvää peruskurssia, valitse TMC-pluginissa organisaatioksi "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"MOOC"}]},{"type":"text","value":" ja kurssiksi "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Ohjelmoinnin MOOC 2023"}]},{"type":"text","value":" ja aloita kurssin tekeminen osasta 8."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten kurssin ensimmäisen puolikkaan aikana huomattiin, on usein hyödyllistä yhdistää samaan asiaan liittyvät tiedot yhdeksi kokonaisuudeksi. Esimerkiksi kirjaa on kätevä mallintaa vaikkapa tuplen tai sanakirjan avulla, kun kaikki kirjaan liittyvät tiedot voidaan tallentaa samaan rakenteeseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tuplea käyttämällä esimerkki voisi näyttää tältä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nuoruuteni näppäilyt\""}]},{"type":"text","value":"\nkirjailija "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"text","value":"\nvuosi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1992"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Yhdistetään yhdeksi tupleksi"}]},{"type":"text","value":"\nkirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirjailija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan kirjan nimi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanakirjassa on tässä yhteydessä se etu, että avaimina voidaan käyttää merkkijonoja kokonaislukujen sijasta. Näin ollen alkioille voidaan antaa niiden sisältöä kuvaavat nimet:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nuoruuteni näppäilyt\""}]},{"type":"text","value":"\nkirjailija "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"text","value":"\nvuosi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1992"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Yhdistetään yhdeksi sanakirjaksi"}]},{"type":"text","value":"\nkirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kirjailija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" kirjailija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vuosi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan kirjan nimi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Molemmissa tapauksissa tietojen tallentaminen tietorakenteeseen muodostaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"olion"}]},{"type":"text","value":". Olio on itsenäinen kokonaisuus, joka sisältää (tässä tapauksessa) toisiinsa liittyvää tietoa. Itsenäisyys tarkoittaa sitä, että olioon tehdyt muutokset eivät vaikuta muihin olioihin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos esimerkiksi muodostetaan sanakirjaa käyttäen kaksi kirjaoliota, ensimmäiseen kirjaan tehdyt muutokset eivät vaikuta toiseen kirjaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kirja1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vanhus ja Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kirjailija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ernest Pythonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vuosi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1952"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\nkirja2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Seitsemän Pythonia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kirjailija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aleksis Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vuosi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1894"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkirja1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jäähyväiset aaseille\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vanhus ja Python\nSeitsemän Pythonia\nJäähyväiset aaseille\nSeitsemän Pythonia"}]}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 341px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/74b678969e8df323e37bea6c8b4fae79/4c0ad/8_1_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 45.65217391304348%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAABRUlEQVQoz41Sa6uCUBD0//+U/oURERpaRollUmnlIx+V9qKay+zlXIg+eBeGg4tnZnfmaGip8/mMNE0RRRHKskQQBNhut0iSBGEYYrPZSJ/V7/ehrVYr+aFpGtR1/YHj8Yjlcon1eo1erwfTNOE4DgaDgYC9breL0WgkhOPxGBrVD4cD7vc7rtfrBy6Xi0wRx7Fcnk6nmM1mmM/nIlhVlYDTsmzbhvaflbkSL3ELnvy+3W4iqISfzyeGwyG01+sF4v1+f4HFSYqiwOl0Qp7nIsCpSMo+T4I9WtM6IQnVhCSl51mWYb/fy7nb7SQwTmxZFjSmRPAi1RVUKL7vC4kyn6HQT13XJSSeTPfxePx6yFCozlCooqBCYiBch/4sFgt5NkyenpGE/il7GFrryiQkmWEYmEwm8ly4muu6f6lzas/z0Ol08AM2IqK5S7nUBQAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/74b678969e8df323e37bea6c8b4fae79/a0b58/8_1_1.webp 230w","/static/74b678969e8df323e37bea6c8b4fae79/5af35/8_1_1.webp 341w"],"sizes":"(max-width: 341px) 100vw, 341px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/74b678969e8df323e37bea6c8b4fae79/81c8e/8_1_1.png 230w","/static/74b678969e8df323e37bea6c8b4fae79/4c0ad/8_1_1.png 341w"],"sizes":"(max-width: 341px) 100vw, 341px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/74b678969e8df323e37bea6c8b4fae79/4c0ad/8_1_1.png","alt":"8 1 1","title":"8 1 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"text-box","properties":{"variant":"info","name":"Oliot Pythonissa"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten kurssin ensimmäisen puolikkaan aikana kerrottiin, Pythonissa kaikki arvot ovat itse asiassa olioita. Tämä tarkoittaa, että muuttujan arvo on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"viittaus olioon"}]},{"type":"text","value":", ja varsinainen tieto on tallennettu olioon. Kun esimerkiksi alustetaan muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a = 3"}]},{"type":"text","value":", ei muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"a"}]},{"type":"text","value":" arvo ole 3 vaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"viittaus olioon, jonka sisältö on arvo 3"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Useimmissa muissa ohjelmointikielissä on olioiden lisäksi ns. perustyyppisiä arvoja (esimerkiksi kokonais- ja liukuluvut sekä totuusarvot), jotka tallennetaan sellaisenaan muuttujiin. Pythonissakin perustyyppiset oliot (kuten vaikkapa luvut, totuusarvot tai merkkijonot) ovat kuitenkin muuttumattomia eli "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"mutatoitumattomia"}]},{"type":"text","value":". Ohjelmoijan kannalta niiden käyttö ei siis käytännössä eroa perustyyppisistä arvoista."}]}]},{"type":"element","tagName":"h2","properties":{"id":"oliot-ja-metodit","style":"position:relative;"},"children":[{"type":"text","value":"Oliot ja metodit"},{"type":"element","tagName":"a","properties":{"href":"#oliot-ja-metodit","ariaLabel":"oliot ja metodit permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olioiden tietosisältöä voidaaan havainnoida ja muuttaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"metodien"}]},{"type":"text","value":" avulla. Metodi on funktio, jonka toiminta kohdistuu annettuun olioon. Metodin erottaa muista funktioista tapa, jolla sitä kutsutaan: ensin kirjoitetaan kohdeolio ja sen perään kutsuttava metodi pisteellä erotettuna. Esimerkiksi sanakirja-olion kaikki arvot voidaan palauttaa metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"values"}]},{"type":"text","value":" avulla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muodostetaan sanakirjatyyppinen kirjaolio"}]},{"type":"text","value":"\nkirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vanhus ja Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kirjailija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ernest Pythonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vuosi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1952"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan kaikki arvot"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodikutsu values() kirjoitetaan muuttujan perään"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# pisteellä erotettuna"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" arvo "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"values"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vanhus ja Python\nErnest Pythonen\n1952"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Samalla tavalla merkkijonometodit kohdistuvat siihen merkkijonoon, jonka kautta niitä kutsutaan. Esimerkiksi merkkijonon metodeja ovat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"count"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"find"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Keijo Keksitty\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan K-kirjaimien määrä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"count"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"K\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# K-kirjaimien määrä toisessa jonossa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Karkkilan Kolisevat Karjut\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"count"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"K\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Osajonon Keksitty indeksi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"find"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Keksitty\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tästä merkkijonosta osajonoa ei löydy"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ihan eri jono\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"find"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Keksitty\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2\n3\n6\n-1"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Merkkijonometodit palauttavat arvoja, mutta niiden avulla ei voida muuttaa merkkijonoa. Kuitenkin esimerkiksi lista-olion metodien avulla voidaan muuttaa listan sisältöä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Lisätään pari alkiota"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Poistetaan alkio alusta"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pop"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1, 2, 3, 5, 1]\n[2, 3, 5, 1]"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Pienin keskiarvo","tmcname":"osa08-01_pienin_keskiarvo"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pienin_keskiarvo(henkilo1: dict, henkilo2: dict, henkilo3: dict)"}]},{"type":"text","value":", joka saa parametrikseen kolme sanakirjaoliota."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jokaisessa sanakirjaoliossa on alkiot, joihin viittaavat nämä avaimet:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"text","value":": kilpailijan nimi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"tulos1\""}]},{"type":"text","value":": kilpailijan ensimmäinen tulos (kokonaisluku väliltä 1...10)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"tulos2\""}]},{"type":"text","value":": kilpailijan toinen tulos (kuten yllä)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"tulos3\""}]},{"type":"text","value":": kilpailijan kolmas tulos (kuten yllä)"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio laskee kaikkien kilpailijoiden tulosten keskiarvot ja palauttaa sen kilpailijan, jonka keskiarvo on pienin. Funktion palautusarvona on sanakirjaolio."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa, että vain yhdellä henkilöllä on pienin keskiarvo."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"henkilo1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Keijo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tulos1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tulos2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tulos3\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\nhenkilo2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Reijo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tulos1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tulos2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tulos3\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\nhenkilo3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nimi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Veijo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tulos1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tulos2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tulos3\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pienin_keskiarvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"henkilo1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" henkilo2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" henkilo3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"{'nimi': 'Veijo', 'tulos1': 3, 'tulos2': 1, 'tulos3': 1}"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Rivien summat","tmcname":"osa08-02_rivien_summmat "},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Listan alkioiden arvot ovat viittauksia olioihin. Tämä pätee myös silloin, kun mallinnetaan matriisia: jokainen päälistan alkion arvo on viittaus toiseen listaan (jonka alkiot taas ovat viittauksia arvoihin)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rivien_summat(matriisi: list)"}]},{"type":"text","value":", joka saa parametrikseen kokonaislukuja sisältävän matriisin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio lisää jokaiselle matriisin riville uuden alkion, jonka arvo on rivin alkioiden summa. Funktio ei palauta mitään, vaan muokkaa parametrinaan saamaansa matriisia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"matriisi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nrivien_summat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matriisi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[[1, 2, 3], [3, 4, 7]]"}]}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, mitä tarkoitetaan oliolla
  • \n
  • Ymmärrät, mitä tarkoitetaan olioiden itsenäisyydellä
  • \n
  • Osaat muodostaa ja käsitellä olioita
  • \n

Tämä on Ohjelmoinnin jatkokurssin ensimmäinen osa, ja kurssilla käytetään VS Codea samaan tapaan kuin Ohjelmoinnin perusteissa. Jos et ole käyttänyt ennen VS Codea, löydät tästä ohjeet ympäristön asentamiseen.

Jatkokurssi ja peruskurssi ovat TMC:ssä yhtenä kurssina. Jos lopetit juuri peruskurssin tekemisen, jatkokurssin tehtävät löytyvät samasta kurssista. Tämän jatkokurssin ensimmäisen osan numero on Osa 8. Mikäli et ole tehnyt tähän jatkokurssin liittyvää peruskurssia, valitse TMC-pluginissa organisaatioksi MOOC ja kurssiksi Ohjelmoinnin MOOC 2023 ja aloita kurssin tekeminen osasta 8.

Kuten kurssin ensimmäisen puolikkaan aikana huomattiin, on usein hyödyllistä yhdistää samaan asiaan liittyvät tiedot yhdeksi kokonaisuudeksi. Esimerkiksi kirjaa on kätevä mallintaa vaikkapa tuplen tai sanakirjan avulla, kun kaikki kirjaan liittyvät tiedot voidaan tallentaa samaan rakenteeseen.

Tuplea käyttämällä esimerkki voisi näyttää tältä:

nimi = \"Nuoruuteni näppäilyt\"\nkirjailija = \"Pekka Python\"\nvuosi = 1992\n\n# Yhdistetään yhdeksi tupleksi\nkirja = (nimi, kirjailija, vuosi)\n\n# Tulostetaan kirjan nimi\nprint(kirja[0])

Sanakirjassa on tässä yhteydessä se etu, että avaimina voidaan käyttää merkkijonoja kokonaislukujen sijasta. Näin ollen alkioille voidaan antaa niiden sisältöä kuvaavat nimet:

nimi = \"Nuoruuteni näppäilyt\"\nkirjailija = \"Pekka Python\"\nvuosi = 1992\n\n# Yhdistetään yhdeksi sanakirjaksi\nkirja = {\"nimi\": nimi, \"kirjailija\": kirjailija, \"vuosi\": vuosi}\n\n# Tulostetaan kirjan nimi\nprint(kirja[\"nimi\"])

Molemmissa tapauksissa tietojen tallentaminen tietorakenteeseen muodostaa olion. Olio on itsenäinen kokonaisuus, joka sisältää (tässä tapauksessa) toisiinsa liittyvää tietoa. Itsenäisyys tarkoittaa sitä, että olioon tehdyt muutokset eivät vaikuta muihin olioihin.

Jos esimerkiksi muodostetaan sanakirjaa käyttäen kaksi kirjaoliota, ensimmäiseen kirjaan tehdyt muutokset eivät vaikuta toiseen kirjaan:

kirja1 = {\"nimi\": \"Vanhus ja Python\", \"kirjailija\": \"Ernest Pythonen\", \"vuosi\": 1952}\nkirja2 = {\"nimi\": \"Seitsemän Pythonia\", \"kirjailija\": \"Aleksis Python\", \"vuosi\": 1894}\n\nprint(kirja1[\"nimi\"])\nprint(kirja2[\"nimi\"])\n\nkirja1[\"nimi\"] = \"Jäähyväiset aaseille\"\n\nprint(kirja1[\"nimi\"])\nprint(kirja2[\"nimi\"])

Vanhus ja Python\nSeitsemän Pythonia\nJäähyväiset aaseille\nSeitsemän Pythonia

\n \n \n \n \n \n \"8\n \n \n

Kuten kurssin ensimmäisen puolikkaan aikana kerrottiin, Pythonissa kaikki arvot ovat itse asiassa olioita. Tämä tarkoittaa, että muuttujan arvo on viittaus olioon, ja varsinainen tieto on tallennettu olioon. Kun esimerkiksi alustetaan muuttuja a = 3, ei muuttujan a arvo ole 3 vaan viittaus olioon, jonka sisältö on arvo 3.

Useimmissa muissa ohjelmointikielissä on olioiden lisäksi ns. perustyyppisiä arvoja (esimerkiksi kokonais- ja liukuluvut sekä totuusarvot), jotka tallennetaan sellaisenaan muuttujiin. Pythonissakin perustyyppiset oliot (kuten vaikkapa luvut, totuusarvot tai merkkijonot) ovat kuitenkin muuttumattomia eli mutatoitumattomia. Ohjelmoijan kannalta niiden käyttö ei siis käytännössä eroa perustyyppisistä arvoista.

Oliot ja metodit

Olioiden tietosisältöä voidaaan havainnoida ja muuttaa metodien avulla. Metodi on funktio, jonka toiminta kohdistuu annettuun olioon. Metodin erottaa muista funktioista tapa, jolla sitä kutsutaan: ensin kirjoitetaan kohdeolio ja sen perään kutsuttava metodi pisteellä erotettuna. Esimerkiksi sanakirja-olion kaikki arvot voidaan palauttaa metodin values avulla:

# muodostetaan sanakirjatyyppinen kirjaolio\nkirja = {\"nimi\": \"Vanhus ja Python\", \"kirjailija\": \"Ernest Pythonen\", \"vuosi\": 1952}\n\n# Tulostetaan kaikki arvot\n# Metodikutsu values() kirjoitetaan muuttujan perään\n# pisteellä erotettuna\nfor arvo in kirja.values():\n    print(arvo)

Vanhus ja Python\nErnest Pythonen\n1952

Samalla tavalla merkkijonometodit kohdistuvat siihen merkkijonoon, jonka kautta niitä kutsutaan. Esimerkiksi merkkijonon metodeja ovat count ja find:

nimi = \"Keijo Keksitty\"\n\n# Tulostetaan K-kirjaimien määrä\nprint(nimi.count(\"K\"))\n\n# K-kirjaimien määrä toisessa jonossa\nprint(\"Karkkilan Kolisevat Karjut\".count(\"K\"))\n\n# Osajonon Keksitty indeksi\nprint(nimi.find(\"Keksitty\"))\n\n# Tästä merkkijonosta osajonoa ei löydy\nprint(\"Ihan eri jono\".find(\"Keksitty\"))

2\n3\n6\n-1

Merkkijonometodit palauttavat arvoja, mutta niiden avulla ei voida muuttaa merkkijonoa. Kuitenkin esimerkiksi lista-olion metodien avulla voidaan muuttaa listan sisältöä:

lista = [1,2,3]\n\n# Lisätään pari alkiota\nlista.append(5)\nlista.append(1)\n\nprint(lista)\n\n# Poistetaan alkio alusta\nlista.pop(0)\n\nprint(lista)

[1, 2, 3, 5, 1]\n[2, 3, 5, 1]

Tee funktio pienin_keskiarvo(henkilo1: dict, henkilo2: dict, henkilo3: dict), joka saa parametrikseen kolme sanakirjaoliota.

Jokaisessa sanakirjaoliossa on alkiot, joihin viittaavat nämä avaimet:

    \n
  • \"nimi\": kilpailijan nimi
  • \n
  • \"tulos1\": kilpailijan ensimmäinen tulos (kokonaisluku väliltä 1...10)
  • \n
  • \"tulos2\": kilpailijan toinen tulos (kuten yllä)
  • \n
  • \"tulos3\": kilpailijan kolmas tulos (kuten yllä)
  • \n

Funktio laskee kaikkien kilpailijoiden tulosten keskiarvot ja palauttaa sen kilpailijan, jonka keskiarvo on pienin. Funktion palautusarvona on sanakirjaolio.

Voit olettaa, että vain yhdellä henkilöllä on pienin keskiarvo.

Esimerkki funktion kutsumisesta:

henkilo1 = {\"nimi\": \"Keijo\", \"tulos1\": 2, \"tulos2\": 3, \"tulos3\": 3}\nhenkilo2 = {\"nimi\": \"Reijo\", \"tulos1\": 5, \"tulos2\": 1, \"tulos3\": 8}\nhenkilo3 = {\"nimi\": \"Veijo\", \"tulos1\": 3, \"tulos2\": 1, \"tulos3\": 1}\n\nprint(pienin_keskiarvo(henkilo1, henkilo2, henkilo3))

{'nimi': 'Veijo', 'tulos1': 3, 'tulos2': 1, 'tulos3': 1}

Listan alkioiden arvot ovat viittauksia olioihin. Tämä pätee myös silloin, kun mallinnetaan matriisia: jokainen päälistan alkion arvo on viittaus toiseen listaan (jonka alkiot taas ovat viittauksia arvoihin).

Tee funktio rivien_summat(matriisi: list), joka saa parametrikseen kokonaislukuja sisältävän matriisin.

Funktio lisää jokaiselle matriisin riville uuden alkion, jonka arvo on rivin alkioiden summa. Funktio ei palauta mitään, vaan muokkaa parametrinaan saamaansa matriisia.

Esimerkki funktion kutsumisesta:

matriisi = [[1, 2], [3, 4]]\nrivien_summat(matriisi)\nprint(matriisi)

[[1, 2, 3], [3, 4, 7]]

","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-8/1-oliot-ja-metodit.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-8/2-luokat-ja-oliot/page-data.json b/page-data/osa-8/2-luokat-ja-oliot/page-data.json index 13774075c..e866e186e 100644 --- a/page-data/osa-8/2-luokat-ja-oliot/page-data.json +++ b/page-data/osa-8/2-luokat-ja-oliot/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-8/2-luokat-ja-oliot", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä tarkoitetaan luokalla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ymmärrät luokan ja olion yhteyden"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä olio-ohjelmointi tarkoittaa"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellisessä osassa käsitellyt esimerkkioliot – listat, tuplet, sanakirjat ja merkkijonot – ovat siinä mielessä erikoistapauksia, että niiden kaikkien muodostamiseen on Pythonissa sisäänrakennettuna oma syntaksinsa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Lista luodaan antamalla arvot hakasuluissa"}]},{"type":"text","value":"\nlista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Merkkijonovakio tunnistetaan lainausmerkeistä"}]},{"type":"text","value":"\nmjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi kaikki!\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Sanakirja luodaan aaltosulkeilla"}]},{"type":"text","value":"\nsanakirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"yksi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kaksi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tuplessa arvot ovat sulkeissa"}]},{"type":"text","value":"\noma_tuple "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muita olioita muodostettaessa kutsutaan erityistä metodia, joka luo olion. Tällaista metodia kutsutaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"konstruktoriksi"}]},{"type":"text","value":". Tarkastellaan esimerkkinä murtolukuolioiden muodostamista Fraction-luokasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tuodaan käyttöön luokka Fraction modulista fractions"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" fractions "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" Fraction\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luodaan pari uutta murtolukuoliota"}]},{"type":"text","value":"\npuolikas "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Fraction"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkolmasosa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Fraction"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkolmas "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Fraction"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"puolikas"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kolmasosa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kolmas"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Murtoluvuilla voi myös laskea"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"puolikas "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" kolmasosa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1/2\n1/3\n3/11\n5/6"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkistä huomataan, että konstuktorikutsut poikkeavat aiemmista metodikutsuista. Konstruktorikutsuja ei ole sidottu tiettyyn olioon (mikä on sikäli loogista, että olio muodostetaan kutsumalla konstruktoria). Lisäksi metodin nimi on kirjoitettu isolla alkukirjaimella: "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"puolikas = Fraction(1,2)"}]},{"type":"text","value":". Pureudutaan tarkemmin olion muodostamisen mekanismiin esittelemällä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"luokan"}]},{"type":"text","value":" käsite."}]},{"type":"element","tagName":"h2","properties":{"id":"luokka-on-olion-kasikirjoitus","style":"position:relative;"},"children":[{"type":"text","value":"Luokka on olion käsikirjoitus"},{"type":"element","tagName":"a","properties":{"href":"#luokka-on-olion-kasikirjoitus","ariaLabel":"luokka on olion kasikirjoitus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Materiaalissa on jo aiemmin vilahtanut käsite "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"luokka"}]},{"type":"text","value":". Edellisessä esimerkissä otettiin käyttöön luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Fraction"}]},{"type":"text","value":" moduulista "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"fractions"}]},{"type":"text","value":". Uudet oliot muodostettiin kutsumalla luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Fraction"}]},{"type":"text","value":" "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"konstruktoria"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokassa määritellään siitä muodostettavien olioiden rakenne ja toiminnallisuus. Luokkaa nimitetään tästä syystä joskus olion käsikirjoitukseksi. Luokassa siis kerrotaan, millaista tietoa olio sisältää, ja määritellään metodit, joiden avulla oliota voidaan käsitellä. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Olio-ohjelmoinnilla"}]},{"type":"text","value":" tarkoitetaan ohjelmointitapaa, jossa ohjelman toiminnallisuus tapahtuu luokkien ja niistä muodostettujen olioiden avulla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yhdestä luokasta voidaan muodostaa useita olioita. Niin kuin aiemmin kerrottiin, oliot ovat itsenäisiä - muutokset olioon eivät vaikuta muihin luokasta muodostettuihin olioihin. Jokaisella oliolla on oma tietosisältönsä. Vähän yksinkertaistaen voisi sanoa, että"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"luokassa määritellään muuttujat ja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"oliota muodostaessa niille annetaan arvot."}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luodaan esimerkkinä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Fraction"}]},{"type":"text","value":"-luokasta olio ja tulostetaan sen osoittaja ja nimittäjä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" fractions "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" Fraction\n\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Fraction"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan osoittaja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"numerator"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ...ja sitten nimittäjä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"denominator"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2\n5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Fraction"}]},{"type":"text","value":" on siis määritelty, että olioilla on muuttujat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"numerator"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"denominator"}]},{"type":"text","value":". Jokaisella oliolla on kuitenkin oma arvonsa näille muuttujille."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Samalla tavalla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"date"}]},{"type":"text","value":"-luokasta muodostetuilla olioilla on kaikilla omat itsenäiset arvonsa vuodelle, kuukaudelle ja päivämäärälle:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" date\n\njoulu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\njuhannus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan kuukaudet molemmista"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"joulu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"month"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"juhannus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"month"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"12\n6"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"date"}]},{"type":"text","value":" on siis määritelty, että luokasta muodostettavilla olioilla on muuttujat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"year"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"month"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"day"}]},{"type":"text","value":". Kun luokasta muodostetaan olio, annetaan muuttujille arvot. Joka oliolla on omat arvonsa muuttujille."}]},{"type":"element","tagName":"h2","properties":{"id":"olioita-kasittelevat-funktiot","style":"position:relative;"},"children":[{"type":"text","value":"Olioita käsittelevät funktiot"},{"type":"element","tagName":"a","properties":{"href":"#olioita-kasittelevat-funktiot","ariaLabel":"olioita kasittelevat funktiot permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktioiden parametrina oleviin olioihin ei liity oikeastaan mitään sen kummempaa. Niitä on jo kurssin aiemmissa osissa nähty runsaasti. Seuraavassa on esimerkki funktiosta, joka tarkastaa, onko sen parametrina oleva "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"date"}]},{"type":"text","value":"-olio viikonloppu:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"onko_viikonloppu"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n viikonpaiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"isoweekday"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" viikonpaiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"or"}]},{"type":"text","value":" viikonpaiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio siis käyttää parametrina olevan olion metodia "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/datetime.html#datetime.date.isoweekday","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"isoweekday"}]},{"type":"text","value":", joka palauttaa viikonpäivää vastaavan numeron niin, että maanantai on 1, tiistai on 2, jne."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiota käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"joulu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\njuhannus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"onko_viikonloppu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"joulu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"onko_viikonloppu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"juhannus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"False\nTrue"}]}]},{"type":"element","tagName":"h2","properties":{"id":"metodi-vs-olion-muuttuja","style":"position:relative;"},"children":[{"type":"text","value":"Metodi vs. olion muuttuja"},{"type":"element","tagName":"a","properties":{"href":"#metodi-vs-olion-muuttuja","ariaLabel":"metodi vs olion muuttuja permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos tarkastellaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"date"}]},{"type":"text","value":"-oliota, niin huomataan, että sen käsittely poikkeaa hieman riippuen siitä, mitä asiaa olion sisällöstä tarkastellaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"paiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kutsutaan metodia"}]},{"type":"text","value":"\nviikonpaiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"isoweekday"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# viitataan olion muuttujaan"}]},{"type":"text","value":"\nkuukausi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"month\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Viikonpäivä:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" viikonpaiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kuukausi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kuukausi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Viikonpäivä: 4\nKuukausi: 12"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Päiväolion viikonpäivä saadaan siis selville kutsumalla "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"metodia"}]},{"type":"text","value":" isoweekday:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"viikonpaiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"isoweekday"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska on kyse metodikutsusta, niin metodin nimen perään laitetaan sulut. Jos sulut unohtuvat, on lopputulos outo:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"viikonpaiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"isoweekday\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Viikonpäivä:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" viikonpaiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Viikonpäivä: "}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Päiväolioon liittyvä kuukausi taas on olion muuttuja, ja sen arvo selviää "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"viittaamalla"}]},{"type":"text","value":" muuttujaan"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kuukausi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"month"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt siis käytössä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei ole sulkuja"}]},{"type":"text","value":". Jos tässä tilanteessa yritettäisiin käyttää sulkuja, ohjelma aiheuttaisi virheen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kuukausi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"month"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"text","value":"Traceback (most recent call last):\nFile \""},{"type":"element","tagName":"stdin","properties":{},"children":[{"type":"text","value":"\", line 1, in "},{"type":"element","tagName":"module","properties":{},"children":[{"type":"text","value":"\nTypeError: 'int' object is not callable"}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Vuodet listaan","tmcname":"osa08-03_vuodet_listaan"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vuodet_listaan(paivamaarat: list)"}]},{"type":"text","value":", joka saa parametrikseen listan, joka sisältää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"date"}]},{"type":"text","value":"-tyyppisiä olioita. Funktio palauttaa uuden listan, jossa on päivämäärien "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"vuodet suuruusjärjestyksessä pienimmästä suurimpaan"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"paiva1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2019"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npaiva2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2006"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npaiva3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1993"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nvuodet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" vuodet_listaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"paiva1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" paiva2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" paiva3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vuodet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1993, 2006, 2019]"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kauppalista","tmcname":"osa08-04_kauppalista"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on määritelty valmiiksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kauppalista"}]},{"type":"text","value":"-luokka, jolla voidaan mallintaa yhtä kauppalistaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos kauppalistaolio on tallennettu esimerkiksi muuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kauppalista"}]},{"type":"text","value":", sitä voidaan käsitellä seuraavan esimerkin mukaisesti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tuotteita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2\nBanaanit\n4\nMaito\n1"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Myös seuraava onnistuu:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kauppalistalla tuotteet on indeksöity ykkösestä alkaen"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tuotteita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tuote "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n maara "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":": "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" kpl\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"banaanit 4 kpl\nmaito 1 kpl"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kauppalistat siis käyttäytyvät hieman listojen tavoin, mutta niitä käsitellään kuitenkin kauppalistan tarjoamien metodien kautta. Toisin kuin listoissa, kauppalistan tuotteet on numeroitu ykkösestä alkaen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee esimerkkejä hyödyntäen funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tuotteita_yhteensa(lista: Kauppalista)"}]},{"type":"text","value":", joka saa parametrikseen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kauppalista"}]},{"type":"text","value":"-tyyppisen olion. Funktio laskee listalla yhteensä olevien tuotteiden määrän ja palauttaa sen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että kauppalistalla tuotteet indeksoidaan ykkösestä alkaen, ei nollasta. Voit testata ohjelmaasi esim. tällä esimerkkikoodilla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaanit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"omenat\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ananas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuotteita_yhteensa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"16"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom"}]},{"type":"text","value":" koska luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kauppalista"}]},{"type":"text","value":" koodi on tehtäväpohjassa valmiina, ei koodissa tarvitse käyttää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":"-lausetta kuten edellisissä esimerkeissä, tehtävissä, jotka käyttävät Pythonin valmiita luokkia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Fraction"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"date"}]},{"type":"text","value":"."}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, mitä tarkoitetaan luokalla
  • \n
  • Ymmärrät luokan ja olion yhteyden
  • \n
  • Tiedät, mitä olio-ohjelmointi tarkoittaa
  • \n

Edellisessä osassa käsitellyt esimerkkioliot – listat, tuplet, sanakirjat ja merkkijonot – ovat siinä mielessä erikoistapauksia, että niiden kaikkien muodostamiseen on Pythonissa sisäänrakennettuna oma syntaksinsa:

# Lista luodaan antamalla arvot hakasuluissa\nlista = [1,2,3]\n\n# Merkkijonovakio tunnistetaan lainausmerkeistä\nmjono = \"Moi kaikki!\"\n\n# Sanakirja luodaan aaltosulkeilla\nsanakirja = {\"yksi\": 1, \"kaksi:\": 2}\n\n# Tuplessa arvot ovat sulkeissa\noma_tuple = (1,2,3)

Muita olioita muodostettaessa kutsutaan erityistä metodia, joka luo olion. Tällaista metodia kutsutaan konstruktoriksi. Tarkastellaan esimerkkinä murtolukuolioiden muodostamista Fraction-luokasta:

# Tuodaan käyttöön luokka Fraction modulista fractions\nfrom fractions import Fraction\n\n# Luodaan pari uutta murtolukuoliota\npuolikas = Fraction(1,2)\n\nkolmasosa = Fraction(1,3)\n\nkolmas = Fraction(3,11)\n\n# Tulostetaan\nprint(puolikas)\nprint(kolmasosa)\nprint(kolmas)\n\n# Murtoluvuilla voi myös laskea\nprint(puolikas + kolmasosa)

1/2\n1/3\n3/11\n5/6

Esimerkistä huomataan, että konstuktorikutsut poikkeavat aiemmista metodikutsuista. Konstruktorikutsuja ei ole sidottu tiettyyn olioon (mikä on sikäli loogista, että olio muodostetaan kutsumalla konstruktoria). Lisäksi metodin nimi on kirjoitettu isolla alkukirjaimella: puolikas = Fraction(1,2). Pureudutaan tarkemmin olion muodostamisen mekanismiin esittelemällä luokan käsite.

Luokka on olion käsikirjoitus

Materiaalissa on jo aiemmin vilahtanut käsite luokka. Edellisessä esimerkissä otettiin käyttöön luokka Fraction moduulista fractions. Uudet oliot muodostettiin kutsumalla luokan Fraction konstruktoria.

Luokassa määritellään siitä muodostettavien olioiden rakenne ja toiminnallisuus. Luokkaa nimitetään tästä syystä joskus olion käsikirjoitukseksi. Luokassa siis kerrotaan, millaista tietoa olio sisältää, ja määritellään metodit, joiden avulla oliota voidaan käsitellä. Olio-ohjelmoinnilla tarkoitetaan ohjelmointitapaa, jossa ohjelman toiminnallisuus tapahtuu luokkien ja niistä muodostettujen olioiden avulla.

Yhdestä luokasta voidaan muodostaa useita olioita. Niin kuin aiemmin kerrottiin, oliot ovat itsenäisiä - muutokset olioon eivät vaikuta muihin luokasta muodostettuihin olioihin. Jokaisella oliolla on oma tietosisältönsä. Vähän yksinkertaistaen voisi sanoa, että

    \n
  • luokassa määritellään muuttujat ja
  • \n
  • oliota muodostaessa niille annetaan arvot.
  • \n

Luodaan esimerkkinä Fraction-luokasta olio ja tulostetaan sen osoittaja ja nimittäjä:

from fractions import Fraction\n\nluku = Fraction(2,5)\n\n# Tulostetaan osoittaja\nprint(luku.numerator)\n\n# ...ja sitten nimittäjä\nprint(luku.denominator)

2\n5

Luokassa Fraction on siis määritelty, että olioilla on muuttujat numerator ja denominator. Jokaisella oliolla on kuitenkin oma arvonsa näille muuttujille.

Samalla tavalla date-luokasta muodostetuilla olioilla on kaikilla omat itsenäiset arvonsa vuodelle, kuukaudelle ja päivämäärälle:

from datetime import date\n\njoulu = date(2020, 12, 24)\njuhannus = date(2020, 6, 20)\n\n# Tulostetaan kuukaudet molemmista\nprint(joulu.month)\nprint(juhannus.month)

12\n6

Luokassa date on siis määritelty, että luokasta muodostettavilla olioilla on muuttujat year, month ja day. Kun luokasta muodostetaan olio, annetaan muuttujille arvot. Joka oliolla on omat arvonsa muuttujille.

Olioita käsittelevät funktiot

Funktioiden parametrina oleviin olioihin ei liity oikeastaan mitään sen kummempaa. Niitä on jo kurssin aiemmissa osissa nähty runsaasti. Seuraavassa on esimerkki funktiosta, joka tarkastaa, onko sen parametrina oleva date-olio viikonloppu:

def onko_viikonloppu(paiva: date):\n    viikonpaiva = paiva.isoweekday()\n    return viikonpaiva == 6 or viikonpaiva == 7

Funktio siis käyttää parametrina olevan olion metodia isoweekday, joka palauttaa viikonpäivää vastaavan numeron niin, että maanantai on 1, tiistai on 2, jne.

Funktiota käytetään seuraavasti:

joulu = date(2020, 12, 24)\njuhannus = date(2020, 6, 20)\n\nprint(onko_viikonloppu(joulu))\nprint(onko_viikonloppu(juhannus))

False\nTrue

Metodi vs. olion muuttuja

Jos tarkastellaan date-oliota, niin huomataan, että sen käsittely poikkeaa hieman riippuen siitä, mitä asiaa olion sisällöstä tarkastellaan:

paiva = date(2020, 12, 24)\n\n# kutsutaan metodia\nviikonpaiva = paiva.isoweekday()\n\n# viitataan olion muuttujaan\nkuukausi = paiva.month\n\nprint(\"Viikonpäivä:\", viikonpaiva)\nprint(\"Kuukausi:\", kuukausi)

Viikonpäivä: 4\nKuukausi: 12

Päiväolion viikonpäivä saadaan siis selville kutsumalla metodia isoweekday:

viikonpaiva = paiva.isoweekday()

Koska on kyse metodikutsusta, niin metodin nimen perään laitetaan sulut. Jos sulut unohtuvat, on lopputulos outo:

viikonpaiva =  paiva.isoweekday\nprint(\"Viikonpäivä:\", viikonpaiva)

Viikonpäivä: <built-in method isoweekday of datetime.date object at 0x10ed66450>

Päiväolioon liittyvä kuukausi taas on olion muuttuja, ja sen arvo selviää viittaamalla muuttujaan

kuukausi = paiva.month

Nyt siis käytössä ei ole sulkuja. Jos tässä tilanteessa yritettäisiin käyttää sulkuja, ohjelma aiheuttaisi virheen:

kuukausi = paiva.month()
Traceback (most recent call last):\nFile \"\", line 1, in \nTypeError: 'int' object is not callable

Tee funktio vuodet_listaan(paivamaarat: list), joka saa parametrikseen listan, joka sisältää date-tyyppisiä olioita. Funktio palauttaa uuden listan, jossa on päivämäärien vuodet suuruusjärjestyksessä pienimmästä suurimpaan.

Esimerkki funktion kutsumisesta:

paiva1 = date(2019, 2, 3)\npaiva2 = date(2006, 10, 10)\npaiva3 = date(1993, 5, 9)\n\nvuodet = vuodet_listaan([paiva1, paiva2, paiva3])\nprint(vuodet)

[1993, 2006, 2019]

Tehtäväpohjassa on määritelty valmiiksi Kauppalista-luokka, jolla voidaan mallintaa yhtä kauppalistaa.

Jos kauppalistaolio on tallennettu esimerkiksi muuttujaan kauppalista, sitä voidaan käsitellä seuraavan esimerkin mukaisesti:

\nprint(kauppalista.tuotteita())\nprint(kauppalista.tuote(1))\nprint(kauppalista.maara(1))\nprint(kauppalista.tuote(2))\nprint(kauppalista.maara(2))\n

2\nBanaanit\n4\nMaito\n1

Myös seuraava onnistuu:

# kauppalistalla tuotteet on indeksöity ykkösestä alkaen\nfor i in range(1, kauppalista.tuotteita()+1):\n    tuote = kauppalista.tuote(i)\n    maara = kauppalista.maara(i)\n    print(f\"{tuote}: {maara} kpl\")

banaanit 4 kpl\nmaito 1 kpl

Kauppalistat siis käyttäytyvät hieman listojen tavoin, mutta niitä käsitellään kuitenkin kauppalistan tarjoamien metodien kautta. Toisin kuin listoissa, kauppalistan tuotteet on numeroitu ykkösestä alkaen.

Tee esimerkkejä hyödyntäen funktio tuotteita_yhteensa(lista: Kauppalista), joka saa parametrikseen Kauppalista-tyyppisen olion. Funktio laskee listalla yhteensä olevien tuotteiden määrän ja palauttaa sen.

Huomaa, että kauppalistalla tuotteet indeksoidaan ykkösestä alkaen, ei nollasta. Voit testata ohjelmaasi esim. tällä esimerkkikoodilla:

if __name__ == \"__main__\":\n    lista = Kauppalista()\n    lista.lisaa(\"banaanit\", 10)\n    lista.lisaa(\"omenat\", 5)\n    lista.lisaa(\"ananas\", 1)\n\n    print(tuotteita_yhteensa(lista))

16

Huom koska luokan Kauppalista koodi on tehtäväpohjassa valmiina, ei koodissa tarvitse käyttää import-lausetta kuten edellisissä esimerkeissä, tehtävissä, jotka käyttävät Pythonin valmiita luokkia Fraction ja date.

","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-8/2-luokat-ja-oliot.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä tarkoitetaan luokalla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ymmärrät luokan ja olion yhteyden"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä olio-ohjelmointi tarkoittaa"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellisessä osassa käsitellyt esimerkkioliot – listat, tuplet, sanakirjat ja merkkijonot – ovat siinä mielessä erikoistapauksia, että niiden kaikkien muodostamiseen on Pythonissa sisäänrakennettuna oma syntaksinsa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Lista luodaan antamalla arvot hakasuluissa"}]},{"type":"text","value":"\nlista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Merkkijonovakio tunnistetaan lainausmerkeistä"}]},{"type":"text","value":"\nmjono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Moi kaikki!\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Sanakirja luodaan aaltosulkeilla"}]},{"type":"text","value":"\nsanakirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"yksi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kaksi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tuplessa arvot ovat sulkeissa"}]},{"type":"text","value":"\noma_tuple "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muita olioita muodostettaessa kutsutaan erityistä metodia, joka luo olion. Tällaista metodia kutsutaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"konstruktoriksi"}]},{"type":"text","value":". Tarkastellaan esimerkkinä murtolukuolioiden muodostamista Fraction-luokasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tuodaan käyttöön luokka Fraction modulista fractions"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" fractions "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" Fraction\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luodaan pari uutta murtolukuoliota"}]},{"type":"text","value":"\npuolikas "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Fraction"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkolmasosa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Fraction"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkolmas "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Fraction"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"puolikas"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kolmasosa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kolmas"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Murtoluvuilla voi myös laskea"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"puolikas "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" kolmasosa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1/2\n1/3\n3/11\n5/6"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkistä huomataan, että konstuktorikutsut poikkeavat aiemmista metodikutsuista. Konstruktorikutsuja ei ole sidottu tiettyyn olioon (mikä on sikäli loogista, että olio muodostetaan kutsumalla konstruktoria). Lisäksi metodin nimi on kirjoitettu isolla alkukirjaimella: "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"puolikas = Fraction(1,2)"}]},{"type":"text","value":". Pureudutaan tarkemmin olion muodostamisen mekanismiin esittelemällä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"luokan"}]},{"type":"text","value":" käsite."}]},{"type":"element","tagName":"h2","properties":{"id":"luokka-on-olion-kasikirjoitus","style":"position:relative;"},"children":[{"type":"text","value":"Luokka on olion käsikirjoitus"},{"type":"element","tagName":"a","properties":{"href":"#luokka-on-olion-kasikirjoitus","ariaLabel":"luokka on olion kasikirjoitus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Materiaalissa on jo aiemmin vilahtanut käsite "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"luokka"}]},{"type":"text","value":". Edellisessä esimerkissä otettiin käyttöön luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Fraction"}]},{"type":"text","value":" moduulista "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"fractions"}]},{"type":"text","value":". Uudet oliot muodostettiin kutsumalla luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Fraction"}]},{"type":"text","value":" "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"konstruktoria"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokassa määritellään siitä muodostettavien olioiden rakenne ja toiminnallisuus. Luokkaa nimitetään tästä syystä joskus olion käsikirjoitukseksi. Luokassa siis kerrotaan, millaista tietoa olio sisältää, ja määritellään metodit, joiden avulla oliota voidaan käsitellä. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Olio-ohjelmoinnilla"}]},{"type":"text","value":" tarkoitetaan ohjelmointitapaa, jossa ohjelman toiminnallisuus tapahtuu luokkien ja niistä muodostettujen olioiden avulla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yhdestä luokasta voidaan muodostaa useita olioita. Niin kuin aiemmin kerrottiin, oliot ovat itsenäisiä - muutokset olioon eivät vaikuta muihin luokasta muodostettuihin olioihin. Jokaisella oliolla on oma tietosisältönsä. Vähän yksinkertaistaen voisi sanoa, että"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"luokassa määritellään muuttujat ja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"oliota muodostaessa niille annetaan arvot."}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luodaan esimerkkinä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Fraction"}]},{"type":"text","value":"-luokasta olio ja tulostetaan sen osoittaja ja nimittäjä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" fractions "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" Fraction\n\nluku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Fraction"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan osoittaja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"numerator"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ...ja sitten nimittäjä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"denominator"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2\n5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Fraction"}]},{"type":"text","value":" on siis määritelty, että olioilla on muuttujat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"numerator"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"denominator"}]},{"type":"text","value":". Jokaisella oliolla on kuitenkin oma arvonsa näille muuttujille."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Samalla tavalla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"date"}]},{"type":"text","value":"-luokasta muodostetuilla olioilla on kaikilla omat itsenäiset arvonsa vuodelle, kuukaudelle ja päivämäärälle:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" date\n\njoulu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\njuhannus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan kuukaudet molemmista"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"joulu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"month"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"juhannus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"month"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"12\n6"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"date"}]},{"type":"text","value":" on siis määritelty, että luokasta muodostettavilla olioilla on muuttujat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"year"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"month"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"day"}]},{"type":"text","value":". Kun luokasta muodostetaan olio, annetaan muuttujille arvot. Joka oliolla on omat arvonsa muuttujille."}]},{"type":"element","tagName":"h2","properties":{"id":"olioita-kasittelevat-funktiot","style":"position:relative;"},"children":[{"type":"text","value":"Olioita käsittelevät funktiot"},{"type":"element","tagName":"a","properties":{"href":"#olioita-kasittelevat-funktiot","ariaLabel":"olioita kasittelevat funktiot permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktioiden parametrina oleviin olioihin ei liity oikeastaan mitään sen kummempaa. Niitä on jo kurssin aiemmissa osissa nähty runsaasti. Seuraavassa on esimerkki funktiosta, joka tarkastaa, onko sen parametrina oleva "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"date"}]},{"type":"text","value":"-olio viikonloppu:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"onko_viikonloppu"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n viikonpaiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"isoweekday"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" viikonpaiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"or"}]},{"type":"text","value":" viikonpaiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio siis käyttää parametrina olevan olion metodia "},{"type":"element","tagName":"a","properties":{"href":"https://docs.python.org/3/library/datetime.html#datetime.date.isoweekday","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"isoweekday"}]},{"type":"text","value":", joka palauttaa viikonpäivää vastaavan numeron niin, että maanantai on 1, tiistai on 2, jne."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiota käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"joulu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\njuhannus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"onko_viikonloppu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"joulu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"onko_viikonloppu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"juhannus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"False\nTrue"}]}]},{"type":"element","tagName":"h2","properties":{"id":"metodi-vs-olion-muuttuja","style":"position:relative;"},"children":[{"type":"text","value":"Metodi vs. olion muuttuja"},{"type":"element","tagName":"a","properties":{"href":"#metodi-vs-olion-muuttuja","ariaLabel":"metodi vs olion muuttuja permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos tarkastellaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"date"}]},{"type":"text","value":"-oliota, niin huomataan, että sen käsittely poikkeaa hieman riippuen siitä, mitä asiaa olion sisällöstä tarkastellaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"paiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kutsutaan metodia"}]},{"type":"text","value":"\nviikonpaiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"isoweekday"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# viitataan olion muuttujaan"}]},{"type":"text","value":"\nkuukausi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"month\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Viikonpäivä:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" viikonpaiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kuukausi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kuukausi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Viikonpäivä: 4\nKuukausi: 12"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Päiväolion viikonpäivä saadaan siis selville kutsumalla "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"metodia"}]},{"type":"text","value":" isoweekday:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"viikonpaiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"isoweekday"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska on kyse metodikutsusta, niin metodin nimen perään laitetaan sulut. Jos sulut unohtuvat, on lopputulos outo:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"viikonpaiva "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"isoweekday\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Viikonpäivä:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" viikonpaiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Viikonpäivä: "}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Päiväolioon liittyvä kuukausi taas on olion muuttuja, ja sen arvo selviää "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"viittaamalla"}]},{"type":"text","value":" muuttujaan"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kuukausi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"month"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt siis käytössä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ei ole sulkuja"}]},{"type":"text","value":". Jos tässä tilanteessa yritettäisiin käyttää sulkuja, ohjelma aiheuttaisi virheen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kuukausi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"month"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"text","value":"Traceback (most recent call last):\nFile \""},{"type":"element","tagName":"stdin","properties":{},"children":[{"type":"text","value":"\", line 1, in "},{"type":"element","tagName":"module","properties":{},"children":[{"type":"text","value":"\nTypeError: 'int' object is not callable"}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Vuodet listaan","tmcname":"osa08-03_vuodet_listaan"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vuodet_listaan(paivamaarat: list)"}]},{"type":"text","value":", joka saa parametrikseen listan, joka sisältää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"date"}]},{"type":"text","value":"-tyyppisiä olioita. Funktio palauttaa uuden listan, jossa on päivämäärien "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"vuodet suuruusjärjestyksessä pienimmästä suurimpaan"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"paiva1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2019"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npaiva2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2006"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npaiva3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1993"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nvuodet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" vuodet_listaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"paiva1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" paiva2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" paiva3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vuodet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[1993, 2006, 2019]"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kauppalista","tmcname":"osa08-04_kauppalista"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on määritelty valmiiksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kauppalista"}]},{"type":"text","value":"-luokka, jolla voidaan mallintaa yhtä kauppalistaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos kauppalistaolio on tallennettu esimerkiksi muuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kauppalista"}]},{"type":"text","value":", sitä voidaan käsitellä seuraavan esimerkin mukaisesti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tuotteita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2\nBanaanit\n4\nMaito\n1"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Myös seuraava onnistuu:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kauppalistalla tuotteet on indeksöity ykkösestä alkaen"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tuotteita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tuote "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n maara "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":": "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" kpl\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"banaanit 4 kpl\nmaito 1 kpl"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kauppalistat siis käyttäytyvät hieman listojen tavoin, mutta niitä käsitellään kuitenkin kauppalistan tarjoamien metodien kautta. Toisin kuin listoissa, kauppalistan tuotteet on numeroitu ykkösestä alkaen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee esimerkkejä hyödyntäen funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tuotteita_yhteensa(lista: Kauppalista)"}]},{"type":"text","value":", joka saa parametrikseen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kauppalista"}]},{"type":"text","value":"-tyyppisen olion. Funktio laskee listalla yhteensä olevien tuotteiden määrän ja palauttaa sen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että kauppalistalla tuotteet indeksoidaan ykkösestä alkaen, ei nollasta. Voit testata ohjelmaasi esim. tällä esimerkkikoodilla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"banaanit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"omenat\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ananas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tuotteita_yhteensa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"16"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom"}]},{"type":"text","value":" koska luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kauppalista"}]},{"type":"text","value":" koodi on tehtäväpohjassa valmiina, ei koodissa tarvitse käyttää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":"-lausetta kuten edellisissä esimerkeissä, tehtävissä, jotka käyttävät Pythonin valmiita luokkia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Fraction"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"date"}]},{"type":"text","value":"."}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, mitä tarkoitetaan luokalla
  • \n
  • Ymmärrät luokan ja olion yhteyden
  • \n
  • Tiedät, mitä olio-ohjelmointi tarkoittaa
  • \n

Edellisessä osassa käsitellyt esimerkkioliot – listat, tuplet, sanakirjat ja merkkijonot – ovat siinä mielessä erikoistapauksia, että niiden kaikkien muodostamiseen on Pythonissa sisäänrakennettuna oma syntaksinsa:

# Lista luodaan antamalla arvot hakasuluissa\nlista = [1,2,3]\n\n# Merkkijonovakio tunnistetaan lainausmerkeistä\nmjono = \"Moi kaikki!\"\n\n# Sanakirja luodaan aaltosulkeilla\nsanakirja = {\"yksi\": 1, \"kaksi:\": 2}\n\n# Tuplessa arvot ovat sulkeissa\noma_tuple = (1,2,3)

Muita olioita muodostettaessa kutsutaan erityistä metodia, joka luo olion. Tällaista metodia kutsutaan konstruktoriksi. Tarkastellaan esimerkkinä murtolukuolioiden muodostamista Fraction-luokasta:

# Tuodaan käyttöön luokka Fraction modulista fractions\nfrom fractions import Fraction\n\n# Luodaan pari uutta murtolukuoliota\npuolikas = Fraction(1,2)\n\nkolmasosa = Fraction(1,3)\n\nkolmas = Fraction(3,11)\n\n# Tulostetaan\nprint(puolikas)\nprint(kolmasosa)\nprint(kolmas)\n\n# Murtoluvuilla voi myös laskea\nprint(puolikas + kolmasosa)

1/2\n1/3\n3/11\n5/6

Esimerkistä huomataan, että konstuktorikutsut poikkeavat aiemmista metodikutsuista. Konstruktorikutsuja ei ole sidottu tiettyyn olioon (mikä on sikäli loogista, että olio muodostetaan kutsumalla konstruktoria). Lisäksi metodin nimi on kirjoitettu isolla alkukirjaimella: puolikas = Fraction(1,2). Pureudutaan tarkemmin olion muodostamisen mekanismiin esittelemällä luokan käsite.

Luokka on olion käsikirjoitus

Materiaalissa on jo aiemmin vilahtanut käsite luokka. Edellisessä esimerkissä otettiin käyttöön luokka Fraction moduulista fractions. Uudet oliot muodostettiin kutsumalla luokan Fraction konstruktoria.

Luokassa määritellään siitä muodostettavien olioiden rakenne ja toiminnallisuus. Luokkaa nimitetään tästä syystä joskus olion käsikirjoitukseksi. Luokassa siis kerrotaan, millaista tietoa olio sisältää, ja määritellään metodit, joiden avulla oliota voidaan käsitellä. Olio-ohjelmoinnilla tarkoitetaan ohjelmointitapaa, jossa ohjelman toiminnallisuus tapahtuu luokkien ja niistä muodostettujen olioiden avulla.

Yhdestä luokasta voidaan muodostaa useita olioita. Niin kuin aiemmin kerrottiin, oliot ovat itsenäisiä - muutokset olioon eivät vaikuta muihin luokasta muodostettuihin olioihin. Jokaisella oliolla on oma tietosisältönsä. Vähän yksinkertaistaen voisi sanoa, että

    \n
  • luokassa määritellään muuttujat ja
  • \n
  • oliota muodostaessa niille annetaan arvot.
  • \n

Luodaan esimerkkinä Fraction-luokasta olio ja tulostetaan sen osoittaja ja nimittäjä:

from fractions import Fraction\n\nluku = Fraction(2,5)\n\n# Tulostetaan osoittaja\nprint(luku.numerator)\n\n# ...ja sitten nimittäjä\nprint(luku.denominator)

2\n5

Luokassa Fraction on siis määritelty, että olioilla on muuttujat numerator ja denominator. Jokaisella oliolla on kuitenkin oma arvonsa näille muuttujille.

Samalla tavalla date-luokasta muodostetuilla olioilla on kaikilla omat itsenäiset arvonsa vuodelle, kuukaudelle ja päivämäärälle:

from datetime import date\n\njoulu = date(2020, 12, 24)\njuhannus = date(2020, 6, 20)\n\n# Tulostetaan kuukaudet molemmista\nprint(joulu.month)\nprint(juhannus.month)

12\n6

Luokassa date on siis määritelty, että luokasta muodostettavilla olioilla on muuttujat year, month ja day. Kun luokasta muodostetaan olio, annetaan muuttujille arvot. Joka oliolla on omat arvonsa muuttujille.

Olioita käsittelevät funktiot

Funktioiden parametrina oleviin olioihin ei liity oikeastaan mitään sen kummempaa. Niitä on jo kurssin aiemmissa osissa nähty runsaasti. Seuraavassa on esimerkki funktiosta, joka tarkastaa, onko sen parametrina oleva date-olio viikonloppu:

def onko_viikonloppu(paiva: date):\n    viikonpaiva = paiva.isoweekday()\n    return viikonpaiva == 6 or viikonpaiva == 7

Funktio siis käyttää parametrina olevan olion metodia isoweekday, joka palauttaa viikonpäivää vastaavan numeron niin, että maanantai on 1, tiistai on 2, jne.

Funktiota käytetään seuraavasti:

joulu = date(2020, 12, 24)\njuhannus = date(2020, 6, 20)\n\nprint(onko_viikonloppu(joulu))\nprint(onko_viikonloppu(juhannus))

False\nTrue

Metodi vs. olion muuttuja

Jos tarkastellaan date-oliota, niin huomataan, että sen käsittely poikkeaa hieman riippuen siitä, mitä asiaa olion sisällöstä tarkastellaan:

paiva = date(2020, 12, 24)\n\n# kutsutaan metodia\nviikonpaiva = paiva.isoweekday()\n\n# viitataan olion muuttujaan\nkuukausi = paiva.month\n\nprint(\"Viikonpäivä:\", viikonpaiva)\nprint(\"Kuukausi:\", kuukausi)

Viikonpäivä: 4\nKuukausi: 12

Päiväolion viikonpäivä saadaan siis selville kutsumalla metodia isoweekday:

viikonpaiva = paiva.isoweekday()

Koska on kyse metodikutsusta, niin metodin nimen perään laitetaan sulut. Jos sulut unohtuvat, on lopputulos outo:

viikonpaiva =  paiva.isoweekday\nprint(\"Viikonpäivä:\", viikonpaiva)

Viikonpäivä: <built-in method isoweekday of datetime.date object at 0x10ed66450>

Päiväolioon liittyvä kuukausi taas on olion muuttuja, ja sen arvo selviää viittaamalla muuttujaan

kuukausi = paiva.month

Nyt siis käytössä ei ole sulkuja. Jos tässä tilanteessa yritettäisiin käyttää sulkuja, ohjelma aiheuttaisi virheen:

kuukausi = paiva.month()
Traceback (most recent call last):\nFile \"\", line 1, in \nTypeError: 'int' object is not callable

Tee funktio vuodet_listaan(paivamaarat: list), joka saa parametrikseen listan, joka sisältää date-tyyppisiä olioita. Funktio palauttaa uuden listan, jossa on päivämäärien vuodet suuruusjärjestyksessä pienimmästä suurimpaan.

Esimerkki funktion kutsumisesta:

paiva1 = date(2019, 2, 3)\npaiva2 = date(2006, 10, 10)\npaiva3 = date(1993, 5, 9)\n\nvuodet = vuodet_listaan([paiva1, paiva2, paiva3])\nprint(vuodet)

[1993, 2006, 2019]

Tehtäväpohjassa on määritelty valmiiksi Kauppalista-luokka, jolla voidaan mallintaa yhtä kauppalistaa.

Jos kauppalistaolio on tallennettu esimerkiksi muuttujaan kauppalista, sitä voidaan käsitellä seuraavan esimerkin mukaisesti:

\nprint(kauppalista.tuotteita())\nprint(kauppalista.tuote(1))\nprint(kauppalista.maara(1))\nprint(kauppalista.tuote(2))\nprint(kauppalista.maara(2))\n

2\nBanaanit\n4\nMaito\n1

Myös seuraava onnistuu:

# kauppalistalla tuotteet on indeksöity ykkösestä alkaen\nfor i in range(1, kauppalista.tuotteita()+1):\n    tuote = kauppalista.tuote(i)\n    maara = kauppalista.maara(i)\n    print(f\"{tuote}: {maara} kpl\")

banaanit 4 kpl\nmaito 1 kpl

Kauppalistat siis käyttäytyvät hieman listojen tavoin, mutta niitä käsitellään kuitenkin kauppalistan tarjoamien metodien kautta. Toisin kuin listoissa, kauppalistan tuotteet on numeroitu ykkösestä alkaen.

Tee esimerkkejä hyödyntäen funktio tuotteita_yhteensa(lista: Kauppalista), joka saa parametrikseen Kauppalista-tyyppisen olion. Funktio laskee listalla yhteensä olevien tuotteiden määrän ja palauttaa sen.

Huomaa, että kauppalistalla tuotteet indeksoidaan ykkösestä alkaen, ei nollasta. Voit testata ohjelmaasi esim. tällä esimerkkikoodilla:

if __name__ == \"__main__\":\n    lista = Kauppalista()\n    lista.lisaa(\"banaanit\", 10)\n    lista.lisaa(\"omenat\", 5)\n    lista.lisaa(\"ananas\", 1)\n\n    print(tuotteita_yhteensa(lista))

16

Huom koska luokan Kauppalista koodi on tehtäväpohjassa valmiina, ei koodissa tarvitse käyttää import-lausetta kuten edellisissä esimerkeissä, tehtävissä, jotka käyttävät Pythonin valmiita luokkia Fraction ja date.

","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-8/2-luokat-ja-oliot.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-8/3-omat-luokat/page-data.json b/page-data/osa-8/3-omat-luokat/page-data.json index 119e4971b..af35be06c 100644 --- a/page-data/osa-8/3-omat-luokat/page-data.json +++ b/page-data/osa-8/3-omat-luokat/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-8/3-omat-luokat", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten omia luokkia määritellään"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat muodostaa itse määritellystä luokasta olion"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat kirjoittaa konstruktorin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä tarkoittaa avainsana "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä ovat attribuutit ja miten niitä käytetään"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokka määritellään avainsanan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" avulla. Syntaksi on"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"LuokanNimi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luokan toteutus"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokat nimetään yleensä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"camel case"}]},{"type":"text","value":" -käytännöllä niin, että sanat kirjoitetaan yhteen ja jokainen sana alkaa isolla alkukirjaimella. Esimerkiksi seuraavat ovat tämän käytännön mukaisia luokkien nimiä:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pankkitili"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"OhjelmaApuri"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"KirjastoTietokanta"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"PythonKurssinArvosanat"}]}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yhdellä luokalla pyritään mallintamaan jokin sellainen yksittäinen kokonaisuus, jonka sisältämät tiedot liittyvät kiinteästi yhteen. Monimutkaisemmissa ratkaisuissa luokka voi sisältää toisia luokkia (esimerkiksi luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kurssi"}]},{"type":"text","value":" voisi sisältää luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Osasuoritus"}]},{"type":"text","value":" mukaisia olioita)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkinä yksinkertaista luokkamäärittelyä, josta sisältö vielä puuttuu:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodissa määritellään luokka, jonka nimi on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"text","value":". Luokalle ei ole määritelty varsinaista sisältöä, mutta tästä huolimatta luokasta voidaan muodostaa olio."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan ohjelmaa, jossa luokasta muodostetun olion sisälle on määritelty kaksi muuttujaa, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"saldo"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"omistaja"}]},{"type":"text","value":". Olion muuttujia kutsutaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"attribuuteiksi"}]},{"type":"text","value":". Attribuutista käytetään myös nimitystä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"oliomuuttuja"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun luokasta luodaan olio, voidaan attribuuttien arvoja käsitellä olion kautta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]},{"type":"text","value":"\n\npekan_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"text","value":"\npekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5.0"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"omistaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka Python\n5.0"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Attribuutit ovat käytettävissä ainoastaan sen olion kautta, jossa ne on määritelty. Pankkitili-luokasta muodostetuilla olioilla on jokaisella omat arvonsa attribuuteille. Attribuuttien arvot haetaan olioiden kautta, esimerkiksi näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"155.50"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Viittaa tilin attribuuttiin saldo"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# TÄSTÄ TULEE VIRHE, koska oliomuuttuja ei ole mukana!"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"konstruktorin-lisaaminen","style":"position:relative;"},"children":[{"type":"text","value":"Konstruktorin lisääminen"},{"type":"element","tagName":"a","properties":{"href":"#konstruktorin-lisaaminen","ariaLabel":"konstruktorin lisaaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten edellisestä esimerkistä huomataan, luokasta voi luoda uuden olion kutsumalla konstruktoria, joka on muotoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"LuokanNimi()"}]},{"type":"text","value":". Yleensä olisi kuitenkin kätevä antaa attribuuteille arvot heti kun olio luodaan – nyt esimerkiksi Pankkitilin omistaja ja saldo asetetaan vasta, kun pankkitiliolio on luotu."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Attribuuttien asettamisessa ilman konstruktoria on myös se ongelma, että samasta luokasta luoduilla olioilla voi olla eri attribuutit. Seuraava ohjelmakoodi esimerkiksi antaa virheen, koska oliolle "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pirjon_tili"}]},{"type":"text","value":" ei ole määritelty attribuuttia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"saldo"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]},{"type":"text","value":"\n\npekan_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"text","value":"\npekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1400"}]},{"type":"text","value":"\n\npirjon_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npirjon_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pirjo\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pirjon_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# TÄSTÄ TULEE VIRHE"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sen sijaan että attribuuttien arvot alustettaisiin luokan luomisen jälkeen, on huomattavasti parempi ajatus alustaa arvot samalla, kun luokasta luodaan olio."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Konstruktori kirjoitetaan luokan sisään metodina "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__init__"}]},{"type":"text","value":" yleensä heti luokan alkuun."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"text","value":"-luokkaa, johon on lisätty konstruktori:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Konstruktori"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" omistaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" omistaja"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Konstruktorin nimi on aina "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__init__"}]},{"type":"text","value":". Huomaa, että nimessä sanan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"init"}]},{"type":"text","value":" molemmilla puolilla on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kaksi alaviivaa"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Konstruktorin ensimmäinen parametri on nimeltään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":". Tämä viittaa olioon, jota käsitellään. Asetuslause"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self.saldo = saldo"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"asettaa parametrina annetun saldon luotavan olion saldoksi. On tärkeä huomata, että tässä yhteydessä muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self.saldo"}]},{"type":"text","value":" on eri muuttuja kuin muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"saldo"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self.saldo"}]},{"type":"text","value":" viittaa olion attribuuttiin. Jokaisella Pankkitili-luokan oliolla on oma saldonsa."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"saldo"}]},{"type":"text","value":" on konstruktorimetodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__init__"}]},{"type":"text","value":" parametri, jolle annetaan arvo, kun metodia kutsutaan (eli kun halutaan luoda uusi olio luokasta)."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt kun konstruktorille on määritelty parametrit, voidaan attribuuttien arvot antaa oliota luotaessa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Konstruktori"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" omistaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" omistaja\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Parametrille self ei anneta arvoa, vaan Python antaa sen"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# automaattisesti"}]},{"type":"text","value":"\npekan_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npirjon_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pirjo Pythonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pirjon_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"100\n20000"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkistä huomataan, että olioiden luominen helpottuu, kun arvot voidaan antaa heti oliota muodostaessa. Samalla tämä varmistaa, että arvojen antaminen ei unohdu, ja ohjaa käyttäjää antamaan arvot attribuuteille."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Attribuuttien arvoja voi edelleen muuttaa myöhemmin ohjelmassa, vaikka alkuarvo olisikin annettu konstruktorissa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Konstruktori"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" omistaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" omistaja\n\npekan_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Saldoksi 1500"}]},{"type":"text","value":"\npekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1500"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Lisätään saldoon 2000"}]},{"type":"text","value":"\npekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2000"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"100\n1500\n3500"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan vielä toista esimerkkiä luokasta ja olioista. Kirjoitetaan luokka, joka mallintaa yhtä lottokierrosta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" date\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"LottoKierros"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" viikko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pvm"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"viikko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" viikko\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pvm "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pvm\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"numerot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" numerot\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luodaan uusi lottokierros"}]},{"type":"text","value":"\nkierros1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" LottoKierros"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2021"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"13"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"14"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"33"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan tiedot"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kierros1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"viikko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kierros1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pvm"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" numero "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" kierros1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"numerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1\n2021-01-02\n1\n4\n8\n12\n13\n14\n33"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Attribuutit voivat olla siis minkä tahansa tyyppisiä – esimerkiksi edellisessä esimerkissä jokaiseen olioon tallennetaan lista ja päivämäärä."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kirja","tmcname":"osa08-06_kirja"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kirja"}]},{"type":"text","value":", jolla on attribuutteina muuttujat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kirjoittaja"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"genre"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kirjoitusvuosi"}]},{"type":"text","value":" sekä konstruktori, joka alustaa muuttujat."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkaa käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"python "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Fluent Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luciano Ramalho\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ohjelmointi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2015"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\neverest "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Huipulta huipulle\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Carina Räihä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"elämänkerta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2010"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"python"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjoittaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":": "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"python"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"python"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjoitusvuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Kirjan "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"everest"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" genre on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"everest"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"genre"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luciano Ramalho: Fluent Python (2015)\nKirjan Huipulta huipulle genre on elämänkerta"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kirjoita luokat","tmcname":"osa08-07_kirjoita_luokat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita alla pyydetyt luokat. Jokaisen luokan alle on kuvattu attribuuttien nimet ja tyypit."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita jokaiselle luokalle myös konstruktori, jossa attribuutit annetaan siinä järjestyksessä kuin ne on kuvauksessa annettu."}]},{"type":"element","tagName":"ol","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Luokka Muistilista"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"attribuutti otsikko (merkkijono)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"attribuutti merkinnat (lista)"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"ol","properties":{"start":2},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Luokka Asiakas"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"attribuutti tunniste (merkkijono)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"attribuutti saldo (desimaaliluku)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"attribuutti alennusprosentti (kokonaisluku)"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"ol","properties":{"start":3},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Luokka Kaapeli"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"attribuutti malli (merkkijono)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"attribuutti pituus (desimaaliluku)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"attribuutti maksiminopeus (kokonaisluku)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"attribuutti kaksisuuntainen (totuusarvo)"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"omien-luokkien-olioiden-kaytto","style":"position:relative;"},"children":[{"type":"text","value":"Omien luokkien olioiden käyttö"},{"type":"element","tagName":"a","properties":{"href":"#omien-luokkien-olioiden-kaytto","ariaLabel":"omien luokkien olioiden kaytto permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Omasta luokasta muodostetut oliot käyttäytyvät esimerkiksi funktioiden parametrina ja paluuarvona samalla tavalla kuin muutkin oliot. Voisimme esimerkiksi tehdä pari apufunktiota tilien käsittelyyn:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# funktio luo uuden tiliolion ja palauttaa sen"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"avaa_tili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n uusi_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" uusi_tili\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# funktio asettaa parametrina saamansa rahasumman parametrina olevalle tilille"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"laita_rahaa_tilille"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" summa\n\npekan_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" avaa_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nlaita_rahaa_tilille"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"0\n500"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Muodosta lemmikki","tmcname":"osa08-07b_muodosta_lemmikki"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Määrittele luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lemmikki"}]},{"type":"text","value":". Luokalla on konstruktori, jossa annetaan arvot attribuuteille "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"laji"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"syntymavuosi"}]},{"type":"text","value":" tässä järjestyksessä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita sitten luokan ulkopuolelle funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"uusi_lemmikki(nimi: str, laji: str, syntymavuosi: int)"}]},{"type":"text","value":", joka luo ja palauttaa uuden "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lemmikki"}]},{"type":"text","value":"-tyyppisen (eli "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lemmikki"}]},{"type":"text","value":"-luokkaa vastaavan) olion."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"musti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" uusi_lemmikki"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Musti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koira\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2017"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"musti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"musti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"laji"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"musti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syntymavuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Musti\nkoira\n2017"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Vanhempi kirja","tmcname":"osa08-08_vanhempi_kirja"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vanhempi_kirja(kirja1: Kirja, kirja2: Kirja)"}]},{"type":"text","value":", joka saa parametriksi kaksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kirja"}]},{"type":"text","value":"-oliota. Funktio kertoo, kumpi kirjoista on vanhempi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiota käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"python "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Fluent Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luciano Ramalho\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ohjelmointi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2015"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\neverest "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Huipulta huipulle\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Carina Räihä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"elämänkerta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2010"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnorma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Norma\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sofi Oksanen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"rikos\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2015"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nvanhempi_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"python"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" everest"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nvanhempi_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"python"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" norma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huipulta huipulle on vanhempi, se kirjoitettiin 2010\nFluent Python ja Norma kirjoitettiin 2015"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Genren kirjat","tmcname":"osa08-09_genren_kirjat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"genren_kirjat(kirjat: list, genre: str)"}]},{"type":"text","value":", joka saa parametriksi listan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kirja"}]},{"type":"text","value":"-olioita sekä genren kertovan merkkijonon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"palauttaa"}]},{"type":"text","value":" uuden listan, jolle se laittaa parametrina olevista kirjoista ne, joilla on haluttu genre."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiota käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"python "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Fluent Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luciano Ramalho\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ohjelmointi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2015"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\neverest "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Huipulta huipulle\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Carina Räihä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"elämänkerta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2010"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnorma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Norma\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sofi Oksanen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"rikos\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2015"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkirjat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"python"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" everest"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" norma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lumiukko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jo Nesbø\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"rikos\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2007"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"rikoskirjoja ovat\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" kirja "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" genren_kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"rikos\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjoittaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":": "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"rikoskirjoja ovat\nSofi Oksanen: Norma\nJo Nesbø: Lumiukko"}]}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, miten omia luokkia määritellään
  • \n
  • Osaat muodostaa itse määritellystä luokasta olion
  • \n
  • Osaat kirjoittaa konstruktorin
  • \n
  • Tiedät, mitä tarkoittaa avainsana self
  • \n
  • Tiedät, mitä ovat attribuutit ja miten niitä käytetään
  • \n

Luokka määritellään avainsanan class avulla. Syntaksi on

class LuokanNimi:\n    # Luokan toteutus

Luokat nimetään yleensä camel case -käytännöllä niin, että sanat kirjoitetaan yhteen ja jokainen sana alkaa isolla alkukirjaimella. Esimerkiksi seuraavat ovat tämän käytännön mukaisia luokkien nimiä:

    \n
  • Pankkitili
  • \n
  • OhjelmaApuri
  • \n
  • KirjastoTietokanta
  • \n
  • PythonKurssinArvosanat
  • \n

Yhdellä luokalla pyritään mallintamaan jokin sellainen yksittäinen kokonaisuus, jonka sisältämät tiedot liittyvät kiinteästi yhteen. Monimutkaisemmissa ratkaisuissa luokka voi sisältää toisia luokkia (esimerkiksi luokka Kurssi voisi sisältää luokan Osasuoritus mukaisia olioita).

Tarkastellaan esimerkkinä yksinkertaista luokkamäärittelyä, josta sisältö vielä puuttuu:

class Pankkitili:\n    pass

Koodissa määritellään luokka, jonka nimi on Pankkitili. Luokalle ei ole määritelty varsinaista sisältöä, mutta tästä huolimatta luokasta voidaan muodostaa olio.

Tarkastellaan ohjelmaa, jossa luokasta muodostetun olion sisälle on määritelty kaksi muuttujaa, saldo ja omistaja. Olion muuttujia kutsutaan attribuuteiksi. Attribuutista käytetään myös nimitystä oliomuuttuja.

Kun luokasta luodaan olio, voidaan attribuuttien arvoja käsitellä olion kautta:

class Pankkitili:\n    pass\n\npekan_tili = Pankkitili()\npekan_tili.omistaja = \"Pekka Python\"\npekan_tili.saldo = 5.0\n\nprint(pekan_tili.omistaja)\nprint(pekan_tili.saldo)

Pekka Python\n5.0

Attribuutit ovat käytettävissä ainoastaan sen olion kautta, jossa ne on määritelty. Pankkitili-luokasta muodostetuilla olioilla on jokaisella omat arvonsa attribuuteille. Attribuuttien arvot haetaan olioiden kautta, esimerkiksi näin:

tili = Pankkitili()\ntili.saldo = 155.50\n\nprint(tili.saldo) # Viittaa tilin attribuuttiin saldo\nprint(saldo) # TÄSTÄ TULEE VIRHE, koska oliomuuttuja ei ole mukana!

Konstruktorin lisääminen

Kuten edellisestä esimerkistä huomataan, luokasta voi luoda uuden olion kutsumalla konstruktoria, joka on muotoa LuokanNimi(). Yleensä olisi kuitenkin kätevä antaa attribuuteille arvot heti kun olio luodaan – nyt esimerkiksi Pankkitilin omistaja ja saldo asetetaan vasta, kun pankkitiliolio on luotu.

Attribuuttien asettamisessa ilman konstruktoria on myös se ongelma, että samasta luokasta luoduilla olioilla voi olla eri attribuutit. Seuraava ohjelmakoodi esimerkiksi antaa virheen, koska oliolle pirjon_tili ei ole määritelty attribuuttia saldo:

class Pankkitili:\n    pass\n\npekan_tili = Pankkitili()\npekan_tili.omistaja = \"Pekka\"\npekan_tili.saldo = 1400\n\npirjon_tili = Pankkitili()\npirjon_tili.omistaja = \"Pirjo\"\n\nprint(pekan_tili.saldo)\nprint(pirjon_tili.saldo) # TÄSTÄ TULEE VIRHE

Sen sijaan että attribuuttien arvot alustettaisiin luokan luomisen jälkeen, on huomattavasti parempi ajatus alustaa arvot samalla, kun luokasta luodaan olio.

Konstruktori kirjoitetaan luokan sisään metodina __init__ yleensä heti luokan alkuun.

Tarkastellaan Pankkitili-luokkaa, johon on lisätty konstruktori:

class Pankkitili:\n\n    # Konstruktori\n    def __init__(self, saldo: float, omistaja: str):\n        self.saldo = saldo\n        self.omistaja = omistaja

Konstruktorin nimi on aina __init__. Huomaa, että nimessä sanan init molemmilla puolilla on kaksi alaviivaa.

Konstruktorin ensimmäinen parametri on nimeltään self. Tämä viittaa olioon, jota käsitellään. Asetuslause

self.saldo = saldo

asettaa parametrina annetun saldon luotavan olion saldoksi. On tärkeä huomata, että tässä yhteydessä muuttuja self.saldo on eri muuttuja kuin muuttuja saldo:

    \n
  • \n

    Muuttuja self.saldo viittaa olion attribuuttiin. Jokaisella Pankkitili-luokan oliolla on oma saldonsa.

    \n
  • \n
  • \n

    Muuttuja saldo on konstruktorimetodin __init__ parametri, jolle annetaan arvo, kun metodia kutsutaan (eli kun halutaan luoda uusi olio luokasta).

    \n
  • \n

Nyt kun konstruktorille on määritelty parametrit, voidaan attribuuttien arvot antaa oliota luotaessa:

class Pankkitili:\n\n    # Konstruktori\n    def __init__(self, saldo: float, omistaja: str):\n        self.saldo = saldo\n        self.omistaja = omistaja\n\n# Parametrille self ei anneta arvoa, vaan Python antaa sen\n# automaattisesti\npekan_tili = Pankkitili(100, \"Pekka Python\")\npirjon_tili = Pankkitili(20000, \"Pirjo Pythonen\")\n\nprint(pekan_tili.saldo)\nprint(pirjon_tili.saldo)

100\n20000

Esimerkistä huomataan, että olioiden luominen helpottuu, kun arvot voidaan antaa heti oliota muodostaessa. Samalla tämä varmistaa, että arvojen antaminen ei unohdu, ja ohjaa käyttäjää antamaan arvot attribuuteille.

Attribuuttien arvoja voi edelleen muuttaa myöhemmin ohjelmassa, vaikka alkuarvo olisikin annettu konstruktorissa:

class Pankkitili:\n\n    # Konstruktori\n    def __init__(self, saldo: float, omistaja: str):\n        self.saldo = saldo\n        self.omistaja = omistaja\n\npekan_tili = Pankkitili(100, \"Pekka Python\")\nprint(pekan_tili.saldo)\n\n# Saldoksi 1500\npekan_tili.saldo = 1500\nprint(pekan_tili.saldo)\n\n# Lisätään saldoon 2000\npekan_tili.saldo += 2000\nprint(pekan_tili.saldo)

100\n1500\n3500

Tarkastellaan vielä toista esimerkkiä luokasta ja olioista. Kirjoitetaan luokka, joka mallintaa yhtä lottokierrosta:

from datetime import date\n\nclass LottoKierros:\n\n    def __init__(self, viikko: int, pvm: date, numerot: list):\n        self.viikko = viikko\n        self.pvm = pvm\n        self.numerot = numerot\n\n\n# Luodaan uusi lottokierros\nkierros1 = LottoKierros(1, date(2021, 1, 2), [1,4,8,12,13,14,33])\n\n# Tulostetaan tiedot\nprint(kierros1.viikko)\nprint(kierros1.pvm)\n\nfor numero in kierros1.numerot:\n    print(numero)

1\n2021-01-02\n1\n4\n8\n12\n13\n14\n33

Attribuutit voivat olla siis minkä tahansa tyyppisiä – esimerkiksi edellisessä esimerkissä jokaiseen olioon tallennetaan lista ja päivämäärä.

Tee luokka Kirja, jolla on attribuutteina muuttujat nimi, kirjoittaja, genre ja kirjoitusvuosi sekä konstruktori, joka alustaa muuttujat.

Luokkaa käytetään seuraavasti:

python = Kirja(\"Fluent Python\", \"Luciano Ramalho\", \"ohjelmointi\", 2015)\neverest = Kirja(\"Huipulta huipulle\", \"Carina Räihä\", \"elämänkerta\", 2010)\n\nprint(f\"{python.kirjoittaja}: {python.nimi} ({python.kirjoitusvuosi})\")\nprint(f\"Kirjan {everest.nimi} genre on {everest.genre}\")

Luciano Ramalho: Fluent Python (2015)\nKirjan Huipulta huipulle genre on elämänkerta

Kirjoita alla pyydetyt luokat. Jokaisen luokan alle on kuvattu attribuuttien nimet ja tyypit.

Kirjoita jokaiselle luokalle myös konstruktori, jossa attribuutit annetaan siinä järjestyksessä kuin ne on kuvauksessa annettu.

    \n
  1. Luokka Muistilista
  2. \n
    \n
  • attribuutti otsikko (merkkijono)
  • \n
  • attribuutti merkinnat (lista)
  • \n
    \n
  1. Luokka Asiakas
  2. \n
    \n
  • attribuutti tunniste (merkkijono)
  • \n
  • attribuutti saldo (desimaaliluku)
  • \n
  • attribuutti alennusprosentti (kokonaisluku)
  • \n
    \n
  1. Luokka Kaapeli
  2. \n
    \n
  • attribuutti malli (merkkijono)
  • \n
  • attribuutti pituus (desimaaliluku)
  • \n
  • attribuutti maksiminopeus (kokonaisluku)
  • \n
  • attribuutti kaksisuuntainen (totuusarvo)
  • \n

Omien luokkien olioiden käyttö

Omasta luokasta muodostetut oliot käyttäytyvät esimerkiksi funktioiden parametrina ja paluuarvona samalla tavalla kuin muutkin oliot. Voisimme esimerkiksi tehdä pari apufunktiota tilien käsittelyyn:

# funktio luo uuden tiliolion ja palauttaa sen\ndef avaa_tili(nimi: str):\n    uusi_tili =  Pankkitili(0, nimi)\n    return uusi_tili\n\n# funktio asettaa parametrina saamansa rahasumman parametrina olevalle tilille\ndef laita_rahaa_tilille(tili: Pankkitili, summa: int):\n    tili.saldo += summa\n\npekan_tili = avaa_tili(\"Pekka Python\")\nprint(pekan_tili.saldo)\n\nlaita_rahaa_tilille(pekan_tili, 500)\n\nprint(pekan_tili.saldo)

0\n500

Määrittele luokka Lemmikki. Luokalla on konstruktori, jossa annetaan arvot attribuuteille nimi, laji ja syntymavuosi tässä järjestyksessä.

Kirjoita sitten luokan ulkopuolelle funktio uusi_lemmikki(nimi: str, laji: str, syntymavuosi: int), joka luo ja palauttaa uuden Lemmikki-tyyppisen (eli Lemmikki-luokkaa vastaavan) olion.

Esimerkki funktion kutsumisesta:

musti = uusi_lemmikki(\"Musti\", \"koira\", 2017)\nprint(musti.nimi)\nprint(musti.laji)\nprint(musti.syntymavuosi)

Musti\nkoira\n2017

Tee funktio vanhempi_kirja(kirja1: Kirja, kirja2: Kirja), joka saa parametriksi kaksi Kirja-oliota. Funktio kertoo, kumpi kirjoista on vanhempi.

Funktiota käytetään seuraavasti:

python = Kirja(\"Fluent Python\", \"Luciano Ramalho\", \"ohjelmointi\", 2015)\neverest = Kirja(\"Huipulta huipulle\", \"Carina Räihä\", \"elämänkerta\", 2010)\nnorma = Kirja(\"Norma\", \"Sofi Oksanen\", \"rikos\", 2015)\n\nvanhempi_kirja(python, everest)\nvanhempi_kirja(python, norma)

Huipulta huipulle on vanhempi, se kirjoitettiin 2010\nFluent Python ja Norma kirjoitettiin 2015

Tee funktio genren_kirjat(kirjat: list, genre: str), joka saa parametriksi listan Kirja-olioita sekä genren kertovan merkkijonon.

Funktio palauttaa uuden listan, jolle se laittaa parametrina olevista kirjoista ne, joilla on haluttu genre.

Funktiota käytetään seuraavasti:

python = Kirja(\"Fluent Python\", \"Luciano Ramalho\", \"ohjelmointi\", 2015)\neverest = Kirja(\"Huipulta huipulle\", \"Carina Räihä\", \"elämänkerta\", 2010)\nnorma = Kirja(\"Norma\", \"Sofi Oksanen\", \"rikos\", 2015)\n\nkirjat = [python, everest, norma, Kirja(\"Lumiukko\", \"Jo Nesbø\", \"rikos\", 2007)]\n\nprint(\"rikoskirjoja ovat\")\nfor kirja in genren_kirjat(kirjat, \"rikos\"):\n    print(f\"{kirja.kirjoittaja}: {kirja.nimi}\")

rikoskirjoja ovat\nSofi Oksanen: Norma\nJo Nesbø: Lumiukko

","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-8/3-omat-luokat.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten omia luokkia määritellään"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat muodostaa itse määritellystä luokasta olion"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat kirjoittaa konstruktorin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä tarkoittaa avainsana "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä ovat attribuutit ja miten niitä käytetään"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokka määritellään avainsanan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" avulla. Syntaksi on"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"LuokanNimi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luokan toteutus"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokat nimetään yleensä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"camel case"}]},{"type":"text","value":" -käytännöllä niin, että sanat kirjoitetaan yhteen ja jokainen sana alkaa isolla alkukirjaimella. Esimerkiksi seuraavat ovat tämän käytännön mukaisia luokkien nimiä:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pankkitili"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"OhjelmaApuri"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"KirjastoTietokanta"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"PythonKurssinArvosanat"}]}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yhdellä luokalla pyritään mallintamaan jokin sellainen yksittäinen kokonaisuus, jonka sisältämät tiedot liittyvät kiinteästi yhteen. Monimutkaisemmissa ratkaisuissa luokka voi sisältää toisia luokkia (esimerkiksi luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kurssi"}]},{"type":"text","value":" voisi sisältää luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Osasuoritus"}]},{"type":"text","value":" mukaisia olioita)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkinä yksinkertaista luokkamäärittelyä, josta sisältö vielä puuttuu:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koodissa määritellään luokka, jonka nimi on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"text","value":". Luokalle ei ole määritelty varsinaista sisältöä, mutta tästä huolimatta luokasta voidaan muodostaa olio."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan ohjelmaa, jossa luokasta muodostetun olion sisälle on määritelty kaksi muuttujaa, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"saldo"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"omistaja"}]},{"type":"text","value":". Olion muuttujia kutsutaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"attribuuteiksi"}]},{"type":"text","value":". Attribuutista käytetään myös nimitystä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"oliomuuttuja"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun luokasta luodaan olio, voidaan attribuuttien arvoja käsitellä olion kautta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]},{"type":"text","value":"\n\npekan_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"text","value":"\npekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5.0"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"omistaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka Python\n5.0"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Attribuutit ovat käytettävissä ainoastaan sen olion kautta, jossa ne on määritelty. Pankkitili-luokasta muodostetuilla olioilla on jokaisella omat arvonsa attribuuteille. Attribuuttien arvot haetaan olioiden kautta, esimerkiksi näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"155.50"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Viittaa tilin attribuuttiin saldo"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# TÄSTÄ TULEE VIRHE, koska oliomuuttuja ei ole mukana!"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"konstruktorin-lisaaminen","style":"position:relative;"},"children":[{"type":"text","value":"Konstruktorin lisääminen"},{"type":"element","tagName":"a","properties":{"href":"#konstruktorin-lisaaminen","ariaLabel":"konstruktorin lisaaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten edellisestä esimerkistä huomataan, luokasta voi luoda uuden olion kutsumalla konstruktoria, joka on muotoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"LuokanNimi()"}]},{"type":"text","value":". Yleensä olisi kuitenkin kätevä antaa attribuuteille arvot heti kun olio luodaan – nyt esimerkiksi Pankkitilin omistaja ja saldo asetetaan vasta, kun pankkitiliolio on luotu."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Attribuuttien asettamisessa ilman konstruktoria on myös se ongelma, että samasta luokasta luoduilla olioilla voi olla eri attribuutit. Seuraava ohjelmakoodi esimerkiksi antaa virheen, koska oliolle "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pirjon_tili"}]},{"type":"text","value":" ei ole määritelty attribuuttia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"saldo"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]},{"type":"text","value":"\n\npekan_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"text","value":"\npekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1400"}]},{"type":"text","value":"\n\npirjon_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npirjon_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pirjo\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pirjon_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# TÄSTÄ TULEE VIRHE"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sen sijaan että attribuuttien arvot alustettaisiin luokan luomisen jälkeen, on huomattavasti parempi ajatus alustaa arvot samalla, kun luokasta luodaan olio."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Konstruktori kirjoitetaan luokan sisään metodina "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__init__"}]},{"type":"text","value":" yleensä heti luokan alkuun."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"text","value":"-luokkaa, johon on lisätty konstruktori:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Konstruktori"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" omistaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" omistaja"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Konstruktorin nimi on aina "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__init__"}]},{"type":"text","value":". Huomaa, että nimessä sanan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"init"}]},{"type":"text","value":" molemmilla puolilla on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kaksi alaviivaa"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Konstruktorin ensimmäinen parametri on nimeltään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":". Tämä viittaa olioon, jota käsitellään. Asetuslause"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self.saldo = saldo"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"asettaa parametrina annetun saldon luotavan olion saldoksi. On tärkeä huomata, että tässä yhteydessä muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self.saldo"}]},{"type":"text","value":" on eri muuttuja kuin muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"saldo"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self.saldo"}]},{"type":"text","value":" viittaa olion attribuuttiin. Jokaisella Pankkitili-luokan oliolla on oma saldonsa."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"saldo"}]},{"type":"text","value":" on konstruktorimetodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__init__"}]},{"type":"text","value":" parametri, jolle annetaan arvo, kun metodia kutsutaan (eli kun halutaan luoda uusi olio luokasta)."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt kun konstruktorille on määritelty parametrit, voidaan attribuuttien arvot antaa oliota luotaessa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Konstruktori"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" omistaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" omistaja\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Parametrille self ei anneta arvoa, vaan Python antaa sen"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# automaattisesti"}]},{"type":"text","value":"\npekan_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npirjon_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pirjo Pythonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pirjon_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"100\n20000"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkistä huomataan, että olioiden luominen helpottuu, kun arvot voidaan antaa heti oliota muodostaessa. Samalla tämä varmistaa, että arvojen antaminen ei unohdu, ja ohjaa käyttäjää antamaan arvot attribuuteille."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Attribuuttien arvoja voi edelleen muuttaa myöhemmin ohjelmassa, vaikka alkuarvo olisikin annettu konstruktorissa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Konstruktori"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" omistaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" omistaja\n\npekan_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Saldoksi 1500"}]},{"type":"text","value":"\npekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1500"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Lisätään saldoon 2000"}]},{"type":"text","value":"\npekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2000"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"100\n1500\n3500"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan vielä toista esimerkkiä luokasta ja olioista. Kirjoitetaan luokka, joka mallintaa yhtä lottokierrosta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" date\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"LottoKierros"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" viikko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pvm"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"list"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"viikko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" viikko\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pvm "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pvm\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"numerot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" numerot\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luodaan uusi lottokierros"}]},{"type":"text","value":"\nkierros1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" LottoKierros"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2021"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"13"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"14"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"33"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan tiedot"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kierros1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"viikko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kierros1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pvm"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" numero "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" kierros1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"numerot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1\n2021-01-02\n1\n4\n8\n12\n13\n14\n33"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Attribuutit voivat olla siis minkä tahansa tyyppisiä – esimerkiksi edellisessä esimerkissä jokaiseen olioon tallennetaan lista ja päivämäärä."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kirja","tmcname":"osa08-06_kirja"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kirja"}]},{"type":"text","value":", jolla on attribuutteina muuttujat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kirjoittaja"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"genre"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kirjoitusvuosi"}]},{"type":"text","value":" sekä konstruktori, joka alustaa muuttujat."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkaa käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"python "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Fluent Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luciano Ramalho\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ohjelmointi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2015"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\neverest "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Huipulta huipulle\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Carina Räihä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"elämänkerta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2010"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"python"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjoittaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":": "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"python"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"python"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjoitusvuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Kirjan "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"everest"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" genre on "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"everest"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"genre"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luciano Ramalho: Fluent Python (2015)\nKirjan Huipulta huipulle genre on elämänkerta"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kirjoita luokat","tmcname":"osa08-07_kirjoita_luokat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita alla pyydetyt luokat. Jokaisen luokan alle on kuvattu attribuuttien nimet ja tyypit."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita jokaiselle luokalle myös konstruktori, jossa attribuutit annetaan siinä järjestyksessä kuin ne on kuvauksessa annettu."}]},{"type":"element","tagName":"ol","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Luokka Muistilista"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"attribuutti otsikko (merkkijono)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"attribuutti merkinnat (lista)"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"ol","properties":{"start":2},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Luokka Asiakas"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"attribuutti tunniste (merkkijono)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"attribuutti saldo (desimaaliluku)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"attribuutti alennusprosentti (kokonaisluku)"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"ol","properties":{"start":3},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Luokka Kaapeli"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"attribuutti malli (merkkijono)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"attribuutti pituus (desimaaliluku)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"attribuutti maksiminopeus (kokonaisluku)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"attribuutti kaksisuuntainen (totuusarvo)"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"omien-luokkien-olioiden-kaytto","style":"position:relative;"},"children":[{"type":"text","value":"Omien luokkien olioiden käyttö"},{"type":"element","tagName":"a","properties":{"href":"#omien-luokkien-olioiden-kaytto","ariaLabel":"omien luokkien olioiden kaytto permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Omasta luokasta muodostetut oliot käyttäytyvät esimerkiksi funktioiden parametrina ja paluuarvona samalla tavalla kuin muutkin oliot. Voisimme esimerkiksi tehdä pari apufunktiota tilien käsittelyyn:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# funktio luo uuden tiliolion ja palauttaa sen"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"avaa_tili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n uusi_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" uusi_tili\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# funktio asettaa parametrina saamansa rahasumman parametrina olevalle tilille"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"laita_rahaa_tilille"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" summa\n\npekan_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" avaa_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nlaita_rahaa_tilille"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"0\n500"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Muodosta lemmikki","tmcname":"osa08-07b_muodosta_lemmikki"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Määrittele luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lemmikki"}]},{"type":"text","value":". Luokalla on konstruktori, jossa annetaan arvot attribuuteille "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"laji"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"syntymavuosi"}]},{"type":"text","value":" tässä järjestyksessä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita sitten luokan ulkopuolelle funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"uusi_lemmikki(nimi: str, laji: str, syntymavuosi: int)"}]},{"type":"text","value":", joka luo ja palauttaa uuden "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lemmikki"}]},{"type":"text","value":"-tyyppisen (eli "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lemmikki"}]},{"type":"text","value":"-luokkaa vastaavan) olion."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"musti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" uusi_lemmikki"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Musti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"koira\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2017"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"musti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"musti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"laji"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"musti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syntymavuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Musti\nkoira\n2017"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Vanhempi kirja","tmcname":"osa08-08_vanhempi_kirja"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vanhempi_kirja(kirja1: Kirja, kirja2: Kirja)"}]},{"type":"text","value":", joka saa parametriksi kaksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kirja"}]},{"type":"text","value":"-oliota. Funktio kertoo, kumpi kirjoista on vanhempi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiota käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"python "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Fluent Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luciano Ramalho\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ohjelmointi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2015"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\neverest "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Huipulta huipulle\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Carina Räihä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"elämänkerta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2010"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnorma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Norma\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sofi Oksanen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"rikos\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2015"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nvanhempi_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"python"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" everest"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nvanhempi_kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"python"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" norma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huipulta huipulle on vanhempi, se kirjoitettiin 2010\nFluent Python ja Norma kirjoitettiin 2015"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Genren kirjat","tmcname":"osa08-09_genren_kirjat"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"genren_kirjat(kirjat: list, genre: str)"}]},{"type":"text","value":", joka saa parametriksi listan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kirja"}]},{"type":"text","value":"-olioita sekä genren kertovan merkkijonon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"palauttaa"}]},{"type":"text","value":" uuden listan, jolle se laittaa parametrina olevista kirjoista ne, joilla on haluttu genre."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktiota käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"python "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Fluent Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Luciano Ramalho\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ohjelmointi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2015"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\neverest "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Huipulta huipulle\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Carina Räihä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"elämänkerta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2010"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nnorma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Norma\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sofi Oksanen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"rikos\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2015"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkirjat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"python"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" everest"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" norma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" Kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lumiukko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jo Nesbø\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"rikos\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2007"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"rikoskirjoja ovat\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" kirja "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" genren_kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"rikos\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kirjoittaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":": "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"rikoskirjoja ovat\nSofi Oksanen: Norma\nJo Nesbø: Lumiukko"}]}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, miten omia luokkia määritellään
  • \n
  • Osaat muodostaa itse määritellystä luokasta olion
  • \n
  • Osaat kirjoittaa konstruktorin
  • \n
  • Tiedät, mitä tarkoittaa avainsana self
  • \n
  • Tiedät, mitä ovat attribuutit ja miten niitä käytetään
  • \n

Luokka määritellään avainsanan class avulla. Syntaksi on

class LuokanNimi:\n    # Luokan toteutus

Luokat nimetään yleensä camel case -käytännöllä niin, että sanat kirjoitetaan yhteen ja jokainen sana alkaa isolla alkukirjaimella. Esimerkiksi seuraavat ovat tämän käytännön mukaisia luokkien nimiä:

    \n
  • Pankkitili
  • \n
  • OhjelmaApuri
  • \n
  • KirjastoTietokanta
  • \n
  • PythonKurssinArvosanat
  • \n

Yhdellä luokalla pyritään mallintamaan jokin sellainen yksittäinen kokonaisuus, jonka sisältämät tiedot liittyvät kiinteästi yhteen. Monimutkaisemmissa ratkaisuissa luokka voi sisältää toisia luokkia (esimerkiksi luokka Kurssi voisi sisältää luokan Osasuoritus mukaisia olioita).

Tarkastellaan esimerkkinä yksinkertaista luokkamäärittelyä, josta sisältö vielä puuttuu:

class Pankkitili:\n    pass

Koodissa määritellään luokka, jonka nimi on Pankkitili. Luokalle ei ole määritelty varsinaista sisältöä, mutta tästä huolimatta luokasta voidaan muodostaa olio.

Tarkastellaan ohjelmaa, jossa luokasta muodostetun olion sisälle on määritelty kaksi muuttujaa, saldo ja omistaja. Olion muuttujia kutsutaan attribuuteiksi. Attribuutista käytetään myös nimitystä oliomuuttuja.

Kun luokasta luodaan olio, voidaan attribuuttien arvoja käsitellä olion kautta:

class Pankkitili:\n    pass\n\npekan_tili = Pankkitili()\npekan_tili.omistaja = \"Pekka Python\"\npekan_tili.saldo = 5.0\n\nprint(pekan_tili.omistaja)\nprint(pekan_tili.saldo)

Pekka Python\n5.0

Attribuutit ovat käytettävissä ainoastaan sen olion kautta, jossa ne on määritelty. Pankkitili-luokasta muodostetuilla olioilla on jokaisella omat arvonsa attribuuteille. Attribuuttien arvot haetaan olioiden kautta, esimerkiksi näin:

tili = Pankkitili()\ntili.saldo = 155.50\n\nprint(tili.saldo) # Viittaa tilin attribuuttiin saldo\nprint(saldo) # TÄSTÄ TULEE VIRHE, koska oliomuuttuja ei ole mukana!

Konstruktorin lisääminen

Kuten edellisestä esimerkistä huomataan, luokasta voi luoda uuden olion kutsumalla konstruktoria, joka on muotoa LuokanNimi(). Yleensä olisi kuitenkin kätevä antaa attribuuteille arvot heti kun olio luodaan – nyt esimerkiksi Pankkitilin omistaja ja saldo asetetaan vasta, kun pankkitiliolio on luotu.

Attribuuttien asettamisessa ilman konstruktoria on myös se ongelma, että samasta luokasta luoduilla olioilla voi olla eri attribuutit. Seuraava ohjelmakoodi esimerkiksi antaa virheen, koska oliolle pirjon_tili ei ole määritelty attribuuttia saldo:

class Pankkitili:\n    pass\n\npekan_tili = Pankkitili()\npekan_tili.omistaja = \"Pekka\"\npekan_tili.saldo = 1400\n\npirjon_tili = Pankkitili()\npirjon_tili.omistaja = \"Pirjo\"\n\nprint(pekan_tili.saldo)\nprint(pirjon_tili.saldo) # TÄSTÄ TULEE VIRHE

Sen sijaan että attribuuttien arvot alustettaisiin luokan luomisen jälkeen, on huomattavasti parempi ajatus alustaa arvot samalla, kun luokasta luodaan olio.

Konstruktori kirjoitetaan luokan sisään metodina __init__ yleensä heti luokan alkuun.

Tarkastellaan Pankkitili-luokkaa, johon on lisätty konstruktori:

class Pankkitili:\n\n    # Konstruktori\n    def __init__(self, saldo: float, omistaja: str):\n        self.saldo = saldo\n        self.omistaja = omistaja

Konstruktorin nimi on aina __init__. Huomaa, että nimessä sanan init molemmilla puolilla on kaksi alaviivaa.

Konstruktorin ensimmäinen parametri on nimeltään self. Tämä viittaa olioon, jota käsitellään. Asetuslause

self.saldo = saldo

asettaa parametrina annetun saldon luotavan olion saldoksi. On tärkeä huomata, että tässä yhteydessä muuttuja self.saldo on eri muuttuja kuin muuttuja saldo:

    \n
  • \n

    Muuttuja self.saldo viittaa olion attribuuttiin. Jokaisella Pankkitili-luokan oliolla on oma saldonsa.

    \n
  • \n
  • \n

    Muuttuja saldo on konstruktorimetodin __init__ parametri, jolle annetaan arvo, kun metodia kutsutaan (eli kun halutaan luoda uusi olio luokasta).

    \n
  • \n

Nyt kun konstruktorille on määritelty parametrit, voidaan attribuuttien arvot antaa oliota luotaessa:

class Pankkitili:\n\n    # Konstruktori\n    def __init__(self, saldo: float, omistaja: str):\n        self.saldo = saldo\n        self.omistaja = omistaja\n\n# Parametrille self ei anneta arvoa, vaan Python antaa sen\n# automaattisesti\npekan_tili = Pankkitili(100, \"Pekka Python\")\npirjon_tili = Pankkitili(20000, \"Pirjo Pythonen\")\n\nprint(pekan_tili.saldo)\nprint(pirjon_tili.saldo)

100\n20000

Esimerkistä huomataan, että olioiden luominen helpottuu, kun arvot voidaan antaa heti oliota muodostaessa. Samalla tämä varmistaa, että arvojen antaminen ei unohdu, ja ohjaa käyttäjää antamaan arvot attribuuteille.

Attribuuttien arvoja voi edelleen muuttaa myöhemmin ohjelmassa, vaikka alkuarvo olisikin annettu konstruktorissa:

class Pankkitili:\n\n    # Konstruktori\n    def __init__(self, saldo: float, omistaja: str):\n        self.saldo = saldo\n        self.omistaja = omistaja\n\npekan_tili = Pankkitili(100, \"Pekka Python\")\nprint(pekan_tili.saldo)\n\n# Saldoksi 1500\npekan_tili.saldo = 1500\nprint(pekan_tili.saldo)\n\n# Lisätään saldoon 2000\npekan_tili.saldo += 2000\nprint(pekan_tili.saldo)

100\n1500\n3500

Tarkastellaan vielä toista esimerkkiä luokasta ja olioista. Kirjoitetaan luokka, joka mallintaa yhtä lottokierrosta:

from datetime import date\n\nclass LottoKierros:\n\n    def __init__(self, viikko: int, pvm: date, numerot: list):\n        self.viikko = viikko\n        self.pvm = pvm\n        self.numerot = numerot\n\n\n# Luodaan uusi lottokierros\nkierros1 = LottoKierros(1, date(2021, 1, 2), [1,4,8,12,13,14,33])\n\n# Tulostetaan tiedot\nprint(kierros1.viikko)\nprint(kierros1.pvm)\n\nfor numero in kierros1.numerot:\n    print(numero)

1\n2021-01-02\n1\n4\n8\n12\n13\n14\n33

Attribuutit voivat olla siis minkä tahansa tyyppisiä – esimerkiksi edellisessä esimerkissä jokaiseen olioon tallennetaan lista ja päivämäärä.

Tee luokka Kirja, jolla on attribuutteina muuttujat nimi, kirjoittaja, genre ja kirjoitusvuosi sekä konstruktori, joka alustaa muuttujat.

Luokkaa käytetään seuraavasti:

python = Kirja(\"Fluent Python\", \"Luciano Ramalho\", \"ohjelmointi\", 2015)\neverest = Kirja(\"Huipulta huipulle\", \"Carina Räihä\", \"elämänkerta\", 2010)\n\nprint(f\"{python.kirjoittaja}: {python.nimi} ({python.kirjoitusvuosi})\")\nprint(f\"Kirjan {everest.nimi} genre on {everest.genre}\")

Luciano Ramalho: Fluent Python (2015)\nKirjan Huipulta huipulle genre on elämänkerta

Kirjoita alla pyydetyt luokat. Jokaisen luokan alle on kuvattu attribuuttien nimet ja tyypit.

Kirjoita jokaiselle luokalle myös konstruktori, jossa attribuutit annetaan siinä järjestyksessä kuin ne on kuvauksessa annettu.

    \n
  1. Luokka Muistilista
  2. \n
    \n
  • attribuutti otsikko (merkkijono)
  • \n
  • attribuutti merkinnat (lista)
  • \n
    \n
  1. Luokka Asiakas
  2. \n
    \n
  • attribuutti tunniste (merkkijono)
  • \n
  • attribuutti saldo (desimaaliluku)
  • \n
  • attribuutti alennusprosentti (kokonaisluku)
  • \n
    \n
  1. Luokka Kaapeli
  2. \n
    \n
  • attribuutti malli (merkkijono)
  • \n
  • attribuutti pituus (desimaaliluku)
  • \n
  • attribuutti maksiminopeus (kokonaisluku)
  • \n
  • attribuutti kaksisuuntainen (totuusarvo)
  • \n

Omien luokkien olioiden käyttö

Omasta luokasta muodostetut oliot käyttäytyvät esimerkiksi funktioiden parametrina ja paluuarvona samalla tavalla kuin muutkin oliot. Voisimme esimerkiksi tehdä pari apufunktiota tilien käsittelyyn:

# funktio luo uuden tiliolion ja palauttaa sen\ndef avaa_tili(nimi: str):\n    uusi_tili =  Pankkitili(0, nimi)\n    return uusi_tili\n\n# funktio asettaa parametrina saamansa rahasumman parametrina olevalle tilille\ndef laita_rahaa_tilille(tili: Pankkitili, summa: int):\n    tili.saldo += summa\n\npekan_tili = avaa_tili(\"Pekka Python\")\nprint(pekan_tili.saldo)\n\nlaita_rahaa_tilille(pekan_tili, 500)\n\nprint(pekan_tili.saldo)

0\n500

Määrittele luokka Lemmikki. Luokalla on konstruktori, jossa annetaan arvot attribuuteille nimi, laji ja syntymavuosi tässä järjestyksessä.

Kirjoita sitten luokan ulkopuolelle funktio uusi_lemmikki(nimi: str, laji: str, syntymavuosi: int), joka luo ja palauttaa uuden Lemmikki-tyyppisen (eli Lemmikki-luokkaa vastaavan) olion.

Esimerkki funktion kutsumisesta:

musti = uusi_lemmikki(\"Musti\", \"koira\", 2017)\nprint(musti.nimi)\nprint(musti.laji)\nprint(musti.syntymavuosi)

Musti\nkoira\n2017

Tee funktio vanhempi_kirja(kirja1: Kirja, kirja2: Kirja), joka saa parametriksi kaksi Kirja-oliota. Funktio kertoo, kumpi kirjoista on vanhempi.

Funktiota käytetään seuraavasti:

python = Kirja(\"Fluent Python\", \"Luciano Ramalho\", \"ohjelmointi\", 2015)\neverest = Kirja(\"Huipulta huipulle\", \"Carina Räihä\", \"elämänkerta\", 2010)\nnorma = Kirja(\"Norma\", \"Sofi Oksanen\", \"rikos\", 2015)\n\nvanhempi_kirja(python, everest)\nvanhempi_kirja(python, norma)

Huipulta huipulle on vanhempi, se kirjoitettiin 2010\nFluent Python ja Norma kirjoitettiin 2015

Tee funktio genren_kirjat(kirjat: list, genre: str), joka saa parametriksi listan Kirja-olioita sekä genren kertovan merkkijonon.

Funktio palauttaa uuden listan, jolle se laittaa parametrina olevista kirjoista ne, joilla on haluttu genre.

Funktiota käytetään seuraavasti:

python = Kirja(\"Fluent Python\", \"Luciano Ramalho\", \"ohjelmointi\", 2015)\neverest = Kirja(\"Huipulta huipulle\", \"Carina Räihä\", \"elämänkerta\", 2010)\nnorma = Kirja(\"Norma\", \"Sofi Oksanen\", \"rikos\", 2015)\n\nkirjat = [python, everest, norma, Kirja(\"Lumiukko\", \"Jo Nesbø\", \"rikos\", 2007)]\n\nprint(\"rikoskirjoja ovat\")\nfor kirja in genren_kirjat(kirjat, \"rikos\"):\n    print(f\"{kirja.kirjoittaja}: {kirja.nimi}\")

rikoskirjoja ovat\nSofi Oksanen: Norma\nJo Nesbø: Lumiukko

","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-8/3-omat-luokat.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-8/4-metodit-omissa-luokissa/page-data.json b/page-data/osa-8/4-metodit-omissa-luokissa/page-data.json index fb7e17183..ecf8abab6 100644 --- a/page-data/osa-8/4-metodit-omissa-luokissa/page-data.json +++ b/page-data/osa-8/4-metodit-omissa-luokissa/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-8/4-metodit-omissa-luokissa", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten metodit toimivat luokissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat kirjoittaa metodeita omiin luokkiin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ymmärrät, mitä tarkoitetaan kapseloinnilla ja asiakkaalla olio-ohjelmoinnissa"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vain attribuutteja sisältävät luokat eivät käytännössä eroa juurikaan sanakirjoista. Seuraavassa esimerkissä on esitetty pankkitiliä mallintava rakenne sekä oman luokan että sanakirjan avulla toteutettuna:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Esimerkki omaa luokkaa käyttäen"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilinumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" omistaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vuosikorko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tilinumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tilinumero\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" omistaja\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vuosikorko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" vuosikorko\n\npekan_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345-678\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1500.0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.015"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Esimerkki sanakirjaa käyttäen"}]},{"type":"text","value":"\npekan_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tilinumero\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345-678\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"omistaja\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"saldo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1500.0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vuosikorko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanakirjaa käyttäen rakenteen toteutus on huomattavasti suoraviivaisempi ja koodi on lyhyempi. Luokan hyötynä tässä tapauksessa on, että se määrittelee rakenteen \"tiukemmin\", jolloin kaikki luokasta muodostetut oliot ovat rakenteeltaan samanlaisia. Luokka on lisäksi nimetty: oliota muodostaessa viitataan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"text","value":"-luokkaan ja olion tyyppi on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"text","value":" eikä sanakirja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokilla on lisäksi etuna, että niihin voidaan lisätä attribuuttien lisäksi myös toiminnallisuutta. Yksi olio-ohjelmoinnin periaatteista onkin, että olioon on yhdistetty sekä tallennettavat tiedot että operaatiot, joilla tietoa voidaan käsitellä."}]},{"type":"element","tagName":"h2","properties":{"id":"metodit-luokissa","style":"position:relative;"},"children":[{"type":"text","value":"Metodit luokissa"},{"type":"element","tagName":"a","properties":{"href":"#metodit-luokissa","ariaLabel":"metodit luokissa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi tarkoittaa luokkaan sidottua aliohjelmaa. Yleensä metodin toiminta kohdistuu vain yhteen olioon. Metodi kirjoitetaan luokan sisälle, ja se voi käsitellä attribuutteja kuten mitä tahansa muuttujia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Katsotaan esimerkkinä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"text","value":"-luokan metodia, joka lisää koron pankkitilille:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilinumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" omistaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vuosikorko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tilinumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tilinumero\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" omistaja\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vuosikorko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" vuosikorko\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodi lisää koron tilin saldoon"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_korko"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vuosikorko\n\n\npekan_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345-678\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1500.0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.015"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_korko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1522.5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_korko"}]},{"type":"text","value":" kertoo olion saldon vuosikorkoprosentilla ja lisää tuloksen nykyiseen saldoon. Metodin toiminta kohdistuu siihen olioon, jonka kautta sitä kutsutaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Katsotaan vielä toinen esimerkki, jossa luokasta on muodostettu useampi olio:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luokka Pankkitili on määritelty edellisessä esimerkissä"}]},{"type":"text","value":"\n\npekan_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345-678\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1500.0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.015"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npirjon_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"99999-999\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pirjo Pythonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1500.0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.05"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npaulin_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1111-222\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pauli Paulinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1500.0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.001"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Lisätään korko Pekalle ja Pirjolle, mutta ei Paulille"}]},{"type":"text","value":"\npekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_korko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npirjon_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_korko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan kaikki"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pirjon_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"paulin_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1522.5\n1575.0\n1500.0"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Korko lisätään vain siihen tiliin, jonka kautta metodia kutsutaan. Esimerkistä huomataan, että Pekalle ja Pirjolle lisätään eri korkoprosentit ja Paulin tilin saldo ei muutu ollenkaan, koska olion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"paulin_tili"}]},{"type":"text","value":" kautta ei kutsuta metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_korko"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"h2","properties":{"id":"kapselointi","style":"position:relative;"},"children":[{"type":"text","value":"Kapselointi"},{"type":"element","tagName":"a","properties":{"href":"#kapselointi","ariaLabel":"kapselointi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olio-ohjelmoinnin yhteydessä puhutaan usein olioiden "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"asiakkaista"}]},{"type":"text","value":". Asiakkaalla (client) tarkoitetaan koodin osaa, joka muodostaa olion ja käyttää sen palveluita kutsumalla metodeita. Kun olion tietosisältöä käsitellään vain olion tarjoamien metodien avulla, voidaan varmistua siitä, että olion "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"sisäinen eheys"}]},{"type":"text","value":" säilyy. Käytännössä tämä tarkoittaa esimerkiksi sitä, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"text","value":"-luokassa tarjotaan metodi, jolla tililtä nostetaan rahaa, sen sijaan, että asiakas käsittelisi suoraan attribuuttia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"saldo"}]},{"type":"text","value":". Tässä metodissa voidaan sitten esimerkiksi varmistaa, ettei tililtä nosteta katetta enempää rahaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilinumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" omistaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vuosikorko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tilinumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tilinumero\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" omistaja\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vuosikorko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" vuosikorko\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodi lisää koron tilin saldoon"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_korko"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vuosikorko\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodilla \"nostetaan\" tililtä rahaa"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodi palauttaa true, jos nosto onnistuu, muuten False"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"nosto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nostosumma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nostosumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" nostosumma\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n\npekan_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345-678\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1500.0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.015"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nosto onnistui, tilin saldo on nyt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nosto ei onnistunut, rahaa ei ole tarpeeksi.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Yritetään uudestaan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nosto onnistui, tilin saldo on nyt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nosto ei onnistunut, rahaa ei ole tarpeeksi.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nosto onnistui, tilin saldo on nyt 500.0\nNosto ei onnistunut, rahaa ei ole tarpeeksi."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olion sisäisen eheyden säilyttämistä ja sopivien metodien tarjoamista asiakkaalle kutsutaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kapseloinniksi"}]},{"type":"text","value":". Tämä tarkoittaa, että olion toteutus piilotetaan asiakkaalta ja olio tarjoaa ulkopuolelle metodit, joiden avulla tietoja voi käsitellä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelkkä metodin lisäys ei kuitenkaan piilota attribuuttia: vaikka luokkaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"text","value":" onkin lisätty metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nosto"}]},{"type":"text","value":" rahan nostamiseksi, asiakas voi edelleen muokata "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"saldo"}]},{"type":"text","value":"-attribuutin arvoa suoraan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"pekan_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345-678\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1500.0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.015"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Yritetään nostaa 2000"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nosto onnistui, tilin saldo on nyt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nosto ei onnistunut, rahaa ei ole tarpeeksi.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Nostetaan \"väkisin\" 2000"}]},{"type":"text","value":"\n pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2000"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Saldo nyt:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ongelma voidaan ainakin osittain ratkaista piilottamalla attribuutit asiakkaalta. Käytännön toteutukseen palataan tarkemmin ensi viikolla."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Vähenevä laskuri","tmcname":"osa08-10_vaheneva_laskuri"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä on useampi osa. Jokainen osa vastaa yhtä tehtäväpistettä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjan mukana tulee osittain valmiiksi toteutettu luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"VahenevaLaskuri"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"VahenevaLaskuri"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvo_alussa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" arvo_alussa\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta_arvo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"arvo:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"vahenna"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ja tänne muut metodit"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkaa käytetään seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"laskuri "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" VahenevaLaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vahenna"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vahenna"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"arvo: 10\narvo: 9\narvo: 8"}]}]},{"type":"element","tagName":"h3","properties":{"id":"laskurin-vahentaminen","style":"position:relative;"},"children":[{"type":"text","value":"Laskurin vähentäminen"},{"type":"element","tagName":"a","properties":{"href":"#laskurin-vahentaminen","ariaLabel":"laskurin vahentaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Täydennä luokan runkoon metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vahenna"}]},{"type":"text","value":" toteutus sellaiseksi, että se vähentää kutsuttavan olion oliomuuttujan arvoa yhdellä. Kun olet toteuttanut metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vahenna"}]},{"type":"text","value":", äskeisen pääohjelman tulee toimia esimerkkitulosteen mukaan."}]},{"type":"element","tagName":"h3","properties":{"id":"laskurin-arvo-ei-saa-olla-negatiivinen","style":"position:relative;"},"children":[{"type":"text","value":"Laskurin arvo ei saa olla negatiivinen"},{"type":"element","tagName":"a","properties":{"href":"#laskurin-arvo-ei-saa-olla-negatiivinen","ariaLabel":"laskurin arvo ei saa olla negatiivinen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Täydennä metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vahenna"}]},{"type":"text","value":" toteutus sellaiseksi, ettei laskurin arvo mene koskaan negatiiviseksi: jos laskurin arvo on jo 0, sitä ei enää vähennetä."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"laskuri "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" VahenevaLaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vahenna"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vahenna"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vahenna"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"arvo: 2\narvo: 1\narvo: 0\narvo: 0"}]}]},{"type":"element","tagName":"h3","properties":{"id":"laskurin-arvon-nollaus","style":"position:relative;"},"children":[{"type":"text","value":"Laskurin arvon nollaus"},{"type":"element","tagName":"a","properties":{"href":"#laskurin-arvon-nollaus","ariaLabel":"laskurin arvon nollaus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee laskurille metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nollaa"}]},{"type":"text","value":", joka nollaa laskurin arvon:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"laskuri "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" VahenevaLaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nollaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"arvo: 100\narvo: 0"}]}]},{"type":"element","tagName":"h3","properties":{"id":"alkuperaisen-arvon-palautus","style":"position:relative;"},"children":[{"type":"text","value":"Alkuperäisen arvon palautus"},{"type":"element","tagName":"a","properties":{"href":"#alkuperaisen-arvon-palautus","ariaLabel":"alkuperaisen arvon palautus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee laskurille metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"palauta_alkuperainen_arvo()"}]},{"type":"text","value":" joka palauttaa laskurille sen alkuperäisen arvon:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"laskuri "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" VahenevaLaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"55"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vahenna"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vahenna"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vahenna"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vahenna"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"palauta_alkuperainen_arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"arvo: 51\narvo: 55"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan vielä esimerkkiä luokasta, joka mallintaa pelaajan ennätystulosta. Luokkaan on kirjoitettu erilliset metodit, joilla voidaan tarkastaa, ovatko annetut parametrit sopivia. Metodeja kutsutaan heti konstruktorissa. Näin varmistetaan luotavan olion sisäinen eheys."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" date\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Ennatystulos"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kuukausi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Oletusarvot"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paivamaara "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1900"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi_ok"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pelaaja\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pvm_ok"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kuukausi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paivamaara "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kuukausi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisteet_ok"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pisteet\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Apumetodit, joilla tarkistetaan ovatko syötteet ok"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"nimi_ok"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Nimessä vähintään kaksi merkkiä"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pvm_ok"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kuukausi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"try"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kuukausi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"except"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Poikkeus, jos yritetään muodostaa epäkelpo päivämäärä"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pisteet_ok"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tulos1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Ennatystulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"235"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paivamaara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Epäkelpo arvo päivämäärälle"}]},{"type":"text","value":"\n tulos2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Ennatystulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Piia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"13"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2019"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4555"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paivamaara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostaa oletusarvon 1900-01-01"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"235\nPekka\n2020-11-01\n4555\nPiia\n1900-01-01"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkistä huomataan, että myös olion omiin metodeihin pitää viitata "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":"-määreen avulla, kun niitä kutsutaan konstruktorista. Luokkiin voidaan kirjoittaa myös "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"staattisia metodeita"}]},{"type":"text","value":" eli metodeja, joita voidaan kutsua ilman, että luokasta muodostetaan oliota. Tähän palataan kuitenkin tarkemmin ensi viikolla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Määrettä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":" käytetään kuitenkin vain silloin, kun viitataan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"olion piirteisiin"}]},{"type":"text","value":" (eli metodeihin tai olion attribuutteihin). Olion metodeissa voidaan käyttää myös paikallisia muuttujia. Tämä on suositeltavaa, jos muuttujaan ei ole tarvetta viitata metodin ulkopuolella."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Paikallinen muuttuja määritellään ilman "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":"-määrettä - eli samoin kuin esimerkiksi kaikki muuttujat kurssin ensimmäisellä puoliskolla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Bonuskortti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_bonus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Nyt muuttuja bonus on paikallinen muuttuja,"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# eikä olion attribuutti - siihen siis ei voi"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# viitata olion kautta"}]},{"type":"text","value":"\n bonus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.25"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" bonus\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_superbonus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Myös muuttuja superbonus on paikallinen muuttuja"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Yleensä apumuuttujina käytetään paikallisia"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muuttujia, koska niihin ei ole tarvetta"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# viitatata muissa metodeissa tai olion kautta"}]},{"type":"text","value":"\n superbonus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.5"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" superbonus\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Bonuskortti(nimi="}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", saldo="}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Etu- ja sukunimi","tmcname":"osa08-10b_etu_ja_sukunimi"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"text","value":", jolla on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ainoastaan yksi attribuutti"}]},{"type":"text","value":" "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":", joka asetetaan konstruktorissa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisäksi luokalle tule kirjoitaa kaksi metodia:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"anna_etunimi"}]},{"type":"text","value":" palauttaa henkilön etunimen ja metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"anna_sukunimi"}]},{"type":"text","value":" vastaavasti henkilön sukunimen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa metodeissa, että konstruktroissa annetussa nimessä on etu- ja sukunimi välilyönnillä erotettuna eikä muita nimiä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki luokan käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n pekka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"anna_etunimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"anna_sukunimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n pauli "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pauli Pythonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pauli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"anna_etunimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pauli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"anna_sukunimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka\nPython\nPauli\nPythonen"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Lukutilasto","tmcname":"osa08-11_lukutilasto"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä toteutetaan olio-ohjelmointia hyödyntäen samantapainen käyttäjän syöttämiä lukuja käsittelevä ohjelma kuin Ohjelmoinnin perusteiden "},{"type":"element","tagName":"a","properties":{"href":"/osa-2/4-yksinkertainen-silmukka#programming-exercise-lukujen-kasittelya"},"children":[{"type":"text","value":"osan 2 lopussa"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"h3","properties":{"id":"lukujen-maara","style":"position:relative;"},"children":[{"type":"text","value":"Lukujen määrä"},{"type":"element","tagName":"a","properties":{"href":"#lukujen-maara","ariaLabel":"lukujen maara permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lukutilasto"}]},{"type":"text","value":", joka tuntee seuraavat toiminnot:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_luku"}]},{"type":"text","value":" lisää uuden luvun tilastoon"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lukujen_maara"}]},{"type":"text","value":" kertoo lisättyjen lukujen määrän"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokan ei tarvitse tallentaa mihinkään lisättyjä lukuja vaan riittää, että se muistaa niiden määrän. Metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_luku"}]},{"type":"text","value":" ei tässä vaiheessa tarvitse edes ottaa huomioon, mikä luku lisätään tilastoon, koska ainoa tallennettava asia on lukujen määrä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokan runko on seuraava:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Lukutilasto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lukuja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_luku"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lukujen_maara"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tilasto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Lukutilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lukujen määrä:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lukujen_maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lukujen määrä: 4"}]}]},{"type":"element","tagName":"h3","properties":{"id":"summa-ja-keskiarvo","style":"position:relative;"},"children":[{"type":"text","value":"Summa ja keskiarvo"},{"type":"element","tagName":"a","properties":{"href":"#summa-ja-keskiarvo","ariaLabel":"summa ja keskiarvo permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajenna luokkaa seuraavilla toiminnoilla:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa"}]},{"type":"text","value":" kertoo lisättyjen lukujen summan (tyhjän lukutilaston summa on 0)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"keskiarvo"}]},{"type":"text","value":" kertoo lisättyjen lukujen keskiarvon (tyhjän lukutilaston keskiarvo on 0)"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tilasto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Lukutilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lukujen määrä:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lukujen_maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Summa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Keskiarvo:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"keskiarvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Määrä: 4\nSumma: 11\nKeskiarvo: 2.75"}]}]},{"type":"element","tagName":"h3","properties":{"id":"summa-kayttajalta","style":"position:relative;"},"children":[{"type":"text","value":"Summa käyttäjältä"},{"type":"element","tagName":"a","properties":{"href":"#summa-kayttajalta","ariaLabel":"summa kayttajalta permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy lukuja käyttäjältä, kunnes käyttäjä antaa luvun -1. Sitten ohjelma ilmoittaa lukujen summan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmassa tulee käyttää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lukutilasto"}]},{"type":"text","value":"-oliota summan laskemiseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"HUOM: Älä muuta tässä osassa luokkaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lukutilasto"}]},{"type":"text","value":", vaan toteuta sitä hyödyntäen summan laskemiseen käytetty ohjelma."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"HUOM2: Älä kirjoita pääohjelmaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkon sisään, jotta testit toimivat!"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lukuja:\n"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-1"}]},{"type":"text","value":"\nSumma: 13\nKeskiarvo: 3.25"}]}]},{"type":"element","tagName":"h3","properties":{"id":"monta-summaa","style":"position:relative;"},"children":[{"type":"text","value":"Monta summaa"},{"type":"element","tagName":"a","properties":{"href":"#monta-summaa","ariaLabel":"monta summaa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuta edellistä ohjelmaa niin, että ohjelma laskee myös parillisten ja parittomien lukujen summaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"HUOM: Älä edelleenkään muuta luokkaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lukutilasto"}]},{"type":"text","value":", vaan määrittele ohjelmassa kolme "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lukutilasto"}]},{"type":"text","value":"-oliota. Laske ensimmäisen avulla kaikkien lukujen summa ja keskiarvo, toisen avulla parillisten lukujen summa ja kolmannen avulla parittomien lukujen summa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"HUOM2: Älä kirjoita pääohjelmaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkon sisään, jotta testit toimivat!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lukuja:\n"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-1"}]},{"type":"text","value":"\nSumma: 13\nKeskiarvo: 3.25\nParillisten summa: 8\nParittomien summa: 5"}]}]}]}]},"html":"

Tämän osion jälkeen:

    \n
  • Tiedät, miten metodit toimivat luokissa
  • \n
  • Osaat kirjoittaa metodeita omiin luokkiin
  • \n
  • Ymmärrät, mitä tarkoitetaan kapseloinnilla ja asiakkaalla olio-ohjelmoinnissa
  • \n

Vain attribuutteja sisältävät luokat eivät käytännössä eroa juurikaan sanakirjoista. Seuraavassa esimerkissä on esitetty pankkitiliä mallintava rakenne sekä oman luokan että sanakirjan avulla toteutettuna:

# Esimerkki omaa luokkaa käyttäen\nclass Pankkitili:\n\n    def __init__(self, tilinumero: str, omistaja: str, saldo: float, vuosikorko: float):\n        self.tilinumero = tilinumero\n        self.omistaja = omistaja\n        self.saldo = saldo\n        self.vuosikorko = vuosikorko\n\npekan_tili = Pankkitili(\"12345-678\", \"Pekka Python\", 1500.0, 0.015)
# Esimerkki sanakirjaa käyttäen\npekan_tili = {\"tilinumero\": \"12345-678\", \"omistaja\": \"Pekka Python\", \"saldo\": 1500.0, \"vuosikorko\": 0.0}

Sanakirjaa käyttäen rakenteen toteutus on huomattavasti suoraviivaisempi ja koodi on lyhyempi. Luokan hyötynä tässä tapauksessa on, että se määrittelee rakenteen \"tiukemmin\", jolloin kaikki luokasta muodostetut oliot ovat rakenteeltaan samanlaisia. Luokka on lisäksi nimetty: oliota muodostaessa viitataan Pankkitili-luokkaan ja olion tyyppi on Pankkitili eikä sanakirja.

Luokilla on lisäksi etuna, että niihin voidaan lisätä attribuuttien lisäksi myös toiminnallisuutta. Yksi olio-ohjelmoinnin periaatteista onkin, että olioon on yhdistetty sekä tallennettavat tiedot että operaatiot, joilla tietoa voidaan käsitellä.

Metodit luokissa

Metodi tarkoittaa luokkaan sidottua aliohjelmaa. Yleensä metodin toiminta kohdistuu vain yhteen olioon. Metodi kirjoitetaan luokan sisälle, ja se voi käsitellä attribuutteja kuten mitä tahansa muuttujia.

Katsotaan esimerkkinä Pankkitili-luokan metodia, joka lisää koron pankkitilille:

class Pankkitili:\n\n    def __init__(self, tilinumero: str, omistaja: str, saldo: float, vuosikorko: float):\n        self.tilinumero = tilinumero\n        self.omistaja = omistaja\n        self.saldo = saldo\n        self.vuosikorko = vuosikorko\n\n    # Metodi lisää koron tilin saldoon\n    def lisaa_korko(self):\n        self.saldo += self.saldo * self.vuosikorko\n\n\npekan_tili = Pankkitili(\"12345-678\", \"Pekka Python\", 1500.0, 0.015)\npekan_tili.lisaa_korko()\nprint(pekan_tili.saldo)

1522.5

Metodi lisaa_korko kertoo olion saldon vuosikorkoprosentilla ja lisää tuloksen nykyiseen saldoon. Metodin toiminta kohdistuu siihen olioon, jonka kautta sitä kutsutaan.

Katsotaan vielä toinen esimerkki, jossa luokasta on muodostettu useampi olio:

# Luokka Pankkitili on määritelty edellisessä esimerkissä\n\npekan_tili = Pankkitili(\"12345-678\", \"Pekka Python\", 1500.0, 0.015)\npirjon_tili = Pankkitili(\"99999-999\", \"Pirjo Pythonen\", 1500.0, 0.05)\npaulin_tili = Pankkitili(\"1111-222\", \"Pauli Paulinen\", 1500.0, 0.001)\n\n# Lisätään korko Pekalle ja Pirjolle, mutta ei Paulille\npekan_tili.lisaa_korko()\npirjon_tili.lisaa_korko()\n\n# Tulostetaan kaikki\nprint(pekan_tili.saldo)\nprint(pirjon_tili.saldo)\nprint(paulin_tili.saldo)

1522.5\n1575.0\n1500.0

Korko lisätään vain siihen tiliin, jonka kautta metodia kutsutaan. Esimerkistä huomataan, että Pekalle ja Pirjolle lisätään eri korkoprosentit ja Paulin tilin saldo ei muutu ollenkaan, koska olion paulin_tili kautta ei kutsuta metodia lisaa_korko.

Kapselointi

Olio-ohjelmoinnin yhteydessä puhutaan usein olioiden asiakkaista. Asiakkaalla (client) tarkoitetaan koodin osaa, joka muodostaa olion ja käyttää sen palveluita kutsumalla metodeita. Kun olion tietosisältöä käsitellään vain olion tarjoamien metodien avulla, voidaan varmistua siitä, että olion sisäinen eheys säilyy. Käytännössä tämä tarkoittaa esimerkiksi sitä, että Pankkitili-luokassa tarjotaan metodi, jolla tililtä nostetaan rahaa, sen sijaan, että asiakas käsittelisi suoraan attribuuttia saldo. Tässä metodissa voidaan sitten esimerkiksi varmistaa, ettei tililtä nosteta katetta enempää rahaa.

Esimerkiksi:

class Pankkitili:\n\n    def __init__(self, tilinumero: str, omistaja: str, saldo: float, vuosikorko: float):\n        self.tilinumero = tilinumero\n        self.omistaja = omistaja\n        self.saldo = saldo\n        self.vuosikorko = vuosikorko\n\n    # Metodi lisää koron tilin saldoon\n    def lisaa_korko(self):\n        self.saldo += self.saldo * self.vuosikorko\n\n    # Metodilla \"nostetaan\" tililtä rahaa\n    # Metodi palauttaa true, jos nosto onnistuu, muuten False\n    def nosto(self, nostosumma: float):\n        if nostosumma <= self.saldo:\n            self.saldo -= nostosumma\n            return True\n\n        return False\n\npekan_tili = Pankkitili(\"12345-678\", \"Pekka Python\", 1500.0, 0.015)\n\nif pekan_tili.nosto(1000):\n    print(\"Nosto onnistui, tilin saldo on nyt\", pekan_tili.saldo)\nelse:\n    print(\"Nosto ei onnistunut, rahaa ei ole tarpeeksi.\")\n\n# Yritetään uudestaan\nif pekan_tili.nosto(1000):\n    print(\"Nosto onnistui, tilin saldo on nyt\", pekan_tili.saldo)\nelse:\n    print(\"Nosto ei onnistunut, rahaa ei ole tarpeeksi.\")

Nosto onnistui, tilin saldo on nyt 500.0\nNosto ei onnistunut, rahaa ei ole tarpeeksi.

Olion sisäisen eheyden säilyttämistä ja sopivien metodien tarjoamista asiakkaalle kutsutaan kapseloinniksi. Tämä tarkoittaa, että olion toteutus piilotetaan asiakkaalta ja olio tarjoaa ulkopuolelle metodit, joiden avulla tietoja voi käsitellä.

Pelkkä metodin lisäys ei kuitenkaan piilota attribuuttia: vaikka luokkaan Pankkitili onkin lisätty metodi nosto rahan nostamiseksi, asiakas voi edelleen muokata saldo-attribuutin arvoa suoraan:

pekan_tili = Pankkitili(\"12345-678\", \"Pekka Python\", 1500.0, 0.015)\n\n# Yritetään nostaa 2000\nif pekan_tili.nosto(2000):\n    print(\"Nosto onnistui, tilin saldo on nyt\", pekan_tili.saldo)\nelse:\n    print(\"Nosto ei onnistunut, rahaa ei ole tarpeeksi.\")\n\n    # Nostetaan \"väkisin\" 2000\n    pekan_tili.saldo -= 2000\n\nprint(\"Saldo nyt:\", pekan_tili.saldo)

Ongelma voidaan ainakin osittain ratkaista piilottamalla attribuutit asiakkaalta. Käytännön toteutukseen palataan tarkemmin ensi viikolla.

Tässä tehtävässä on useampi osa. Jokainen osa vastaa yhtä tehtäväpistettä.

Tehtäväpohjan mukana tulee osittain valmiiksi toteutettu luokka VahenevaLaskuri:

class VahenevaLaskuri:\n    def __init__(self, arvo_alussa: int):\n        self.arvo = arvo_alussa\n\n    def tulosta_arvo(self):\n        print(\"arvo:\", self.arvo)\n\n    def vahenna(self):\n        pass\n\n    # ja tänne muut metodit

Luokkaa käytetään seuraavasti

laskuri = VahenevaLaskuri(10)\nlaskuri.tulosta_arvo()\nlaskuri.vahenna()\nlaskuri.tulosta_arvo()\nlaskuri.vahenna()\nlaskuri.tulosta_arvo()

arvo: 10\narvo: 9\narvo: 8

Laskurin vähentäminen

Täydennä luokan runkoon metodin vahenna toteutus sellaiseksi, että se vähentää kutsuttavan olion oliomuuttujan arvoa yhdellä. Kun olet toteuttanut metodin vahenna, äskeisen pääohjelman tulee toimia esimerkkitulosteen mukaan.

Laskurin arvo ei saa olla negatiivinen

Täydennä metodin vahenna toteutus sellaiseksi, ettei laskurin arvo mene koskaan negatiiviseksi: jos laskurin arvo on jo 0, sitä ei enää vähennetä.

laskuri = VahenevaLaskuri(2)\nlaskuri.tulosta_arvo()\nlaskuri.vahenna()\nlaskuri.tulosta_arvo()\nlaskuri.vahenna()\nlaskuri.tulosta_arvo()\nlaskuri.vahenna()\nlaskuri.tulosta_arvo()

arvo: 2\narvo: 1\narvo: 0\narvo: 0

Laskurin arvon nollaus

Tee laskurille metodi nollaa, joka nollaa laskurin arvon:

laskuri = VahenevaLaskuri(100)\nlaskuri.tulosta_arvo()\nlaskuri.nollaa()\nlaskuri.tulosta_arvo()

arvo: 100\narvo: 0

Alkuperäisen arvon palautus

Tee laskurille metodi palauta_alkuperainen_arvo() joka palauttaa laskurille sen alkuperäisen arvon:

laskuri = VahenevaLaskuri(55)\nlaskuri.vahenna()\nlaskuri.vahenna()\nlaskuri.vahenna()\nlaskuri.vahenna()\nlaskuri.tulosta_arvo()\nlaskuri.palauta_alkuperainen_arvo()\nlaskuri.tulosta_arvo()

arvo: 51\narvo: 55

Tarkastellaan vielä esimerkkiä luokasta, joka mallintaa pelaajan ennätystulosta. Luokkaan on kirjoitettu erilliset metodit, joilla voidaan tarkastaa, ovatko annetut parametrit sopivia. Metodeja kutsutaan heti konstruktorissa. Näin varmistetaan luotavan olion sisäinen eheys.

from datetime import date\n\nclass Ennatystulos:\n\n    def __init__(self, pelaaja: str, paiva: int, kuukausi: int, vuosi: int, pisteet: int):\n        # Oletusarvot\n        self.pelaaja = \"\"\n        self.paivamaara = date(1900, 1, 1)\n        self.pisteet = 0\n\n        if self.nimi_ok(pelaaja):\n            self.pelaaja = pelaaja\n\n        if self.pvm_ok(paiva, kuukausi, vuosi):\n            self.paivamaara = date(vuosi, kuukausi, paiva)\n\n        if self.pisteet_ok(pisteet):\n            self.pisteet = pisteet\n\n    # Apumetodit, joilla tarkistetaan ovatko syötteet ok\n    def nimi_ok(self, nimi: str):\n        return len(nimi) >= 2 # Nimessä vähintään kaksi merkkiä\n\n    def pvm_ok(self, paiva, kuukausi, vuosi):\n        try:\n            date(vuosi, kuukausi, paiva)\n            return True\n        except:\n            # Poikkeus, jos yritetään muodostaa epäkelpo päivämäärä\n            return False\n\n    def pisteet_ok(self, pisteet):\n        return pisteet >= 0\n\nif __name__ == \"__main__\":\n    tulos1 = Ennatystulos(\"Pekka\", 1, 11, 2020, 235)\n    print(tulos1.pisteet)\n    print(tulos1.pelaaja)\n    print(tulos1.paivamaara)\n\n    # Epäkelpo arvo päivämäärälle\n    tulos2 = Ennatystulos(\"Piia\", 4, 13, 2019, 4555)\n    print(tulos2.pisteet)\n    print(tulos2.pelaaja)\n    print(tulos2.paivamaara) # Tulostaa oletusarvon 1900-01-01

235\nPekka\n2020-11-01\n4555\nPiia\n1900-01-01

Esimerkistä huomataan, että myös olion omiin metodeihin pitää viitata self-määreen avulla, kun niitä kutsutaan konstruktorista. Luokkiin voidaan kirjoittaa myös staattisia metodeita eli metodeja, joita voidaan kutsua ilman, että luokasta muodostetaan oliota. Tähän palataan kuitenkin tarkemmin ensi viikolla.

Määrettä self käytetään kuitenkin vain silloin, kun viitataan olion piirteisiin (eli metodeihin tai olion attribuutteihin). Olion metodeissa voidaan käyttää myös paikallisia muuttujia. Tämä on suositeltavaa, jos muuttujaan ei ole tarvetta viitata metodin ulkopuolella.

Paikallinen muuttuja määritellään ilman self-määrettä - eli samoin kuin esimerkiksi kaikki muuttujat kurssin ensimmäisellä puoliskolla.

Esimerkiksi

class Bonuskortti:\n    def __init__(self, nimi: str, saldo: float):\n        self.nimi = nimi\n        self.saldo = saldo\n\n    def lisaa_bonus(self):\n        # Nyt muuttuja bonus on paikallinen muuttuja,\n        # eikä olion attribuutti - siihen siis ei voi\n        # viitata olion kautta\n        bonus = self.saldo * 0.25\n        self.saldo += bonus\n\n    def lisaa_superbonus(self):\n        # Myös muuttuja superbonus on paikallinen muuttuja\n        # Yleensä apumuuttujina käytetään paikallisia\n        # muuttujia, koska niihin ei ole tarvetta\n        # viitatata muissa metodeissa tai olion kautta\n        superbonus = self.saldo * 0.5\n        self.saldo += superbonus\n\n    def __str__(self):\n        return f\"Bonuskortti(nimi={self.nimi}, saldo={self.saldo})\"

Kirjoita luokka Henkilo, jolla on ainoastaan yksi attribuutti nimi, joka asetetaan konstruktorissa.

Lisäksi luokalle tule kirjoitaa kaksi metodia:

Metodi anna_etunimi palauttaa henkilön etunimen ja metodi anna_sukunimi vastaavasti henkilön sukunimen.

Voit olettaa metodeissa, että konstruktroissa annetussa nimessä on etu- ja sukunimi välilyönnillä erotettuna eikä muita nimiä.

Esimerkki luokan käytöstä:

if __name__ == \"__main__\":\n    pekka = Henkilo(\"Pekka Python\")\n    print(pekka.anna_etunimi())\n    print(pekka.anna_sukunimi())\n\n    pauli = Henkilo(\"Pauli Pythonen\")\n    print(pauli.anna_etunimi())\n    print(pauli.anna_sukunimi())

Pekka\nPython\nPauli\nPythonen

Tässä tehtävässä toteutetaan olio-ohjelmointia hyödyntäen samantapainen käyttäjän syöttämiä lukuja käsittelevä ohjelma kuin Ohjelmoinnin perusteiden osan 2 lopussa.

Lukujen määrä

Tee luokka Lukutilasto, joka tuntee seuraavat toiminnot:

    \n
  • metodi lisaa_luku lisää uuden luvun tilastoon
  • \n
  • metodi lukujen_maara kertoo lisättyjen lukujen määrän
  • \n

Luokan ei tarvitse tallentaa mihinkään lisättyjä lukuja vaan riittää, että se muistaa niiden määrän. Metodin lisaa_luku ei tässä vaiheessa tarvitse edes ottaa huomioon, mikä luku lisätään tilastoon, koska ainoa tallennettava asia on lukujen määrä.

Luokan runko on seuraava:

class  Lukutilasto:\n    def __init__(self):\n        self.lukuja = 0\n\n    def lisaa_luku(self, luku:int):\n        pass\n\n    def lukujen_maara(self):\n        pass
tilasto = Lukutilasto()\ntilasto.lisaa_luku(3)\ntilasto.lisaa_luku(5)\ntilasto.lisaa_luku(1)\ntilasto.lisaa_luku(2)\nprint(\"Lukujen määrä:\", tilasto.lukujen_maara())

Lukujen määrä: 4

Summa ja keskiarvo

Laajenna luokkaa seuraavilla toiminnoilla:

    \n
  • metodi summa kertoo lisättyjen lukujen summan (tyhjän lukutilaston summa on 0)
  • \n
  • metodi keskiarvo kertoo lisättyjen lukujen keskiarvon (tyhjän lukutilaston keskiarvo on 0)
  • \n
tilasto = Lukutilasto()\ntilasto.lisaa_luku(3)\ntilasto.lisaa_luku(5)\ntilasto.lisaa_luku(1)\ntilasto.lisaa_luku(2)\nprint(\"Lukujen määrä:\", tilasto.lukujen_maara())\nprint(\"Summa:\", tilasto.summa())\nprint(\"Keskiarvo:\", tilasto.keskiarvo())

Määrä: 4\nSumma: 11\nKeskiarvo: 2.75

Summa käyttäjältä

Tee ohjelma, joka kysyy lukuja käyttäjältä, kunnes käyttäjä antaa luvun -1. Sitten ohjelma ilmoittaa lukujen summan.

Ohjelmassa tulee käyttää Lukutilasto-oliota summan laskemiseen.

HUOM: Älä muuta tässä osassa luokkaa Lukutilasto, vaan toteuta sitä hyödyntäen summan laskemiseen käytetty ohjelma.

HUOM2: Älä kirjoita pääohjelmaa if __name__ == \"__main__\"-lohkon sisään, jotta testit toimivat!

Anna lukuja:\n4\n2\n5\n2\n-1\nSumma: 13\nKeskiarvo: 3.25

Monta summaa

Muuta edellistä ohjelmaa niin, että ohjelma laskee myös parillisten ja parittomien lukujen summaa.

HUOM: Älä edelleenkään muuta luokkaa Lukutilasto, vaan määrittele ohjelmassa kolme Lukutilasto-oliota. Laske ensimmäisen avulla kaikkien lukujen summa ja keskiarvo, toisen avulla parillisten lukujen summa ja kolmannen avulla parittomien lukujen summa.

HUOM2: Älä kirjoita pääohjelmaa if __name__ == \"__main__\"-lohkon sisään, jotta testit toimivat!

Ohjelman tulee toimia seuraavasti:

Anna lukuja:\n4\n2\n5\n2\n-1\nSumma: 13\nKeskiarvo: 3.25\nParillisten summa: 8\nParittomien summa: 5

","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-8/4-metodit-omissa-luokissa.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten metodit toimivat luokissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat kirjoittaa metodeita omiin luokkiin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ymmärrät, mitä tarkoitetaan kapseloinnilla ja asiakkaalla olio-ohjelmoinnissa"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vain attribuutteja sisältävät luokat eivät käytännössä eroa juurikaan sanakirjoista. Seuraavassa esimerkissä on esitetty pankkitiliä mallintava rakenne sekä oman luokan että sanakirjan avulla toteutettuna:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Esimerkki omaa luokkaa käyttäen"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilinumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" omistaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vuosikorko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tilinumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tilinumero\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" omistaja\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vuosikorko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" vuosikorko\n\npekan_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345-678\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1500.0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.015"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Esimerkki sanakirjaa käyttäen"}]},{"type":"text","value":"\npekan_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"tilinumero\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345-678\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"omistaja\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"saldo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1500.0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"vuosikorko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanakirjaa käyttäen rakenteen toteutus on huomattavasti suoraviivaisempi ja koodi on lyhyempi. Luokan hyötynä tässä tapauksessa on, että se määrittelee rakenteen \"tiukemmin\", jolloin kaikki luokasta muodostetut oliot ovat rakenteeltaan samanlaisia. Luokka on lisäksi nimetty: oliota muodostaessa viitataan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"text","value":"-luokkaan ja olion tyyppi on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"text","value":" eikä sanakirja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokilla on lisäksi etuna, että niihin voidaan lisätä attribuuttien lisäksi myös toiminnallisuutta. Yksi olio-ohjelmoinnin periaatteista onkin, että olioon on yhdistetty sekä tallennettavat tiedot että operaatiot, joilla tietoa voidaan käsitellä."}]},{"type":"element","tagName":"h2","properties":{"id":"metodit-luokissa","style":"position:relative;"},"children":[{"type":"text","value":"Metodit luokissa"},{"type":"element","tagName":"a","properties":{"href":"#metodit-luokissa","ariaLabel":"metodit luokissa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi tarkoittaa luokkaan sidottua aliohjelmaa. Yleensä metodin toiminta kohdistuu vain yhteen olioon. Metodi kirjoitetaan luokan sisälle, ja se voi käsitellä attribuutteja kuten mitä tahansa muuttujia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Katsotaan esimerkkinä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"text","value":"-luokan metodia, joka lisää koron pankkitilille:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilinumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" omistaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vuosikorko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tilinumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tilinumero\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" omistaja\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vuosikorko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" vuosikorko\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodi lisää koron tilin saldoon"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_korko"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vuosikorko\n\n\npekan_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345-678\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1500.0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.015"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_korko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1522.5"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_korko"}]},{"type":"text","value":" kertoo olion saldon vuosikorkoprosentilla ja lisää tuloksen nykyiseen saldoon. Metodin toiminta kohdistuu siihen olioon, jonka kautta sitä kutsutaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Katsotaan vielä toinen esimerkki, jossa luokasta on muodostettu useampi olio:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luokka Pankkitili on määritelty edellisessä esimerkissä"}]},{"type":"text","value":"\n\npekan_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345-678\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1500.0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.015"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npirjon_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"99999-999\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pirjo Pythonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1500.0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.05"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npaulin_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1111-222\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pauli Paulinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1500.0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.001"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Lisätään korko Pekalle ja Pirjolle, mutta ei Paulille"}]},{"type":"text","value":"\npekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_korko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npirjon_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_korko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan kaikki"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pirjon_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"paulin_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"1522.5\n1575.0\n1500.0"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Korko lisätään vain siihen tiliin, jonka kautta metodia kutsutaan. Esimerkistä huomataan, että Pekalle ja Pirjolle lisätään eri korkoprosentit ja Paulin tilin saldo ei muutu ollenkaan, koska olion "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"paulin_tili"}]},{"type":"text","value":" kautta ei kutsuta metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_korko"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"h2","properties":{"id":"kapselointi","style":"position:relative;"},"children":[{"type":"text","value":"Kapselointi"},{"type":"element","tagName":"a","properties":{"href":"#kapselointi","ariaLabel":"kapselointi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olio-ohjelmoinnin yhteydessä puhutaan usein olioiden "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"asiakkaista"}]},{"type":"text","value":". Asiakkaalla (client) tarkoitetaan koodin osaa, joka muodostaa olion ja käyttää sen palveluita kutsumalla metodeita. Kun olion tietosisältöä käsitellään vain olion tarjoamien metodien avulla, voidaan varmistua siitä, että olion "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"sisäinen eheys"}]},{"type":"text","value":" säilyy. Käytännössä tämä tarkoittaa esimerkiksi sitä, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"text","value":"-luokassa tarjotaan metodi, jolla tililtä nostetaan rahaa, sen sijaan, että asiakas käsittelisi suoraan attribuuttia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"saldo"}]},{"type":"text","value":". Tässä metodissa voidaan sitten esimerkiksi varmistaa, ettei tililtä nosteta katetta enempää rahaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilinumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" omistaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vuosikorko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tilinumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tilinumero\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" omistaja\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vuosikorko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" vuosikorko\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodi lisää koron tilin saldoon"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_korko"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vuosikorko\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodilla \"nostetaan\" tililtä rahaa"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodi palauttaa true, jos nosto onnistuu, muuten False"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"nosto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nostosumma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nostosumma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" nostosumma\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n\npekan_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345-678\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1500.0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.015"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nosto onnistui, tilin saldo on nyt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nosto ei onnistunut, rahaa ei ole tarpeeksi.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Yritetään uudestaan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nosto onnistui, tilin saldo on nyt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nosto ei onnistunut, rahaa ei ole tarpeeksi.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nosto onnistui, tilin saldo on nyt 500.0\nNosto ei onnistunut, rahaa ei ole tarpeeksi."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olion sisäisen eheyden säilyttämistä ja sopivien metodien tarjoamista asiakkaalle kutsutaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kapseloinniksi"}]},{"type":"text","value":". Tämä tarkoittaa, että olion toteutus piilotetaan asiakkaalta ja olio tarjoaa ulkopuolelle metodit, joiden avulla tietoja voi käsitellä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pelkkä metodin lisäys ei kuitenkaan piilota attribuuttia: vaikka luokkaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"text","value":" onkin lisätty metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nosto"}]},{"type":"text","value":" rahan nostamiseksi, asiakas voi edelleen muokata "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"saldo"}]},{"type":"text","value":"-attribuutin arvoa suoraan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"pekan_tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345-678\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1500.0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.015"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Yritetään nostaa 2000"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nosto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nosto onnistui, tilin saldo on nyt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nosto ei onnistunut, rahaa ei ole tarpeeksi.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Nostetaan \"väkisin\" 2000"}]},{"type":"text","value":"\n pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2000"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Saldo nyt:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pekan_tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ongelma voidaan ainakin osittain ratkaista piilottamalla attribuutit asiakkaalta. Käytännön toteutukseen palataan tarkemmin ensi viikolla."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Vähenevä laskuri","tmcname":"osa08-10_vaheneva_laskuri"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä on useampi osa. Jokainen osa vastaa yhtä tehtäväpistettä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjan mukana tulee osittain valmiiksi toteutettu luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"VahenevaLaskuri"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"VahenevaLaskuri"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvo_alussa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" arvo_alussa\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta_arvo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"arvo:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"vahenna"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ja tänne muut metodit"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkaa käytetään seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"laskuri "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" VahenevaLaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vahenna"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vahenna"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"arvo: 10\narvo: 9\narvo: 8"}]}]},{"type":"element","tagName":"h3","properties":{"id":"laskurin-vahentaminen","style":"position:relative;"},"children":[{"type":"text","value":"Laskurin vähentäminen"},{"type":"element","tagName":"a","properties":{"href":"#laskurin-vahentaminen","ariaLabel":"laskurin vahentaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Täydennä luokan runkoon metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vahenna"}]},{"type":"text","value":" toteutus sellaiseksi, että se vähentää kutsuttavan olion oliomuuttujan arvoa yhdellä. Kun olet toteuttanut metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vahenna"}]},{"type":"text","value":", äskeisen pääohjelman tulee toimia esimerkkitulosteen mukaan."}]},{"type":"element","tagName":"h3","properties":{"id":"laskurin-arvo-ei-saa-olla-negatiivinen","style":"position:relative;"},"children":[{"type":"text","value":"Laskurin arvo ei saa olla negatiivinen"},{"type":"element","tagName":"a","properties":{"href":"#laskurin-arvo-ei-saa-olla-negatiivinen","ariaLabel":"laskurin arvo ei saa olla negatiivinen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Täydennä metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vahenna"}]},{"type":"text","value":" toteutus sellaiseksi, ettei laskurin arvo mene koskaan negatiiviseksi: jos laskurin arvo on jo 0, sitä ei enää vähennetä."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"laskuri "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" VahenevaLaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vahenna"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vahenna"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vahenna"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"arvo: 2\narvo: 1\narvo: 0\narvo: 0"}]}]},{"type":"element","tagName":"h3","properties":{"id":"laskurin-arvon-nollaus","style":"position:relative;"},"children":[{"type":"text","value":"Laskurin arvon nollaus"},{"type":"element","tagName":"a","properties":{"href":"#laskurin-arvon-nollaus","ariaLabel":"laskurin arvon nollaus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee laskurille metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nollaa"}]},{"type":"text","value":", joka nollaa laskurin arvon:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"laskuri "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" VahenevaLaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nollaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"arvo: 100\narvo: 0"}]}]},{"type":"element","tagName":"h3","properties":{"id":"alkuperaisen-arvon-palautus","style":"position:relative;"},"children":[{"type":"text","value":"Alkuperäisen arvon palautus"},{"type":"element","tagName":"a","properties":{"href":"#alkuperaisen-arvon-palautus","ariaLabel":"alkuperaisen arvon palautus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee laskurille metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"palauta_alkuperainen_arvo()"}]},{"type":"text","value":" joka palauttaa laskurille sen alkuperäisen arvon:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"laskuri "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" VahenevaLaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"55"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vahenna"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vahenna"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vahenna"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vahenna"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"palauta_alkuperainen_arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlaskuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_arvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"arvo: 51\narvo: 55"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan vielä esimerkkiä luokasta, joka mallintaa pelaajan ennätystulosta. Luokkaan on kirjoitettu erilliset metodit, joilla voidaan tarkastaa, ovatko annetut parametrit sopivia. Metodeja kutsutaan heti konstruktorissa. Näin varmistetaan luotavan olion sisäinen eheys."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" date\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Ennatystulos"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kuukausi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Oletusarvot"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paivamaara "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1900"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi_ok"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pelaaja\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pvm_ok"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kuukausi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paivamaara "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kuukausi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisteet_ok"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pisteet\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Apumetodit, joilla tarkistetaan ovatko syötteet ok"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"nimi_ok"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Nimessä vähintään kaksi merkkiä"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pvm_ok"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kuukausi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"try"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kuukausi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" paiva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"except"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Poikkeus, jos yritetään muodostaa epäkelpo päivämäärä"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pisteet_ok"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" pisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n tulos1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Ennatystulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"235"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paivamaara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Epäkelpo arvo päivämäärälle"}]},{"type":"text","value":"\n tulos2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Ennatystulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Piia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"13"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2019"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4555"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tulos2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paivamaara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostaa oletusarvon 1900-01-01"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"235\nPekka\n2020-11-01\n4555\nPiia\n1900-01-01"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkistä huomataan, että myös olion omiin metodeihin pitää viitata "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":"-määreen avulla, kun niitä kutsutaan konstruktorista. Luokkiin voidaan kirjoittaa myös "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"staattisia metodeita"}]},{"type":"text","value":" eli metodeja, joita voidaan kutsua ilman, että luokasta muodostetaan oliota. Tähän palataan kuitenkin tarkemmin ensi viikolla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Määrettä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":" käytetään kuitenkin vain silloin, kun viitataan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"olion piirteisiin"}]},{"type":"text","value":" (eli metodeihin tai olion attribuutteihin). Olion metodeissa voidaan käyttää myös paikallisia muuttujia. Tämä on suositeltavaa, jos muuttujaan ei ole tarvetta viitata metodin ulkopuolella."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Paikallinen muuttuja määritellään ilman "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":"-määrettä - eli samoin kuin esimerkiksi kaikki muuttujat kurssin ensimmäisellä puoliskolla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Bonuskortti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_bonus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Nyt muuttuja bonus on paikallinen muuttuja,"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# eikä olion attribuutti - siihen siis ei voi"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# viitata olion kautta"}]},{"type":"text","value":"\n bonus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.25"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" bonus\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_superbonus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Myös muuttuja superbonus on paikallinen muuttuja"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Yleensä apumuuttujina käytetään paikallisia"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# muuttujia, koska niihin ei ole tarvetta"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# viitatata muissa metodeissa tai olion kautta"}]},{"type":"text","value":"\n superbonus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.5"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" superbonus\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Bonuskortti(nimi="}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", saldo="}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Etu- ja sukunimi","tmcname":"osa08-10b_etu_ja_sukunimi"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"text","value":", jolla on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ainoastaan yksi attribuutti"}]},{"type":"text","value":" "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":", joka asetetaan konstruktorissa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisäksi luokalle tule kirjoitaa kaksi metodia:"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"anna_etunimi"}]},{"type":"text","value":" palauttaa henkilön etunimen ja metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"anna_sukunimi"}]},{"type":"text","value":" vastaavasti henkilön sukunimen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Voit olettaa metodeissa, että konstruktroissa annetussa nimessä on etu- ja sukunimi välilyönnillä erotettuna eikä muita nimiä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki luokan käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n pekka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"anna_etunimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"anna_sukunimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n pauli "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pauli Pythonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pauli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"anna_etunimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pauli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"anna_sukunimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka\nPython\nPauli\nPythonen"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Lukutilasto","tmcname":"osa08-11_lukutilasto"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä toteutetaan olio-ohjelmointia hyödyntäen samantapainen käyttäjän syöttämiä lukuja käsittelevä ohjelma kuin Ohjelmoinnin perusteiden "},{"type":"element","tagName":"a","properties":{"href":"/osa-2/4-yksinkertainen-silmukka#programming-exercise-lukujen-kasittelya"},"children":[{"type":"text","value":"osan 2 lopussa"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"h3","properties":{"id":"lukujen-maara","style":"position:relative;"},"children":[{"type":"text","value":"Lukujen määrä"},{"type":"element","tagName":"a","properties":{"href":"#lukujen-maara","ariaLabel":"lukujen maara permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lukutilasto"}]},{"type":"text","value":", joka tuntee seuraavat toiminnot:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_luku"}]},{"type":"text","value":" lisää uuden luvun tilastoon"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lukujen_maara"}]},{"type":"text","value":" kertoo lisättyjen lukujen määrän"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokan ei tarvitse tallentaa mihinkään lisättyjä lukuja vaan riittää, että se muistaa niiden määrän. Metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_luku"}]},{"type":"text","value":" ei tässä vaiheessa tarvitse edes ottaa huomioon, mikä luku lisätään tilastoon, koska ainoa tallennettava asia on lukujen määrä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokan runko on seuraava:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Lukutilasto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lukuja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_luku"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lukujen_maara"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tilasto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Lukutilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lukujen määrä:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lukujen_maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lukujen määrä: 4"}]}]},{"type":"element","tagName":"h3","properties":{"id":"summa-ja-keskiarvo","style":"position:relative;"},"children":[{"type":"text","value":"Summa ja keskiarvo"},{"type":"element","tagName":"a","properties":{"href":"#summa-ja-keskiarvo","ariaLabel":"summa ja keskiarvo permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajenna luokkaa seuraavilla toiminnoilla:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"summa"}]},{"type":"text","value":" kertoo lisättyjen lukujen summan (tyhjän lukutilaston summa on 0)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"keskiarvo"}]},{"type":"text","value":" kertoo lisättyjen lukujen keskiarvon (tyhjän lukutilaston keskiarvo on 0)"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tilasto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Lukutilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_luku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lukujen määrä:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lukujen_maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Summa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Keskiarvo:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"keskiarvo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Määrä: 4\nSumma: 11\nKeskiarvo: 2.75"}]}]},{"type":"element","tagName":"h3","properties":{"id":"summa-kayttajalta","style":"position:relative;"},"children":[{"type":"text","value":"Summa käyttäjältä"},{"type":"element","tagName":"a","properties":{"href":"#summa-kayttajalta","ariaLabel":"summa kayttajalta permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelma, joka kysyy lukuja käyttäjältä, kunnes käyttäjä antaa luvun -1. Sitten ohjelma ilmoittaa lukujen summan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelmassa tulee käyttää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lukutilasto"}]},{"type":"text","value":"-oliota summan laskemiseen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"HUOM: Älä muuta tässä osassa luokkaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lukutilasto"}]},{"type":"text","value":", vaan toteuta sitä hyödyntäen summan laskemiseen käytetty ohjelma."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"HUOM2: Älä kirjoita pääohjelmaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkon sisään, jotta testit toimivat!"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lukuja:\n"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-1"}]},{"type":"text","value":"\nSumma: 13\nKeskiarvo: 3.25"}]}]},{"type":"element","tagName":"h3","properties":{"id":"monta-summaa","style":"position:relative;"},"children":[{"type":"text","value":"Monta summaa"},{"type":"element","tagName":"a","properties":{"href":"#monta-summaa","ariaLabel":"monta summaa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuta edellistä ohjelmaa niin, että ohjelma laskee myös parillisten ja parittomien lukujen summaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"HUOM: Älä edelleenkään muuta luokkaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lukutilasto"}]},{"type":"text","value":", vaan määrittele ohjelmassa kolme "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lukutilasto"}]},{"type":"text","value":"-oliota. Laske ensimmäisen avulla kaikkien lukujen summa ja keskiarvo, toisen avulla parillisten lukujen summa ja kolmannen avulla parittomien lukujen summa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"HUOM2: Älä kirjoita pääohjelmaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if __name__ == \"__main__\""}]},{"type":"text","value":"-lohkon sisään, jotta testit toimivat!"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulee toimia seuraavasti:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anna lukuja:\n"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-1"}]},{"type":"text","value":"\nSumma: 13\nKeskiarvo: 3.25\nParillisten summa: 8\nParittomien summa: 5"}]}]}]}]},"html":"

Tämän osion jälkeen:

    \n
  • Tiedät, miten metodit toimivat luokissa
  • \n
  • Osaat kirjoittaa metodeita omiin luokkiin
  • \n
  • Ymmärrät, mitä tarkoitetaan kapseloinnilla ja asiakkaalla olio-ohjelmoinnissa
  • \n

Vain attribuutteja sisältävät luokat eivät käytännössä eroa juurikaan sanakirjoista. Seuraavassa esimerkissä on esitetty pankkitiliä mallintava rakenne sekä oman luokan että sanakirjan avulla toteutettuna:

# Esimerkki omaa luokkaa käyttäen\nclass Pankkitili:\n\n    def __init__(self, tilinumero: str, omistaja: str, saldo: float, vuosikorko: float):\n        self.tilinumero = tilinumero\n        self.omistaja = omistaja\n        self.saldo = saldo\n        self.vuosikorko = vuosikorko\n\npekan_tili = Pankkitili(\"12345-678\", \"Pekka Python\", 1500.0, 0.015)
# Esimerkki sanakirjaa käyttäen\npekan_tili = {\"tilinumero\": \"12345-678\", \"omistaja\": \"Pekka Python\", \"saldo\": 1500.0, \"vuosikorko\": 0.0}

Sanakirjaa käyttäen rakenteen toteutus on huomattavasti suoraviivaisempi ja koodi on lyhyempi. Luokan hyötynä tässä tapauksessa on, että se määrittelee rakenteen \"tiukemmin\", jolloin kaikki luokasta muodostetut oliot ovat rakenteeltaan samanlaisia. Luokka on lisäksi nimetty: oliota muodostaessa viitataan Pankkitili-luokkaan ja olion tyyppi on Pankkitili eikä sanakirja.

Luokilla on lisäksi etuna, että niihin voidaan lisätä attribuuttien lisäksi myös toiminnallisuutta. Yksi olio-ohjelmoinnin periaatteista onkin, että olioon on yhdistetty sekä tallennettavat tiedot että operaatiot, joilla tietoa voidaan käsitellä.

Metodit luokissa

Metodi tarkoittaa luokkaan sidottua aliohjelmaa. Yleensä metodin toiminta kohdistuu vain yhteen olioon. Metodi kirjoitetaan luokan sisälle, ja se voi käsitellä attribuutteja kuten mitä tahansa muuttujia.

Katsotaan esimerkkinä Pankkitili-luokan metodia, joka lisää koron pankkitilille:

class Pankkitili:\n\n    def __init__(self, tilinumero: str, omistaja: str, saldo: float, vuosikorko: float):\n        self.tilinumero = tilinumero\n        self.omistaja = omistaja\n        self.saldo = saldo\n        self.vuosikorko = vuosikorko\n\n    # Metodi lisää koron tilin saldoon\n    def lisaa_korko(self):\n        self.saldo += self.saldo * self.vuosikorko\n\n\npekan_tili = Pankkitili(\"12345-678\", \"Pekka Python\", 1500.0, 0.015)\npekan_tili.lisaa_korko()\nprint(pekan_tili.saldo)

1522.5

Metodi lisaa_korko kertoo olion saldon vuosikorkoprosentilla ja lisää tuloksen nykyiseen saldoon. Metodin toiminta kohdistuu siihen olioon, jonka kautta sitä kutsutaan.

Katsotaan vielä toinen esimerkki, jossa luokasta on muodostettu useampi olio:

# Luokka Pankkitili on määritelty edellisessä esimerkissä\n\npekan_tili = Pankkitili(\"12345-678\", \"Pekka Python\", 1500.0, 0.015)\npirjon_tili = Pankkitili(\"99999-999\", \"Pirjo Pythonen\", 1500.0, 0.05)\npaulin_tili = Pankkitili(\"1111-222\", \"Pauli Paulinen\", 1500.0, 0.001)\n\n# Lisätään korko Pekalle ja Pirjolle, mutta ei Paulille\npekan_tili.lisaa_korko()\npirjon_tili.lisaa_korko()\n\n# Tulostetaan kaikki\nprint(pekan_tili.saldo)\nprint(pirjon_tili.saldo)\nprint(paulin_tili.saldo)

1522.5\n1575.0\n1500.0

Korko lisätään vain siihen tiliin, jonka kautta metodia kutsutaan. Esimerkistä huomataan, että Pekalle ja Pirjolle lisätään eri korkoprosentit ja Paulin tilin saldo ei muutu ollenkaan, koska olion paulin_tili kautta ei kutsuta metodia lisaa_korko.

Kapselointi

Olio-ohjelmoinnin yhteydessä puhutaan usein olioiden asiakkaista. Asiakkaalla (client) tarkoitetaan koodin osaa, joka muodostaa olion ja käyttää sen palveluita kutsumalla metodeita. Kun olion tietosisältöä käsitellään vain olion tarjoamien metodien avulla, voidaan varmistua siitä, että olion sisäinen eheys säilyy. Käytännössä tämä tarkoittaa esimerkiksi sitä, että Pankkitili-luokassa tarjotaan metodi, jolla tililtä nostetaan rahaa, sen sijaan, että asiakas käsittelisi suoraan attribuuttia saldo. Tässä metodissa voidaan sitten esimerkiksi varmistaa, ettei tililtä nosteta katetta enempää rahaa.

Esimerkiksi:

class Pankkitili:\n\n    def __init__(self, tilinumero: str, omistaja: str, saldo: float, vuosikorko: float):\n        self.tilinumero = tilinumero\n        self.omistaja = omistaja\n        self.saldo = saldo\n        self.vuosikorko = vuosikorko\n\n    # Metodi lisää koron tilin saldoon\n    def lisaa_korko(self):\n        self.saldo += self.saldo * self.vuosikorko\n\n    # Metodilla \"nostetaan\" tililtä rahaa\n    # Metodi palauttaa true, jos nosto onnistuu, muuten False\n    def nosto(self, nostosumma: float):\n        if nostosumma <= self.saldo:\n            self.saldo -= nostosumma\n            return True\n\n        return False\n\npekan_tili = Pankkitili(\"12345-678\", \"Pekka Python\", 1500.0, 0.015)\n\nif pekan_tili.nosto(1000):\n    print(\"Nosto onnistui, tilin saldo on nyt\", pekan_tili.saldo)\nelse:\n    print(\"Nosto ei onnistunut, rahaa ei ole tarpeeksi.\")\n\n# Yritetään uudestaan\nif pekan_tili.nosto(1000):\n    print(\"Nosto onnistui, tilin saldo on nyt\", pekan_tili.saldo)\nelse:\n    print(\"Nosto ei onnistunut, rahaa ei ole tarpeeksi.\")

Nosto onnistui, tilin saldo on nyt 500.0\nNosto ei onnistunut, rahaa ei ole tarpeeksi.

Olion sisäisen eheyden säilyttämistä ja sopivien metodien tarjoamista asiakkaalle kutsutaan kapseloinniksi. Tämä tarkoittaa, että olion toteutus piilotetaan asiakkaalta ja olio tarjoaa ulkopuolelle metodit, joiden avulla tietoja voi käsitellä.

Pelkkä metodin lisäys ei kuitenkaan piilota attribuuttia: vaikka luokkaan Pankkitili onkin lisätty metodi nosto rahan nostamiseksi, asiakas voi edelleen muokata saldo-attribuutin arvoa suoraan:

pekan_tili = Pankkitili(\"12345-678\", \"Pekka Python\", 1500.0, 0.015)\n\n# Yritetään nostaa 2000\nif pekan_tili.nosto(2000):\n    print(\"Nosto onnistui, tilin saldo on nyt\", pekan_tili.saldo)\nelse:\n    print(\"Nosto ei onnistunut, rahaa ei ole tarpeeksi.\")\n\n    # Nostetaan \"väkisin\" 2000\n    pekan_tili.saldo -= 2000\n\nprint(\"Saldo nyt:\", pekan_tili.saldo)

Ongelma voidaan ainakin osittain ratkaista piilottamalla attribuutit asiakkaalta. Käytännön toteutukseen palataan tarkemmin ensi viikolla.

Tässä tehtävässä on useampi osa. Jokainen osa vastaa yhtä tehtäväpistettä.

Tehtäväpohjan mukana tulee osittain valmiiksi toteutettu luokka VahenevaLaskuri:

class VahenevaLaskuri:\n    def __init__(self, arvo_alussa: int):\n        self.arvo = arvo_alussa\n\n    def tulosta_arvo(self):\n        print(\"arvo:\", self.arvo)\n\n    def vahenna(self):\n        pass\n\n    # ja tänne muut metodit

Luokkaa käytetään seuraavasti

laskuri = VahenevaLaskuri(10)\nlaskuri.tulosta_arvo()\nlaskuri.vahenna()\nlaskuri.tulosta_arvo()\nlaskuri.vahenna()\nlaskuri.tulosta_arvo()

arvo: 10\narvo: 9\narvo: 8

Laskurin vähentäminen

Täydennä luokan runkoon metodin vahenna toteutus sellaiseksi, että se vähentää kutsuttavan olion oliomuuttujan arvoa yhdellä. Kun olet toteuttanut metodin vahenna, äskeisen pääohjelman tulee toimia esimerkkitulosteen mukaan.

Laskurin arvo ei saa olla negatiivinen

Täydennä metodin vahenna toteutus sellaiseksi, ettei laskurin arvo mene koskaan negatiiviseksi: jos laskurin arvo on jo 0, sitä ei enää vähennetä.

laskuri = VahenevaLaskuri(2)\nlaskuri.tulosta_arvo()\nlaskuri.vahenna()\nlaskuri.tulosta_arvo()\nlaskuri.vahenna()\nlaskuri.tulosta_arvo()\nlaskuri.vahenna()\nlaskuri.tulosta_arvo()

arvo: 2\narvo: 1\narvo: 0\narvo: 0

Laskurin arvon nollaus

Tee laskurille metodi nollaa, joka nollaa laskurin arvon:

laskuri = VahenevaLaskuri(100)\nlaskuri.tulosta_arvo()\nlaskuri.nollaa()\nlaskuri.tulosta_arvo()

arvo: 100\narvo: 0

Alkuperäisen arvon palautus

Tee laskurille metodi palauta_alkuperainen_arvo() joka palauttaa laskurille sen alkuperäisen arvon:

laskuri = VahenevaLaskuri(55)\nlaskuri.vahenna()\nlaskuri.vahenna()\nlaskuri.vahenna()\nlaskuri.vahenna()\nlaskuri.tulosta_arvo()\nlaskuri.palauta_alkuperainen_arvo()\nlaskuri.tulosta_arvo()

arvo: 51\narvo: 55

Tarkastellaan vielä esimerkkiä luokasta, joka mallintaa pelaajan ennätystulosta. Luokkaan on kirjoitettu erilliset metodit, joilla voidaan tarkastaa, ovatko annetut parametrit sopivia. Metodeja kutsutaan heti konstruktorissa. Näin varmistetaan luotavan olion sisäinen eheys.

from datetime import date\n\nclass Ennatystulos:\n\n    def __init__(self, pelaaja: str, paiva: int, kuukausi: int, vuosi: int, pisteet: int):\n        # Oletusarvot\n        self.pelaaja = \"\"\n        self.paivamaara = date(1900, 1, 1)\n        self.pisteet = 0\n\n        if self.nimi_ok(pelaaja):\n            self.pelaaja = pelaaja\n\n        if self.pvm_ok(paiva, kuukausi, vuosi):\n            self.paivamaara = date(vuosi, kuukausi, paiva)\n\n        if self.pisteet_ok(pisteet):\n            self.pisteet = pisteet\n\n    # Apumetodit, joilla tarkistetaan ovatko syötteet ok\n    def nimi_ok(self, nimi: str):\n        return len(nimi) >= 2 # Nimessä vähintään kaksi merkkiä\n\n    def pvm_ok(self, paiva, kuukausi, vuosi):\n        try:\n            date(vuosi, kuukausi, paiva)\n            return True\n        except:\n            # Poikkeus, jos yritetään muodostaa epäkelpo päivämäärä\n            return False\n\n    def pisteet_ok(self, pisteet):\n        return pisteet >= 0\n\nif __name__ == \"__main__\":\n    tulos1 = Ennatystulos(\"Pekka\", 1, 11, 2020, 235)\n    print(tulos1.pisteet)\n    print(tulos1.pelaaja)\n    print(tulos1.paivamaara)\n\n    # Epäkelpo arvo päivämäärälle\n    tulos2 = Ennatystulos(\"Piia\", 4, 13, 2019, 4555)\n    print(tulos2.pisteet)\n    print(tulos2.pelaaja)\n    print(tulos2.paivamaara) # Tulostaa oletusarvon 1900-01-01

235\nPekka\n2020-11-01\n4555\nPiia\n1900-01-01

Esimerkistä huomataan, että myös olion omiin metodeihin pitää viitata self-määreen avulla, kun niitä kutsutaan konstruktorista. Luokkiin voidaan kirjoittaa myös staattisia metodeita eli metodeja, joita voidaan kutsua ilman, että luokasta muodostetaan oliota. Tähän palataan kuitenkin tarkemmin ensi viikolla.

Määrettä self käytetään kuitenkin vain silloin, kun viitataan olion piirteisiin (eli metodeihin tai olion attribuutteihin). Olion metodeissa voidaan käyttää myös paikallisia muuttujia. Tämä on suositeltavaa, jos muuttujaan ei ole tarvetta viitata metodin ulkopuolella.

Paikallinen muuttuja määritellään ilman self-määrettä - eli samoin kuin esimerkiksi kaikki muuttujat kurssin ensimmäisellä puoliskolla.

Esimerkiksi

class Bonuskortti:\n    def __init__(self, nimi: str, saldo: float):\n        self.nimi = nimi\n        self.saldo = saldo\n\n    def lisaa_bonus(self):\n        # Nyt muuttuja bonus on paikallinen muuttuja,\n        # eikä olion attribuutti - siihen siis ei voi\n        # viitata olion kautta\n        bonus = self.saldo * 0.25\n        self.saldo += bonus\n\n    def lisaa_superbonus(self):\n        # Myös muuttuja superbonus on paikallinen muuttuja\n        # Yleensä apumuuttujina käytetään paikallisia\n        # muuttujia, koska niihin ei ole tarvetta\n        # viitatata muissa metodeissa tai olion kautta\n        superbonus = self.saldo * 0.5\n        self.saldo += superbonus\n\n    def __str__(self):\n        return f\"Bonuskortti(nimi={self.nimi}, saldo={self.saldo})\"

Kirjoita luokka Henkilo, jolla on ainoastaan yksi attribuutti nimi, joka asetetaan konstruktorissa.

Lisäksi luokalle tule kirjoitaa kaksi metodia:

Metodi anna_etunimi palauttaa henkilön etunimen ja metodi anna_sukunimi vastaavasti henkilön sukunimen.

Voit olettaa metodeissa, että konstruktroissa annetussa nimessä on etu- ja sukunimi välilyönnillä erotettuna eikä muita nimiä.

Esimerkki luokan käytöstä:

if __name__ == \"__main__\":\n    pekka = Henkilo(\"Pekka Python\")\n    print(pekka.anna_etunimi())\n    print(pekka.anna_sukunimi())\n\n    pauli = Henkilo(\"Pauli Pythonen\")\n    print(pauli.anna_etunimi())\n    print(pauli.anna_sukunimi())

Pekka\nPython\nPauli\nPythonen

Tässä tehtävässä toteutetaan olio-ohjelmointia hyödyntäen samantapainen käyttäjän syöttämiä lukuja käsittelevä ohjelma kuin Ohjelmoinnin perusteiden osan 2 lopussa.

Lukujen määrä

Tee luokka Lukutilasto, joka tuntee seuraavat toiminnot:

    \n
  • metodi lisaa_luku lisää uuden luvun tilastoon
  • \n
  • metodi lukujen_maara kertoo lisättyjen lukujen määrän
  • \n

Luokan ei tarvitse tallentaa mihinkään lisättyjä lukuja vaan riittää, että se muistaa niiden määrän. Metodin lisaa_luku ei tässä vaiheessa tarvitse edes ottaa huomioon, mikä luku lisätään tilastoon, koska ainoa tallennettava asia on lukujen määrä.

Luokan runko on seuraava:

class  Lukutilasto:\n    def __init__(self):\n        self.lukuja = 0\n\n    def lisaa_luku(self, luku:int):\n        pass\n\n    def lukujen_maara(self):\n        pass
tilasto = Lukutilasto()\ntilasto.lisaa_luku(3)\ntilasto.lisaa_luku(5)\ntilasto.lisaa_luku(1)\ntilasto.lisaa_luku(2)\nprint(\"Lukujen määrä:\", tilasto.lukujen_maara())

Lukujen määrä: 4

Summa ja keskiarvo

Laajenna luokkaa seuraavilla toiminnoilla:

    \n
  • metodi summa kertoo lisättyjen lukujen summan (tyhjän lukutilaston summa on 0)
  • \n
  • metodi keskiarvo kertoo lisättyjen lukujen keskiarvon (tyhjän lukutilaston keskiarvo on 0)
  • \n
tilasto = Lukutilasto()\ntilasto.lisaa_luku(3)\ntilasto.lisaa_luku(5)\ntilasto.lisaa_luku(1)\ntilasto.lisaa_luku(2)\nprint(\"Lukujen määrä:\", tilasto.lukujen_maara())\nprint(\"Summa:\", tilasto.summa())\nprint(\"Keskiarvo:\", tilasto.keskiarvo())

Määrä: 4\nSumma: 11\nKeskiarvo: 2.75

Summa käyttäjältä

Tee ohjelma, joka kysyy lukuja käyttäjältä, kunnes käyttäjä antaa luvun -1. Sitten ohjelma ilmoittaa lukujen summan.

Ohjelmassa tulee käyttää Lukutilasto-oliota summan laskemiseen.

HUOM: Älä muuta tässä osassa luokkaa Lukutilasto, vaan toteuta sitä hyödyntäen summan laskemiseen käytetty ohjelma.

HUOM2: Älä kirjoita pääohjelmaa if __name__ == \"__main__\"-lohkon sisään, jotta testit toimivat!

Anna lukuja:\n4\n2\n5\n2\n-1\nSumma: 13\nKeskiarvo: 3.25

Monta summaa

Muuta edellistä ohjelmaa niin, että ohjelma laskee myös parillisten ja parittomien lukujen summaa.

HUOM: Älä edelleenkään muuta luokkaa Lukutilasto, vaan määrittele ohjelmassa kolme Lukutilasto-oliota. Laske ensimmäisen avulla kaikkien lukujen summa ja keskiarvo, toisen avulla parillisten lukujen summa ja kolmannen avulla parittomien lukujen summa.

HUOM2: Älä kirjoita pääohjelmaa if __name__ == \"__main__\"-lohkon sisään, jotta testit toimivat!

Ohjelman tulee toimia seuraavasti:

Anna lukuja:\n4\n2\n5\n2\n-1\nSumma: 13\nKeskiarvo: 3.25\nParillisten summa: 8\nParittomien summa: 5

","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-8/4-metodit-omissa-luokissa.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-8/5-lisaa-esimerkkeja/page-data.json b/page-data/osa-8/5-lisaa-esimerkkeja/page-data.json index 17c782ca0..3750990ee 100644 --- a/page-data/osa-8/5-lisaa-esimerkkeja/page-data.json +++ b/page-data/osa-8/5-lisaa-esimerkkeja/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-8/5-lisaa-esimerkkeja", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat luoda aiempaa monipuolisempia luokkia"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat määritellä luokkaan metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"esimerkki-1-luokka-suorakulmio","style":"position:relative;"},"children":[{"type":"text","value":"Esimerkki 1: Luokka Suorakulmio"},{"type":"element","tagName":"a","properties":{"href":"#esimerkki-1-luokka-suorakulmio","ariaLabel":"esimerkki 1 luokka suorakulmio permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan seuraavaksi luokkaa, joka mallintaa suorakulmiota kaksiulotteisessa koordinaatistossa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Suorakulmio"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vasen_ylakulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"tuple"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" oikea_alakulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"tuple"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_ylakulma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" vasen_ylakulma\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_alakulma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" oikea_alakulma\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" oikea_alakulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"vasen_ylakulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" oikea_alakulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"vasen_ylakulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pinta_ala"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"piiri"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"siirra"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" x_muutos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" y_muutos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n kulma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_ylakulma\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_ylakulma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"x_muutos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"y_muutos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kulma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_alakulma\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_alakulma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"x_muutos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"y_muutos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun suorakulmio luodaan, konstruktorille annetaan kaksi tuplea: vasemman yläkulman ja oikean alakulman sijainti (x- ja y-koordinaatit). Konstruktori laskee tämän perusteella suorakulmion leveyden ja korkeuden."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pinta_ala"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"piiri"}]},{"type":"text","value":" laskevat suorakulmion pinta-alan ja piirin korkeuden ja leveyden perusteella. Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"siirra"}]},{"type":"text","value":" puolestaan siirtää suorakulmiota koordinaatistossa annetun verran x- ja y-suunnissa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että suorakulmio esitetään koordinaatistossa, jossa x-koordinaatit kasvavat vasemmalta oikealle ja y-koordinaatit kasvavat ylhäältä alaspäin. Tämä on usein käytetty koordinaatisto ohjelmoinnissa, koska on luontevaa esittää tietokoneen näyttö niin, että vasemman yläkulman x- ja y-koordinaatti on 0."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava koodi testaa luokkaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"suorakulmio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_ylakulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_alakulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"piiri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pinta_ala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsuorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"siirra"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_ylakulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_alakulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"(1, 1)\n(4, 3)\n3\n2\n10\n6\n(4, 4)\n(7, 6)"}]}]},{"type":"element","tagName":"h2","properties":{"id":"olion-tulostaminen","style":"position:relative;"},"children":[{"type":"text","value":"Olion tulostaminen"},{"type":"element","tagName":"a","properties":{"href":"#olion-tulostaminen","ariaLabel":"olion tulostaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun omasta luokasta luotu olio tulostetaan sellaisenaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennolla, lopputulos ei ole kovin selkeä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"suorakulmio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma tulostaa jotain seuraavankaltaista:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"<"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"main"}]},{"type":"text","value":".Suorakulmio object at 0x000002D7BF148A90>"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Järkevämpi tulostus saadaan lisäämällä luokkaan metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":", joka palauttaa ymmärrettävän kuvauksen olion tilasta merkkijonona. Kun tämä metodi on määritelty, metodin palauttama kuvaus oliosta tulee näkyviin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennossa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisätään luokkaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Suorakulmio"}]},{"type":"text","value":" metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Suorakulmio"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luokan muu sisältö tähän kuten ennenkin..."}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodi palauttaa olion tilan merkkijonona"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"suorakulmio "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_ylakulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ... "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_alakulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komento tuottaa luettavan lopputuloksen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"suorakulmio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"suorakulmio (1, 1) ... (4, 3)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":" kutsutaan yleisemmin silloin, kun oliosta muodostetaan merkkijonokuvaus "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"str"}]},{"type":"text","value":"-funktiolla. Seuraava koodi esittelee asiaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"suorakulmio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkuvaus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kuvaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"suorakulmio (1, 1) ... (4, 3)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":" lisäksi olioon voidaan määritellä samantapainen metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__repr__"}]},{"type":"text","value":", joka antaa teknisen kuvauksen olion tilasta. Tutustumme tähän metodiin tarkemmin myöhemmin."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sekuntikello","tmcname":"osa08-11a_sekuntikello"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on mukana luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Sekuntikello"}]},{"type":"text","value":" runko:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Sekuntikello"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sekunnit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"minuutit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajenna luokkaa siten, että se toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kello "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Sekuntikello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3600"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"00:00\n00:01\n00:02\n... tässä välissä monta riviä\n00:59\n01:00\n01:01\n... tässä välissä erittäin monta riviä\n59:58\n59:59\n00:00\n00:01"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tick"}]},{"type":"text","value":" vie siis kelloa sekunnin eteenpäin, ja sekä sekuntien että minuuttien arvo on suuruudeltaan korkeintaan 59. Lisäksi oliossa tulee olla metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":", joka näyttää kellonajan yllä olevassa muodossa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vihje:"}]},{"type":"text","value":" metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tick"}]},{"type":"text","value":" testailua voi helpottaa asettamalla tilapäisesti konstruktorissa sekunneille ja minuuteille valmiiksi jonkin suuremman arvon kuin 0."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kello","tmcname":"osa08-12_kello"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta edellistä tehtävää laajentava luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kello"}]},{"type":"text","value":", joka toimii seuraavaan tapaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kello "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"23"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"59"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"55"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"aseta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"text","value":"\n23:59:55\n23:59:56\n23:59:57\n23:59:58\n23:59:59\n00:00:00\n00:00:01\n12:05:00\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Konstruktori siis antaa kellon tunneille, minuuteille ja sekunneille alkuarvot. Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tick"}]},{"type":"text","value":" vie kelloa sekunnin eteenpäin ja metodilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"aseta"}]},{"type":"text","value":" voi asettaa kellon tunneille ja minuuteille uuden arvon ja "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"nollata sekunnit"}]},{"type":"text","value":"."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Maksukortti","tmcname":"osa08-13_maksukortti"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Helsingin Yliopiston opiskelijaruokaloissa eli Unicafeissa opiskelijat maksavat lounaansa käyttäen maksukorttia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtäväsarjassa tehdään luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Maksukortti"}]},{"type":"text","value":", jonka tarkoituksena on jäljitellä Unicafeissa tapahtuvaa maksutoimintaa."}]},{"type":"element","tagName":"h3","properties":{"id":"luokan-runko","style":"position:relative;"},"children":[{"type":"text","value":"Luokan runko"},{"type":"element","tagName":"a","properties":{"href":"#luokan-runko","ariaLabel":"luokan runko permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelmaan uusi luokka nimeltä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Maksukortti"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ensin luokalle konstruktori, jolle annetaan kortin alkusaldo ja joka tallentaa sen olion sisäiseen muuttujaan. Tee sitten "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":"-metodi, joka palauttaa kortin saldon muodossa \"Kortilla on rahaa X euroa\". Rahamäärä tulee tulostaa yhden desimaalin tarkkuudella."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on luokan Maksukortti runko:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Maksukortti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" alkusaldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" alkusaldo\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käyttöesimerkki"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulisi tuottaa seuraava tulostus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kortilla on rahaa 50.0 euroa"}]}]},{"type":"element","tagName":"h3","properties":{"id":"kortilla-maksaminen","style":"position:relative;"},"children":[{"type":"text","value":"Kortilla maksaminen"},{"type":"element","tagName":"a","properties":{"href":"#kortilla-maksaminen","ariaLabel":"kortilla maksaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Täydennä Maksukortti-luokkaa seuraavilla metodeilla:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"syo_edullisesti"}]},{"type":"text","value":" joka vähentää kortin saldoa 2.60 eurolla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"syo_maukkaasti"}]},{"type":"text","value":" joka vähentää kortin saldoa 4.60 eurolla"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava pääohjelma testaa luokkaa"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_edullisesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_maukkaasti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_edullisesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulisi tuottaa seuraava tulostus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kortilla on rahaa 50.0 euroa\nKortilla on rahaa 47.4 euroa\nKortilla on rahaa 40.2 euroa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että kortin saldo ei saa mennä negatiiviseksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_edullisesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_edullisesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kortilla on rahaa 4.0 euroa\nKortilla on rahaa 1.4 euroa\nKortilla on rahaa 1.4 euroa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eli kortin saldo ei enää vähene jos maksettaessa saldo ei ole riittävä."}]},{"type":"element","tagName":"h3","properties":{"id":"kortin-lataaminen","style":"position:relative;"},"children":[{"type":"text","value":"Kortin lataaminen"},{"type":"element","tagName":"a","properties":{"href":"#kortin-lataaminen","ariaLabel":"kortin lataaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Maksukortti"}]},{"type":"text","value":"-luokkaan metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lataa_rahaa"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodin tarkoituksena on kasvattaa kortin saldoa parametrina annetulla rahamäärällä."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lataa_rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lataa_rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lataa_rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"200"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kortilla on rahaa 10.0 euroa\nKortilla on rahaa 25.0 euroa\nKortilla on rahaa 35.0 euroa\nKortilla on rahaa 235.0 euroa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos kortille yritetään ladata negatiivinen summa, tulee metodin "},{"type":"element","tagName":"a","properties":{"href":"/osa-6/3-virheet#poikkeusten-tuottaminen"},"children":[{"type":"text","value":"tuottaa poikkeus"}]},{"type":"text","value":" "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ValueError"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lataa_rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"File \"testi.py\", line 3, in maksukortti\nValueError: Kortille ei saa ladata negatiivista summaa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huomaa"}]},{"type":"text","value":" että metodin tulee "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tuottaa"}]},{"type":"text","value":" poikkeus, katso "},{"type":"element","tagName":"a","properties":{"href":"/osa-6/3-virheet#poikkeusten-tuottaminen"},"children":[{"type":"text","value":"osan 6"}]},{"type":"text","value":" materiaalista miten poikkeus tuotetaan. Metodi ei missään tilanteessa itse tulosta mitään!"}]},{"type":"element","tagName":"h3","properties":{"id":"monta-korttia","style":"position:relative;"},"children":[{"type":"text","value":"Monta korttia"},{"type":"element","tagName":"a","properties":{"href":"#monta-korttia","ariaLabel":"monta korttia permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee pääohjelma, joka sisältää seuraavan tapahtumasarjan:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Luo Pekan kortti. Kortin alkusaldo on 20 euroa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Luo Matin kortti. Kortin alkusaldo on 30 euroa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Pekka syö maukkaasti"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Matti syö edullisesti"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Korttien arvot tulostetaan (molemmat omalle rivilleen, rivin alkuun kortin omistajan nimi)"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Pekka lataa rahaa 20 euroa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Matti syö maukkaasti"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Korttien arvot tulostetaan (molemmat omalle rivilleen, rivin alkuun kortin omistajan nimi)"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Pekka syö edullisesti"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Pekka syö edullisesti"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Matti lataa rahaa 50 euroa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Korttien arvot tulostetaan (molemmat omalle rivilleen, rivin alkuun kortin omistajan nimi)"}]}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pääohjelman runko"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"pekan_kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmatin_kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"30"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tee koodi tänne"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostuksen tulee olla seuraava"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka: Kortilla on rahaa 15.4 euroa\nMatti: Kortilla on rahaa 27.4 euroa\nPekka: Kortilla on rahaa 35.4 euroa\nMatti: Kortilla on rahaa 22.8 euroa\nPekka: Kortilla on rahaa 30.2 euroa\nMatti: Kortilla on rahaa 72.8 euroa"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"esimerkki-2-tehtavalista","style":"position:relative;"},"children":[{"type":"text","value":"Esimerkki 2: Tehtävälista"},{"type":"element","tagName":"a","properties":{"href":"#esimerkki-2-tehtavalista","ariaLabel":"esimerkki 2 tehtavalista permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tehtavalista"}]},{"type":"text","value":" toteuttaa tehtävälistan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Tehtavalista"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehtavat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" prioriteetti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehtavat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"prioriteetti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hae_seuraava"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehtavat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sort"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodi pop poistaa ja palauttaa listan viimeisen alkion"}]},{"type":"text","value":"\n tehtava "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehtavat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pop"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Palautetaan tuplen jälkimmäinen osa eli tehtävän nimi"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" tehtava"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"yhteensa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehtavat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tyhjenna"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehtavat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa"}]},{"type":"text","value":" lisää listalle uuden tehtävän tietyllä prioriteetilla ja metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae_seuraava"}]},{"type":"text","value":" poistaa ja palauttaa listan suurimman prioriteetin tehtävän. Lisäksi metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"yhteensa"}]},{"type":"text","value":" antaa listan tehtävien yhteismäärän ja metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tyhjenna"}]},{"type":"text","value":" tyhjentää listan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäviä säilytetään sisäisesti listassa, jossa on tuplena kunkin tehtävän prioriteetti ja nimi. Prioriteetti tallennetaan ensin, jolloin tärkein tehtävä on listan lopussa listan järjestämisen jälkeen. Tämän ansiosta tehtävän saa haettua ja poistettua listalta kätevästi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pop"}]},{"type":"text","value":"-metodilla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava koodi esittelee luokan käyttämistä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tehtavalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"opiskelu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ulkoilu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"60"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"siivous\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yhteensa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_seuraava"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yhteensa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"treffit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yhteensa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_seuraava"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_seuraava"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yhteensa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tyhjenna"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yhteensa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3\nulkoilu\n2\n3\ntreffit\nopiskelu\n1\n0"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sarja","tmcname":"osa08-14_sarja"},"children":[{"type":"element","tagName":"h3","properties":{"id":"luokka-sarja","style":"position:relative;"},"children":[{"type":"text","value":"Luokka Sarja"},{"type":"element","tagName":"a","properties":{"href":"#luokka-sarja","ariaLabel":"luokka sarja permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Sarja"}]},{"type":"text","value":", joka toimii seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"dexter "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Sarja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Dexter\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Crime\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Drama\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mystery\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Thriller\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"dexter"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Dexter (8 esityskautta)\ngenret: Crime, Drama, Mystery, Thriller\nei arvosteluja"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Konstruktorissa siis asetetaan sarjan nimi, sen esityskausien lukumäärä sekä lista, joka kertoo mitä genrejä sarja edustaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vihje:"}]},{"type":"text","value":" merkkijonotaulukko saadaan muutettua haluttuja välimerkkejä sisältäväksi merkkijonoksi metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"join"}]},{"type":"text","value":" avulla seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Crime\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Drama\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mystery\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Thriller\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nmerkkijono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\", \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"merkkijono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Crime, Drama, Mystery, Thriller"}]}]},{"type":"element","tagName":"h3","properties":{"id":"arvostelujen-lisaaminen","style":"position:relative;"},"children":[{"type":"text","value":"Arvostelujen lisääminen"},{"type":"element","tagName":"a","properties":{"href":"#arvostelujen-lisaaminen","ariaLabel":"arvostelujen lisaaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee luokalle metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"arvostele(arvosana: int)"}]},{"type":"text","value":", jonka avulla sarjalle voi lisätä arvosanan, joka on kokonaisluku väliltä 0–5. Myös metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":" tulee muuttaa niin, että se antaa arvostelujen määrän ja keskiarvon pyöristettynä yhden desimaalin tarkkuudelle (jos arvosteluja on annettu)."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"dexter "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Sarja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Dexter\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Crime\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Drama\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mystery\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Thriller\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ndexter"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvostele"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ndexter"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvostele"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ndexter"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvostele"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ndexter"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvostele"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ndexter"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvostele"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"dexter"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Dexter (8 esityskautta)\ngenret: Crime, Drama, Mystery, Thriller\narvosteluja 5, keskiarvo 3.4 pistettä"}]}]},{"type":"element","tagName":"h3","properties":{"id":"sarjojen-haku","style":"position:relative;"},"children":[{"type":"text","value":"Sarjojen haku"},{"type":"element","tagName":"a","properties":{"href":"#sarjojen-haku","ariaLabel":"sarjojen haku permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee kaksi funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"arvosana_vahintaan(arvosana: float, sarjat: list)"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sisaltaa_genren(genre: str, sarjat: list)"}]},{"type":"text","value":", joiden avulla on mahdollista etsiä listalla olevia sarjoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodit toimivat seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"s1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Sarja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Dexter\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Crime\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Drama\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mystery\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Thriller\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvostele"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ns2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Sarja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"South Park\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Animation\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Comedy\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvostele"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ns3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Sarja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Friends\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Romance\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Comedy\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvostele"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsarjat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"s1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"arvosana vähintään 4.5:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sarja "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" arvosana_vahintaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sarjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sarja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"genre Comedy:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sarja "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sisaltaa_genren"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Comedy\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sarjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sarja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"arvosana vähintään 4.5:\nDexter"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"genre Comedy:\nSouth Park\nFriends"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että yllä oleva koodi ja testit olettavat, että luokassa on attribuutti "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":". Jos olet käyttänyt muuta nimeä, sinun kannattaa vaihtaa se nyt."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa lopuksi osion loppukyselyyn:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat luoda aiempaa monipuolisempia luokkia
  • \n
  • Osaat määritellä luokkaan metodin __str__
  • \n

Esimerkki 1: Luokka Suorakulmio

Tarkastellaan seuraavaksi luokkaa, joka mallintaa suorakulmiota kaksiulotteisessa koordinaatistossa:

class Suorakulmio:\n    def __init__(self, vasen_ylakulma: tuple, oikea_alakulma: tuple):\n        self.vasen_ylakulma = vasen_ylakulma\n        self.oikea_alakulma = oikea_alakulma\n        self.leveys = oikea_alakulma[0]-vasen_ylakulma[0]\n        self.korkeus = oikea_alakulma[1]-vasen_ylakulma[1]\n\n    def pinta_ala(self):\n        return self.leveys * self.korkeus\n\n    def piiri(self):\n        return self.leveys * 2 + self.korkeus * 2\n\n    def siirra(self, x_muutos: int, y_muutos: int):\n        kulma = self.vasen_ylakulma\n        self.vasen_ylakulma = (kulma[0]+x_muutos, kulma[1]+y_muutos)\n        kulma = self.oikea_alakulma\n        self.oikea_alakulma = (kulma[0]+x_muutos, kulma[1]+y_muutos)

Kun suorakulmio luodaan, konstruktorille annetaan kaksi tuplea: vasemman yläkulman ja oikean alakulman sijainti (x- ja y-koordinaatit). Konstruktori laskee tämän perusteella suorakulmion leveyden ja korkeuden.

Metodit pinta_ala ja piiri laskevat suorakulmion pinta-alan ja piirin korkeuden ja leveyden perusteella. Metodi siirra puolestaan siirtää suorakulmiota koordinaatistossa annetun verran x- ja y-suunnissa.

Huomaa, että suorakulmio esitetään koordinaatistossa, jossa x-koordinaatit kasvavat vasemmalta oikealle ja y-koordinaatit kasvavat ylhäältä alaspäin. Tämä on usein käytetty koordinaatisto ohjelmoinnissa, koska on luontevaa esittää tietokoneen näyttö niin, että vasemman yläkulman x- ja y-koordinaatti on 0.

Seuraava koodi testaa luokkaa:

suorakulmio = Suorakulmio((1, 1), (4, 3))\nprint(suorakulmio.vasen_ylakulma)\nprint(suorakulmio.oikea_alakulma)\nprint(suorakulmio.leveys)\nprint(suorakulmio.korkeus)\nprint(suorakulmio.piiri())\nprint(suorakulmio.pinta_ala())\n\nsuorakulmio.siirra(3, 3)\nprint(suorakulmio.vasen_ylakulma)\nprint(suorakulmio.oikea_alakulma)

(1, 1)\n(4, 3)\n3\n2\n10\n6\n(4, 4)\n(7, 6)

Olion tulostaminen

Kun omasta luokasta luotu olio tulostetaan sellaisenaan print-komennolla, lopputulos ei ole kovin selkeä:

suorakulmio = Suorakulmio((1, 1), (4, 3))\nprint(suorakulmio)

Ohjelma tulostaa jotain seuraavankaltaista:

<main.Suorakulmio object at 0x000002D7BF148A90>

Järkevämpi tulostus saadaan lisäämällä luokkaan metodi __str__, joka palauttaa ymmärrettävän kuvauksen olion tilasta merkkijonona. Kun tämä metodi on määritelty, metodin palauttama kuvaus oliosta tulee näkyviin print-komennossa.

Lisätään luokkaan Suorakulmio metodi __str__:

class Suorakulmio:\n\n    # Luokan muu sisältö tähän kuten ennenkin...\n\n    # Metodi palauttaa olion tilan merkkijonona\n    def __str__(self):\n        return f\"suorakulmio {self.vasen_ylakulma} ... {self.oikea_alakulma}\"

Nyt print-komento tuottaa luettavan lopputuloksen:

suorakulmio = Suorakulmio((1, 1), (4, 3))\nprint(suorakulmio)

suorakulmio (1, 1) ... (4, 3)

Metodia __str__ kutsutaan yleisemmin silloin, kun oliosta muodostetaan merkkijonokuvaus str-funktiolla. Seuraava koodi esittelee asiaa:

suorakulmio = Suorakulmio((1, 1), (4, 3))\nkuvaus = str(suorakulmio)\nprint(kuvaus)

suorakulmio (1, 1) ... (4, 3)

Metodin __str__ lisäksi olioon voidaan määritellä samantapainen metodi __repr__, joka antaa teknisen kuvauksen olion tilasta. Tutustumme tähän metodiin tarkemmin myöhemmin.

Tehtäväpohjassa on mukana luokan Sekuntikello runko:

class Sekuntikello:\n    def __init__(self):\n        self.sekunnit = 0\n        self.minuutit = 0

Laajenna luokkaa siten, että se toimii seuraavasti:

kello = Sekuntikello()\nfor i in range(3600):\n    print(kello)\n    kello.tick()

00:00\n00:01\n00:02\n... tässä välissä monta riviä\n00:59\n01:00\n01:01\n... tässä välissä erittäin monta riviä\n59:58\n59:59\n00:00\n00:01

Metodi tick vie siis kelloa sekunnin eteenpäin, ja sekä sekuntien että minuuttien arvo on suuruudeltaan korkeintaan 59. Lisäksi oliossa tulee olla metodi __str__, joka näyttää kellonajan yllä olevassa muodossa.

Vihje: metodin tick testailua voi helpottaa asettamalla tilapäisesti konstruktorissa sekunneille ja minuuteille valmiiksi jonkin suuremman arvon kuin 0.

Toteuta edellistä tehtävää laajentava luokka Kello, joka toimii seuraavaan tapaan:

kello = Kello(23, 59, 55)\nprint(kello)\nkello.tick()\nprint(kello)\nkello.tick()\nprint(kello)\nkello.tick()\nprint(kello)\nkello.tick()\nprint(kello)\nkello.tick()\nprint(kello)\nkello.tick()\nprint(kello)\n\nkello.aseta(12, 5)\nprint(kello)
\n23:59:55\n23:59:56\n23:59:57\n23:59:58\n23:59:59\n00:00:00\n00:00:01\n12:05:00\n

Konstruktori siis antaa kellon tunneille, minuuteille ja sekunneille alkuarvot. Metodi tick vie kelloa sekunnin eteenpäin ja metodilla aseta voi asettaa kellon tunneille ja minuuteille uuden arvon ja nollata sekunnit.

Helsingin Yliopiston opiskelijaruokaloissa eli Unicafeissa opiskelijat maksavat lounaansa käyttäen maksukorttia.

Tässä tehtäväsarjassa tehdään luokka Maksukortti, jonka tarkoituksena on jäljitellä Unicafeissa tapahtuvaa maksutoimintaa.

Luokan runko

Tee ohjelmaan uusi luokka nimeltä Maksukortti.

Tee ensin luokalle konstruktori, jolle annetaan kortin alkusaldo ja joka tallentaa sen olion sisäiseen muuttujaan. Tee sitten __str__-metodi, joka palauttaa kortin saldon muodossa \"Kortilla on rahaa X euroa\". Rahamäärä tulee tulostaa yhden desimaalin tarkkuudella.

Seuraavassa on luokan Maksukortti runko:

class Maksukortti:\n    def __init__(self, alkusaldo: float):\n        self.saldo = alkusaldo\n\n    def __str__(self):\n        pass

Käyttöesimerkki

kortti = Maksukortti(50)\nprint(kortti)

Ohjelman tulisi tuottaa seuraava tulostus:

Kortilla on rahaa 50.0 euroa

Kortilla maksaminen

Täydennä Maksukortti-luokkaa seuraavilla metodeilla:

    \n
  • syo_edullisesti joka vähentää kortin saldoa 2.60 eurolla
  • \n
  • syo_maukkaasti joka vähentää kortin saldoa 4.60 eurolla
  • \n

Seuraava pääohjelma testaa luokkaa

kortti = Maksukortti(50)\nprint(kortti)\n\nkortti.syo_edullisesti()\nprint(kortti)\n\nkortti.syo_maukkaasti()\nkortti.syo_edullisesti()\nprint(kortti)

Ohjelman tulisi tuottaa seuraava tulostus:

Kortilla on rahaa 50.0 euroa\nKortilla on rahaa 47.4 euroa\nKortilla on rahaa 40.2 euroa

Huomaa, että kortin saldo ei saa mennä negatiiviseksi:

kortti = Maksukortti(4)\nprint(kortti)\n\nkortti.syo_edullisesti()\nprint(kortti)\n\nkortti.syo_edullisesti()\nprint(kortti)

Kortilla on rahaa 4.0 euroa\nKortilla on rahaa 1.4 euroa\nKortilla on rahaa 1.4 euroa

Eli kortin saldo ei enää vähene jos maksettaessa saldo ei ole riittävä.

Kortin lataaminen

Lisää Maksukortti-luokkaan metodi lataa_rahaa.

Metodin tarkoituksena on kasvattaa kortin saldoa parametrina annetulla rahamäärällä.

kortti = Maksukortti(10)\nprint(kortti)\nkortti.lataa_rahaa(15)\nprint(kortti)\nkortti.lataa_rahaa(10)\nprint(kortti)\nkortti.lataa_rahaa(200)\nprint(kortti)

Kortilla on rahaa 10.0 euroa\nKortilla on rahaa 25.0 euroa\nKortilla on rahaa 35.0 euroa\nKortilla on rahaa 235.0 euroa

Jos kortille yritetään ladata negatiivinen summa, tulee metodin tuottaa poikkeus ValueError:

kortti = Maksukortti(10)\nkortti.lataa_rahaa(-10)

File \"testi.py\", line 3, in maksukortti\nValueError: Kortille ei saa ladata negatiivista summaa

Huomaa että metodin tulee tuottaa poikkeus, katso osan 6 materiaalista miten poikkeus tuotetaan. Metodi ei missään tilanteessa itse tulosta mitään!

Monta korttia

Tee pääohjelma, joka sisältää seuraavan tapahtumasarjan:

    \n
  • Luo Pekan kortti. Kortin alkusaldo on 20 euroa
  • \n
  • Luo Matin kortti. Kortin alkusaldo on 30 euroa
  • \n
  • Pekka syö maukkaasti
  • \n
  • Matti syö edullisesti
  • \n
  • Korttien arvot tulostetaan (molemmat omalle rivilleen, rivin alkuun kortin omistajan nimi)
  • \n
  • Pekka lataa rahaa 20 euroa
  • \n
  • Matti syö maukkaasti
  • \n
  • Korttien arvot tulostetaan (molemmat omalle rivilleen, rivin alkuun kortin omistajan nimi)
  • \n
  • Pekka syö edullisesti
  • \n
  • Pekka syö edullisesti
  • \n
  • Matti lataa rahaa 50 euroa
  • \n
  • Korttien arvot tulostetaan (molemmat omalle rivilleen, rivin alkuun kortin omistajan nimi)
  • \n

Pääohjelman runko

pekan_kortti = Maksukortti(20)\nmatin_kortti = Maksukortti(30)\n# tee koodi tänne

Tulostuksen tulee olla seuraava

Pekka: Kortilla on rahaa 15.4 euroa\nMatti: Kortilla on rahaa 27.4 euroa\nPekka: Kortilla on rahaa 35.4 euroa\nMatti: Kortilla on rahaa 22.8 euroa\nPekka: Kortilla on rahaa 30.2 euroa\nMatti: Kortilla on rahaa 72.8 euroa

Esimerkki 2: Tehtävälista

Seuraava luokka Tehtavalista toteuttaa tehtävälistan:

class Tehtavalista:\n    def __init__(self):\n        self.tehtavat = []\n\n    def lisaa(self, nimi: str, prioriteetti: int):\n        self.tehtavat.append((prioriteetti, nimi))\n\n    def hae_seuraava(self):\n        self.tehtavat.sort()\n        # Metodi pop poistaa ja palauttaa listan viimeisen alkion\n        tehtava = self.tehtavat.pop()\n        # Palautetaan tuplen jälkimmäinen osa eli tehtävän nimi\n        return tehtava[1]\n\n    def yhteensa(self):\n        return len(self.tehtavat)\n\n    def tyhjenna(self):\n        self.tehtavat = []

Metodi lisaa lisää listalle uuden tehtävän tietyllä prioriteetilla ja metodi hae_seuraava poistaa ja palauttaa listan suurimman prioriteetin tehtävän. Lisäksi metodi yhteensa antaa listan tehtävien yhteismäärän ja metodi tyhjenna tyhjentää listan.

Tehtäviä säilytetään sisäisesti listassa, jossa on tuplena kunkin tehtävän prioriteetti ja nimi. Prioriteetti tallennetaan ensin, jolloin tärkein tehtävä on listan lopussa listan järjestämisen jälkeen. Tämän ansiosta tehtävän saa haettua ja poistettua listalta kätevästi pop-metodilla.

Seuraava koodi esittelee luokan käyttämistä:

lista = Tehtavalista()\nlista.lisaa(\"opiskelu\", 50)\nlista.lisaa(\"ulkoilu\", 60)\nlista.lisaa(\"siivous\", 10)\nprint(lista.yhteensa())\nprint(lista.hae_seuraava())\nprint(lista.yhteensa())\nlista.lisaa(\"treffit\", 100)\nprint(lista.yhteensa())\nprint(lista.hae_seuraava())\nprint(lista.hae_seuraava())\nprint(lista.yhteensa())\nlista.tyhjenna()\nprint(lista.yhteensa())

3\nulkoilu\n2\n3\ntreffit\nopiskelu\n1\n0

Luokka Sarja

Tee luokka Sarja, joka toimii seuraavasti

dexter = Sarja(\"Dexter\", 8, [\"Crime\", \"Drama\", \"Mystery\", \"Thriller\"])\nprint(dexter)

Dexter (8 esityskautta)\ngenret: Crime, Drama, Mystery, Thriller\nei arvosteluja

Konstruktorissa siis asetetaan sarjan nimi, sen esityskausien lukumäärä sekä lista, joka kertoo mitä genrejä sarja edustaa.

Vihje: merkkijonotaulukko saadaan muutettua haluttuja välimerkkejä sisältäväksi merkkijonoksi metodin join avulla seuraavasti:

lista = [\"Crime\", \"Drama\", \"Mystery\", \"Thriller\"]\nmerkkijono = \", \".join(lista)\nprint(merkkijono)

Crime, Drama, Mystery, Thriller

Arvostelujen lisääminen

Tee luokalle metodi arvostele(arvosana: int), jonka avulla sarjalle voi lisätä arvosanan, joka on kokonaisluku väliltä 0–5. Myös metodia __str__ tulee muuttaa niin, että se antaa arvostelujen määrän ja keskiarvon pyöristettynä yhden desimaalin tarkkuudelle (jos arvosteluja on annettu).

dexter = Sarja(\"Dexter\", 8, [\"Crime\", \"Drama\", \"Mystery\", \"Thriller\"])\ndexter.arvostele(4)\ndexter.arvostele(5)\ndexter.arvostele(5)\ndexter.arvostele(3)\ndexter.arvostele(0)\nprint(dexter)

Dexter (8 esityskautta)\ngenret: Crime, Drama, Mystery, Thriller\narvosteluja 5, keskiarvo 3.4 pistettä

Sarjojen haku

Tee kaksi funktiota arvosana_vahintaan(arvosana: float, sarjat: list) ja sisaltaa_genren(genre: str, sarjat: list), joiden avulla on mahdollista etsiä listalla olevia sarjoja.

Metodit toimivat seuraavasti:

s1 = Sarja(\"Dexter\", 8, [\"Crime\", \"Drama\", \"Mystery\", \"Thriller\"])\ns1.arvostele(5)\n\ns2 = Sarja(\"South Park\", 24, [\"Animation\", \"Comedy\"])\ns2.arvostele(3)\n\ns3 = Sarja(\"Friends\", 10, [\"Romance\", \"Comedy\"])\ns3.arvostele(2)\n\nsarjat = [s1, s2, s3]\n\nprint(\"arvosana vähintään 4.5:\")\nfor sarja in arvosana_vahintaan(4.5, sarjat):\n    print(sarja.nimi)\n\nprint(\"genre Comedy:\")\nfor sarja in sisaltaa_genren(\"Comedy\", sarjat):\n    print(sarja.nimi)

arvosana vähintään 4.5:\nDexter

genre Comedy:\nSouth Park\nFriends

Huomaa, että yllä oleva koodi ja testit olettavat, että luokassa on attribuutti nimi. Jos olet käyttänyt muuta nimeä, sinun kannattaa vaihtaa se nyt.

Vastaa lopuksi osion loppukyselyyn:

","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-8/5-lisaa-esimerkkeja.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat luoda aiempaa monipuolisempia luokkia"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat määritellä luokkaan metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"h2","properties":{"id":"esimerkki-1-luokka-suorakulmio","style":"position:relative;"},"children":[{"type":"text","value":"Esimerkki 1: Luokka Suorakulmio"},{"type":"element","tagName":"a","properties":{"href":"#esimerkki-1-luokka-suorakulmio","ariaLabel":"esimerkki 1 luokka suorakulmio permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan seuraavaksi luokkaa, joka mallintaa suorakulmiota kaksiulotteisessa koordinaatistossa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Suorakulmio"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vasen_ylakulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"tuple"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" oikea_alakulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"tuple"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_ylakulma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" vasen_ylakulma\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_alakulma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" oikea_alakulma\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" oikea_alakulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"vasen_ylakulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" oikea_alakulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"vasen_ylakulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pinta_ala"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"piiri"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"siirra"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" x_muutos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" y_muutos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n kulma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_ylakulma\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_ylakulma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"x_muutos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"y_muutos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kulma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_alakulma\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_alakulma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"x_muutos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"y_muutos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun suorakulmio luodaan, konstruktorille annetaan kaksi tuplea: vasemman yläkulman ja oikean alakulman sijainti (x- ja y-koordinaatit). Konstruktori laskee tämän perusteella suorakulmion leveyden ja korkeuden."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pinta_ala"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"piiri"}]},{"type":"text","value":" laskevat suorakulmion pinta-alan ja piirin korkeuden ja leveyden perusteella. Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"siirra"}]},{"type":"text","value":" puolestaan siirtää suorakulmiota koordinaatistossa annetun verran x- ja y-suunnissa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että suorakulmio esitetään koordinaatistossa, jossa x-koordinaatit kasvavat vasemmalta oikealle ja y-koordinaatit kasvavat ylhäältä alaspäin. Tämä on usein käytetty koordinaatisto ohjelmoinnissa, koska on luontevaa esittää tietokoneen näyttö niin, että vasemman yläkulman x- ja y-koordinaatti on 0."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava koodi testaa luokkaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"suorakulmio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_ylakulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_alakulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"leveys"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"korkeus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"piiri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pinta_ala"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsuorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"siirra"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_ylakulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_alakulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"(1, 1)\n(4, 3)\n3\n2\n10\n6\n(4, 4)\n(7, 6)"}]}]},{"type":"element","tagName":"h2","properties":{"id":"olion-tulostaminen","style":"position:relative;"},"children":[{"type":"text","value":"Olion tulostaminen"},{"type":"element","tagName":"a","properties":{"href":"#olion-tulostaminen","ariaLabel":"olion tulostaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun omasta luokasta luotu olio tulostetaan sellaisenaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennolla, lopputulos ei ole kovin selkeä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"suorakulmio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma tulostaa jotain seuraavankaltaista:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"<"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"main"}]},{"type":"text","value":".Suorakulmio object at 0x000002D7BF148A90>"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Järkevämpi tulostus saadaan lisäämällä luokkaan metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":", joka palauttaa ymmärrettävän kuvauksen olion tilasta merkkijonona. Kun tämä metodi on määritelty, metodin palauttama kuvaus oliosta tulee näkyviin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komennossa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisätään luokkaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Suorakulmio"}]},{"type":"text","value":" metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Suorakulmio"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luokan muu sisältö tähän kuten ennenkin..."}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodi palauttaa olion tilan merkkijonona"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"suorakulmio "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vasen_ylakulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ... "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"oikea_alakulma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print"}]},{"type":"text","value":"-komento tuottaa luettavan lopputuloksen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"suorakulmio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"suorakulmio (1, 1) ... (4, 3)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":" kutsutaan yleisemmin silloin, kun oliosta muodostetaan merkkijonokuvaus "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"str"}]},{"type":"text","value":"-funktiolla. Seuraava koodi esittelee asiaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"suorakulmio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkuvaus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suorakulmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kuvaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"suorakulmio (1, 1) ... (4, 3)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":" lisäksi olioon voidaan määritellä samantapainen metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__repr__"}]},{"type":"text","value":", joka antaa teknisen kuvauksen olion tilasta. Tutustumme tähän metodiin tarkemmin myöhemmin."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sekuntikello","tmcname":"osa08-11a_sekuntikello"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on mukana luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Sekuntikello"}]},{"type":"text","value":" runko:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Sekuntikello"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sekunnit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"minuutit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajenna luokkaa siten, että se toimii seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kello "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Sekuntikello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3600"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"00:00\n00:01\n00:02\n... tässä välissä monta riviä\n00:59\n01:00\n01:01\n... tässä välissä erittäin monta riviä\n59:58\n59:59\n00:00\n00:01"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tick"}]},{"type":"text","value":" vie siis kelloa sekunnin eteenpäin, ja sekä sekuntien että minuuttien arvo on suuruudeltaan korkeintaan 59. Lisäksi oliossa tulee olla metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":", joka näyttää kellonajan yllä olevassa muodossa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vihje:"}]},{"type":"text","value":" metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tick"}]},{"type":"text","value":" testailua voi helpottaa asettamalla tilapäisesti konstruktorissa sekunneille ja minuuteille valmiiksi jonkin suuremman arvon kuin 0."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kello","tmcname":"osa08-12_kello"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta edellistä tehtävää laajentava luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kello"}]},{"type":"text","value":", joka toimii seuraavaan tapaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kello "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"23"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"59"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"55"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tick"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"aseta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kello"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"text","value":"\n23:59:55\n23:59:56\n23:59:57\n23:59:58\n23:59:59\n00:00:00\n00:00:01\n12:05:00\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Konstruktori siis antaa kellon tunneille, minuuteille ja sekunneille alkuarvot. Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tick"}]},{"type":"text","value":" vie kelloa sekunnin eteenpäin ja metodilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"aseta"}]},{"type":"text","value":" voi asettaa kellon tunneille ja minuuteille uuden arvon ja "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"nollata sekunnit"}]},{"type":"text","value":"."}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Maksukortti","tmcname":"osa08-13_maksukortti"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Helsingin Yliopiston opiskelijaruokaloissa eli Unicafeissa opiskelijat maksavat lounaansa käyttäen maksukorttia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtäväsarjassa tehdään luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Maksukortti"}]},{"type":"text","value":", jonka tarkoituksena on jäljitellä Unicafeissa tapahtuvaa maksutoimintaa."}]},{"type":"element","tagName":"h3","properties":{"id":"luokan-runko","style":"position:relative;"},"children":[{"type":"text","value":"Luokan runko"},{"type":"element","tagName":"a","properties":{"href":"#luokan-runko","ariaLabel":"luokan runko permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ohjelmaan uusi luokka nimeltä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Maksukortti"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee ensin luokalle konstruktori, jolle annetaan kortin alkusaldo ja joka tallentaa sen olion sisäiseen muuttujaan. Tee sitten "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":"-metodi, joka palauttaa kortin saldon muodossa \"Kortilla on rahaa X euroa\". Rahamäärä tulee tulostaa yhden desimaalin tarkkuudella."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on luokan Maksukortti runko:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Maksukortti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" alkusaldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" alkusaldo\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käyttöesimerkki"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulisi tuottaa seuraava tulostus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kortilla on rahaa 50.0 euroa"}]}]},{"type":"element","tagName":"h3","properties":{"id":"kortilla-maksaminen","style":"position:relative;"},"children":[{"type":"text","value":"Kortilla maksaminen"},{"type":"element","tagName":"a","properties":{"href":"#kortilla-maksaminen","ariaLabel":"kortilla maksaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Täydennä Maksukortti-luokkaa seuraavilla metodeilla:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"syo_edullisesti"}]},{"type":"text","value":" joka vähentää kortin saldoa 2.60 eurolla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"syo_maukkaasti"}]},{"type":"text","value":" joka vähentää kortin saldoa 4.60 eurolla"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava pääohjelma testaa luokkaa"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_edullisesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_maukkaasti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_edullisesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulisi tuottaa seuraava tulostus:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kortilla on rahaa 50.0 euroa\nKortilla on rahaa 47.4 euroa\nKortilla on rahaa 40.2 euroa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että kortin saldo ei saa mennä negatiiviseksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_edullisesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_edullisesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kortilla on rahaa 4.0 euroa\nKortilla on rahaa 1.4 euroa\nKortilla on rahaa 1.4 euroa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eli kortin saldo ei enää vähene jos maksettaessa saldo ei ole riittävä."}]},{"type":"element","tagName":"h3","properties":{"id":"kortin-lataaminen","style":"position:relative;"},"children":[{"type":"text","value":"Kortin lataaminen"},{"type":"element","tagName":"a","properties":{"href":"#kortin-lataaminen","ariaLabel":"kortin lataaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Maksukortti"}]},{"type":"text","value":"-luokkaan metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lataa_rahaa"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodin tarkoituksena on kasvattaa kortin saldoa parametrina annetulla rahamäärällä."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lataa_rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lataa_rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lataa_rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"200"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kortilla on rahaa 10.0 euroa\nKortilla on rahaa 25.0 euroa\nKortilla on rahaa 35.0 euroa\nKortilla on rahaa 235.0 euroa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos kortille yritetään ladata negatiivinen summa, tulee metodin "},{"type":"element","tagName":"a","properties":{"href":"/osa-6/3-virheet#poikkeusten-tuottaminen"},"children":[{"type":"text","value":"tuottaa poikkeus"}]},{"type":"text","value":" "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ValueError"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lataa_rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"File \"testi.py\", line 3, in maksukortti\nValueError: Kortille ei saa ladata negatiivista summaa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huomaa"}]},{"type":"text","value":" että metodin tulee "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tuottaa"}]},{"type":"text","value":" poikkeus, katso "},{"type":"element","tagName":"a","properties":{"href":"/osa-6/3-virheet#poikkeusten-tuottaminen"},"children":[{"type":"text","value":"osan 6"}]},{"type":"text","value":" materiaalista miten poikkeus tuotetaan. Metodi ei missään tilanteessa itse tulosta mitään!"}]},{"type":"element","tagName":"h3","properties":{"id":"monta-korttia","style":"position:relative;"},"children":[{"type":"text","value":"Monta korttia"},{"type":"element","tagName":"a","properties":{"href":"#monta-korttia","ariaLabel":"monta korttia permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee pääohjelma, joka sisältää seuraavan tapahtumasarjan:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Luo Pekan kortti. Kortin alkusaldo on 20 euroa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Luo Matin kortti. Kortin alkusaldo on 30 euroa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Pekka syö maukkaasti"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Matti syö edullisesti"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Korttien arvot tulostetaan (molemmat omalle rivilleen, rivin alkuun kortin omistajan nimi)"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Pekka lataa rahaa 20 euroa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Matti syö maukkaasti"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Korttien arvot tulostetaan (molemmat omalle rivilleen, rivin alkuun kortin omistajan nimi)"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Pekka syö edullisesti"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Pekka syö edullisesti"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Matti lataa rahaa 50 euroa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Korttien arvot tulostetaan (molemmat omalle rivilleen, rivin alkuun kortin omistajan nimi)"}]}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pääohjelman runko"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"pekan_kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmatin_kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"30"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tee koodi tänne"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostuksen tulee olla seuraava"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka: Kortilla on rahaa 15.4 euroa\nMatti: Kortilla on rahaa 27.4 euroa\nPekka: Kortilla on rahaa 35.4 euroa\nMatti: Kortilla on rahaa 22.8 euroa\nPekka: Kortilla on rahaa 30.2 euroa\nMatti: Kortilla on rahaa 72.8 euroa"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"esimerkki-2-tehtavalista","style":"position:relative;"},"children":[{"type":"text","value":"Esimerkki 2: Tehtävälista"},{"type":"element","tagName":"a","properties":{"href":"#esimerkki-2-tehtavalista","ariaLabel":"esimerkki 2 tehtavalista permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tehtavalista"}]},{"type":"text","value":" toteuttaa tehtävälistan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Tehtavalista"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehtavat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" prioriteetti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehtavat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"prioriteetti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hae_seuraava"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehtavat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sort"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodi pop poistaa ja palauttaa listan viimeisen alkion"}]},{"type":"text","value":"\n tehtava "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehtavat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pop"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Palautetaan tuplen jälkimmäinen osa eli tehtävän nimi"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" tehtava"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"yhteensa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehtavat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tyhjenna"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehtavat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa"}]},{"type":"text","value":" lisää listalle uuden tehtävän tietyllä prioriteetilla ja metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae_seuraava"}]},{"type":"text","value":" poistaa ja palauttaa listan suurimman prioriteetin tehtävän. Lisäksi metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"yhteensa"}]},{"type":"text","value":" antaa listan tehtävien yhteismäärän ja metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tyhjenna"}]},{"type":"text","value":" tyhjentää listan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäviä säilytetään sisäisesti listassa, jossa on tuplena kunkin tehtävän prioriteetti ja nimi. Prioriteetti tallennetaan ensin, jolloin tärkein tehtävä on listan lopussa listan järjestämisen jälkeen. Tämän ansiosta tehtävän saa haettua ja poistettua listalta kätevästi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pop"}]},{"type":"text","value":"-metodilla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava koodi esittelee luokan käyttämistä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tehtavalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"opiskelu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ulkoilu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"60"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"siivous\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yhteensa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_seuraava"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yhteensa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"treffit\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yhteensa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_seuraava"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_seuraava"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yhteensa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tyhjenna"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yhteensa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"3\nulkoilu\n2\n3\ntreffit\nopiskelu\n1\n0"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Sarja","tmcname":"osa08-14_sarja"},"children":[{"type":"element","tagName":"h3","properties":{"id":"luokka-sarja","style":"position:relative;"},"children":[{"type":"text","value":"Luokka Sarja"},{"type":"element","tagName":"a","properties":{"href":"#luokka-sarja","ariaLabel":"luokka sarja permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Sarja"}]},{"type":"text","value":", joka toimii seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"dexter "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Sarja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Dexter\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Crime\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Drama\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mystery\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Thriller\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"dexter"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Dexter (8 esityskautta)\ngenret: Crime, Drama, Mystery, Thriller\nei arvosteluja"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Konstruktorissa siis asetetaan sarjan nimi, sen esityskausien lukumäärä sekä lista, joka kertoo mitä genrejä sarja edustaa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vihje:"}]},{"type":"text","value":" merkkijonotaulukko saadaan muutettua haluttuja välimerkkejä sisältäväksi merkkijonoksi metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"join"}]},{"type":"text","value":" avulla seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Crime\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Drama\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mystery\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Thriller\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nmerkkijono "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\", \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"join"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"merkkijono"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Crime, Drama, Mystery, Thriller"}]}]},{"type":"element","tagName":"h3","properties":{"id":"arvostelujen-lisaaminen","style":"position:relative;"},"children":[{"type":"text","value":"Arvostelujen lisääminen"},{"type":"element","tagName":"a","properties":{"href":"#arvostelujen-lisaaminen","ariaLabel":"arvostelujen lisaaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee luokalle metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"arvostele(arvosana: int)"}]},{"type":"text","value":", jonka avulla sarjalle voi lisätä arvosanan, joka on kokonaisluku väliltä 0–5. Myös metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":" tulee muuttaa niin, että se antaa arvostelujen määrän ja keskiarvon pyöristettynä yhden desimaalin tarkkuudelle (jos arvosteluja on annettu)."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"dexter "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Sarja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Dexter\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Crime\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Drama\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mystery\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Thriller\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ndexter"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvostele"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ndexter"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvostele"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ndexter"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvostele"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ndexter"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvostele"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ndexter"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvostele"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"dexter"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Dexter (8 esityskautta)\ngenret: Crime, Drama, Mystery, Thriller\narvosteluja 5, keskiarvo 3.4 pistettä"}]}]},{"type":"element","tagName":"h3","properties":{"id":"sarjojen-haku","style":"position:relative;"},"children":[{"type":"text","value":"Sarjojen haku"},{"type":"element","tagName":"a","properties":{"href":"#sarjojen-haku","ariaLabel":"sarjojen haku permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee kaksi funktiota "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"arvosana_vahintaan(arvosana: float, sarjat: list)"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sisaltaa_genren(genre: str, sarjat: list)"}]},{"type":"text","value":", joiden avulla on mahdollista etsiä listalla olevia sarjoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodit toimivat seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"s1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Sarja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Dexter\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Crime\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Drama\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mystery\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Thriller\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvostele"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ns2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Sarja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"South Park\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"24"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Animation\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Comedy\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvostele"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ns3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Sarja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Friends\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Romance\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Comedy\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ns3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvostele"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsarjat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"s1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"arvosana vähintään 4.5:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sarja "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" arvosana_vahintaan"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sarjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sarja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"genre Comedy:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sarja "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sisaltaa_genren"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Comedy\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sarjat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sarja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"arvosana vähintään 4.5:\nDexter"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"genre Comedy:\nSouth Park\nFriends"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että yllä oleva koodi ja testit olettavat, että luokassa on attribuutti "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":". Jos olet käyttänyt muuta nimeä, sinun kannattaa vaihtaa se nyt."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa lopuksi osion loppukyselyyn:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat luoda aiempaa monipuolisempia luokkia
  • \n
  • Osaat määritellä luokkaan metodin __str__
  • \n

Esimerkki 1: Luokka Suorakulmio

Tarkastellaan seuraavaksi luokkaa, joka mallintaa suorakulmiota kaksiulotteisessa koordinaatistossa:

class Suorakulmio:\n    def __init__(self, vasen_ylakulma: tuple, oikea_alakulma: tuple):\n        self.vasen_ylakulma = vasen_ylakulma\n        self.oikea_alakulma = oikea_alakulma\n        self.leveys = oikea_alakulma[0]-vasen_ylakulma[0]\n        self.korkeus = oikea_alakulma[1]-vasen_ylakulma[1]\n\n    def pinta_ala(self):\n        return self.leveys * self.korkeus\n\n    def piiri(self):\n        return self.leveys * 2 + self.korkeus * 2\n\n    def siirra(self, x_muutos: int, y_muutos: int):\n        kulma = self.vasen_ylakulma\n        self.vasen_ylakulma = (kulma[0]+x_muutos, kulma[1]+y_muutos)\n        kulma = self.oikea_alakulma\n        self.oikea_alakulma = (kulma[0]+x_muutos, kulma[1]+y_muutos)

Kun suorakulmio luodaan, konstruktorille annetaan kaksi tuplea: vasemman yläkulman ja oikean alakulman sijainti (x- ja y-koordinaatit). Konstruktori laskee tämän perusteella suorakulmion leveyden ja korkeuden.

Metodit pinta_ala ja piiri laskevat suorakulmion pinta-alan ja piirin korkeuden ja leveyden perusteella. Metodi siirra puolestaan siirtää suorakulmiota koordinaatistossa annetun verran x- ja y-suunnissa.

Huomaa, että suorakulmio esitetään koordinaatistossa, jossa x-koordinaatit kasvavat vasemmalta oikealle ja y-koordinaatit kasvavat ylhäältä alaspäin. Tämä on usein käytetty koordinaatisto ohjelmoinnissa, koska on luontevaa esittää tietokoneen näyttö niin, että vasemman yläkulman x- ja y-koordinaatti on 0.

Seuraava koodi testaa luokkaa:

suorakulmio = Suorakulmio((1, 1), (4, 3))\nprint(suorakulmio.vasen_ylakulma)\nprint(suorakulmio.oikea_alakulma)\nprint(suorakulmio.leveys)\nprint(suorakulmio.korkeus)\nprint(suorakulmio.piiri())\nprint(suorakulmio.pinta_ala())\n\nsuorakulmio.siirra(3, 3)\nprint(suorakulmio.vasen_ylakulma)\nprint(suorakulmio.oikea_alakulma)

(1, 1)\n(4, 3)\n3\n2\n10\n6\n(4, 4)\n(7, 6)

Olion tulostaminen

Kun omasta luokasta luotu olio tulostetaan sellaisenaan print-komennolla, lopputulos ei ole kovin selkeä:

suorakulmio = Suorakulmio((1, 1), (4, 3))\nprint(suorakulmio)

Ohjelma tulostaa jotain seuraavankaltaista:

<main.Suorakulmio object at 0x000002D7BF148A90>

Järkevämpi tulostus saadaan lisäämällä luokkaan metodi __str__, joka palauttaa ymmärrettävän kuvauksen olion tilasta merkkijonona. Kun tämä metodi on määritelty, metodin palauttama kuvaus oliosta tulee näkyviin print-komennossa.

Lisätään luokkaan Suorakulmio metodi __str__:

class Suorakulmio:\n\n    # Luokan muu sisältö tähän kuten ennenkin...\n\n    # Metodi palauttaa olion tilan merkkijonona\n    def __str__(self):\n        return f\"suorakulmio {self.vasen_ylakulma} ... {self.oikea_alakulma}\"

Nyt print-komento tuottaa luettavan lopputuloksen:

suorakulmio = Suorakulmio((1, 1), (4, 3))\nprint(suorakulmio)

suorakulmio (1, 1) ... (4, 3)

Metodia __str__ kutsutaan yleisemmin silloin, kun oliosta muodostetaan merkkijonokuvaus str-funktiolla. Seuraava koodi esittelee asiaa:

suorakulmio = Suorakulmio((1, 1), (4, 3))\nkuvaus = str(suorakulmio)\nprint(kuvaus)

suorakulmio (1, 1) ... (4, 3)

Metodin __str__ lisäksi olioon voidaan määritellä samantapainen metodi __repr__, joka antaa teknisen kuvauksen olion tilasta. Tutustumme tähän metodiin tarkemmin myöhemmin.

Tehtäväpohjassa on mukana luokan Sekuntikello runko:

class Sekuntikello:\n    def __init__(self):\n        self.sekunnit = 0\n        self.minuutit = 0

Laajenna luokkaa siten, että se toimii seuraavasti:

kello = Sekuntikello()\nfor i in range(3600):\n    print(kello)\n    kello.tick()

00:00\n00:01\n00:02\n... tässä välissä monta riviä\n00:59\n01:00\n01:01\n... tässä välissä erittäin monta riviä\n59:58\n59:59\n00:00\n00:01

Metodi tick vie siis kelloa sekunnin eteenpäin, ja sekä sekuntien että minuuttien arvo on suuruudeltaan korkeintaan 59. Lisäksi oliossa tulee olla metodi __str__, joka näyttää kellonajan yllä olevassa muodossa.

Vihje: metodin tick testailua voi helpottaa asettamalla tilapäisesti konstruktorissa sekunneille ja minuuteille valmiiksi jonkin suuremman arvon kuin 0.

Toteuta edellistä tehtävää laajentava luokka Kello, joka toimii seuraavaan tapaan:

kello = Kello(23, 59, 55)\nprint(kello)\nkello.tick()\nprint(kello)\nkello.tick()\nprint(kello)\nkello.tick()\nprint(kello)\nkello.tick()\nprint(kello)\nkello.tick()\nprint(kello)\nkello.tick()\nprint(kello)\n\nkello.aseta(12, 5)\nprint(kello)
\n23:59:55\n23:59:56\n23:59:57\n23:59:58\n23:59:59\n00:00:00\n00:00:01\n12:05:00\n

Konstruktori siis antaa kellon tunneille, minuuteille ja sekunneille alkuarvot. Metodi tick vie kelloa sekunnin eteenpäin ja metodilla aseta voi asettaa kellon tunneille ja minuuteille uuden arvon ja nollata sekunnit.

Helsingin Yliopiston opiskelijaruokaloissa eli Unicafeissa opiskelijat maksavat lounaansa käyttäen maksukorttia.

Tässä tehtäväsarjassa tehdään luokka Maksukortti, jonka tarkoituksena on jäljitellä Unicafeissa tapahtuvaa maksutoimintaa.

Luokan runko

Tee ohjelmaan uusi luokka nimeltä Maksukortti.

Tee ensin luokalle konstruktori, jolle annetaan kortin alkusaldo ja joka tallentaa sen olion sisäiseen muuttujaan. Tee sitten __str__-metodi, joka palauttaa kortin saldon muodossa \"Kortilla on rahaa X euroa\". Rahamäärä tulee tulostaa yhden desimaalin tarkkuudella.

Seuraavassa on luokan Maksukortti runko:

class Maksukortti:\n    def __init__(self, alkusaldo: float):\n        self.saldo = alkusaldo\n\n    def __str__(self):\n        pass

Käyttöesimerkki

kortti = Maksukortti(50)\nprint(kortti)

Ohjelman tulisi tuottaa seuraava tulostus:

Kortilla on rahaa 50.0 euroa

Kortilla maksaminen

Täydennä Maksukortti-luokkaa seuraavilla metodeilla:

    \n
  • syo_edullisesti joka vähentää kortin saldoa 2.60 eurolla
  • \n
  • syo_maukkaasti joka vähentää kortin saldoa 4.60 eurolla
  • \n

Seuraava pääohjelma testaa luokkaa

kortti = Maksukortti(50)\nprint(kortti)\n\nkortti.syo_edullisesti()\nprint(kortti)\n\nkortti.syo_maukkaasti()\nkortti.syo_edullisesti()\nprint(kortti)

Ohjelman tulisi tuottaa seuraava tulostus:

Kortilla on rahaa 50.0 euroa\nKortilla on rahaa 47.4 euroa\nKortilla on rahaa 40.2 euroa

Huomaa, että kortin saldo ei saa mennä negatiiviseksi:

kortti = Maksukortti(4)\nprint(kortti)\n\nkortti.syo_edullisesti()\nprint(kortti)\n\nkortti.syo_edullisesti()\nprint(kortti)

Kortilla on rahaa 4.0 euroa\nKortilla on rahaa 1.4 euroa\nKortilla on rahaa 1.4 euroa

Eli kortin saldo ei enää vähene jos maksettaessa saldo ei ole riittävä.

Kortin lataaminen

Lisää Maksukortti-luokkaan metodi lataa_rahaa.

Metodin tarkoituksena on kasvattaa kortin saldoa parametrina annetulla rahamäärällä.

kortti = Maksukortti(10)\nprint(kortti)\nkortti.lataa_rahaa(15)\nprint(kortti)\nkortti.lataa_rahaa(10)\nprint(kortti)\nkortti.lataa_rahaa(200)\nprint(kortti)

Kortilla on rahaa 10.0 euroa\nKortilla on rahaa 25.0 euroa\nKortilla on rahaa 35.0 euroa\nKortilla on rahaa 235.0 euroa

Jos kortille yritetään ladata negatiivinen summa, tulee metodin tuottaa poikkeus ValueError:

kortti = Maksukortti(10)\nkortti.lataa_rahaa(-10)

File \"testi.py\", line 3, in maksukortti\nValueError: Kortille ei saa ladata negatiivista summaa

Huomaa että metodin tulee tuottaa poikkeus, katso osan 6 materiaalista miten poikkeus tuotetaan. Metodi ei missään tilanteessa itse tulosta mitään!

Monta korttia

Tee pääohjelma, joka sisältää seuraavan tapahtumasarjan:

    \n
  • Luo Pekan kortti. Kortin alkusaldo on 20 euroa
  • \n
  • Luo Matin kortti. Kortin alkusaldo on 30 euroa
  • \n
  • Pekka syö maukkaasti
  • \n
  • Matti syö edullisesti
  • \n
  • Korttien arvot tulostetaan (molemmat omalle rivilleen, rivin alkuun kortin omistajan nimi)
  • \n
  • Pekka lataa rahaa 20 euroa
  • \n
  • Matti syö maukkaasti
  • \n
  • Korttien arvot tulostetaan (molemmat omalle rivilleen, rivin alkuun kortin omistajan nimi)
  • \n
  • Pekka syö edullisesti
  • \n
  • Pekka syö edullisesti
  • \n
  • Matti lataa rahaa 50 euroa
  • \n
  • Korttien arvot tulostetaan (molemmat omalle rivilleen, rivin alkuun kortin omistajan nimi)
  • \n

Pääohjelman runko

pekan_kortti = Maksukortti(20)\nmatin_kortti = Maksukortti(30)\n# tee koodi tänne

Tulostuksen tulee olla seuraava

Pekka: Kortilla on rahaa 15.4 euroa\nMatti: Kortilla on rahaa 27.4 euroa\nPekka: Kortilla on rahaa 35.4 euroa\nMatti: Kortilla on rahaa 22.8 euroa\nPekka: Kortilla on rahaa 30.2 euroa\nMatti: Kortilla on rahaa 72.8 euroa

Esimerkki 2: Tehtävälista

Seuraava luokka Tehtavalista toteuttaa tehtävälistan:

class Tehtavalista:\n    def __init__(self):\n        self.tehtavat = []\n\n    def lisaa(self, nimi: str, prioriteetti: int):\n        self.tehtavat.append((prioriteetti, nimi))\n\n    def hae_seuraava(self):\n        self.tehtavat.sort()\n        # Metodi pop poistaa ja palauttaa listan viimeisen alkion\n        tehtava = self.tehtavat.pop()\n        # Palautetaan tuplen jälkimmäinen osa eli tehtävän nimi\n        return tehtava[1]\n\n    def yhteensa(self):\n        return len(self.tehtavat)\n\n    def tyhjenna(self):\n        self.tehtavat = []

Metodi lisaa lisää listalle uuden tehtävän tietyllä prioriteetilla ja metodi hae_seuraava poistaa ja palauttaa listan suurimman prioriteetin tehtävän. Lisäksi metodi yhteensa antaa listan tehtävien yhteismäärän ja metodi tyhjenna tyhjentää listan.

Tehtäviä säilytetään sisäisesti listassa, jossa on tuplena kunkin tehtävän prioriteetti ja nimi. Prioriteetti tallennetaan ensin, jolloin tärkein tehtävä on listan lopussa listan järjestämisen jälkeen. Tämän ansiosta tehtävän saa haettua ja poistettua listalta kätevästi pop-metodilla.

Seuraava koodi esittelee luokan käyttämistä:

lista = Tehtavalista()\nlista.lisaa(\"opiskelu\", 50)\nlista.lisaa(\"ulkoilu\", 60)\nlista.lisaa(\"siivous\", 10)\nprint(lista.yhteensa())\nprint(lista.hae_seuraava())\nprint(lista.yhteensa())\nlista.lisaa(\"treffit\", 100)\nprint(lista.yhteensa())\nprint(lista.hae_seuraava())\nprint(lista.hae_seuraava())\nprint(lista.yhteensa())\nlista.tyhjenna()\nprint(lista.yhteensa())

3\nulkoilu\n2\n3\ntreffit\nopiskelu\n1\n0

Luokka Sarja

Tee luokka Sarja, joka toimii seuraavasti

dexter = Sarja(\"Dexter\", 8, [\"Crime\", \"Drama\", \"Mystery\", \"Thriller\"])\nprint(dexter)

Dexter (8 esityskautta)\ngenret: Crime, Drama, Mystery, Thriller\nei arvosteluja

Konstruktorissa siis asetetaan sarjan nimi, sen esityskausien lukumäärä sekä lista, joka kertoo mitä genrejä sarja edustaa.

Vihje: merkkijonotaulukko saadaan muutettua haluttuja välimerkkejä sisältäväksi merkkijonoksi metodin join avulla seuraavasti:

lista = [\"Crime\", \"Drama\", \"Mystery\", \"Thriller\"]\nmerkkijono = \", \".join(lista)\nprint(merkkijono)

Crime, Drama, Mystery, Thriller

Arvostelujen lisääminen

Tee luokalle metodi arvostele(arvosana: int), jonka avulla sarjalle voi lisätä arvosanan, joka on kokonaisluku väliltä 0–5. Myös metodia __str__ tulee muuttaa niin, että se antaa arvostelujen määrän ja keskiarvon pyöristettynä yhden desimaalin tarkkuudelle (jos arvosteluja on annettu).

dexter = Sarja(\"Dexter\", 8, [\"Crime\", \"Drama\", \"Mystery\", \"Thriller\"])\ndexter.arvostele(4)\ndexter.arvostele(5)\ndexter.arvostele(5)\ndexter.arvostele(3)\ndexter.arvostele(0)\nprint(dexter)

Dexter (8 esityskautta)\ngenret: Crime, Drama, Mystery, Thriller\narvosteluja 5, keskiarvo 3.4 pistettä

Sarjojen haku

Tee kaksi funktiota arvosana_vahintaan(arvosana: float, sarjat: list) ja sisaltaa_genren(genre: str, sarjat: list), joiden avulla on mahdollista etsiä listalla olevia sarjoja.

Metodit toimivat seuraavasti:

s1 = Sarja(\"Dexter\", 8, [\"Crime\", \"Drama\", \"Mystery\", \"Thriller\"])\ns1.arvostele(5)\n\ns2 = Sarja(\"South Park\", 24, [\"Animation\", \"Comedy\"])\ns2.arvostele(3)\n\ns3 = Sarja(\"Friends\", 10, [\"Romance\", \"Comedy\"])\ns3.arvostele(2)\n\nsarjat = [s1, s2, s3]\n\nprint(\"arvosana vähintään 4.5:\")\nfor sarja in arvosana_vahintaan(4.5, sarjat):\n    print(sarja.nimi)\n\nprint(\"genre Comedy:\")\nfor sarja in sisaltaa_genren(\"Comedy\", sarjat):\n    print(sarja.nimi)

arvosana vähintään 4.5:\nDexter

genre Comedy:\nSouth Park\nFriends

Huomaa, että yllä oleva koodi ja testit olettavat, että luokassa on attribuutti nimi. Jos olet käyttänyt muuta nimeä, sinun kannattaa vaihtaa se nyt.

Vastaa lopuksi osion loppukyselyyn:

","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-8/5-lisaa-esimerkkeja.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-8/page-data.json b/page-data/osa-8/page-data.json index fade21375..71a12dae5 100644 --- a/page-data/osa-8/page-data.json +++ b/page-data/osa-8/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-part-overview-template-js", "path": "/osa-8", - "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-8","title":"Osa 8"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-8/index.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-8","title":"Osa 8"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-8/index.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-9/1-oliot-ja-viittaukset/page-data.json b/page-data/osa-9/1-oliot-ja-viittaukset/page-data.json index 007ff0c68..504c865d2 100644 --- a/page-data/osa-9/1-oliot-ja-viittaukset/page-data.json +++ b/page-data/osa-9/1-oliot-ja-viittaukset/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-9/1-oliot-ja-viittaukset", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten olioita voi tallentaa tietorakenteisiin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten olioiden välitys parametrina toimii"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa kaikki arvot ovat olioita ja myös omista luokista luotuja olioita voi käsitellä kuin mitä tahansa muitakin olioita. Esimerkiksi olioita voidaan tallentaa listaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" date\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kurssisuoritus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kurssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" suorituspvm"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kurssi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kurssi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opintopisteet\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"suorituspvm "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" suorituspvm\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luodaan pari kurssisuoritusta ja lisätään listaan"}]},{"type":"text","value":"\n suoritukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n mat1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kurssisuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Matematiikka 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n ohj1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kurssisuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmointi 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2019"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"17"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n suoritukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mat1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n suoritukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ohj1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Lisätään suoraan listaan muutama"}]},{"type":"text","value":"\n suoritukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kurssisuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Fysiikka 2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2019"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n suoritukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kurssisuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmointi 2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"19"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Käydään läpi kaikki suoritukset, tulostetaan nimet ja lasketaan opintopisteet yhteen"}]},{"type":"text","value":"\n opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" suoritus "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" suoritukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kurssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Opintopisteitä yhteensä:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Matematiikka 1\nOhjelmointi 1\nFysiikka 2\nOhjelmointi 2\nOpintopisteitä yhteensä: 20"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Nopein auto","tmcname":"osa09-01_nopein_auto"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa oleva luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Auto"}]},{"type":"text","value":" mallintaa autoa kahden attribuutin avulla: "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"merkki (str)"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"huippunopeus (int)"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nopein_auto(autot: list)"}]},{"type":"text","value":", joka saa parametrikseen listan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Auto"}]},{"type":"text","value":"-luokan olioita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa listassa olevista autoista nopeimman auton merkin. Voit olettaa, että nopein auto on yksikäsitteinen. Älä muuta alkuperäistä listaa tai luokkaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Auto"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion testauksesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n auto1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Auto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mersu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"195"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n auto2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Auto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lada\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"110"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n auto3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Auto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ferrari\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"280"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n auto4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Auto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Trabant\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"85"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n autot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"auto1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" auto2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" auto3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" auto4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nopein_auto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"autot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ferrari"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Hyväksytyt suoritukset","tmcname":"osa09-02_hyvaksytyt_suoritukset"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjasta löytyy luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Koesuoritus"}]},{"type":"text","value":", joka mallintaa nimensä mukaisesti koesuoritusta. Sillä on kaksi attribuuttia, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suorittaja (str)"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pisteet (int)"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hyvaksytyt(suoritukset: list, pisteraja: int)"}]},{"type":"text","value":", joka saa parametrikseen listan koesuorituksia ja alimman hyväksytyn pistemäärän kokonaislukuna."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio muodostaa ja palauttaa uuden listan, johon on tallennettu ainoastaan hyväksytyt suoritukset listalta. Älä muuta alkuperäistä listaa tai luokkaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Koesuoritus"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n s1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Koesuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n s2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Koesuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pirjo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"19"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n s3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Koesuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pauli\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n s4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Koesuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pirkko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n s5 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Koesuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Petriina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"17"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n hyv "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" hyvaksytyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"s1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s5"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" hyvaksytty "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" hyv"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"hyvaksytty"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koesuoritus (suorittaja: Pirjo, pisteet: 19)\nKoesuoritus (suorittaja: Pauli, pisteet: 15)\nKoesuoritus (suorittaja: Petriina, pisteet: 17)"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Listaan ei tarkkaan ottaen tallenneta olioita vaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"viittauksia olioihin"}]},{"type":"text","value":". Niinpä sama olio voi esiintyä listassa useaan kertaan ja samaan olioon voidaan viitata useaan kertaan listassa ja sen ulkopuolella. Esimerkiksi näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Tuote"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" yksikko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yksikko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" yksikko\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n kauppalista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n maito "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maito\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"litra\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"maito"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"maito"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kurkku\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kpl\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 313px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/13e71ea262de820629eb873bb73f2d94/80977/9_1_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 64.34782608695653%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAABdUlEQVQ4y22TiarCQAxF+/9/pQVRLLihFKu4r1iXui8YOeHlMXa8UNLpJDc3SwP5w/v9VrtYLGS73crhcJD9fq/PbreT9XptrnK9XmW5XEqWZXqP/+VykXa7LUGeEIdfgNRAME8e0+nUJ1ytVhLHsQwGA6nVatLv9/V7mqb/gbfbTcbjsSRJoiT1el1Go5H6eoSUUqlUpFAoqGMYhnI6nVS5+dzvdw0uFosSRZFUq1UVQRKPcLPZaDmQPB4Pfce6JdNDzig9n896BpPJxCekwb9AIgMkx+PR86FNHiGZ6RcEnU5Her2eWlMBns+n3jNlSqV8EnyV7JKanc/nGoS173Zn4I7SDYE5uWRu862HEOeBKsp3474I8wpfr5cuOgqwBJPEhmHL7sYF+awuMQpoNIHD4VB7xFrRZ86z2eyLUEtuNpvSaDSkXC5Lq9XSEpk0JOyhAWX2lxiJTdoVEdjSWj/cS7YfUv7RUqmkEyUxIkje7XY9hR86hOegM+cgfwAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/13e71ea262de820629eb873bb73f2d94/a0b58/9_1_1.webp 230w","/static/13e71ea262de820629eb873bb73f2d94/12766/9_1_1.webp 313w"],"sizes":"(max-width: 313px) 100vw, 313px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/13e71ea262de820629eb873bb73f2d94/81c8e/9_1_1.png 230w","/static/13e71ea262de820629eb873bb73f2d94/80977/9_1_1.png 313w"],"sizes":"(max-width: 313px) 100vw, 313px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/13e71ea262de820629eb873bb73f2d94/80977/9_1_1.png","alt":"9 1 1","title":"9 1 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos samaan olioon on useampi kuin yksi viittaus, on lopputuloksen kannalta yhdentekevää, mitä viittauksista käytetään:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Koira"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi\n\nkoirat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nmusti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Koira"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Musti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkoirat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"musti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkoirat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"musti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkoirat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Koira"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Musti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Koirat alussa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" koira "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" koirat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"koira"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kohdan 0 koira saa uuden nimen:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkoirat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Rekku\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" koira "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" koirat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"koira"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kohdan 2 koira saa uuden nimen:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkoirat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Fifi\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" koira "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" koirat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"koira"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koirat alussa:\nMusti\nMusti\nMusti\nKohdan 0 koira saa uuden nimen:\nRekku\nRekku\nMusti\nKohdan 2 koira saa uuden nimen:\nRekku\nRekku\nFifi"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Listan kohdissa 0 ja 1 on viittaus samaan olioon, joten olion sisältöä voidaan muuttaa kumman tahansa viittauksen kautta. Listan kohdassa 2 on kuitenkin viittaus toiseen olioon, minkä vuoksi tämän olion muuttaminen ei muuta muita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Operaattorilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"is"}]},{"type":"text","value":" voidaan tutkia, onko kyseessä täysin sama olio, ja operaattorilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" voidaan tutkia, onko kyseessä saman sisältöinen olio. Seuraava koodi havainnollistaa asiaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nlista2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nlista3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lista1\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista1 "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"is"}]},{"type":"text","value":" lista2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista1 "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"is"}]},{"type":"text","value":" lista3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista2 "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"is"}]},{"type":"text","value":" lista3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" lista2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" lista3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" lista3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"False\nTrue\nFalse"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\nTrue\nTrue"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Omista luokista muodostettuja olioita voidaan myös tallentaa esimerkiksi sanakirjaan ja muihin tietorakenteisiin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" op"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"op "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" op\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Käytetään avaimena opiskelijanumeroa ja arvona Opiskelija-oliota"}]},{"type":"text","value":"\n opiskelijat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olli Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"54321\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Outi Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"67"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"http://www.pythontutor.com/visualize.html#mode=edit","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Visualisaattori"}]},{"type":"text","value":" osaa havainnollistaa nämäkin asiat hienosti:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/d20c7f9a5570bf04d75c3836868a8870/15171/9_1_2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 43.04347826086957%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAABYlAAAWJQFJUiTwAAABPklEQVQoz2WR20rEMBBA/f+/8k0RFUVExdVda7ubtnHbSSfN3FLtVlHWA4E85DBnyEkYUow44Oj36PexB4wRpx9yzvPJ2cymf5xQSuM4ElHre1fvmSX/IGqA4xBHFgkBzPRYHgZ0BwIAMxFRSslynqbJeTi9uC9cr6ptceHr8zBcxXiNeKXazzIz9wcAYMkzs3yQY6Jy14ZILAJ+ReNONIqgCJrJLHddt1q9FEVRVVXT1AAQQmDmpXzJU5WuOuu7x3nv/CcbADabTVG873aurhvnnPfeOdc0zSHh9+lIXL7ddPvbMNwzl7OMiCmlnKcwUB+Sqi3xfycvmJl3dxHvRB5Ui28ZIxIRM5uZqorIcjn6HjMt15feX0K4IXqb5cQWQ6jK8nW93m63bdsy8zLnaPI05fDxHOOTyLNq9SV/Av8dBuHbnwNlAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/d20c7f9a5570bf04d75c3836868a8870/a0b58/9_1_2.webp 230w","/static/d20c7f9a5570bf04d75c3836868a8870/bc10c/9_1_2.webp 460w","/static/d20c7f9a5570bf04d75c3836868a8870/966d8/9_1_2.webp 920w","/static/d20c7f9a5570bf04d75c3836868a8870/445df/9_1_2.webp 1380w","/static/d20c7f9a5570bf04d75c3836868a8870/78de1/9_1_2.webp 1840w","/static/d20c7f9a5570bf04d75c3836868a8870/995bd/9_1_2.webp 2230w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/d20c7f9a5570bf04d75c3836868a8870/81c8e/9_1_2.png 230w","/static/d20c7f9a5570bf04d75c3836868a8870/08a84/9_1_2.png 460w","/static/d20c7f9a5570bf04d75c3836868a8870/c0255/9_1_2.png 920w","/static/d20c7f9a5570bf04d75c3836868a8870/b1001/9_1_2.png 1380w","/static/d20c7f9a5570bf04d75c3836868a8870/161ec/9_1_2.png 1840w","/static/d20c7f9a5570bf04d75c3836868a8870/15171/9_1_2.png 2230w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/d20c7f9a5570bf04d75c3836868a8870/c0255/9_1_2.png","alt":"9 1 2","title":"9 1 2","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"h2","properties":{"id":"selfilla-vai-ilman","style":"position:relative;"},"children":[{"type":"text","value":"Selfillä vai ilman?"},{"type":"element","tagName":"a","properties":{"href":"#selfilla-vai-ilman","ariaLabel":"selfilla vai ilman permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä vaiheessa kurssia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":"-määre saattaa vaikuttaa vielä hämärältä. Käytetään siis hetki sen pohtimiseen, milloin selfiä tulee käyttää, ja milloin sitä kannattaa olla käyttämättä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkinä yksinkertaista luokkaa, jonka avulla joukosta sanoja on mahdollista muodostaa sanasto:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Sanasto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_sana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsanasto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Sanasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsanasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsanasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"olio\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsanasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"olio-ohjelmointi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsanasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"olio\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsanasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nörtti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsanasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"nörtti\nolio\nolio-ohjelmointi\npython"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokka tallentaa sanalistan oliomuuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self.sanat"}]},{"type":"text","value":". Tässä tapauksessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":" tarvitaan ehdottomasti sekä luokan konstruktorissa että luokan muissa metodeissa tähän muuttujaan viitatessa, koska muuten sama lista ei ole kaikkien olion metodien käytettävissä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisätään luokalle metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pisin_sana(self)"}]},{"type":"text","value":" joka selvittää nimensä mukaisesti sanaston pisimmän sanan (tai yhden niistä)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtävän voisi toteuttaa vaikkapa seuraavasti, mutta näemme kohta miksei se ole kovin hyvä idea:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Sanasto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pisin_sana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# määritellään kaksi apumuuttujaa"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisimman_pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisimman_pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisimman_pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sana\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisin"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi siis käyttää kahta apumuuttujaa, jotka on määritelty käyttäen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":"-määrettä. Jos vielä halutaan hämmentää ohjelmakoodia lukevaa, apumuuttujat voisi lisäksi nimetä kryptisemmin, esim. "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"apu"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"apu2"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Sanasto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pisin_sana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# määritellään kaksi apumuuttujaa"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sana\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun muuttujan määrittely tehdään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":"-määreen avulla, liitetään muuttuja olion attribuutiksi, eli muuttuja tulee olemaan edelleen olemassa myös metodin suorituksen päätyttyä. Tämä on aivan tarpeetonta, koska kyseisiä apumuuttujia on tarkoitus käyttää vain metodissa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pisin_sana(self)"}]},{"type":"text","value":". Apumuuttujien määrittely "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":"-määreen avulla on siis varsin huono idea."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Paitsi turhaa, apumuuttujien liittäminen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":"-määreellä olion attribuuteiksi on myös riskialtista, varsinkin epämääräisesti nimettyjen apumuuttujien tapauksessa. Jos samaa apumuuttujaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self.apu"}]},{"type":"text","value":" käytetään monessa eri metodissa mutta täysin eri tarkoituksiin, voivat seuraukset olla arvaamattomat ja koodissa voi ilmetä hankalasti löydettäviä bugeja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ongelma voi tulla esiin erityisesti silloin jos apumuuttujan alkuarvo annetaan jossain muualla, esimerkiksi konstruktorissa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Sanasto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# määritellään apumuuttujia"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pisin_sana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tämä ei toimi sillä apu2:n tyyppi on väärä"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sana\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toisaalta uusien olion attribuuttien määrittely "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"muualla"}]},{"type":"text","value":" kuin konstruktorissa on sikäli vaarallista, että tällöin olion attribuutit riippuvat siitä, mitä metodeja on suoritettu. Kaikilla saman luokan avulla luoduilla olioilla ei välttämättä ole samoja attribuutteja, mistä seuraa helposti bugeja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Siispä oikea tapa määritellä yhdessä metodissa käytettävät apumuuttujat on tehdä se "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ilman"}]},{"type":"text","value":" "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":"-määrettä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Sanasto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pisin_sana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tämä on oikea tapa määritellä yhden metodin sisäiset apumuuttujat"}]},{"type":"text","value":"\n pisin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":"\n pisimman_pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" pisimman_pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n pisimman_pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pisin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sana\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" pisin"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tällaisessa toteutuksessa apumuuttujat ovat olemassa ainoastaan metodin suorituksen aikana, ja niissä olevat arvot eivät pääse aiheuttamaan komplikaatioita muussa koodissa."}]},{"type":"element","tagName":"h2","properties":{"id":"oliot-funktioiden-parametrina","style":"position:relative;"},"children":[{"type":"text","value":"Oliot funktioiden parametrina"},{"type":"element","tagName":"a","properties":{"href":"#oliot-funktioiden-parametrina","ariaLabel":"oliot funktioiden parametrina permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Omista luokista luodut oliot ovat yleensä muuttuvia eli mutatoituvia, joten niiden toiminta parametrina välitettäessä muistuttaa esimerkiksi listoista tuttua tapaa: funktio, jolle olio välitetään parametrina, voi muuttaa kyseistä oliota."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan yksinkertaista esimerkkiä, jossa funktiolle välitetään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"text","value":"-luokasta luotu olio. Funktion sisällä muutetaan opiskelijan nimi, ja muutos näkyy myös pääohjelmassa, koska molemmissa tilanteissa viitataan samaan olioon."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opiskelijanumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opiskelijanumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opiskelijanumero\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opiskelijanumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Huomaa, että tyyppivihjeenä käytetään nyt oman luokan nimeä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"muuta_nimi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olli Opiskelija\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luodaan opiskelijaolio"}]},{"type":"text","value":"\nolli "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olli Oppilas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"olli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmuuta_nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"olli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"olli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olli Oppilas (12345)\nOlli Opiskelija (12345)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olion voi myös luoda funktion sisällä. Mikäli funktio palauttaa viittauksen olioon, on muodostettu olio käytettävissä myös pääohjelmassa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" random "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" randint"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" choice\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opiskelijanumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opiskelijanumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opiskelijanumero\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opiskelijanumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"text","value":"\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Funktio luo ja palauttaa Opiskelija-olion, jolla on satunnainen nimi ja opiskelijanumero"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"uusi_opiskelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n etunimet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Minna\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mari\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n sukunimet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Virtanen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lahtinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Leinonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pythonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# arvo nimi"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" choice"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"etunimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" choice"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sukunimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Arvo opiskelijanumero"}]},{"type":"text","value":"\n opiskelijanumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"randint"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"99999"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luo ja palauta opiskelijaolio"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opiskelijanumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kutsutaan metodia viidesti, tallennetaan tulokset listaan"}]},{"type":"text","value":"\n opiskelijat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"uusi_opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" opiskelija "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mari Lahtinen (36213)\nArto Virtanen (11859)\nMari Pythonen (77330)\nArto Pythonen (86451)\nMinna Pythonen (86211)"}]}]},{"type":"element","tagName":"h2","properties":{"id":"oliot-metodien-parametrina","style":"position:relative;"},"children":[{"type":"text","value":"Oliot metodien parametrina"},{"type":"element","tagName":"a","properties":{"href":"#oliot-metodien-parametrina","ariaLabel":"oliot metodien parametrina permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oliot toimivat normaaliin tapaan myös "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"metodien"}]},{"type":"text","value":" parametrina. Tarkastellaan seuraavaa esimerkkiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pituus\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Huvipuistolaite"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pituusraja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kavijoita "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pituusraja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pituusraja\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"ota_kyytiin"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pituusraja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kavijoita "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" pääsi kyytiin\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" liian lyhyt :(\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kavijoita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" kävijää)\""}]}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huvipuistolaitteen metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ota_kyytiin"}]},{"type":"text","value":" saa nyt parametrina luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"text","value":" olion. Jos kävijä on riittävän pitkä, metodi päästää hänet laitteeseen ja lisää kävijöiden määrää. Seuraavassa esimerkkisuoritus:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"hurjakuru "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Huvipuistolaite"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hurjakuru\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"120"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\njarkko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jarkko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"172"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nvenla "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Venla\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"105"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nhurjakuru"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ota_kyytiin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jarkko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhurjakuru"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ota_kyytiin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"venla"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"hurjakuru"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jarkko pääsi kyytiin\nVenla liian lyhyt :(\nHurjakuru (1 kävijää)"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kasvatuslaitos","tmcname":"osa09-03_kasvatuslaitos"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassasi on valmiina jo luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"text","value":" sekä runko luokalle "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kasvatuslaitos"}]},{"type":"text","value":". Kasvatuslaitosoliot käsittelevät ihmisiä eri tavalla, esim. punnitsevat ja syöttävät ihmisiä. Rakennamme tässä tehtävässä kasvatuslaitoksen. Luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"text","value":" koodiin ei tehtävässä ole tarkoitus koskea!"}]},{"type":"element","tagName":"h2","properties":{"id":"henkiloiden-punnitseminen","style":"position:relative;"},"children":[{"type":"text","value":"Henkilöiden punnitseminen"},{"type":"element","tagName":"a","properties":{"href":"#henkiloiden-punnitseminen","ariaLabel":"henkiloiden punnitseminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kasvatuslaitoksen luokkarungossa on valmiina runko metodille punnitse:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kasvatuslaitos"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"punnitse"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# palautetaan parametrina annetun henkilön paino"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi saa parametrina henkilön ja metodin on tarkoitus palauttaa kutsujalleen parametrina olevan henkilön paino. Paino selviää pyytämällä parametrina olevalta henkilöltä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"henkilo"}]},{"type":"text","value":" sopiva attribuutti. Sinun tulee täydentää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"punnitse"}]},{"type":"text","value":"-metodin koodia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on pääohjelma jossa kasvatuslaitos punnitsee kaksi henkilöä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"haagan_neuvola "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kasvatuslaitos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\neero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Eero\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"110"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npekka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"33"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"176"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"85"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" painaa "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"haagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" kg\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pekka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" painaa "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"haagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" kg\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eero painaa 7 kg\nPekka painaa 85 kg"}]}]},{"type":"element","tagName":"h2","properties":{"id":"syottaminen","style":"position:relative;"},"children":[{"type":"text","value":"Syöttäminen"},{"type":"element","tagName":"a","properties":{"href":"#syottaminen","ariaLabel":"syottaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Parametrina olevan olion tilaa on mahdollista muuttaa. Tee kasvatuslaitokselle metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"syota(henkilo: Henkilo)"}]},{"type":"text","value":" joka kasvattaa parametrina olevan henkilön painoa yhdellä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on esimerkki, jossa henkilöt ensin punnitaan ja tämän jälkeen neuvolassa syötetään Eeroa kolme kertaa. Tämän jälkeen henkilöt taas punnitaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"haagan_neuvola "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kasvatuslaitos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\neero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Eero\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"110"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npekka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"33"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"176"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"85"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" painaa "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"haagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" kg\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pekka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" painaa "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"haagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" kg\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nhaagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syota"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhaagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syota"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhaagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syota"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" painaa "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"haagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" kg\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pekka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" painaa "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"haagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" kg\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostuksen pitäisi paljastaa, että Eeron paino on noussut kolmella:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eero painaa 7 kg\nPekka painaa 85 kg"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eero painaa 10 kg\nPekka painaa 85 kg"}]}]},{"type":"element","tagName":"h2","properties":{"id":"punnitusten-laskeminen","style":"position:relative;"},"children":[{"type":"text","value":"Punnitusten laskeminen"},{"type":"element","tagName":"a","properties":{"href":"#punnitusten-laskeminen","ariaLabel":"punnitusten laskeminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee kasvatuslaitokselle metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"punnitukset()"}]},{"type":"text","value":" joka kertoo, kuinka monta punnitusta kasvatuslaitos on ylipäätään tehnyt. Huom! Tarvitset uuden oliomuuttujan punnitusten lukumäärän laskemiseen. Testipääohjelma:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"haagan_neuvola "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kasvatuslaitos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\neero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Eero\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"110"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npekka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"33"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"176"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"85"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Punnituksia tehty "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"haagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nhaagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhaagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Punnituksia tehty "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"haagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nhaagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhaagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhaagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhaagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Punnituksia tehty "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"haagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Punnituksia tehty 0\nPunnituksia tehty 2\nPunnituksia tehty 6"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Maksukortti ja kassapääte","tmcname":"osa09-04_maksukortti_ja_kassapaate"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Teimme edellisessä osan "},{"type":"element","tagName":"a","properties":{"href":"/osa-8/5-lisaa-esimerkkeja#programming-exercise-maksukortti"},"children":[{"type":"text","value":"tehtävässä"}]},{"type":"text","value":" luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Maksukortti"}]},{"type":"text","value":". Kortilla oli metodit edullisesti ja maukkaasti syömistä sekä rahan lataamista varten."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellisen osan tyylillä tehdyssä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Maksukortti"}]},{"type":"text","value":"-luokassa oli kuitenkin ongelma. Kortti tiesi lounaiden hinnan ja osasi sen ansiosta vähentää saldoa oikean määrän. Entä kun hinnat nousevat? Tai jos myyntivalikoimaan tulee uusia tuotteita? Hintojen muuttaminen tarkoittaisi, että kaikki jo käytössä olevat kortit pitäisi korvata uudet hinnat tuntevilla korteilla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Parempi ratkaisu on tehdä kortit \"tyhmiksi\", hinnoista ja myytävistä tuotteista tietämättömiksi pelkän saldon säilyttäjiksi. Kaikki äly kannattaakin laittaa erillisiin olioihin, kassapäätteisiin."}]},{"type":"element","tagName":"h2","properties":{"id":"tyhma-maksukortti","style":"position:relative;"},"children":[{"type":"text","value":"\"Tyhmä\" maksukortti"},{"type":"element","tagName":"a","properties":{"href":"#tyhma-maksukortti","ariaLabel":"tyhma maksukortti permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteutetaan ensin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Maksukortti"}]},{"type":"text","value":"-luokasta \"tyhmä\" versio. Kortilla on ainoastaan metodit saldon kysymiseen, rahan lataamiseen ja rahan ottamiseen. Täydennä alla ja tehtäväpohjassa olevaan luokkaan metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ota_rahaa(maara)"}]},{"type":"text","value":" ohjeen mukaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Maksukortti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lataa_rahaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lisays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" lisays\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"ota_rahaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Toteuta metodi siten, että se ottaa kortilta rahaa vain, jos saldoa riittää"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Onnistuessaan metodi palauttaa True ja muuten False"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Testipääohjelma:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Rahaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ota_rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Onnistuiko otto:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Rahaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ota_rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Onnistuiko otto:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Rahaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rahaa 10\nOnnistuiko otto: True\nRahaa 2\nOnnistuiko otto: False\nRahaa 2"}]}]},{"type":"element","tagName":"h2","properties":{"id":"kassapaate-ja-kateiskauppa","style":"position:relative;"},"children":[{"type":"text","value":"Kassapääte ja käteiskauppa"},{"type":"element","tagName":"a","properties":{"href":"#kassapaate-ja-kateiskauppa","ariaLabel":"kassapaate ja kateiskauppa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Unicafessa asioidessa asiakas maksaa joko käteisellä tai maksukortilla. Myyjä käyttää kassapäätettä kortin veloittamiseen ja käteismaksujen hoitamiseen. Tehdään ensin kassapäätteestä käteismaksuihin sopiva versio."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kassapäätteen runko on seuraavanlainen. Metodien kommentit kertovat halutun toiminnallisuuden."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kassapaate"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kassassa on aluksi 1000 euroa rahaa"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"edulliset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maukkaat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"syo_edullisesti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" maksu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Edullinen lounas maksaa 2.50 euroa."}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kasvatetaan kassan rahamäärää edullisen lounaan hinnalla ja palautetaan vaihtorahat"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Jos parametrina annettu maksu ei ole riittävän suuri, ei lounasta myydä ja metodi palauttaa koko summan"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"syo_maukkaasti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" maksu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Maukas lounas maksaa 4.30 euroa."}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kasvatetaan kassan rahamäärää maukkaan lounaan hinnalla ja palautetaan vaihtorahat"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Jos parametrina annettu maksu ei ole riittävän suuri, ei lounasta myydä ja metodi palauttaa koko summan"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käyttöesimerkki"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"exactum "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kassapaate"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nvaihtorahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_edullisesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vaihtorahaa jäi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vaihtorahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nvaihtorahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_edullisesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vaihtorahaa jäi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vaihtorahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nvaihtorahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_maukkaasti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vaihtorahaa jäi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vaihtorahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kassassa rahaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Edullisia lounaita myyty\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"edulliset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maukkaita lounaita myyty\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maukkaat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaihtorahaa jäi 7.5\nVaihtorahaa jäi 2.5\nVaihtorahaa jäi 0.0\nKassassa rahaa 1009.3\nEdullisia lounaita myyty 2\nMaukkaita lounaita myyty 1"}]}]},{"type":"element","tagName":"h2","properties":{"id":"kortilla-maksaminen","style":"position:relative;"},"children":[{"type":"text","value":"Kortilla maksaminen"},{"type":"element","tagName":"a","properties":{"href":"#kortilla-maksaminen","ariaLabel":"kortilla maksaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajennetaan kassapäätettä siten, että myös kortilla voi maksaa. Teemme kassapäätteelle siis metodit, joiden parametrina kassapääte saa maksukortin, jolta se vähentää valitun lounaan hinnan. Seuraavassa ovat uusien metodien rungot ja ohje niiden toteuttamiseksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kassapaate"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"syo_edullisesti_kortilla"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Edullinen lounas maksaa 2.50 euroa"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Jos kortilla on tarpeeksi rahaa, vähennetään hinta kortilta ja palautetaan True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Muuten palautetaan False"}]},{"type":"text","value":"\n\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"syo_maukkaasti_kortilla"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Maukas lounas maksaa 4.30 euroa."}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Jos kortilla on tarpeeksi rahaa, vähennetään hinta kortilta ja palautetaan True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Muuten palautetaan False"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" kortilla maksaminen ei lisää kassapäätteessä olevan käteisen määrää."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on testipääohjelma ja haluttu tulostus:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"exactum "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kassapaate"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nvaihtorahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_edullisesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vaihtorahaa jäi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vaihtorahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_maukkaasti_kortilla"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Riittikö raha:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_maukkaasti_kortilla"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Riittikö raha:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_edullisesti_kortilla"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Riittikö raha:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kassassa rahaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Edullisia lounaita myyty\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"edulliset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maukkaita lounaita myyty\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maukkaat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaihtorahaa jäi 7.5\nRiittikö raha: True\nRiittikö raha: False\nRiittikö raha: True\nKassassa rahaa 1002.5\nEdullisia lounaita myyty 2\nMaukkaita lounaita myyty 1"}]}]},{"type":"element","tagName":"h2","properties":{"id":"rahan-lataaminen","style":"position:relative;"},"children":[{"type":"text","value":"Rahan lataaminen"},{"type":"element","tagName":"a","properties":{"href":"#rahan-lataaminen","ariaLabel":"rahan lataaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisätään vielä kassapäätteelle metodi jonka avulla kortille voidaan ladata lisää rahaa. Muista, että rahan lataamisen yhteydessä ladattava summa viedään kassapäätteeseen. Metodin runko:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lataa_rahaa_kortille"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Testipääohjelma ja esimerkkisyöte:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"exactum "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kassapaate"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nantin_kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Kortilla rahaa "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"antin_kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" euroa\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_maukkaasti_kortilla"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"antin_kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Riittikö raha:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nexactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lataa_rahaa_kortille"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"antin_kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Kortilla rahaa "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"antin_kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" euroa\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_maukkaasti_kortilla"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"antin_kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Riittikö raha:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Kortilla rahaa "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"antin_kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" euroa\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kassassa rahaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Edullisia lounaita myyty\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"edulliset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maukkaita lounaita myyty\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maukkaat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kortilla rahaa 2 euroa\nRiittikö raha: False\nKortilla rahaa 102 euroa\nRiittikö raha: True\nKortilla rahaa 97.7 euroa\nKassassa rahaa 1100\nEdullisia lounaita myyty 0\nMaukkaita lounaita myyty 1"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"saman-luokan-oliot-metodien-parametrina","style":"position:relative;"},"children":[{"type":"text","value":"Saman luokan oliot metodien parametrina"},{"type":"element","tagName":"a","properties":{"href":"#saman-luokan-oliot-metodien-parametrina","ariaLabel":"saman luokan oliot metodien parametrina permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan jälleen kerran yhtä versiota luokasta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" syntynyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syntynyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" syntynyt"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oletetaan että olemme tekemässä ohjelmaa, joka vertailee henkilöiden ikiä. Voisimme tehdä tarkoitusta varten erillisen funktion:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"vanhempi_kuin"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"henkilo1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" henkilo2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" henkilo1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syntynyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" henkilo2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syntynyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n\nmuhammad "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Muhammad ibn Musa al-Khwarizmi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"780"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npascal "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Blaise Pascal\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1623"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ngrace "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Grace Hopper\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1906"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" vanhempi_kuin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"muhammad"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pascal"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"muhammad"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" on vanhempi kuin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pascal"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"muhammad"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ei ole vanhempi kuin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pascal"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" vanhempi_kuin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"grace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pascal"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"grace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" on vanhempi kuin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pascal"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"grace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ei ole vanhempi kuin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pascal"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muhammad ibn Musa al-Khwarizmi on vanhempi kuin Blaise Pascal\nGrace Hopper ei ole vanhempi kuin Blaise Pascal"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olio-ohjelmoinnin henkeen kuuluu kuitenkin sijoittaa oliota käsittelevät \"funktiot\" luokan metodeiksi. Voisimmekin tehdä henkilölle metodin, jonka avulla henkilön ikää voidaan verrata "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"toiseen"}]},{"type":"text","value":" henkilöön:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" syntynyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syntynyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" syntynyt\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# huomaa, että tyyppivihje pitää antaa hipsuissa jos parametri on saman luokan olio!"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"vanhempi_kuin"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" toinen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Henkilo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syntynyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" toinen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syntynyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt siis olio itse on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"toinen"}]},{"type":"text","value":" on henkilöolio, joka toimii vertailukohtana."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, miten metodin kutsuminen eroaa funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"muhammad "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Muhammad ibn Musa al-Khwarizmi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"780"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npascal "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Blaise Pascal\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1623"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ngrace "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Grace Hopper\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1906"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" muhammad"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vanhempi_kuin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pascal"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"muhammad"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" on vanhempi kuin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pascal"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"muhammad"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ei ole vanhempi kuin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pascal"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" grace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vanhempi_kuin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pascal"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"grace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" on vanhempi kuin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pascal"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"grace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ei ole vanhempi kuin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pascal"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pisteen vasemmalla puolella on siis verrattava henkilö, eli olio, johon metodin suorituksessa viittaa muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":". Metodin parametrina taas on vertailukohta, eli metodin suorituksessa muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"toinen"}]},{"type":"text","value":" viittaama olio."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostus on sama kuin edellisessä funktiota käyttäneessä esimerkissä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että if-else-rakenne metodissa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vanhempi_kuin"}]},{"type":"text","value":" on oikeastaan turha, sillä vertailun arvona on suoraan haluamamme totuusarvo. Voimme siis yksinkertaistaa metodia seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" syntynyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syntynyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" syntynyt\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# huomaa, että tyyppivihje pitää antaa hipsuissa jos parametri on saman luokan olio!"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"vanhempi_kuin"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" toinen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Henkilo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syntynyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" toinen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syntynyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellisestä esimerkistä kannattaa huomata se, että kun metodi saa parametrikseen toisen saman luokan olion, tulee tyyppivihje antaa hipsuissa, eli seuraava koodi aiheuttaisi virheen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tämä ei toimi, Henkilo pitaa olla hipsuissa"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"vanhempi_kuin"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" toinen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syntynyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" toinen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syntynyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Asuntovertailu","tmcname":"osa09-05_asuntovertailu"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Asuntovälitystoimiston tietojärjestelmässä kuvataan myynnissä olevaa asuntoa seuraavasta luokasta tehdyillä olioilla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Asunto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" huoneita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nelioita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" neliohinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"huoneita "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" huoneita\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nelioita "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nelioita\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"neliohinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" neliohinta"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtävänä on toteuttaa metodeita, joiden avulla myynnissä olevia asuntoja voidaan vertailla."}]},{"type":"element","tagName":"h2","properties":{"id":"onko-suurempi","style":"position:relative;"},"children":[{"type":"text","value":"Onko suurempi"},{"type":"element","tagName":"a","properties":{"href":"#onko-suurempi","ariaLabel":"onko suurempi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suurempi(self, verrattava)"}]},{"type":"text","value":", joka palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", jos asunto-olio itse on pinta-alaltaan suurempi kuin verrattava asunto-olio."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki metodin toiminnasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"eira_yksio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"16"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkallio_kaksio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"38"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4200"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\njakomaki_kolmio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"78"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eira_yksio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"suurempi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kallio_kaksio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jakomaki_kolmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"suurempi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kallio_kaksio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"False\nTrue"}]}]},{"type":"element","tagName":"h2","properties":{"id":"hintaero","style":"position:relative;"},"children":[{"type":"text","value":"Hintaero"},{"type":"element","tagName":"a","properties":{"href":"#hintaero","ariaLabel":"hintaero permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hintaero(self, verrattava)"}]},{"type":"text","value":", joka palauttaa asunto-olion ja verrattavan asunto-olion hintaeron. Hintaero on asuntojen hintojen erotuksen (hinta lasketaan kertomalla neliöhinta neliöillä) itseisarvo."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki metodin toiminnasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"eira_yksio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"16"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkallio_kaksio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"38"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4200"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\njakomaki_kolmio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"78"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eira_yksio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hintaero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kallio_kaksio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jakomaki_kolmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hintaero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kallio_kaksio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"71600\n35400"}]}]},{"type":"element","tagName":"h2","properties":{"id":"onko-kalliimpi","style":"position:relative;"},"children":[{"type":"text","value":"Onko kalliimpi?"},{"type":"element","tagName":"a","properties":{"href":"#onko-kalliimpi","ariaLabel":"onko kalliimpi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kalliimpi(self, verrattava)"}]},{"type":"text","value":" joka palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", jos asunto-olio on kalliimpi kuin verrattavana oleva asunto-olio."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki metodin toiminnasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"eira_yksio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"16"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkallio_kaksio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"38"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4200"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\njakomaki_kolmio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"78"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eira_yksio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kalliimpi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kallio_kaksio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jakomaki_kolmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kalliimpi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kallio_kaksio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"False\nTrue"}]}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, miten olioita voi tallentaa tietorakenteisiin
  • \n
  • Tiedät, miten olioiden välitys parametrina toimii
  • \n

Pythonissa kaikki arvot ovat olioita ja myös omista luokista luotuja olioita voi käsitellä kuin mitä tahansa muitakin olioita. Esimerkiksi olioita voidaan tallentaa listaan:

from datetime import date\n\nclass Kurssisuoritus:\n\n    def __init__(self, kurssi: str, opintopisteet: int, suorituspvm: date):\n        self.kurssi = kurssi\n        self.opintopisteet = opintopisteet\n        self.suorituspvm = suorituspvm\n\n\nif __name__ == \"__main__\":\n    # Luodaan pari kurssisuoritusta ja lisätään listaan\n    suoritukset = []\n\n    mat1 = Kurssisuoritus(\"Matematiikka 1\", 5, date(2020, 3, 11))\n    ohj1 = Kurssisuoritus(\"Ohjelmointi 1\", 6, date(2019, 12, 17))\n\n    suoritukset.append(mat1)\n    suoritukset.append(ohj1)\n\n    # Lisätään suoraan listaan muutama\n    suoritukset.append(Kurssisuoritus(\"Fysiikka 2\", 4, date(2019, 11, 10)))\n    suoritukset.append(Kurssisuoritus(\"Ohjelmointi 2\", 5, date(2020, 5, 19)))\n\n    # Käydään läpi kaikki suoritukset, tulostetaan nimet ja lasketaan opintopisteet yhteen\n    opintopisteet = 0\n    for suoritus in suoritukset:\n        print(suoritus.kurssi)\n        opintopisteet += suoritus.opintopisteet\n\n    print(\"Opintopisteitä yhteensä:\", opintopisteet)

Matematiikka 1\nOhjelmointi 1\nFysiikka 2\nOhjelmointi 2\nOpintopisteitä yhteensä: 20

Tehtäväpohjassa oleva luokka Auto mallintaa autoa kahden attribuutin avulla: merkki (str) ja huippunopeus (int).

Kirjoita funktio nopein_auto(autot: list), joka saa parametrikseen listan Auto-luokan olioita.

Funktio palauttaa listassa olevista autoista nopeimman auton merkin. Voit olettaa, että nopein auto on yksikäsitteinen. Älä muuta alkuperäistä listaa tai luokkaa Auto.

Esimerkki funktion testauksesta:

if __name__ == \"__main__\":\n    auto1 = Auto(\"Mersu\", 195)\n    auto2 = Auto(\"Lada\", 110)\n    auto3 = Auto(\"Ferrari\", 280)\n    auto4 = Auto(\"Trabant\", 85)\n\n    autot = [auto1, auto2, auto3, auto4]\n    print(nopein_auto(autot))

Ferrari

Tehtäväpohjasta löytyy luokka Koesuoritus, joka mallintaa nimensä mukaisesti koesuoritusta. Sillä on kaksi attribuuttia, suorittaja (str) ja pisteet (int).

Kirjoita funktio hyvaksytyt(suoritukset: list, pisteraja: int), joka saa parametrikseen listan koesuorituksia ja alimman hyväksytyn pistemäärän kokonaislukuna.

Funktio muodostaa ja palauttaa uuden listan, johon on tallennettu ainoastaan hyväksytyt suoritukset listalta. Älä muuta alkuperäistä listaa tai luokkaa Koesuoritus.

Esimerkki funktion käytöstä:

if __name__ == \"__main__\":\n    s1 = Koesuoritus(\"Pekka\", 12)\n    s2 = Koesuoritus(\"Pirjo\", 19)\n    s3 = Koesuoritus(\"Pauli\", 15)\n    s4 = Koesuoritus(\"Pirkko\", 9)\n    s5 = Koesuoritus(\"Petriina\", 17)\n\n    hyv = hyvaksytyt([s1, s2, s3, s4, s5], 15)\n    for hyvaksytty in hyv:\n        print(hyvaksytty)

Koesuoritus (suorittaja: Pirjo, pisteet: 19)\nKoesuoritus (suorittaja: Pauli, pisteet: 15)\nKoesuoritus (suorittaja: Petriina, pisteet: 17)

Listaan ei tarkkaan ottaen tallenneta olioita vaan viittauksia olioihin. Niinpä sama olio voi esiintyä listassa useaan kertaan ja samaan olioon voidaan viitata useaan kertaan listassa ja sen ulkopuolella. Esimerkiksi näin:

class Tuote:\n    def __init__(self, nimi: int, yksikko: str):\n        self.nimi = nimi\n        self.yksikko = yksikko\n\n\nif __name__ == \"__main__\":\n    kauppalista = []\n    maito = Tuote(\"Maito\", \"litra\")\n\n    kauppalista.append(maito)\n    kauppalista.append(maito)\n    kauppalista.append(Tuote(\"Kurkku\", \"kpl\"))
\n \n \n \n \n \n \"9\n \n \n

Jos samaan olioon on useampi kuin yksi viittaus, on lopputuloksen kannalta yhdentekevää, mitä viittauksista käytetään:

class Koira:\n    def __init__(self, nimi):\n        self.nimi = nimi\n\n    def __str__(self):\n        return self.nimi\n\nkoirat = []\nmusti = Koira(\"Musti\")\nkoirat.append(musti)\nkoirat.append(musti)\nkoirat.append(Koira(\"Musti\"))\n\nprint(\"Koirat alussa:\")\nfor koira in koirat:\n    print(koira)\n\nprint(\"Kohdan 0 koira saa uuden nimen:\")\nkoirat[0].nimi = \"Rekku\"\nfor koira in koirat:\n    print(koira)\n\nprint(\"Kohdan 2 koira saa uuden nimen:\")\nkoirat[2].nimi = \"Fifi\"\nfor koira in koirat:\n    print(koira)

Koirat alussa:\nMusti\nMusti\nMusti\nKohdan 0 koira saa uuden nimen:\nRekku\nRekku\nMusti\nKohdan 2 koira saa uuden nimen:\nRekku\nRekku\nFifi

Listan kohdissa 0 ja 1 on viittaus samaan olioon, joten olion sisältöä voidaan muuttaa kumman tahansa viittauksen kautta. Listan kohdassa 2 on kuitenkin viittaus toiseen olioon, minkä vuoksi tämän olion muuttaminen ei muuta muita.

Operaattorilla is voidaan tutkia, onko kyseessä täysin sama olio, ja operaattorilla == voidaan tutkia, onko kyseessä saman sisältöinen olio. Seuraava koodi havainnollistaa asiaa:

lista1 = [1, 2, 3]\nlista2 = [1, 2, 3]\nlista3 = lista1\n\nprint(lista1 is lista2)\nprint(lista1 is lista3)\nprint(lista2 is lista3)\n\nprint()\n\nprint(lista1 == lista2)\nprint(lista1 == lista3)\nprint(lista2 == lista3)

False\nTrue\nFalse

True\nTrue\nTrue

Omista luokista muodostettuja olioita voidaan myös tallentaa esimerkiksi sanakirjaan ja muihin tietorakenteisiin:

class Opiskelija:\n    def __init__(self, nimi: str, op: int):\n        self.nimi = nimi\n        self.op = op\n\nif __name__ == \"__main__\":\n    # Käytetään avaimena opiskelijanumeroa ja arvona Opiskelija-oliota\n    opiskelijat = {}\n    opiskelijat[\"12345\"] = Opiskelija(\"Olli Opiskelija\", 10)\n    opiskelijat[\"54321\"] = Opiskelija(\"Outi Opiskelija\", 67)

Visualisaattori osaa havainnollistaa nämäkin asiat hienosti:

\n \n \n \n \n \n \"9\n \n \n

Selfillä vai ilman?

Tässä vaiheessa kurssia self-määre saattaa vaikuttaa vielä hämärältä. Käytetään siis hetki sen pohtimiseen, milloin selfiä tulee käyttää, ja milloin sitä kannattaa olla käyttämättä.

Tarkastellaan esimerkkinä yksinkertaista luokkaa, jonka avulla joukosta sanoja on mahdollista muodostaa sanasto:

class Sanasto:\n    def __init__(self):\n        self.sanat = []\n\n    def lisaa_sana(self, sana: str):\n        if not sana in self.sanat:\n            self.sanat.append(sana)\n\n    def tulosta(self):\n        for sana in sorted(self.sanat):\n            print(sana)\n\nsanasto = Sanasto()\nsanasto.lisaa_sana(\"python\")\nsanasto.lisaa_sana(\"olio\")\nsanasto.lisaa_sana(\"olio-ohjelmointi\")\nsanasto.lisaa_sana(\"olio\")\nsanasto.lisaa_sana(\"nörtti\")\n\nsanasto.tulosta()

nörtti\nolio\nolio-ohjelmointi\npython

Luokka tallentaa sanalistan oliomuuttujaan self.sanat. Tässä tapauksessa self tarvitaan ehdottomasti sekä luokan konstruktorissa että luokan muissa metodeissa tähän muuttujaan viitatessa, koska muuten sama lista ei ole kaikkien olion metodien käytettävissä.

Lisätään luokalle metodi pisin_sana(self) joka selvittää nimensä mukaisesti sanaston pisimmän sanan (tai yhden niistä).

Tehtävän voisi toteuttaa vaikkapa seuraavasti, mutta näemme kohta miksei se ole kovin hyvä idea:

class Sanasto:\n    def __init__(self):\n        self.sanat = []\n\n    # ...\n\n    def pisin_sana(self):\n        # määritellään kaksi apumuuttujaa\n        self.pisin = \"\"\n        self.pisimman_pituus = 0\n\n        for sana in self.sanat:\n            if len(sana) > self.pisimman_pituus:\n                self.pisimman_pituus = len(sana)\n                self.pisin = sana\n\n        return self.pisin

Metodi siis käyttää kahta apumuuttujaa, jotka on määritelty käyttäen self-määrettä. Jos vielä halutaan hämmentää ohjelmakoodia lukevaa, apumuuttujat voisi lisäksi nimetä kryptisemmin, esim. apu ja apu2:

class Sanasto:\n    def __init__(self):\n        self.sanat = []\n\n    # ...\n\n    def pisin_sana(self):\n        # määritellään kaksi apumuuttujaa\n        self.apu = \"\"\n        self.apu2 = 0\n\n        for sana in self.sanat:\n            if len(sana) > self.apu2:\n                self.apu2 = len(sana)\n                self.apu = sana\n\n        return self.apu

Kun muuttujan määrittely tehdään self-määreen avulla, liitetään muuttuja olion attribuutiksi, eli muuttuja tulee olemaan edelleen olemassa myös metodin suorituksen päätyttyä. Tämä on aivan tarpeetonta, koska kyseisiä apumuuttujia on tarkoitus käyttää vain metodissa pisin_sana(self). Apumuuttujien määrittely self-määreen avulla on siis varsin huono idea.

Paitsi turhaa, apumuuttujien liittäminen self-määreellä olion attribuuteiksi on myös riskialtista, varsinkin epämääräisesti nimettyjen apumuuttujien tapauksessa. Jos samaa apumuuttujaa self.apu käytetään monessa eri metodissa mutta täysin eri tarkoituksiin, voivat seuraukset olla arvaamattomat ja koodissa voi ilmetä hankalasti löydettäviä bugeja.

Ongelma voi tulla esiin erityisesti silloin jos apumuuttujan alkuarvo annetaan jossain muualla, esimerkiksi konstruktorissa:

class Sanasto:\n    def __init__(self):\n        self.sanat = []\n        # määritellään apumuuttujia\n        self.apu = \"\"\n        self.apu2 = \"\"\n        self.apu3 = \"\"\n        self.apu4 = \"\"\n\n    # ...\n\n    def pisin_sana(self):\n        for sana in self.sanat:\n            # tämä ei toimi sillä apu2:n tyyppi on väärä\n            if len(sana) > self.apu2:\n                self.apu2 = len(sana)\n                self.apu = sana\n\n        return self.apu

Toisaalta uusien olion attribuuttien määrittely muualla kuin konstruktorissa on sikäli vaarallista, että tällöin olion attribuutit riippuvat siitä, mitä metodeja on suoritettu. Kaikilla saman luokan avulla luoduilla olioilla ei välttämättä ole samoja attribuutteja, mistä seuraa helposti bugeja.

Siispä oikea tapa määritellä yhdessä metodissa käytettävät apumuuttujat on tehdä se ilman self-määrettä:

class Sanasto:\n    def __init__(self):\n        self.sanat = []\n\n    # ...\n\n    def pisin_sana(self):\n        # tämä on oikea tapa määritellä yhden metodin sisäiset apumuuttujat\n        pisin = \"\"\n        pisimman_pituus = 0\n\n        for sana in self.sanat:\n            if len(sana) > pisimman_pituus:\n                pisimman_pituus = len(sana)\n                pisin = sana\n\n        return pisin

Tällaisessa toteutuksessa apumuuttujat ovat olemassa ainoastaan metodin suorituksen aikana, ja niissä olevat arvot eivät pääse aiheuttamaan komplikaatioita muussa koodissa.

Oliot funktioiden parametrina

Omista luokista luodut oliot ovat yleensä muuttuvia eli mutatoituvia, joten niiden toiminta parametrina välitettäessä muistuttaa esimerkiksi listoista tuttua tapaa: funktio, jolle olio välitetään parametrina, voi muuttaa kyseistä oliota.

Tarkastellaan yksinkertaista esimerkkiä, jossa funktiolle välitetään Opiskelija-luokasta luotu olio. Funktion sisällä muutetaan opiskelijan nimi, ja muutos näkyy myös pääohjelmassa, koska molemmissa tilanteissa viitataan samaan olioon.

class Opiskelija:\n    def __init__(self, nimi: str, opiskelijanumero: str):\n        self.nimi = nimi\n        self.opiskelijanumero = opiskelijanumero\n\n    def __str__(self):\n        return f\"{self.nimi} ({self.opiskelijanumero})\"\n\n# Huomaa, että tyyppivihjeenä käytetään nyt oman luokan nimeä\ndef muuta_nimi(opiskelija: Opiskelija):\n    opiskelija.nimi = \"Olli Opiskelija\"\n\n# Luodaan opiskelijaolio\nolli = Opiskelija(\"Olli Oppilas\", \"12345\")\n\nprint(olli)\nmuuta_nimi(olli)\nprint(olli)

Olli Oppilas (12345)\nOlli Opiskelija (12345)

Olion voi myös luoda funktion sisällä. Mikäli funktio palauttaa viittauksen olioon, on muodostettu olio käytettävissä myös pääohjelmassa:

from random import randint, choice\n\nclass Opiskelija:\n    def __init__(self, nimi: str, opiskelijanumero: str):\n        self.nimi = nimi\n        self.opiskelijanumero = opiskelijanumero\n\n    def __str__(self):\n        return f\"{self.nimi} ({self.opiskelijanumero})\"\n\n\n# Funktio luo ja palauttaa Opiskelija-olion, jolla on satunnainen nimi ja opiskelijanumero\ndef uusi_opiskelija():\n    etunimet = [\"Arto\",\"Pekka\",\"Minna\",\"Mari\"]\n    sukunimet = [\"Virtanen\", \"Lahtinen\", \"Leinonen\", \"Pythonen\"]\n\n    # arvo nimi\n    nimi = choice(etunimet) + \" \" + choice(sukunimet)\n\n    # Arvo opiskelijanumero\n    opiskelijanumero = str(randint(10000,99999))\n\n    # Luo ja palauta opiskelijaolio\n    return Opiskelija(nimi, opiskelijanumero)\n\nif __name__ == \"__main__\":\n    # Kutsutaan metodia viidesti, tallennetaan tulokset listaan\n    opiskelijat = []\n    for i in range(5):\n        opiskelijat.append(uusi_opiskelija())\n\n    # Tulostetaan\n    for opiskelija in opiskelijat:\n        print(opiskelija)

Mari Lahtinen (36213)\nArto Virtanen (11859)\nMari Pythonen (77330)\nArto Pythonen (86451)\nMinna Pythonen (86211)

Oliot metodien parametrina

Oliot toimivat normaaliin tapaan myös metodien parametrina. Tarkastellaan seuraavaa esimerkkiä:

class Henkilo:\n    def __init__(self, nimi: str, pituus: int):\n        self.nimi = nimi\n        self.pituus = pituus\n\nclass Huvipuistolaite:\n    def __init__(self, nimi: str, pituusraja: int):\n        self.kavijoita = 0\n        self.nimi = nimi\n        self.pituusraja = pituusraja\n\n    def ota_kyytiin(self, henkilo: Henkilo):\n        if henkilo.pituus >= self.pituusraja:\n            self.kavijoita += 1\n            print(f\"{henkilo.nimi} pääsi kyytiin\")\n        else:\n            print(f\"{henkilo.nimi} liian lyhyt :(\")\n\n    def __str__(self):\n        return f\"{self.nimi} ({self.kavijoita} kävijää)\"

Huvipuistolaitteen metodi ota_kyytiin saa nyt parametrina luokan Henkilo olion. Jos kävijä on riittävän pitkä, metodi päästää hänet laitteeseen ja lisää kävijöiden määrää. Seuraavassa esimerkkisuoritus:

hurjakuru = Huvipuistolaite(\"Hurjakuru\", 120)\njarkko = Henkilo(\"Jarkko\", 172)\nvenla = Henkilo(\"Venla\", 105)\n\nhurjakuru.ota_kyytiin(jarkko)\nhurjakuru.ota_kyytiin(venla)\n\nprint(hurjakuru)

Jarkko pääsi kyytiin\nVenla liian lyhyt :(\nHurjakuru (1 kävijää)

Tehtäväpohjassasi on valmiina jo luokka Henkilo sekä runko luokalle Kasvatuslaitos. Kasvatuslaitosoliot käsittelevät ihmisiä eri tavalla, esim. punnitsevat ja syöttävät ihmisiä. Rakennamme tässä tehtävässä kasvatuslaitoksen. Luokan Henkilo koodiin ei tehtävässä ole tarkoitus koskea!

Henkilöiden punnitseminen

Kasvatuslaitoksen luokkarungossa on valmiina runko metodille punnitse:

class Kasvatuslaitos:\n    def punnitse(self, henkilo: Henkilo):\n        # palautetaan parametrina annetun henkilön paino\n        return -1

Metodi saa parametrina henkilön ja metodin on tarkoitus palauttaa kutsujalleen parametrina olevan henkilön paino. Paino selviää pyytämällä parametrina olevalta henkilöltä henkilo sopiva attribuutti. Sinun tulee täydentää punnitse-metodin koodia.

Seuraavassa on pääohjelma jossa kasvatuslaitos punnitsee kaksi henkilöä:

haagan_neuvola = Kasvatuslaitos()\n\neero = Henkilo(\"Eero\", 1, 110, 7)\npekka = Henkilo(\"Pekka\", 33, 176, 85)\n\nprint(f\"{eero.nimi} painaa {haagan_neuvola.punnitse(eero)} kg\")\nprint(f\"{pekka.nimi} painaa {haagan_neuvola.punnitse(pekka)} kg\")

Eero painaa 7 kg\nPekka painaa 85 kg

Syöttäminen

Parametrina olevan olion tilaa on mahdollista muuttaa. Tee kasvatuslaitokselle metodi syota(henkilo: Henkilo) joka kasvattaa parametrina olevan henkilön painoa yhdellä.

Seuraavassa on esimerkki, jossa henkilöt ensin punnitaan ja tämän jälkeen neuvolassa syötetään Eeroa kolme kertaa. Tämän jälkeen henkilöt taas punnitaan:

haagan_neuvola = Kasvatuslaitos()\n\neero = Henkilo(\"Eero\", 1, 110, 7)\npekka = Henkilo(\"Pekka\", 33, 176, 85)\n\nprint(f\"{eero.nimi} painaa {haagan_neuvola.punnitse(eero)} kg\")\nprint(f\"{pekka.nimi} painaa {haagan_neuvola.punnitse(pekka)} kg\")\nprint()\n\nhaagan_neuvola.syota(eero)\nhaagan_neuvola.syota(eero)\nhaagan_neuvola.syota(eero)\n\nprint(f\"{eero.nimi} painaa {haagan_neuvola.punnitse(eero)} kg\")\nprint(f\"{pekka.nimi} painaa {haagan_neuvola.punnitse(pekka)} kg\")

Tulostuksen pitäisi paljastaa, että Eeron paino on noussut kolmella:

Eero painaa 7 kg\nPekka painaa 85 kg

Eero painaa 10 kg\nPekka painaa 85 kg

Punnitusten laskeminen

Tee kasvatuslaitokselle metodi punnitukset() joka kertoo, kuinka monta punnitusta kasvatuslaitos on ylipäätään tehnyt. Huom! Tarvitset uuden oliomuuttujan punnitusten lukumäärän laskemiseen. Testipääohjelma:

haagan_neuvola = Kasvatuslaitos()\n\neero = Henkilo(\"Eero\", 1, 110, 7)\npekka = Henkilo(\"Pekka\", 33, 176, 85)\n\nprint(f\"Punnituksia tehty {haagan_neuvola.punnitukset()}\")\n\nhaagan_neuvola.punnitse(eero)\nhaagan_neuvola.punnitse(eero)\n\nprint(f\"Punnituksia tehty {haagan_neuvola.punnitukset()}\")\n\nhaagan_neuvola.punnitse(eero)\nhaagan_neuvola.punnitse(eero)\nhaagan_neuvola.punnitse(eero)\nhaagan_neuvola.punnitse(eero)\n\nprint(f\"Punnituksia tehty {haagan_neuvola.punnitukset()}\")

Punnituksia tehty 0\nPunnituksia tehty 2\nPunnituksia tehty 6

Teimme edellisessä osan tehtävässä luokan Maksukortti. Kortilla oli metodit edullisesti ja maukkaasti syömistä sekä rahan lataamista varten.

Edellisen osan tyylillä tehdyssä Maksukortti-luokassa oli kuitenkin ongelma. Kortti tiesi lounaiden hinnan ja osasi sen ansiosta vähentää saldoa oikean määrän. Entä kun hinnat nousevat? Tai jos myyntivalikoimaan tulee uusia tuotteita? Hintojen muuttaminen tarkoittaisi, että kaikki jo käytössä olevat kortit pitäisi korvata uudet hinnat tuntevilla korteilla.

Parempi ratkaisu on tehdä kortit \"tyhmiksi\", hinnoista ja myytävistä tuotteista tietämättömiksi pelkän saldon säilyttäjiksi. Kaikki äly kannattaakin laittaa erillisiin olioihin, kassapäätteisiin.

\"Tyhmä\" maksukortti

Toteutetaan ensin Maksukortti-luokasta \"tyhmä\" versio. Kortilla on ainoastaan metodit saldon kysymiseen, rahan lataamiseen ja rahan ottamiseen. Täydennä alla ja tehtäväpohjassa olevaan luokkaan metodin ota_rahaa(maara) ohjeen mukaan:

class Maksukortti:\n    def __init__(self, saldo: float):\n        self.saldo = saldo\n\n    def lataa_rahaa(self, lisays: float):\n        self.saldo += lisays\n\n    def ota_rahaa(self, maara: float):\n        pass\n        # Toteuta metodi siten, että se ottaa kortilta rahaa vain, jos saldoa riittää\n        # Onnistuessaan metodi palauttaa True ja muuten False

Testipääohjelma:

if __name__ == \"__main__\":\n    kortti = Maksukortti(10)\n    print(\"Rahaa\", kortti.saldo)\n    tulos = kortti.ota_rahaa(8)\n    print(\"Onnistuiko otto:\", tulos)\n    print(\"Rahaa\", kortti.saldo)\n    tulos = kortti.ota_rahaa(4)\n    print(\"Onnistuiko otto:\", tulos)\n    print(\"Rahaa\", kortti.saldo)

Rahaa 10\nOnnistuiko otto: True\nRahaa 2\nOnnistuiko otto: False\nRahaa 2

Kassapääte ja käteiskauppa

Unicafessa asioidessa asiakas maksaa joko käteisellä tai maksukortilla. Myyjä käyttää kassapäätettä kortin veloittamiseen ja käteismaksujen hoitamiseen. Tehdään ensin kassapäätteestä käteismaksuihin sopiva versio.

Kassapäätteen runko on seuraavanlainen. Metodien kommentit kertovat halutun toiminnallisuuden.

class Kassapaate:\n    def __init__(self):\n        # Kassassa on aluksi 1000 euroa rahaa\n        self.rahaa = 1000\n        self.edulliset = 0\n        self.maukkaat = 0\n\n    def syo_edullisesti(self, maksu: float):\n        # Edullinen lounas maksaa 2.50 euroa.\n        # Kasvatetaan kassan rahamäärää edullisen lounaan hinnalla ja palautetaan vaihtorahat\n        # Jos parametrina annettu maksu ei ole riittävän suuri, ei lounasta myydä ja metodi palauttaa koko summan\n\n    def syo_maukkaasti(self, maksu: float):\n        # Maukas lounas maksaa 4.30 euroa.\n        # Kasvatetaan kassan rahamäärää maukkaan lounaan hinnalla ja palautetaan vaihtorahat\n        # Jos parametrina annettu maksu ei ole riittävän suuri, ei lounasta myydä ja metodi palauttaa koko summan

Käyttöesimerkki

exactum = Kassapaate()\n\nvaihtorahaa = exactum.syo_edullisesti(10)\nprint(\"Vaihtorahaa jäi\", vaihtorahaa)\n\nvaihtorahaa = exactum.syo_edullisesti(5)\nprint(\"Vaihtorahaa jäi\", vaihtorahaa)\n\nvaihtorahaa = exactum.syo_maukkaasti(4.3)\nprint(\"Vaihtorahaa jäi\", vaihtorahaa)\n\nprint(\"Kassassa rahaa\", exactum.rahaa)\nprint(\"Edullisia lounaita myyty\", exactum.edulliset)\nprint(\"Maukkaita lounaita myyty\", exactum.maukkaat)

Vaihtorahaa jäi 7.5\nVaihtorahaa jäi 2.5\nVaihtorahaa jäi 0.0\nKassassa rahaa 1009.3\nEdullisia lounaita myyty 2\nMaukkaita lounaita myyty 1

Kortilla maksaminen

Laajennetaan kassapäätettä siten, että myös kortilla voi maksaa. Teemme kassapäätteelle siis metodit, joiden parametrina kassapääte saa maksukortin, jolta se vähentää valitun lounaan hinnan. Seuraavassa ovat uusien metodien rungot ja ohje niiden toteuttamiseksi:

class Kassapaate:\n    # ...\n\n    def syo_edullisesti_kortilla(self, kortti: Maksukortti):\n        # Edullinen lounas maksaa 2.50 euroa\n        # Jos kortilla on tarpeeksi rahaa, vähennetään hinta kortilta ja palautetaan True\n        # Muuten palautetaan False\n\n\n    def syo_maukkaasti_kortilla(self, kortti: Maksukortti):\n        # Maukas lounas maksaa 4.30 euroa.\n        # Jos kortilla on tarpeeksi rahaa, vähennetään hinta kortilta ja palautetaan True\n        # Muuten palautetaan False

Huom: kortilla maksaminen ei lisää kassapäätteessä olevan käteisen määrää.

Seuraavassa on testipääohjelma ja haluttu tulostus:

exactum = Kassapaate()\n\nvaihtorahaa = exactum.syo_edullisesti(10)\nprint(\"Vaihtorahaa jäi\", vaihtorahaa)\n\nkortti = Maksukortti(7)\n\ntulos = exactum.syo_maukkaasti_kortilla(kortti)\nprint(\"Riittikö raha:\", tulos)\ntulos = exactum.syo_maukkaasti_kortilla(kortti)\nprint(\"Riittikö raha:\", tulos)\ntulos = exactum.syo_edullisesti_kortilla(kortti)\nprint(\"Riittikö raha:\", tulos)\n\nprint(\"Kassassa rahaa\", exactum.rahaa)\nprint(\"Edullisia lounaita myyty\", exactum.edulliset)\nprint(\"Maukkaita lounaita myyty\", exactum.maukkaat)

Vaihtorahaa jäi 7.5\nRiittikö raha: True\nRiittikö raha: False\nRiittikö raha: True\nKassassa rahaa 1002.5\nEdullisia lounaita myyty 2\nMaukkaita lounaita myyty 1

Rahan lataaminen

Lisätään vielä kassapäätteelle metodi jonka avulla kortille voidaan ladata lisää rahaa. Muista, että rahan lataamisen yhteydessä ladattava summa viedään kassapäätteeseen. Metodin runko:

def lataa_rahaa_kortille(self, kortti: Maksukortti, summa: float):\n    pass

Testipääohjelma ja esimerkkisyöte:

exactum = Kassapaate()\n\nantin_kortti = Maksukortti(2)\nprint(f\"Kortilla rahaa {antin_kortti.saldo} euroa\")\n\ntulos = exactum.syo_maukkaasti_kortilla(antin_kortti)\nprint(\"Riittikö raha:\", tulos)\n\nexactum.lataa_rahaa_kortille(antin_kortti, 100)\nprint(f\"Kortilla rahaa {antin_kortti.saldo} euroa\")\n\ntulos = exactum.syo_maukkaasti_kortilla(antin_kortti)\nprint(\"Riittikö raha:\", tulos)\nprint(f\"Kortilla rahaa {antin_kortti.saldo} euroa\")\n\nprint(\"Kassassa rahaa\", exactum.rahaa)\nprint(\"Edullisia lounaita myyty\", exactum.edulliset)\nprint(\"Maukkaita lounaita myyty\", exactum.maukkaat)

Kortilla rahaa 2 euroa\nRiittikö raha: False\nKortilla rahaa 102 euroa\nRiittikö raha: True\nKortilla rahaa 97.7 euroa\nKassassa rahaa 1100\nEdullisia lounaita myyty 0\nMaukkaita lounaita myyty 1

Saman luokan oliot metodien parametrina

Tarkastellaan jälleen kerran yhtä versiota luokasta Henkilo:

class Henkilo:\n    def __init__(self, nimi: str, syntynyt: int):\n        self.nimi = nimi\n        self.syntynyt = syntynyt

Oletetaan että olemme tekemässä ohjelmaa, joka vertailee henkilöiden ikiä. Voisimme tehdä tarkoitusta varten erillisen funktion:

def vanhempi_kuin(henkilo1: Henkilo, henkilo2: Henkilo):\n    if henkilo1.syntynyt < henkilo2.syntynyt:\n        return True\n    else:\n        return False\n\nmuhammad = Henkilo(\"Muhammad ibn Musa al-Khwarizmi\", 780)\npascal = Henkilo(\"Blaise Pascal\", 1623)\ngrace = Henkilo(\"Grace Hopper\", 1906)\n\nif vanhempi_kuin(muhammad, pascal):\n    print(f\"{muhammad} on vanhempi kuin {pascal}\")\nelse:\n    print(f\"{muhammad} ei ole vanhempi kuin {pascal}\")\n\nif vanhempi_kuin(grace, pascal):\n    print(f\"{grace} on vanhempi kuin {pascal}\")\nelse:\n    print(f\"{grace} ei ole vanhempi kuin {pascal}\")

Muhammad ibn Musa al-Khwarizmi on vanhempi kuin Blaise Pascal\nGrace Hopper ei ole vanhempi kuin Blaise Pascal

Olio-ohjelmoinnin henkeen kuuluu kuitenkin sijoittaa oliota käsittelevät \"funktiot\" luokan metodeiksi. Voisimmekin tehdä henkilölle metodin, jonka avulla henkilön ikää voidaan verrata toiseen henkilöön:

class Henkilo:\n    def __init__(self, nimi: str, syntynyt: int):\n        self.nimi = nimi\n        self.syntynyt = syntynyt\n\n    # huomaa, että tyyppivihje pitää antaa hipsuissa jos parametri on saman luokan olio!\n    def vanhempi_kuin(self, toinen: \"Henkilo\"):\n        if self.syntynyt < toinen.syntynyt:\n            return True\n        else:\n            return False

Nyt siis olio itse on self ja toinen on henkilöolio, joka toimii vertailukohtana.

Huomaa, miten metodin kutsuminen eroaa funktion kutsumisesta:

muhammad = Henkilo(\"Muhammad ibn Musa al-Khwarizmi\", 780)\npascal = Henkilo(\"Blaise Pascal\", 1623)\ngrace = Henkilo(\"Grace Hopper\", 1906)\n\nif muhammad.vanhempi_kuin(pascal):\n    print(f\"{muhammad.nimi} on vanhempi kuin {pascal.nimi}\")\nelse:\n    print(f\"{muhammad.nimi} ei ole vanhempi kuin {pascal.nimi}\")\n\nif grace.vanhempi_kuin(pascal):\n    print(f\"{grace.nimi} on vanhempi kuin {pascal.nimi}\")\nelse:\n    print(f\"{grace.nimi} ei ole vanhempi kuin {pascal.nimi}\")

Pisteen vasemmalla puolella on siis verrattava henkilö, eli olio, johon metodin suorituksessa viittaa muuttuja self. Metodin parametrina taas on vertailukohta, eli metodin suorituksessa muuttujan toinen viittaama olio.

Ohjelman tulostus on sama kuin edellisessä funktiota käyttäneessä esimerkissä.

Huomaa, että if-else-rakenne metodissa vanhempi_kuin on oikeastaan turha, sillä vertailun arvona on suoraan haluamamme totuusarvo. Voimme siis yksinkertaistaa metodia seuraavasti:

class Henkilo:\n    def __init__(self, nimi: str, syntynyt: int):\n        self.nimi = nimi\n        self.syntynyt = syntynyt\n\n    # huomaa, että tyyppivihje pitää antaa hipsuissa jos parametri on saman luokan olio!\n    def vanhempi_kuin(self, toinen: \"Henkilo\"):\n        return self.syntynyt < toinen.syntynyt:

Edellisestä esimerkistä kannattaa huomata se, että kun metodi saa parametrikseen toisen saman luokan olion, tulee tyyppivihje antaa hipsuissa, eli seuraava koodi aiheuttaisi virheen:

class Henkilo:\n    # ...\n\n    # tämä ei toimi, Henkilo pitaa olla hipsuissa\n    def vanhempi_kuin(self, toinen: Henkilo):\n        return self.syntynyt < toinen.syntynyt:

Asuntovälitystoimiston tietojärjestelmässä kuvataan myynnissä olevaa asuntoa seuraavasta luokasta tehdyillä olioilla:

class Asunto:\n    def __init__(self, huoneita: int, nelioita: int, neliohinta: int):\n        self.huoneita = huoneita\n        self.nelioita = nelioita\n        self.neliohinta = neliohinta

Tehtävänä on toteuttaa metodeita, joiden avulla myynnissä olevia asuntoja voidaan vertailla.

Onko suurempi

Tee metodi suurempi(self, verrattava), joka palauttaa True, jos asunto-olio itse on pinta-alaltaan suurempi kuin verrattava asunto-olio.

Esimerkki metodin toiminnasta:

eira_yksio = Asunto(1, 16, 5500)\nkallio_kaksio = Asunto(2, 38, 4200)\njakomaki_kolmio = Asunto(3, 78, 2500)\n\nprint(eira_yksio.suurempi(kallio_kaksio))\nprint(jakomaki_kolmio.suurempi(kallio_kaksio))

False\nTrue

Hintaero

Tee metodi hintaero(self, verrattava), joka palauttaa asunto-olion ja verrattavan asunto-olion hintaeron. Hintaero on asuntojen hintojen erotuksen (hinta lasketaan kertomalla neliöhinta neliöillä) itseisarvo.

Esimerkki metodin toiminnasta:

eira_yksio = Asunto(1, 16, 5500)\nkallio_kaksio = Asunto(2, 38, 4200)\njakomaki_kolmio = Asunto(3, 78, 2500)\n\nprint(eira_yksio.hintaero(kallio_kaksio))\nprint(jakomaki_kolmio.hintaero(kallio_kaksio))

71600\n35400

Onko kalliimpi?

Tee metodi kalliimpi(self, verrattava) joka palauttaa True, jos asunto-olio on kalliimpi kuin verrattavana oleva asunto-olio.

Esimerkki metodin toiminnasta:

eira_yksio = Asunto(1, 16, 5500)\nkallio_kaksio = Asunto(2, 38, 4200)\njakomaki_kolmio = Asunto(3, 78, 2500)\n\nprint(eira_yksio.kalliimpi(kallio_kaksio))\nprint(jakomaki_kolmio.kalliimpi(kallio_kaksio))

False\nTrue

","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-9/1-oliot-ja-viitteet.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten olioita voi tallentaa tietorakenteisiin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten olioiden välitys parametrina toimii"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa kaikki arvot ovat olioita ja myös omista luokista luotuja olioita voi käsitellä kuin mitä tahansa muitakin olioita. Esimerkiksi olioita voidaan tallentaa listaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" datetime "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" date\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kurssisuoritus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kurssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" suorituspvm"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kurssi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kurssi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opintopisteet\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"suorituspvm "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" suorituspvm\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luodaan pari kurssisuoritusta ja lisätään listaan"}]},{"type":"text","value":"\n suoritukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n mat1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kurssisuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Matematiikka 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n ohj1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kurssisuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmointi 1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2019"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"17"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n suoritukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mat1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n suoritukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ohj1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Lisätään suoraan listaan muutama"}]},{"type":"text","value":"\n suoritukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kurssisuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Fysiikka 2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2019"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n suoritukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Kurssisuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmointi 2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" date"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2020"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"19"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Käydään läpi kaikki suoritukset, tulostetaan nimet ja lasketaan opintopisteet yhteen"}]},{"type":"text","value":"\n opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" suoritus "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" suoritukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kurssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Opintopisteitä yhteensä:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Matematiikka 1\nOhjelmointi 1\nFysiikka 2\nOhjelmointi 2\nOpintopisteitä yhteensä: 20"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Nopein auto","tmcname":"osa09-01_nopein_auto"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa oleva luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Auto"}]},{"type":"text","value":" mallintaa autoa kahden attribuutin avulla: "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"merkki (str)"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"huippunopeus (int)"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nopein_auto(autot: list)"}]},{"type":"text","value":", joka saa parametrikseen listan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Auto"}]},{"type":"text","value":"-luokan olioita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio palauttaa listassa olevista autoista nopeimman auton merkin. Voit olettaa, että nopein auto on yksikäsitteinen. Älä muuta alkuperäistä listaa tai luokkaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Auto"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion testauksesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n auto1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Auto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mersu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"195"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n auto2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Auto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lada\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"110"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n auto3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Auto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ferrari\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"280"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n auto4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Auto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Trabant\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"85"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n autot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"auto1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" auto2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" auto3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" auto4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nopein_auto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"autot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ferrari"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Hyväksytyt suoritukset","tmcname":"osa09-02_hyvaksytyt_suoritukset"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjasta löytyy luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Koesuoritus"}]},{"type":"text","value":", joka mallintaa nimensä mukaisesti koesuoritusta. Sillä on kaksi attribuuttia, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suorittaja (str)"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pisteet (int)"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita funktio "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hyvaksytyt(suoritukset: list, pisteraja: int)"}]},{"type":"text","value":", joka saa parametrikseen listan koesuorituksia ja alimman hyväksytyn pistemäärän kokonaislukuna."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Funktio muodostaa ja palauttaa uuden listan, johon on tallennettu ainoastaan hyväksytyt suoritukset listalta. Älä muuta alkuperäistä listaa tai luokkaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Koesuoritus"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki funktion käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n s1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Koesuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"12"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n s2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Koesuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pirjo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"19"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n s3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Koesuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pauli\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n s4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Koesuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pirkko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"9"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n s5 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Koesuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Petriina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"17"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n hyv "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" hyvaksytyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"s1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" s5"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"15"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" hyvaksytty "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" hyv"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"hyvaksytty"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koesuoritus (suorittaja: Pirjo, pisteet: 19)\nKoesuoritus (suorittaja: Pauli, pisteet: 15)\nKoesuoritus (suorittaja: Petriina, pisteet: 17)"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Listaan ei tarkkaan ottaen tallenneta olioita vaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"viittauksia olioihin"}]},{"type":"text","value":". Niinpä sama olio voi esiintyä listassa useaan kertaan ja samaan olioon voidaan viitata useaan kertaan listassa ja sen ulkopuolella. Esimerkiksi näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Tuote"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" yksikko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yksikko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" yksikko\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n kauppalista "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n maito "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maito\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"litra\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"maito"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"maito"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n kauppalista"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Tuote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kurkku\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"kpl\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 313px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/13e71ea262de820629eb873bb73f2d94/80977/9_1_1.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 64.34782608695653%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAABdUlEQVQ4y22TiarCQAxF+/9/pQVRLLihFKu4r1iXui8YOeHlMXa8UNLpJDc3SwP5w/v9VrtYLGS73crhcJD9fq/PbreT9XptrnK9XmW5XEqWZXqP/+VykXa7LUGeEIdfgNRAME8e0+nUJ1ytVhLHsQwGA6nVatLv9/V7mqb/gbfbTcbjsSRJoiT1el1Go5H6eoSUUqlUpFAoqGMYhnI6nVS5+dzvdw0uFosSRZFUq1UVQRKPcLPZaDmQPB4Pfce6JdNDzig9n896BpPJxCekwb9AIgMkx+PR86FNHiGZ6RcEnU5Her2eWlMBns+n3jNlSqV8EnyV7JKanc/nGoS173Zn4I7SDYE5uWRu862HEOeBKsp3474I8wpfr5cuOgqwBJPEhmHL7sYF+awuMQpoNIHD4VB7xFrRZ86z2eyLUEtuNpvSaDSkXC5Lq9XSEpk0JOyhAWX2lxiJTdoVEdjSWj/cS7YfUv7RUqmkEyUxIkje7XY9hR86hOegM+cgfwAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/13e71ea262de820629eb873bb73f2d94/a0b58/9_1_1.webp 230w","/static/13e71ea262de820629eb873bb73f2d94/12766/9_1_1.webp 313w"],"sizes":"(max-width: 313px) 100vw, 313px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/13e71ea262de820629eb873bb73f2d94/81c8e/9_1_1.png 230w","/static/13e71ea262de820629eb873bb73f2d94/80977/9_1_1.png 313w"],"sizes":"(max-width: 313px) 100vw, 313px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/13e71ea262de820629eb873bb73f2d94/80977/9_1_1.png","alt":"9 1 1","title":"9 1 1","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos samaan olioon on useampi kuin yksi viittaus, on lopputuloksen kannalta yhdentekevää, mitä viittauksista käytetään:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Koira"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi\n\nkoirat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nmusti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Koira"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Musti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkoirat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"musti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkoirat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"musti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkoirat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Koira"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Musti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Koirat alussa:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" koira "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" koirat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"koira"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kohdan 0 koira saa uuden nimen:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkoirat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Rekku\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" koira "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" koirat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"koira"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kohdan 2 koira saa uuden nimen:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkoirat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Fifi\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" koira "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" koirat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"koira"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koirat alussa:\nMusti\nMusti\nMusti\nKohdan 0 koira saa uuden nimen:\nRekku\nRekku\nMusti\nKohdan 2 koira saa uuden nimen:\nRekku\nRekku\nFifi"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Listan kohdissa 0 ja 1 on viittaus samaan olioon, joten olion sisältöä voidaan muuttaa kumman tahansa viittauksen kautta. Listan kohdassa 2 on kuitenkin viittaus toiseen olioon, minkä vuoksi tämän olion muuttaminen ei muuta muita."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Operaattorilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"is"}]},{"type":"text","value":" voidaan tutkia, onko kyseessä täysin sama olio, ja operaattorilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" voidaan tutkia, onko kyseessä saman sisältöinen olio. Seuraava koodi havainnollistaa asiaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lista1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nlista2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nlista3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" lista1\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista1 "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"is"}]},{"type":"text","value":" lista2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista1 "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"is"}]},{"type":"text","value":" lista3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista2 "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"is"}]},{"type":"text","value":" lista3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" lista2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" lista3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lista2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" lista3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"False\nTrue\nFalse"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"True\nTrue\nTrue"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Omista luokista muodostettuja olioita voidaan myös tallentaa esimerkiksi sanakirjaan ja muihin tietorakenteisiin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" op"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"op "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" op\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Käytetään avaimena opiskelijanumeroa ja arvona Opiskelija-oliota"}]},{"type":"text","value":"\n opiskelijat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olli Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"54321\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Outi Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"67"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"http://www.pythontutor.com/visualize.html#mode=edit","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Visualisaattori"}]},{"type":"text","value":" osaa havainnollistaa nämäkin asiat hienosti:"}]},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/d20c7f9a5570bf04d75c3836868a8870/15171/9_1_2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 43.04347826086957%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAABYlAAAWJQFJUiTwAAABPklEQVQoz2WR20rEMBBA/f+/8k0RFUVExdVda7ubtnHbSSfN3FLtVlHWA4E85DBnyEkYUow44Oj36PexB4wRpx9yzvPJ2cymf5xQSuM4ElHre1fvmSX/IGqA4xBHFgkBzPRYHgZ0BwIAMxFRSslynqbJeTi9uC9cr6ptceHr8zBcxXiNeKXazzIz9wcAYMkzs3yQY6Jy14ZILAJ+ReNONIqgCJrJLHddt1q9FEVRVVXT1AAQQmDmpXzJU5WuOuu7x3nv/CcbADabTVG873aurhvnnPfeOdc0zSHh9+lIXL7ddPvbMNwzl7OMiCmlnKcwUB+Sqi3xfycvmJl3dxHvRB5Ui28ZIxIRM5uZqorIcjn6HjMt15feX0K4IXqb5cQWQ6jK8nW93m63bdsy8zLnaPI05fDxHOOTyLNq9SV/Av8dBuHbnwNlAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/d20c7f9a5570bf04d75c3836868a8870/a0b58/9_1_2.webp 230w","/static/d20c7f9a5570bf04d75c3836868a8870/bc10c/9_1_2.webp 460w","/static/d20c7f9a5570bf04d75c3836868a8870/966d8/9_1_2.webp 920w","/static/d20c7f9a5570bf04d75c3836868a8870/445df/9_1_2.webp 1380w","/static/d20c7f9a5570bf04d75c3836868a8870/78de1/9_1_2.webp 1840w","/static/d20c7f9a5570bf04d75c3836868a8870/995bd/9_1_2.webp 2230w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"source","properties":{"srcSet":["/static/d20c7f9a5570bf04d75c3836868a8870/81c8e/9_1_2.png 230w","/static/d20c7f9a5570bf04d75c3836868a8870/08a84/9_1_2.png 460w","/static/d20c7f9a5570bf04d75c3836868a8870/c0255/9_1_2.png 920w","/static/d20c7f9a5570bf04d75c3836868a8870/b1001/9_1_2.png 1380w","/static/d20c7f9a5570bf04d75c3836868a8870/161ec/9_1_2.png 1840w","/static/d20c7f9a5570bf04d75c3836868a8870/15171/9_1_2.png 2230w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/static/d20c7f9a5570bf04d75c3836868a8870/c0255/9_1_2.png","alt":"9 1 2","title":"9 1 2","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"h2","properties":{"id":"selfilla-vai-ilman","style":"position:relative;"},"children":[{"type":"text","value":"Selfillä vai ilman?"},{"type":"element","tagName":"a","properties":{"href":"#selfilla-vai-ilman","ariaLabel":"selfilla vai ilman permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä vaiheessa kurssia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":"-määre saattaa vaikuttaa vielä hämärältä. Käytetään siis hetki sen pohtimiseen, milloin selfiä tulee käyttää, ja milloin sitä kannattaa olla käyttämättä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkinä yksinkertaista luokkaa, jonka avulla joukosta sanoja on mahdollista muodostaa sanasto:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Sanasto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_sana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"sorted"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsanasto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Sanasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsanasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsanasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"olio\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsanasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"olio-ohjelmointi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsanasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"olio\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nsanasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"nörtti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nsanasto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"nörtti\nolio\nolio-ohjelmointi\npython"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokka tallentaa sanalistan oliomuuttujaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self.sanat"}]},{"type":"text","value":". Tässä tapauksessa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":" tarvitaan ehdottomasti sekä luokan konstruktorissa että luokan muissa metodeissa tähän muuttujaan viitatessa, koska muuten sama lista ei ole kaikkien olion metodien käytettävissä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisätään luokalle metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pisin_sana(self)"}]},{"type":"text","value":" joka selvittää nimensä mukaisesti sanaston pisimmän sanan (tai yhden niistä)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtävän voisi toteuttaa vaikkapa seuraavasti, mutta näemme kohta miksei se ole kovin hyvä idea:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Sanasto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pisin_sana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# määritellään kaksi apumuuttujaa"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisimman_pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisimman_pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisimman_pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sana\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pisin"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi siis käyttää kahta apumuuttujaa, jotka on määritelty käyttäen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":"-määrettä. Jos vielä halutaan hämmentää ohjelmakoodia lukevaa, apumuuttujat voisi lisäksi nimetä kryptisemmin, esim. "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"apu"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"apu2"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Sanasto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pisin_sana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# määritellään kaksi apumuuttujaa"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sana\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun muuttujan määrittely tehdään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":"-määreen avulla, liitetään muuttuja olion attribuutiksi, eli muuttuja tulee olemaan edelleen olemassa myös metodin suorituksen päätyttyä. Tämä on aivan tarpeetonta, koska kyseisiä apumuuttujia on tarkoitus käyttää vain metodissa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pisin_sana(self)"}]},{"type":"text","value":". Apumuuttujien määrittely "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":"-määreen avulla on siis varsin huono idea."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Paitsi turhaa, apumuuttujien liittäminen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":"-määreellä olion attribuuteiksi on myös riskialtista, varsinkin epämääräisesti nimettyjen apumuuttujien tapauksessa. Jos samaa apumuuttujaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self.apu"}]},{"type":"text","value":" käytetään monessa eri metodissa mutta täysin eri tarkoituksiin, voivat seuraukset olla arvaamattomat ja koodissa voi ilmetä hankalasti löydettäviä bugeja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ongelma voi tulla esiin erityisesti silloin jos apumuuttujan alkuarvo annetaan jossain muualla, esimerkiksi konstruktorissa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Sanasto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# määritellään apumuuttujia"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pisin_sana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tämä ei toimi sillä apu2:n tyyppi on väärä"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sana\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"apu"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toisaalta uusien olion attribuuttien määrittely "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"muualla"}]},{"type":"text","value":" kuin konstruktorissa on sikäli vaarallista, että tällöin olion attribuutit riippuvat siitä, mitä metodeja on suoritettu. Kaikilla saman luokan avulla luoduilla olioilla ei välttämättä ole samoja attribuutteja, mistä seuraa helposti bugeja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Siispä oikea tapa määritellä yhdessä metodissa käytettävät apumuuttujat on tehdä se "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ilman"}]},{"type":"text","value":" "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":"-määrettä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Sanasto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pisin_sana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tämä on oikea tapa määritellä yhden metodin sisäiset apumuuttujat"}]},{"type":"text","value":"\n pisin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":"\n pisimman_pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" sana "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sanat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" pisimman_pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n pisimman_pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n pisin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sana\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" pisin"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tällaisessa toteutuksessa apumuuttujat ovat olemassa ainoastaan metodin suorituksen aikana, ja niissä olevat arvot eivät pääse aiheuttamaan komplikaatioita muussa koodissa."}]},{"type":"element","tagName":"h2","properties":{"id":"oliot-funktioiden-parametrina","style":"position:relative;"},"children":[{"type":"text","value":"Oliot funktioiden parametrina"},{"type":"element","tagName":"a","properties":{"href":"#oliot-funktioiden-parametrina","ariaLabel":"oliot funktioiden parametrina permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Omista luokista luodut oliot ovat yleensä muuttuvia eli mutatoituvia, joten niiden toiminta parametrina välitettäessä muistuttaa esimerkiksi listoista tuttua tapaa: funktio, jolle olio välitetään parametrina, voi muuttaa kyseistä oliota."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan yksinkertaista esimerkkiä, jossa funktiolle välitetään "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"text","value":"-luokasta luotu olio. Funktion sisällä muutetaan opiskelijan nimi, ja muutos näkyy myös pääohjelmassa, koska molemmissa tilanteissa viitataan samaan olioon."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opiskelijanumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opiskelijanumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opiskelijanumero\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opiskelijanumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Huomaa, että tyyppivihjeenä käytetään nyt oman luokan nimeä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"muuta_nimi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olli Opiskelija\""}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luodaan opiskelijaolio"}]},{"type":"text","value":"\nolli "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olli Oppilas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"olli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmuuta_nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"olli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"olli"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olli Oppilas (12345)\nOlli Opiskelija (12345)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olion voi myös luoda funktion sisällä. Mikäli funktio palauttaa viittauksen olioon, on muodostettu olio käytettävissä myös pääohjelmassa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" random "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" randint"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" choice\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opiskelijanumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opiskelijanumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opiskelijanumero\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opiskelijanumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"text","value":"\n\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Funktio luo ja palauttaa Opiskelija-olion, jolla on satunnainen nimi ja opiskelijanumero"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"uusi_opiskelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n etunimet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Minna\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Mari\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n sukunimet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Virtanen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lahtinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Leinonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pythonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# arvo nimi"}]},{"type":"text","value":"\n nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" choice"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"etunimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" choice"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sukunimet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Arvo opiskelijanumero"}]},{"type":"text","value":"\n opiskelijanumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"randint"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"99999"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luo ja palauta opiskelijaolio"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opiskelijanumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kutsutaan metodia viidesti, tallennetaan tulokset listaan"}]},{"type":"text","value":"\n opiskelijat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"uusi_opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" opiskelija "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mari Lahtinen (36213)\nArto Virtanen (11859)\nMari Pythonen (77330)\nArto Pythonen (86451)\nMinna Pythonen (86211)"}]}]},{"type":"element","tagName":"h2","properties":{"id":"oliot-metodien-parametrina","style":"position:relative;"},"children":[{"type":"text","value":"Oliot metodien parametrina"},{"type":"element","tagName":"a","properties":{"href":"#oliot-metodien-parametrina","ariaLabel":"oliot metodien parametrina permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oliot toimivat normaaliin tapaan myös "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"metodien"}]},{"type":"text","value":" parametrina. Tarkastellaan seuraavaa esimerkkiä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pituus\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Huvipuistolaite"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pituusraja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kavijoita "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pituusraja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pituusraja\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"ota_kyytiin"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pituusraja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kavijoita "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" pääsi kyytiin\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" liian lyhyt :(\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kavijoita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" kävijää)\""}]}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huvipuistolaitteen metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ota_kyytiin"}]},{"type":"text","value":" saa nyt parametrina luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"text","value":" olion. Jos kävijä on riittävän pitkä, metodi päästää hänet laitteeseen ja lisää kävijöiden määrää. Seuraavassa esimerkkisuoritus:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"hurjakuru "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Huvipuistolaite"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hurjakuru\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"120"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\njarkko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jarkko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"172"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nvenla "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Venla\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"105"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nhurjakuru"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ota_kyytiin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jarkko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhurjakuru"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ota_kyytiin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"venla"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"hurjakuru"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jarkko pääsi kyytiin\nVenla liian lyhyt :(\nHurjakuru (1 kävijää)"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Kasvatuslaitos","tmcname":"osa09-03_kasvatuslaitos"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassasi on valmiina jo luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"text","value":" sekä runko luokalle "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kasvatuslaitos"}]},{"type":"text","value":". Kasvatuslaitosoliot käsittelevät ihmisiä eri tavalla, esim. punnitsevat ja syöttävät ihmisiä. Rakennamme tässä tehtävässä kasvatuslaitoksen. Luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"text","value":" koodiin ei tehtävässä ole tarkoitus koskea!"}]},{"type":"element","tagName":"h2","properties":{"id":"henkiloiden-punnitseminen","style":"position:relative;"},"children":[{"type":"text","value":"Henkilöiden punnitseminen"},{"type":"element","tagName":"a","properties":{"href":"#henkiloiden-punnitseminen","ariaLabel":"henkiloiden punnitseminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kasvatuslaitoksen luokkarungossa on valmiina runko metodille punnitse:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kasvatuslaitos"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"punnitse"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# palautetaan parametrina annetun henkilön paino"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodi saa parametrina henkilön ja metodin on tarkoitus palauttaa kutsujalleen parametrina olevan henkilön paino. Paino selviää pyytämällä parametrina olevalta henkilöltä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"henkilo"}]},{"type":"text","value":" sopiva attribuutti. Sinun tulee täydentää "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"punnitse"}]},{"type":"text","value":"-metodin koodia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on pääohjelma jossa kasvatuslaitos punnitsee kaksi henkilöä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"haagan_neuvola "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kasvatuslaitos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\neero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Eero\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"110"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npekka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"33"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"176"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"85"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" painaa "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"haagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" kg\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pekka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" painaa "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"haagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" kg\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eero painaa 7 kg\nPekka painaa 85 kg"}]}]},{"type":"element","tagName":"h2","properties":{"id":"syottaminen","style":"position:relative;"},"children":[{"type":"text","value":"Syöttäminen"},{"type":"element","tagName":"a","properties":{"href":"#syottaminen","ariaLabel":"syottaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Parametrina olevan olion tilaa on mahdollista muuttaa. Tee kasvatuslaitokselle metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"syota(henkilo: Henkilo)"}]},{"type":"text","value":" joka kasvattaa parametrina olevan henkilön painoa yhdellä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on esimerkki, jossa henkilöt ensin punnitaan ja tämän jälkeen neuvolassa syötetään Eeroa kolme kertaa. Tämän jälkeen henkilöt taas punnitaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"haagan_neuvola "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kasvatuslaitos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\neero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Eero\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"110"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npekka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"33"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"176"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"85"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" painaa "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"haagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" kg\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pekka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" painaa "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"haagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" kg\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nhaagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syota"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhaagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syota"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhaagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syota"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" painaa "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"haagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" kg\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pekka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" painaa "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"haagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" kg\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tulostuksen pitäisi paljastaa, että Eeron paino on noussut kolmella:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eero painaa 7 kg\nPekka painaa 85 kg"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Eero painaa 10 kg\nPekka painaa 85 kg"}]}]},{"type":"element","tagName":"h2","properties":{"id":"punnitusten-laskeminen","style":"position:relative;"},"children":[{"type":"text","value":"Punnitusten laskeminen"},{"type":"element","tagName":"a","properties":{"href":"#punnitusten-laskeminen","ariaLabel":"punnitusten laskeminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee kasvatuslaitokselle metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"punnitukset()"}]},{"type":"text","value":" joka kertoo, kuinka monta punnitusta kasvatuslaitos on ylipäätään tehnyt. Huom! Tarvitset uuden oliomuuttujan punnitusten lukumäärän laskemiseen. Testipääohjelma:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"haagan_neuvola "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kasvatuslaitos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\neero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Eero\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"110"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npekka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"33"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"176"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"85"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Punnituksia tehty "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"haagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nhaagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhaagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Punnituksia tehty "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"haagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nhaagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhaagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhaagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhaagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitse"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Punnituksia tehty "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"haagan_neuvola"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"punnitukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Punnituksia tehty 0\nPunnituksia tehty 2\nPunnituksia tehty 6"}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Maksukortti ja kassapääte","tmcname":"osa09-04_maksukortti_ja_kassapaate"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Teimme edellisessä osan "},{"type":"element","tagName":"a","properties":{"href":"/osa-8/5-lisaa-esimerkkeja#programming-exercise-maksukortti"},"children":[{"type":"text","value":"tehtävässä"}]},{"type":"text","value":" luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Maksukortti"}]},{"type":"text","value":". Kortilla oli metodit edullisesti ja maukkaasti syömistä sekä rahan lataamista varten."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellisen osan tyylillä tehdyssä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Maksukortti"}]},{"type":"text","value":"-luokassa oli kuitenkin ongelma. Kortti tiesi lounaiden hinnan ja osasi sen ansiosta vähentää saldoa oikean määrän. Entä kun hinnat nousevat? Tai jos myyntivalikoimaan tulee uusia tuotteita? Hintojen muuttaminen tarkoittaisi, että kaikki jo käytössä olevat kortit pitäisi korvata uudet hinnat tuntevilla korteilla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Parempi ratkaisu on tehdä kortit \"tyhmiksi\", hinnoista ja myytävistä tuotteista tietämättömiksi pelkän saldon säilyttäjiksi. Kaikki äly kannattaakin laittaa erillisiin olioihin, kassapäätteisiin."}]},{"type":"element","tagName":"h2","properties":{"id":"tyhma-maksukortti","style":"position:relative;"},"children":[{"type":"text","value":"\"Tyhmä\" maksukortti"},{"type":"element","tagName":"a","properties":{"href":"#tyhma-maksukortti","ariaLabel":"tyhma maksukortti permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteutetaan ensin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Maksukortti"}]},{"type":"text","value":"-luokasta \"tyhmä\" versio. Kortilla on ainoastaan metodit saldon kysymiseen, rahan lataamiseen ja rahan ottamiseen. Täydennä alla ja tehtäväpohjassa olevaan luokkaan metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ota_rahaa(maara)"}]},{"type":"text","value":" ohjeen mukaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Maksukortti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lataa_rahaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" lisays"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" lisays\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"ota_rahaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Toteuta metodi siten, että se ottaa kortilta rahaa vain, jos saldoa riittää"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Onnistuessaan metodi palauttaa True ja muuten False"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Testipääohjelma:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Rahaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ota_rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Onnistuiko otto:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Rahaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n tulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"ota_rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Onnistuiko otto:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Rahaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rahaa 10\nOnnistuiko otto: True\nRahaa 2\nOnnistuiko otto: False\nRahaa 2"}]}]},{"type":"element","tagName":"h2","properties":{"id":"kassapaate-ja-kateiskauppa","style":"position:relative;"},"children":[{"type":"text","value":"Kassapääte ja käteiskauppa"},{"type":"element","tagName":"a","properties":{"href":"#kassapaate-ja-kateiskauppa","ariaLabel":"kassapaate ja kateiskauppa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Unicafessa asioidessa asiakas maksaa joko käteisellä tai maksukortilla. Myyjä käyttää kassapäätettä kortin veloittamiseen ja käteismaksujen hoitamiseen. Tehdään ensin kassapäätteestä käteismaksuihin sopiva versio."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kassapäätteen runko on seuraavanlainen. Metodien kommentit kertovat halutun toiminnallisuuden."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kassapaate"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kassassa on aluksi 1000 euroa rahaa"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"edulliset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maukkaat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"syo_edullisesti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" maksu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Edullinen lounas maksaa 2.50 euroa."}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kasvatetaan kassan rahamäärää edullisen lounaan hinnalla ja palautetaan vaihtorahat"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Jos parametrina annettu maksu ei ole riittävän suuri, ei lounasta myydä ja metodi palauttaa koko summan"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"syo_maukkaasti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" maksu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Maukas lounas maksaa 4.30 euroa."}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kasvatetaan kassan rahamäärää maukkaan lounaan hinnalla ja palautetaan vaihtorahat"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Jos parametrina annettu maksu ei ole riittävän suuri, ei lounasta myydä ja metodi palauttaa koko summan"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käyttöesimerkki"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"exactum "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kassapaate"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nvaihtorahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_edullisesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vaihtorahaa jäi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vaihtorahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nvaihtorahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_edullisesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vaihtorahaa jäi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vaihtorahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nvaihtorahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_maukkaasti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4.3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vaihtorahaa jäi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vaihtorahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kassassa rahaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Edullisia lounaita myyty\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"edulliset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maukkaita lounaita myyty\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maukkaat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaihtorahaa jäi 7.5\nVaihtorahaa jäi 2.5\nVaihtorahaa jäi 0.0\nKassassa rahaa 1009.3\nEdullisia lounaita myyty 2\nMaukkaita lounaita myyty 1"}]}]},{"type":"element","tagName":"h2","properties":{"id":"kortilla-maksaminen","style":"position:relative;"},"children":[{"type":"text","value":"Kortilla maksaminen"},{"type":"element","tagName":"a","properties":{"href":"#kortilla-maksaminen","ariaLabel":"kortilla maksaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajennetaan kassapäätettä siten, että myös kortilla voi maksaa. Teemme kassapäätteelle siis metodit, joiden parametrina kassapääte saa maksukortin, jolta se vähentää valitun lounaan hinnan. Seuraavassa ovat uusien metodien rungot ja ohje niiden toteuttamiseksi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kassapaate"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"syo_edullisesti_kortilla"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Edullinen lounas maksaa 2.50 euroa"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Jos kortilla on tarpeeksi rahaa, vähennetään hinta kortilta ja palautetaan True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Muuten palautetaan False"}]},{"type":"text","value":"\n\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"syo_maukkaasti_kortilla"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Maukas lounas maksaa 4.30 euroa."}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Jos kortilla on tarpeeksi rahaa, vähennetään hinta kortilta ja palautetaan True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Muuten palautetaan False"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" kortilla maksaminen ei lisää kassapäätteessä olevan käteisen määrää."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on testipääohjelma ja haluttu tulostus:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"exactum "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kassapaate"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nvaihtorahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_edullisesti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Vaihtorahaa jäi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vaihtorahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"7"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_maukkaasti_kortilla"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Riittikö raha:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_maukkaasti_kortilla"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Riittikö raha:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_edullisesti_kortilla"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Riittikö raha:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kassassa rahaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Edullisia lounaita myyty\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"edulliset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maukkaita lounaita myyty\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maukkaat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaihtorahaa jäi 7.5\nRiittikö raha: True\nRiittikö raha: False\nRiittikö raha: True\nKassassa rahaa 1002.5\nEdullisia lounaita myyty 2\nMaukkaita lounaita myyty 1"}]}]},{"type":"element","tagName":"h2","properties":{"id":"rahan-lataaminen","style":"position:relative;"},"children":[{"type":"text","value":"Rahan lataaminen"},{"type":"element","tagName":"a","properties":{"href":"#rahan-lataaminen","ariaLabel":"rahan lataaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisätään vielä kassapäätteelle metodi jonka avulla kortille voidaan ladata lisää rahaa. Muista, että rahan lataamisen yhteydessä ladattava summa viedään kassapäätteeseen. Metodin runko:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lataa_rahaa_kortille"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"pass"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Testipääohjelma ja esimerkkisyöte:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"exactum "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kassapaate"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nantin_kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Maksukortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Kortilla rahaa "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"antin_kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" euroa\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_maukkaasti_kortilla"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"antin_kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Riittikö raha:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nexactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lataa_rahaa_kortille"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"antin_kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Kortilla rahaa "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"antin_kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" euroa\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntulos "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syo_maukkaasti_kortilla"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"antin_kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Riittikö raha:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tulos"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Kortilla rahaa "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"antin_kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" euroa\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kassassa rahaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Edullisia lounaita myyty\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"edulliset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Maukkaita lounaita myyty\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" exactum"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maukkaat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kortilla rahaa 2 euroa\nRiittikö raha: False\nKortilla rahaa 102 euroa\nRiittikö raha: True\nKortilla rahaa 97.7 euroa\nKassassa rahaa 1100\nEdullisia lounaita myyty 0\nMaukkaita lounaita myyty 1"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"saman-luokan-oliot-metodien-parametrina","style":"position:relative;"},"children":[{"type":"text","value":"Saman luokan oliot metodien parametrina"},{"type":"element","tagName":"a","properties":{"href":"#saman-luokan-oliot-metodien-parametrina","ariaLabel":"saman luokan oliot metodien parametrina permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan jälleen kerran yhtä versiota luokasta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" syntynyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syntynyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" syntynyt"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oletetaan että olemme tekemässä ohjelmaa, joka vertailee henkilöiden ikiä. Voisimme tehdä tarkoitusta varten erillisen funktion:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"vanhempi_kuin"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"henkilo1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" henkilo2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" henkilo1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syntynyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" henkilo2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syntynyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n\nmuhammad "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Muhammad ibn Musa al-Khwarizmi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"780"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npascal "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Blaise Pascal\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1623"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ngrace "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Grace Hopper\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1906"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" vanhempi_kuin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"muhammad"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pascal"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"muhammad"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" on vanhempi kuin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pascal"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"muhammad"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ei ole vanhempi kuin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pascal"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" vanhempi_kuin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"grace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pascal"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"grace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" on vanhempi kuin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pascal"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"grace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ei ole vanhempi kuin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pascal"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muhammad ibn Musa al-Khwarizmi on vanhempi kuin Blaise Pascal\nGrace Hopper ei ole vanhempi kuin Blaise Pascal"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olio-ohjelmoinnin henkeen kuuluu kuitenkin sijoittaa oliota käsittelevät \"funktiot\" luokan metodeiksi. Voisimmekin tehdä henkilölle metodin, jonka avulla henkilön ikää voidaan verrata "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"toiseen"}]},{"type":"text","value":" henkilöön:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" syntynyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syntynyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" syntynyt\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# huomaa, että tyyppivihje pitää antaa hipsuissa jos parametri on saman luokan olio!"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"vanhempi_kuin"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" toinen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Henkilo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syntynyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" toinen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syntynyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt siis olio itse on "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"toinen"}]},{"type":"text","value":" on henkilöolio, joka toimii vertailukohtana."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, miten metodin kutsuminen eroaa funktion kutsumisesta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"muhammad "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Muhammad ibn Musa al-Khwarizmi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"780"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npascal "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Blaise Pascal\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1623"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ngrace "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Grace Hopper\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1906"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" muhammad"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vanhempi_kuin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pascal"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"muhammad"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" on vanhempi kuin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pascal"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"muhammad"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ei ole vanhempi kuin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pascal"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" grace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"vanhempi_kuin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pascal"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"grace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" on vanhempi kuin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pascal"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"grace"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ei ole vanhempi kuin "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pascal"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pisteen vasemmalla puolella on siis verrattava henkilö, eli olio, johon metodin suorituksessa viittaa muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":". Metodin parametrina taas on vertailukohta, eli metodin suorituksessa muuttujan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"toinen"}]},{"type":"text","value":" viittaama olio."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostus on sama kuin edellisessä funktiota käyttäneessä esimerkissä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että if-else-rakenne metodissa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"vanhempi_kuin"}]},{"type":"text","value":" on oikeastaan turha, sillä vertailun arvona on suoraan haluamamme totuusarvo. Voimme siis yksinkertaistaa metodia seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" syntynyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syntynyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" syntynyt\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# huomaa, että tyyppivihje pitää antaa hipsuissa jos parametri on saman luokan olio!"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"vanhempi_kuin"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" toinen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Henkilo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syntynyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" toinen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syntynyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellisestä esimerkistä kannattaa huomata se, että kun metodi saa parametrikseen toisen saman luokan olion, tulee tyyppivihje antaa hipsuissa, eli seuraava koodi aiheuttaisi virheen:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# tämä ei toimi, Henkilo pitaa olla hipsuissa"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"vanhempi_kuin"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" toinen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syntynyt "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" toinen"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"syntynyt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]}]}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Asuntovertailu","tmcname":"osa09-05_asuntovertailu"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Asuntovälitystoimiston tietojärjestelmässä kuvataan myynnissä olevaa asuntoa seuraavasta luokasta tehdyillä olioilla:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Asunto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" huoneita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nelioita"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" neliohinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"huoneita "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" huoneita\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nelioita "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nelioita\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"neliohinta "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" neliohinta"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtävänä on toteuttaa metodeita, joiden avulla myynnissä olevia asuntoja voidaan vertailla."}]},{"type":"element","tagName":"h2","properties":{"id":"onko-suurempi","style":"position:relative;"},"children":[{"type":"text","value":"Onko suurempi"},{"type":"element","tagName":"a","properties":{"href":"#onko-suurempi","ariaLabel":"onko suurempi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suurempi(self, verrattava)"}]},{"type":"text","value":", joka palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", jos asunto-olio itse on pinta-alaltaan suurempi kuin verrattava asunto-olio."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki metodin toiminnasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"eira_yksio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"16"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkallio_kaksio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"38"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4200"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\njakomaki_kolmio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"78"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eira_yksio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"suurempi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kallio_kaksio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jakomaki_kolmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"suurempi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kallio_kaksio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"False\nTrue"}]}]},{"type":"element","tagName":"h2","properties":{"id":"hintaero","style":"position:relative;"},"children":[{"type":"text","value":"Hintaero"},{"type":"element","tagName":"a","properties":{"href":"#hintaero","ariaLabel":"hintaero permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hintaero(self, verrattava)"}]},{"type":"text","value":", joka palauttaa asunto-olion ja verrattavan asunto-olion hintaeron. Hintaero on asuntojen hintojen erotuksen (hinta lasketaan kertomalla neliöhinta neliöillä) itseisarvo."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki metodin toiminnasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"eira_yksio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"16"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkallio_kaksio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"38"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4200"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\njakomaki_kolmio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"78"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eira_yksio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hintaero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kallio_kaksio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jakomaki_kolmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hintaero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kallio_kaksio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"71600\n35400"}]}]},{"type":"element","tagName":"h2","properties":{"id":"onko-kalliimpi","style":"position:relative;"},"children":[{"type":"text","value":"Onko kalliimpi?"},{"type":"element","tagName":"a","properties":{"href":"#onko-kalliimpi","ariaLabel":"onko kalliimpi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kalliimpi(self, verrattava)"}]},{"type":"text","value":" joka palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":", jos asunto-olio on kalliimpi kuin verrattavana oleva asunto-olio."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki metodin toiminnasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"eira_yksio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"16"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkallio_kaksio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"38"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4200"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\njakomaki_kolmio "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Asunto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"78"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"eira_yksio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kalliimpi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kallio_kaksio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jakomaki_kolmio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kalliimpi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kallio_kaksio"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"False\nTrue"}]}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, miten olioita voi tallentaa tietorakenteisiin
  • \n
  • Tiedät, miten olioiden välitys parametrina toimii
  • \n

Pythonissa kaikki arvot ovat olioita ja myös omista luokista luotuja olioita voi käsitellä kuin mitä tahansa muitakin olioita. Esimerkiksi olioita voidaan tallentaa listaan:

from datetime import date\n\nclass Kurssisuoritus:\n\n    def __init__(self, kurssi: str, opintopisteet: int, suorituspvm: date):\n        self.kurssi = kurssi\n        self.opintopisteet = opintopisteet\n        self.suorituspvm = suorituspvm\n\n\nif __name__ == \"__main__\":\n    # Luodaan pari kurssisuoritusta ja lisätään listaan\n    suoritukset = []\n\n    mat1 = Kurssisuoritus(\"Matematiikka 1\", 5, date(2020, 3, 11))\n    ohj1 = Kurssisuoritus(\"Ohjelmointi 1\", 6, date(2019, 12, 17))\n\n    suoritukset.append(mat1)\n    suoritukset.append(ohj1)\n\n    # Lisätään suoraan listaan muutama\n    suoritukset.append(Kurssisuoritus(\"Fysiikka 2\", 4, date(2019, 11, 10)))\n    suoritukset.append(Kurssisuoritus(\"Ohjelmointi 2\", 5, date(2020, 5, 19)))\n\n    # Käydään läpi kaikki suoritukset, tulostetaan nimet ja lasketaan opintopisteet yhteen\n    opintopisteet = 0\n    for suoritus in suoritukset:\n        print(suoritus.kurssi)\n        opintopisteet += suoritus.opintopisteet\n\n    print(\"Opintopisteitä yhteensä:\", opintopisteet)

Matematiikka 1\nOhjelmointi 1\nFysiikka 2\nOhjelmointi 2\nOpintopisteitä yhteensä: 20

Tehtäväpohjassa oleva luokka Auto mallintaa autoa kahden attribuutin avulla: merkki (str) ja huippunopeus (int).

Kirjoita funktio nopein_auto(autot: list), joka saa parametrikseen listan Auto-luokan olioita.

Funktio palauttaa listassa olevista autoista nopeimman auton merkin. Voit olettaa, että nopein auto on yksikäsitteinen. Älä muuta alkuperäistä listaa tai luokkaa Auto.

Esimerkki funktion testauksesta:

if __name__ == \"__main__\":\n    auto1 = Auto(\"Mersu\", 195)\n    auto2 = Auto(\"Lada\", 110)\n    auto3 = Auto(\"Ferrari\", 280)\n    auto4 = Auto(\"Trabant\", 85)\n\n    autot = [auto1, auto2, auto3, auto4]\n    print(nopein_auto(autot))

Ferrari

Tehtäväpohjasta löytyy luokka Koesuoritus, joka mallintaa nimensä mukaisesti koesuoritusta. Sillä on kaksi attribuuttia, suorittaja (str) ja pisteet (int).

Kirjoita funktio hyvaksytyt(suoritukset: list, pisteraja: int), joka saa parametrikseen listan koesuorituksia ja alimman hyväksytyn pistemäärän kokonaislukuna.

Funktio muodostaa ja palauttaa uuden listan, johon on tallennettu ainoastaan hyväksytyt suoritukset listalta. Älä muuta alkuperäistä listaa tai luokkaa Koesuoritus.

Esimerkki funktion käytöstä:

if __name__ == \"__main__\":\n    s1 = Koesuoritus(\"Pekka\", 12)\n    s2 = Koesuoritus(\"Pirjo\", 19)\n    s3 = Koesuoritus(\"Pauli\", 15)\n    s4 = Koesuoritus(\"Pirkko\", 9)\n    s5 = Koesuoritus(\"Petriina\", 17)\n\n    hyv = hyvaksytyt([s1, s2, s3, s4, s5], 15)\n    for hyvaksytty in hyv:\n        print(hyvaksytty)

Koesuoritus (suorittaja: Pirjo, pisteet: 19)\nKoesuoritus (suorittaja: Pauli, pisteet: 15)\nKoesuoritus (suorittaja: Petriina, pisteet: 17)

Listaan ei tarkkaan ottaen tallenneta olioita vaan viittauksia olioihin. Niinpä sama olio voi esiintyä listassa useaan kertaan ja samaan olioon voidaan viitata useaan kertaan listassa ja sen ulkopuolella. Esimerkiksi näin:

class Tuote:\n    def __init__(self, nimi: int, yksikko: str):\n        self.nimi = nimi\n        self.yksikko = yksikko\n\n\nif __name__ == \"__main__\":\n    kauppalista = []\n    maito = Tuote(\"Maito\", \"litra\")\n\n    kauppalista.append(maito)\n    kauppalista.append(maito)\n    kauppalista.append(Tuote(\"Kurkku\", \"kpl\"))
\n \n \n \n \n \n \"9\n \n \n

Jos samaan olioon on useampi kuin yksi viittaus, on lopputuloksen kannalta yhdentekevää, mitä viittauksista käytetään:

class Koira:\n    def __init__(self, nimi):\n        self.nimi = nimi\n\n    def __str__(self):\n        return self.nimi\n\nkoirat = []\nmusti = Koira(\"Musti\")\nkoirat.append(musti)\nkoirat.append(musti)\nkoirat.append(Koira(\"Musti\"))\n\nprint(\"Koirat alussa:\")\nfor koira in koirat:\n    print(koira)\n\nprint(\"Kohdan 0 koira saa uuden nimen:\")\nkoirat[0].nimi = \"Rekku\"\nfor koira in koirat:\n    print(koira)\n\nprint(\"Kohdan 2 koira saa uuden nimen:\")\nkoirat[2].nimi = \"Fifi\"\nfor koira in koirat:\n    print(koira)

Koirat alussa:\nMusti\nMusti\nMusti\nKohdan 0 koira saa uuden nimen:\nRekku\nRekku\nMusti\nKohdan 2 koira saa uuden nimen:\nRekku\nRekku\nFifi

Listan kohdissa 0 ja 1 on viittaus samaan olioon, joten olion sisältöä voidaan muuttaa kumman tahansa viittauksen kautta. Listan kohdassa 2 on kuitenkin viittaus toiseen olioon, minkä vuoksi tämän olion muuttaminen ei muuta muita.

Operaattorilla is voidaan tutkia, onko kyseessä täysin sama olio, ja operaattorilla == voidaan tutkia, onko kyseessä saman sisältöinen olio. Seuraava koodi havainnollistaa asiaa:

lista1 = [1, 2, 3]\nlista2 = [1, 2, 3]\nlista3 = lista1\n\nprint(lista1 is lista2)\nprint(lista1 is lista3)\nprint(lista2 is lista3)\n\nprint()\n\nprint(lista1 == lista2)\nprint(lista1 == lista3)\nprint(lista2 == lista3)

False\nTrue\nFalse

True\nTrue\nTrue

Omista luokista muodostettuja olioita voidaan myös tallentaa esimerkiksi sanakirjaan ja muihin tietorakenteisiin:

class Opiskelija:\n    def __init__(self, nimi: str, op: int):\n        self.nimi = nimi\n        self.op = op\n\nif __name__ == \"__main__\":\n    # Käytetään avaimena opiskelijanumeroa ja arvona Opiskelija-oliota\n    opiskelijat = {}\n    opiskelijat[\"12345\"] = Opiskelija(\"Olli Opiskelija\", 10)\n    opiskelijat[\"54321\"] = Opiskelija(\"Outi Opiskelija\", 67)

Visualisaattori osaa havainnollistaa nämäkin asiat hienosti:

\n \n \n \n \n \n \"9\n \n \n

Selfillä vai ilman?

Tässä vaiheessa kurssia self-määre saattaa vaikuttaa vielä hämärältä. Käytetään siis hetki sen pohtimiseen, milloin selfiä tulee käyttää, ja milloin sitä kannattaa olla käyttämättä.

Tarkastellaan esimerkkinä yksinkertaista luokkaa, jonka avulla joukosta sanoja on mahdollista muodostaa sanasto:

class Sanasto:\n    def __init__(self):\n        self.sanat = []\n\n    def lisaa_sana(self, sana: str):\n        if not sana in self.sanat:\n            self.sanat.append(sana)\n\n    def tulosta(self):\n        for sana in sorted(self.sanat):\n            print(sana)\n\nsanasto = Sanasto()\nsanasto.lisaa_sana(\"python\")\nsanasto.lisaa_sana(\"olio\")\nsanasto.lisaa_sana(\"olio-ohjelmointi\")\nsanasto.lisaa_sana(\"olio\")\nsanasto.lisaa_sana(\"nörtti\")\n\nsanasto.tulosta()

nörtti\nolio\nolio-ohjelmointi\npython

Luokka tallentaa sanalistan oliomuuttujaan self.sanat. Tässä tapauksessa self tarvitaan ehdottomasti sekä luokan konstruktorissa että luokan muissa metodeissa tähän muuttujaan viitatessa, koska muuten sama lista ei ole kaikkien olion metodien käytettävissä.

Lisätään luokalle metodi pisin_sana(self) joka selvittää nimensä mukaisesti sanaston pisimmän sanan (tai yhden niistä).

Tehtävän voisi toteuttaa vaikkapa seuraavasti, mutta näemme kohta miksei se ole kovin hyvä idea:

class Sanasto:\n    def __init__(self):\n        self.sanat = []\n\n    # ...\n\n    def pisin_sana(self):\n        # määritellään kaksi apumuuttujaa\n        self.pisin = \"\"\n        self.pisimman_pituus = 0\n\n        for sana in self.sanat:\n            if len(sana) > self.pisimman_pituus:\n                self.pisimman_pituus = len(sana)\n                self.pisin = sana\n\n        return self.pisin

Metodi siis käyttää kahta apumuuttujaa, jotka on määritelty käyttäen self-määrettä. Jos vielä halutaan hämmentää ohjelmakoodia lukevaa, apumuuttujat voisi lisäksi nimetä kryptisemmin, esim. apu ja apu2:

class Sanasto:\n    def __init__(self):\n        self.sanat = []\n\n    # ...\n\n    def pisin_sana(self):\n        # määritellään kaksi apumuuttujaa\n        self.apu = \"\"\n        self.apu2 = 0\n\n        for sana in self.sanat:\n            if len(sana) > self.apu2:\n                self.apu2 = len(sana)\n                self.apu = sana\n\n        return self.apu

Kun muuttujan määrittely tehdään self-määreen avulla, liitetään muuttuja olion attribuutiksi, eli muuttuja tulee olemaan edelleen olemassa myös metodin suorituksen päätyttyä. Tämä on aivan tarpeetonta, koska kyseisiä apumuuttujia on tarkoitus käyttää vain metodissa pisin_sana(self). Apumuuttujien määrittely self-määreen avulla on siis varsin huono idea.

Paitsi turhaa, apumuuttujien liittäminen self-määreellä olion attribuuteiksi on myös riskialtista, varsinkin epämääräisesti nimettyjen apumuuttujien tapauksessa. Jos samaa apumuuttujaa self.apu käytetään monessa eri metodissa mutta täysin eri tarkoituksiin, voivat seuraukset olla arvaamattomat ja koodissa voi ilmetä hankalasti löydettäviä bugeja.

Ongelma voi tulla esiin erityisesti silloin jos apumuuttujan alkuarvo annetaan jossain muualla, esimerkiksi konstruktorissa:

class Sanasto:\n    def __init__(self):\n        self.sanat = []\n        # määritellään apumuuttujia\n        self.apu = \"\"\n        self.apu2 = \"\"\n        self.apu3 = \"\"\n        self.apu4 = \"\"\n\n    # ...\n\n    def pisin_sana(self):\n        for sana in self.sanat:\n            # tämä ei toimi sillä apu2:n tyyppi on väärä\n            if len(sana) > self.apu2:\n                self.apu2 = len(sana)\n                self.apu = sana\n\n        return self.apu

Toisaalta uusien olion attribuuttien määrittely muualla kuin konstruktorissa on sikäli vaarallista, että tällöin olion attribuutit riippuvat siitä, mitä metodeja on suoritettu. Kaikilla saman luokan avulla luoduilla olioilla ei välttämättä ole samoja attribuutteja, mistä seuraa helposti bugeja.

Siispä oikea tapa määritellä yhdessä metodissa käytettävät apumuuttujat on tehdä se ilman self-määrettä:

class Sanasto:\n    def __init__(self):\n        self.sanat = []\n\n    # ...\n\n    def pisin_sana(self):\n        # tämä on oikea tapa määritellä yhden metodin sisäiset apumuuttujat\n        pisin = \"\"\n        pisimman_pituus = 0\n\n        for sana in self.sanat:\n            if len(sana) > pisimman_pituus:\n                pisimman_pituus = len(sana)\n                pisin = sana\n\n        return pisin

Tällaisessa toteutuksessa apumuuttujat ovat olemassa ainoastaan metodin suorituksen aikana, ja niissä olevat arvot eivät pääse aiheuttamaan komplikaatioita muussa koodissa.

Oliot funktioiden parametrina

Omista luokista luodut oliot ovat yleensä muuttuvia eli mutatoituvia, joten niiden toiminta parametrina välitettäessä muistuttaa esimerkiksi listoista tuttua tapaa: funktio, jolle olio välitetään parametrina, voi muuttaa kyseistä oliota.

Tarkastellaan yksinkertaista esimerkkiä, jossa funktiolle välitetään Opiskelija-luokasta luotu olio. Funktion sisällä muutetaan opiskelijan nimi, ja muutos näkyy myös pääohjelmassa, koska molemmissa tilanteissa viitataan samaan olioon.

class Opiskelija:\n    def __init__(self, nimi: str, opiskelijanumero: str):\n        self.nimi = nimi\n        self.opiskelijanumero = opiskelijanumero\n\n    def __str__(self):\n        return f\"{self.nimi} ({self.opiskelijanumero})\"\n\n# Huomaa, että tyyppivihjeenä käytetään nyt oman luokan nimeä\ndef muuta_nimi(opiskelija: Opiskelija):\n    opiskelija.nimi = \"Olli Opiskelija\"\n\n# Luodaan opiskelijaolio\nolli = Opiskelija(\"Olli Oppilas\", \"12345\")\n\nprint(olli)\nmuuta_nimi(olli)\nprint(olli)

Olli Oppilas (12345)\nOlli Opiskelija (12345)

Olion voi myös luoda funktion sisällä. Mikäli funktio palauttaa viittauksen olioon, on muodostettu olio käytettävissä myös pääohjelmassa:

from random import randint, choice\n\nclass Opiskelija:\n    def __init__(self, nimi: str, opiskelijanumero: str):\n        self.nimi = nimi\n        self.opiskelijanumero = opiskelijanumero\n\n    def __str__(self):\n        return f\"{self.nimi} ({self.opiskelijanumero})\"\n\n\n# Funktio luo ja palauttaa Opiskelija-olion, jolla on satunnainen nimi ja opiskelijanumero\ndef uusi_opiskelija():\n    etunimet = [\"Arto\",\"Pekka\",\"Minna\",\"Mari\"]\n    sukunimet = [\"Virtanen\", \"Lahtinen\", \"Leinonen\", \"Pythonen\"]\n\n    # arvo nimi\n    nimi = choice(etunimet) + \" \" + choice(sukunimet)\n\n    # Arvo opiskelijanumero\n    opiskelijanumero = str(randint(10000,99999))\n\n    # Luo ja palauta opiskelijaolio\n    return Opiskelija(nimi, opiskelijanumero)\n\nif __name__ == \"__main__\":\n    # Kutsutaan metodia viidesti, tallennetaan tulokset listaan\n    opiskelijat = []\n    for i in range(5):\n        opiskelijat.append(uusi_opiskelija())\n\n    # Tulostetaan\n    for opiskelija in opiskelijat:\n        print(opiskelija)

Mari Lahtinen (36213)\nArto Virtanen (11859)\nMari Pythonen (77330)\nArto Pythonen (86451)\nMinna Pythonen (86211)

Oliot metodien parametrina

Oliot toimivat normaaliin tapaan myös metodien parametrina. Tarkastellaan seuraavaa esimerkkiä:

class Henkilo:\n    def __init__(self, nimi: str, pituus: int):\n        self.nimi = nimi\n        self.pituus = pituus\n\nclass Huvipuistolaite:\n    def __init__(self, nimi: str, pituusraja: int):\n        self.kavijoita = 0\n        self.nimi = nimi\n        self.pituusraja = pituusraja\n\n    def ota_kyytiin(self, henkilo: Henkilo):\n        if henkilo.pituus >= self.pituusraja:\n            self.kavijoita += 1\n            print(f\"{henkilo.nimi} pääsi kyytiin\")\n        else:\n            print(f\"{henkilo.nimi} liian lyhyt :(\")\n\n    def __str__(self):\n        return f\"{self.nimi} ({self.kavijoita} kävijää)\"

Huvipuistolaitteen metodi ota_kyytiin saa nyt parametrina luokan Henkilo olion. Jos kävijä on riittävän pitkä, metodi päästää hänet laitteeseen ja lisää kävijöiden määrää. Seuraavassa esimerkkisuoritus:

hurjakuru = Huvipuistolaite(\"Hurjakuru\", 120)\njarkko = Henkilo(\"Jarkko\", 172)\nvenla = Henkilo(\"Venla\", 105)\n\nhurjakuru.ota_kyytiin(jarkko)\nhurjakuru.ota_kyytiin(venla)\n\nprint(hurjakuru)

Jarkko pääsi kyytiin\nVenla liian lyhyt :(\nHurjakuru (1 kävijää)

Tehtäväpohjassasi on valmiina jo luokka Henkilo sekä runko luokalle Kasvatuslaitos. Kasvatuslaitosoliot käsittelevät ihmisiä eri tavalla, esim. punnitsevat ja syöttävät ihmisiä. Rakennamme tässä tehtävässä kasvatuslaitoksen. Luokan Henkilo koodiin ei tehtävässä ole tarkoitus koskea!

Henkilöiden punnitseminen

Kasvatuslaitoksen luokkarungossa on valmiina runko metodille punnitse:

class Kasvatuslaitos:\n    def punnitse(self, henkilo: Henkilo):\n        # palautetaan parametrina annetun henkilön paino\n        return -1

Metodi saa parametrina henkilön ja metodin on tarkoitus palauttaa kutsujalleen parametrina olevan henkilön paino. Paino selviää pyytämällä parametrina olevalta henkilöltä henkilo sopiva attribuutti. Sinun tulee täydentää punnitse-metodin koodia.

Seuraavassa on pääohjelma jossa kasvatuslaitos punnitsee kaksi henkilöä:

haagan_neuvola = Kasvatuslaitos()\n\neero = Henkilo(\"Eero\", 1, 110, 7)\npekka = Henkilo(\"Pekka\", 33, 176, 85)\n\nprint(f\"{eero.nimi} painaa {haagan_neuvola.punnitse(eero)} kg\")\nprint(f\"{pekka.nimi} painaa {haagan_neuvola.punnitse(pekka)} kg\")

Eero painaa 7 kg\nPekka painaa 85 kg

Syöttäminen

Parametrina olevan olion tilaa on mahdollista muuttaa. Tee kasvatuslaitokselle metodi syota(henkilo: Henkilo) joka kasvattaa parametrina olevan henkilön painoa yhdellä.

Seuraavassa on esimerkki, jossa henkilöt ensin punnitaan ja tämän jälkeen neuvolassa syötetään Eeroa kolme kertaa. Tämän jälkeen henkilöt taas punnitaan:

haagan_neuvola = Kasvatuslaitos()\n\neero = Henkilo(\"Eero\", 1, 110, 7)\npekka = Henkilo(\"Pekka\", 33, 176, 85)\n\nprint(f\"{eero.nimi} painaa {haagan_neuvola.punnitse(eero)} kg\")\nprint(f\"{pekka.nimi} painaa {haagan_neuvola.punnitse(pekka)} kg\")\nprint()\n\nhaagan_neuvola.syota(eero)\nhaagan_neuvola.syota(eero)\nhaagan_neuvola.syota(eero)\n\nprint(f\"{eero.nimi} painaa {haagan_neuvola.punnitse(eero)} kg\")\nprint(f\"{pekka.nimi} painaa {haagan_neuvola.punnitse(pekka)} kg\")

Tulostuksen pitäisi paljastaa, että Eeron paino on noussut kolmella:

Eero painaa 7 kg\nPekka painaa 85 kg

Eero painaa 10 kg\nPekka painaa 85 kg

Punnitusten laskeminen

Tee kasvatuslaitokselle metodi punnitukset() joka kertoo, kuinka monta punnitusta kasvatuslaitos on ylipäätään tehnyt. Huom! Tarvitset uuden oliomuuttujan punnitusten lukumäärän laskemiseen. Testipääohjelma:

haagan_neuvola = Kasvatuslaitos()\n\neero = Henkilo(\"Eero\", 1, 110, 7)\npekka = Henkilo(\"Pekka\", 33, 176, 85)\n\nprint(f\"Punnituksia tehty {haagan_neuvola.punnitukset()}\")\n\nhaagan_neuvola.punnitse(eero)\nhaagan_neuvola.punnitse(eero)\n\nprint(f\"Punnituksia tehty {haagan_neuvola.punnitukset()}\")\n\nhaagan_neuvola.punnitse(eero)\nhaagan_neuvola.punnitse(eero)\nhaagan_neuvola.punnitse(eero)\nhaagan_neuvola.punnitse(eero)\n\nprint(f\"Punnituksia tehty {haagan_neuvola.punnitukset()}\")

Punnituksia tehty 0\nPunnituksia tehty 2\nPunnituksia tehty 6

Teimme edellisessä osan tehtävässä luokan Maksukortti. Kortilla oli metodit edullisesti ja maukkaasti syömistä sekä rahan lataamista varten.

Edellisen osan tyylillä tehdyssä Maksukortti-luokassa oli kuitenkin ongelma. Kortti tiesi lounaiden hinnan ja osasi sen ansiosta vähentää saldoa oikean määrän. Entä kun hinnat nousevat? Tai jos myyntivalikoimaan tulee uusia tuotteita? Hintojen muuttaminen tarkoittaisi, että kaikki jo käytössä olevat kortit pitäisi korvata uudet hinnat tuntevilla korteilla.

Parempi ratkaisu on tehdä kortit \"tyhmiksi\", hinnoista ja myytävistä tuotteista tietämättömiksi pelkän saldon säilyttäjiksi. Kaikki äly kannattaakin laittaa erillisiin olioihin, kassapäätteisiin.

\"Tyhmä\" maksukortti

Toteutetaan ensin Maksukortti-luokasta \"tyhmä\" versio. Kortilla on ainoastaan metodit saldon kysymiseen, rahan lataamiseen ja rahan ottamiseen. Täydennä alla ja tehtäväpohjassa olevaan luokkaan metodin ota_rahaa(maara) ohjeen mukaan:

class Maksukortti:\n    def __init__(self, saldo: float):\n        self.saldo = saldo\n\n    def lataa_rahaa(self, lisays: float):\n        self.saldo += lisays\n\n    def ota_rahaa(self, maara: float):\n        pass\n        # Toteuta metodi siten, että se ottaa kortilta rahaa vain, jos saldoa riittää\n        # Onnistuessaan metodi palauttaa True ja muuten False

Testipääohjelma:

if __name__ == \"__main__\":\n    kortti = Maksukortti(10)\n    print(\"Rahaa\", kortti.saldo)\n    tulos = kortti.ota_rahaa(8)\n    print(\"Onnistuiko otto:\", tulos)\n    print(\"Rahaa\", kortti.saldo)\n    tulos = kortti.ota_rahaa(4)\n    print(\"Onnistuiko otto:\", tulos)\n    print(\"Rahaa\", kortti.saldo)

Rahaa 10\nOnnistuiko otto: True\nRahaa 2\nOnnistuiko otto: False\nRahaa 2

Kassapääte ja käteiskauppa

Unicafessa asioidessa asiakas maksaa joko käteisellä tai maksukortilla. Myyjä käyttää kassapäätettä kortin veloittamiseen ja käteismaksujen hoitamiseen. Tehdään ensin kassapäätteestä käteismaksuihin sopiva versio.

Kassapäätteen runko on seuraavanlainen. Metodien kommentit kertovat halutun toiminnallisuuden.

class Kassapaate:\n    def __init__(self):\n        # Kassassa on aluksi 1000 euroa rahaa\n        self.rahaa = 1000\n        self.edulliset = 0\n        self.maukkaat = 0\n\n    def syo_edullisesti(self, maksu: float):\n        # Edullinen lounas maksaa 2.50 euroa.\n        # Kasvatetaan kassan rahamäärää edullisen lounaan hinnalla ja palautetaan vaihtorahat\n        # Jos parametrina annettu maksu ei ole riittävän suuri, ei lounasta myydä ja metodi palauttaa koko summan\n\n    def syo_maukkaasti(self, maksu: float):\n        # Maukas lounas maksaa 4.30 euroa.\n        # Kasvatetaan kassan rahamäärää maukkaan lounaan hinnalla ja palautetaan vaihtorahat\n        # Jos parametrina annettu maksu ei ole riittävän suuri, ei lounasta myydä ja metodi palauttaa koko summan

Käyttöesimerkki

exactum = Kassapaate()\n\nvaihtorahaa = exactum.syo_edullisesti(10)\nprint(\"Vaihtorahaa jäi\", vaihtorahaa)\n\nvaihtorahaa = exactum.syo_edullisesti(5)\nprint(\"Vaihtorahaa jäi\", vaihtorahaa)\n\nvaihtorahaa = exactum.syo_maukkaasti(4.3)\nprint(\"Vaihtorahaa jäi\", vaihtorahaa)\n\nprint(\"Kassassa rahaa\", exactum.rahaa)\nprint(\"Edullisia lounaita myyty\", exactum.edulliset)\nprint(\"Maukkaita lounaita myyty\", exactum.maukkaat)

Vaihtorahaa jäi 7.5\nVaihtorahaa jäi 2.5\nVaihtorahaa jäi 0.0\nKassassa rahaa 1009.3\nEdullisia lounaita myyty 2\nMaukkaita lounaita myyty 1

Kortilla maksaminen

Laajennetaan kassapäätettä siten, että myös kortilla voi maksaa. Teemme kassapäätteelle siis metodit, joiden parametrina kassapääte saa maksukortin, jolta se vähentää valitun lounaan hinnan. Seuraavassa ovat uusien metodien rungot ja ohje niiden toteuttamiseksi:

class Kassapaate:\n    # ...\n\n    def syo_edullisesti_kortilla(self, kortti: Maksukortti):\n        # Edullinen lounas maksaa 2.50 euroa\n        # Jos kortilla on tarpeeksi rahaa, vähennetään hinta kortilta ja palautetaan True\n        # Muuten palautetaan False\n\n\n    def syo_maukkaasti_kortilla(self, kortti: Maksukortti):\n        # Maukas lounas maksaa 4.30 euroa.\n        # Jos kortilla on tarpeeksi rahaa, vähennetään hinta kortilta ja palautetaan True\n        # Muuten palautetaan False

Huom: kortilla maksaminen ei lisää kassapäätteessä olevan käteisen määrää.

Seuraavassa on testipääohjelma ja haluttu tulostus:

exactum = Kassapaate()\n\nvaihtorahaa = exactum.syo_edullisesti(10)\nprint(\"Vaihtorahaa jäi\", vaihtorahaa)\n\nkortti = Maksukortti(7)\n\ntulos = exactum.syo_maukkaasti_kortilla(kortti)\nprint(\"Riittikö raha:\", tulos)\ntulos = exactum.syo_maukkaasti_kortilla(kortti)\nprint(\"Riittikö raha:\", tulos)\ntulos = exactum.syo_edullisesti_kortilla(kortti)\nprint(\"Riittikö raha:\", tulos)\n\nprint(\"Kassassa rahaa\", exactum.rahaa)\nprint(\"Edullisia lounaita myyty\", exactum.edulliset)\nprint(\"Maukkaita lounaita myyty\", exactum.maukkaat)

Vaihtorahaa jäi 7.5\nRiittikö raha: True\nRiittikö raha: False\nRiittikö raha: True\nKassassa rahaa 1002.5\nEdullisia lounaita myyty 2\nMaukkaita lounaita myyty 1

Rahan lataaminen

Lisätään vielä kassapäätteelle metodi jonka avulla kortille voidaan ladata lisää rahaa. Muista, että rahan lataamisen yhteydessä ladattava summa viedään kassapäätteeseen. Metodin runko:

def lataa_rahaa_kortille(self, kortti: Maksukortti, summa: float):\n    pass

Testipääohjelma ja esimerkkisyöte:

exactum = Kassapaate()\n\nantin_kortti = Maksukortti(2)\nprint(f\"Kortilla rahaa {antin_kortti.saldo} euroa\")\n\ntulos = exactum.syo_maukkaasti_kortilla(antin_kortti)\nprint(\"Riittikö raha:\", tulos)\n\nexactum.lataa_rahaa_kortille(antin_kortti, 100)\nprint(f\"Kortilla rahaa {antin_kortti.saldo} euroa\")\n\ntulos = exactum.syo_maukkaasti_kortilla(antin_kortti)\nprint(\"Riittikö raha:\", tulos)\nprint(f\"Kortilla rahaa {antin_kortti.saldo} euroa\")\n\nprint(\"Kassassa rahaa\", exactum.rahaa)\nprint(\"Edullisia lounaita myyty\", exactum.edulliset)\nprint(\"Maukkaita lounaita myyty\", exactum.maukkaat)

Kortilla rahaa 2 euroa\nRiittikö raha: False\nKortilla rahaa 102 euroa\nRiittikö raha: True\nKortilla rahaa 97.7 euroa\nKassassa rahaa 1100\nEdullisia lounaita myyty 0\nMaukkaita lounaita myyty 1

Saman luokan oliot metodien parametrina

Tarkastellaan jälleen kerran yhtä versiota luokasta Henkilo:

class Henkilo:\n    def __init__(self, nimi: str, syntynyt: int):\n        self.nimi = nimi\n        self.syntynyt = syntynyt

Oletetaan että olemme tekemässä ohjelmaa, joka vertailee henkilöiden ikiä. Voisimme tehdä tarkoitusta varten erillisen funktion:

def vanhempi_kuin(henkilo1: Henkilo, henkilo2: Henkilo):\n    if henkilo1.syntynyt < henkilo2.syntynyt:\n        return True\n    else:\n        return False\n\nmuhammad = Henkilo(\"Muhammad ibn Musa al-Khwarizmi\", 780)\npascal = Henkilo(\"Blaise Pascal\", 1623)\ngrace = Henkilo(\"Grace Hopper\", 1906)\n\nif vanhempi_kuin(muhammad, pascal):\n    print(f\"{muhammad} on vanhempi kuin {pascal}\")\nelse:\n    print(f\"{muhammad} ei ole vanhempi kuin {pascal}\")\n\nif vanhempi_kuin(grace, pascal):\n    print(f\"{grace} on vanhempi kuin {pascal}\")\nelse:\n    print(f\"{grace} ei ole vanhempi kuin {pascal}\")

Muhammad ibn Musa al-Khwarizmi on vanhempi kuin Blaise Pascal\nGrace Hopper ei ole vanhempi kuin Blaise Pascal

Olio-ohjelmoinnin henkeen kuuluu kuitenkin sijoittaa oliota käsittelevät \"funktiot\" luokan metodeiksi. Voisimmekin tehdä henkilölle metodin, jonka avulla henkilön ikää voidaan verrata toiseen henkilöön:

class Henkilo:\n    def __init__(self, nimi: str, syntynyt: int):\n        self.nimi = nimi\n        self.syntynyt = syntynyt\n\n    # huomaa, että tyyppivihje pitää antaa hipsuissa jos parametri on saman luokan olio!\n    def vanhempi_kuin(self, toinen: \"Henkilo\"):\n        if self.syntynyt < toinen.syntynyt:\n            return True\n        else:\n            return False

Nyt siis olio itse on self ja toinen on henkilöolio, joka toimii vertailukohtana.

Huomaa, miten metodin kutsuminen eroaa funktion kutsumisesta:

muhammad = Henkilo(\"Muhammad ibn Musa al-Khwarizmi\", 780)\npascal = Henkilo(\"Blaise Pascal\", 1623)\ngrace = Henkilo(\"Grace Hopper\", 1906)\n\nif muhammad.vanhempi_kuin(pascal):\n    print(f\"{muhammad.nimi} on vanhempi kuin {pascal.nimi}\")\nelse:\n    print(f\"{muhammad.nimi} ei ole vanhempi kuin {pascal.nimi}\")\n\nif grace.vanhempi_kuin(pascal):\n    print(f\"{grace.nimi} on vanhempi kuin {pascal.nimi}\")\nelse:\n    print(f\"{grace.nimi} ei ole vanhempi kuin {pascal.nimi}\")

Pisteen vasemmalla puolella on siis verrattava henkilö, eli olio, johon metodin suorituksessa viittaa muuttuja self. Metodin parametrina taas on vertailukohta, eli metodin suorituksessa muuttujan toinen viittaama olio.

Ohjelman tulostus on sama kuin edellisessä funktiota käyttäneessä esimerkissä.

Huomaa, että if-else-rakenne metodissa vanhempi_kuin on oikeastaan turha, sillä vertailun arvona on suoraan haluamamme totuusarvo. Voimme siis yksinkertaistaa metodia seuraavasti:

class Henkilo:\n    def __init__(self, nimi: str, syntynyt: int):\n        self.nimi = nimi\n        self.syntynyt = syntynyt\n\n    # huomaa, että tyyppivihje pitää antaa hipsuissa jos parametri on saman luokan olio!\n    def vanhempi_kuin(self, toinen: \"Henkilo\"):\n        return self.syntynyt < toinen.syntynyt:

Edellisestä esimerkistä kannattaa huomata se, että kun metodi saa parametrikseen toisen saman luokan olion, tulee tyyppivihje antaa hipsuissa, eli seuraava koodi aiheuttaisi virheen:

class Henkilo:\n    # ...\n\n    # tämä ei toimi, Henkilo pitaa olla hipsuissa\n    def vanhempi_kuin(self, toinen: Henkilo):\n        return self.syntynyt < toinen.syntynyt:

Asuntovälitystoimiston tietojärjestelmässä kuvataan myynnissä olevaa asuntoa seuraavasta luokasta tehdyillä olioilla:

class Asunto:\n    def __init__(self, huoneita: int, nelioita: int, neliohinta: int):\n        self.huoneita = huoneita\n        self.nelioita = nelioita\n        self.neliohinta = neliohinta

Tehtävänä on toteuttaa metodeita, joiden avulla myynnissä olevia asuntoja voidaan vertailla.

Onko suurempi

Tee metodi suurempi(self, verrattava), joka palauttaa True, jos asunto-olio itse on pinta-alaltaan suurempi kuin verrattava asunto-olio.

Esimerkki metodin toiminnasta:

eira_yksio = Asunto(1, 16, 5500)\nkallio_kaksio = Asunto(2, 38, 4200)\njakomaki_kolmio = Asunto(3, 78, 2500)\n\nprint(eira_yksio.suurempi(kallio_kaksio))\nprint(jakomaki_kolmio.suurempi(kallio_kaksio))

False\nTrue

Hintaero

Tee metodi hintaero(self, verrattava), joka palauttaa asunto-olion ja verrattavan asunto-olion hintaeron. Hintaero on asuntojen hintojen erotuksen (hinta lasketaan kertomalla neliöhinta neliöillä) itseisarvo.

Esimerkki metodin toiminnasta:

eira_yksio = Asunto(1, 16, 5500)\nkallio_kaksio = Asunto(2, 38, 4200)\njakomaki_kolmio = Asunto(3, 78, 2500)\n\nprint(eira_yksio.hintaero(kallio_kaksio))\nprint(jakomaki_kolmio.hintaero(kallio_kaksio))

71600\n35400

Onko kalliimpi?

Tee metodi kalliimpi(self, verrattava) joka palauttaa True, jos asunto-olio on kalliimpi kuin verrattavana oleva asunto-olio.

Esimerkki metodin toiminnasta:

eira_yksio = Asunto(1, 16, 5500)\nkallio_kaksio = Asunto(2, 38, 4200)\njakomaki_kolmio = Asunto(3, 78, 2500)\n\nprint(eira_yksio.kalliimpi(kallio_kaksio))\nprint(jakomaki_kolmio.kalliimpi(kallio_kaksio))

False\nTrue

","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-9/1-oliot-ja-viitteet.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-9/2-oliot-attribuuttina/page-data.json b/page-data/osa-9/2-oliot-attribuuttina/page-data.json index e0ee4ff85..cf52df568 100644 --- a/page-data/osa-9/2-oliot-attribuuttina/page-data.json +++ b/page-data/osa-9/2-oliot-attribuuttina/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-9/2-oliot-attribuuttina", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat tallentaa olioita toisten olioiden sisään"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä tarkoittaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"None"}]}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aikaisemmin nähtiin esimerkkejä luokista, joissa attribuutteina oli käytetty esimerkiksi listoja. Samalla tavalla myös omista luokista luotuja olioita voi käyttää toisten olioiden attribuutteina. Seuraavissa esimerkeissä on määritelty luokat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kurssi"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Opintosuoritus"}]},{"type":"text","value":". Opintosuorituksessa hyödynnetään kahta ensimmäistä luokkaa. Luokkien sisäinen toteutus on lyhyt, jotta esimerkki toisi esille oleellisen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkissä jokainen luokka on kirjoitettu omaan tiedostoonsa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esitellään aluksi luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kurssi"}]},{"type":"text","value":", joka on määritelty tiedostossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kurssi.py"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kurssi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" koodi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"koodi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" koodi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opintopisteet"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"text","value":" mallintaa yhtä opiskelijaa. Luokka on määritelty tiedostossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"opiskelija.py"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opiskelijanumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opiskelijanumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opiskelijanumero\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opintopisteet"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Opintosuoritus"}]},{"type":"text","value":" hyödyntää luokkia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kurssi"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"text","value":" suorituksen tallentamiseen. Huomaa, että luokat tuodaan mukaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":"-lauseella:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" kurssi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" Kurssi\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" opiskelija "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" Opiskelija\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opintosuoritus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kurssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Kurssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvosana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opiskelija "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opiskelija\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kurssi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kurssi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvosana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" arvosana"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki opintosuoritusten lisäämisestä listaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" opintosuoritus "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" Opintosuoritus\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" kurssi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" Kurssi\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" opiskelija "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" Opiskelija\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luodaan lista opiskelijoista"}]},{"type":"text","value":"\nopiskelijat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nopiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olli\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1234\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nopiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"3210\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"23"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nopiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Leena\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"9999\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"43"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nopiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tiina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"3333\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kurssi Ohjelmoinnin perusteet"}]},{"type":"text","value":"\nohpe "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kurssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ohpe1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Annetaan suoritukset kaikille opiskelijoille, kaikille arvosanaksi 3"}]},{"type":"text","value":"\nsuoritukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" opiskelija "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n suoritukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Opintosuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" ohpe"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan kaikista suorituksista opiskelijan nimi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" suoritus "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" suoritukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olli\nPekka\nLeena\nTiina"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan lähemmin riviä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print(suoritus.opiskelija.nimi)"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suoritus"}]},{"type":"text","value":" on luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Opintosuoritus"}]},{"type":"text","value":" mukainen olio"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Niinpä muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"opiskelija"}]},{"type":"text","value":" viittaa suoritukseen tallennettuun "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"text","value":"-olioon"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"text","value":"-luokan muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":" sisältää opiskelijan nimen"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"h2","properties":{"id":"milloin-import-tarvitaan","style":"position:relative;"},"children":[{"type":"text","value":"Milloin import tarvitaan?"},{"type":"element","tagName":"a","properties":{"href":"#milloin-import-tarvitaan","ariaLabel":"milloin import tarvitaan permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellisessä esimerkissä käytetään muutamassa kohdassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":":ia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" opintosuoritus "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" Opintosuoritus\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" kurssi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" Kurssi\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" opiskelija "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" Opiskelija\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# koodi"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Importia tarvitaan vain jos tiedostossa käytetään jossain muualla määriteltyä koodia. Näin on esimerkiksi kun käytetään jotain Pythonin valmista kalustoa, esim. matemaattisia operaatiota tarjoavaa moduulia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"math"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" math\n\nx "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"luvun "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"neliöjuuri math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sqrt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellisessä tehtävässä oletettiin, että luokat on määritelty omissa tiedostoissaan. Esimerkki toteaa mm.\n"},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Esitellään aluksi luokka Kurssi, joka on määritelty tiedostossa kurssi.py"}]},{"type":"text","value":"\nja importin tarve siis johtuu tästä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos kaikki koodi sijoitetaan samaan tiedostoon, kuten kaikissa kurssin ohjelmointitehtävissä ohjeistetaan, "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"et tarvitse"}]},{"type":"text","value":" "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":":ia luomiesi luokkien käytöön."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos siis päädyt kirjottamaan kurssilla seuraavanlaista koodia"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" henkilo "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" Henkilo\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# koodi"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"ratkaisusi on todennäköisesti väärä! Lisää importin käytöstä "},{"type":"element","tagName":"a","properties":{"href":"/osa-7/1-moduulit/"},"children":[{"type":"text","value":"osan 7"}]},{"type":"text","value":" materiaalissa."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Lemmikit","tmcname":"osa09-06_lemmikki"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa tulee kaksi luokkaa, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lemmikki"}]},{"type":"text","value":". Jokaisella henkilöllä on yksi lemmikki. Täydennä luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"text","value":" metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":" siten, että metodi palauttaa merkkijonon, joka kertoo henkilön nimen lisäksi lemmikin nimen ja rodun alta löytyvät esimerkkitulosteen mukaisesti."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että metodin palauttaman merkkijonon pitää olla "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"täsmälleen samanlainen kuin esimerkkitulosteessa esitetty"}]},{"type":"text","value":"!"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"hulda "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Lemmikki"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hulda\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"sekarotuinen koira\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nleevi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Leevi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" hulda"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"leevi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Leevi, kaverina Hulda, joka on sekarotuinen koira"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" koska kaikki koodi tulee samaan tiedostoon, et tarvitse tehtävässä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":":ia ollenkaan!"}]}]},{"type":"element","tagName":"h2","properties":{"id":"olion-attribuuttina-lista-olioita","style":"position:relative;"},"children":[{"type":"text","value":"Olion attribuuttina lista olioita"},{"type":"element","tagName":"a","properties":{"href":"#olion-attribuuttina-lista-olioita","ariaLabel":"olion attribuuttina lista olioita permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Äskeisissä esimerkeissä oliolla oli attribuuttina yksittäinen toisen luokan olio, esim. henkilöllä attribuuttina lemmikki ja opintosuorituksella attribuuttina kurssi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olio-ohjelmoinnissa törmätään kutenkin usein tilanteeseen, jossa oliolla on attribuuttina "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"joukko"}]},{"type":"text","value":" toisen luokan olioita. Eräs tälläinen tilanne kuvaa joukkueen ja sen pelaajien välistä yhteyttä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pelaaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" maalit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maalit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" maalit\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" (maaleja "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maalit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Joukkue"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaajat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_pelaaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaajat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"yhteenveto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n maalit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" pelaaja "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaajat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n maalit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maalit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Joukkue\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pelaajia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaajat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pelaajien maalimäärät\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" maalit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kupa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Joukkue"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kumpulan pallo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"22"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yhteenveto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joukkue Kumpulan pallo\nPelaajia 3\nPelaajien maalimäärät [10, 22, 1]"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Lahjapakkaus","tmcname":"osa09-07_lahjapakkaus"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä harjoitellaan lahjojen pakkaamista. Tehdään luokat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lahja"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pakkaus"}]},{"type":"text","value":". Lahjalla on nimi ja paino, ja pakkaus sisältää lahjoja."}]},{"type":"element","tagName":"h2","properties":{"id":"lahja-luokka","style":"position:relative;"},"children":[{"type":"text","value":"Lahja-luokka"},{"type":"element","tagName":"a","properties":{"href":"#lahja-luokka","ariaLabel":"lahja luokka permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lahja"}]},{"type":"text","value":", josta muodostetut oliot kuvaavat erilaisia lahjoja. Tallennettavat tiedot ovat tavaran nimi ja paino (kg). Luokan olioiden tulee toimia seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Lahja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aapiskukko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lahjan nimi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lahjan paino:\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paino"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lahja:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostuksen tulisi olla seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lahjan nimi: Aapiskukko\nLahjan paino: 2\nLahja: Aapiskukko (2 kg)"}]}]},{"type":"element","tagName":"h2","properties":{"id":"pakkaus-luokka","style":"position:relative;"},"children":[{"type":"text","value":"Pakkaus-luokka"},{"type":"element","tagName":"a","properties":{"href":"#pakkaus-luokka","ariaLabel":"pakkaus luokka permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pakkaus"}]},{"type":"text","value":", johon voi lisätä lahjoja ja joka pitää kirjaa pakkauksessa olevien lahjojen yhteispainosta. Luokassa tulee olla seuraavat metodit"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_lahja(self, lahja: Lahja)"}]},{"type":"text","value":", joka lisää parametrina annettavan lahjan pakkaukseen. Metodi ei palauta mitään arvoa."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"yhteispaino(self)"}]},{"type":"text","value":", joka palauttaa pakkauksessa olevien lahjojen yhteispainon."}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on luokan käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Lahja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aapiskukko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npakkaus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pakkaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npakkaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_lahja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pakkaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yhteispaino"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ncd_levy "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Lahja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pink Floyd: Dark side of the moon\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npakkaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_lahja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"cd_levy"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pakkaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yhteispaino"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2\n3"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"none-eli-viite-ei-mihinkaan","style":"position:relative;"},"children":[{"type":"text","value":"None eli viite ei mihinkään"},{"type":"element","tagName":"a","properties":{"href":"#none-eli-viite-ei-mihinkaan","ariaLabel":"none eli viite ei mihinkaan permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa muuttujat viittaavat aina johonkin olioon. On kuitenkin tilanteita, joissa haluaisimme määrittää arvon, joka ei viittaa mihinkään. Arvoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"None"}]},{"type":"text","value":" käytetään esittämään tyhjää viittausta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos esimerkiksi luokkaan joukkue lisättäisiin metodi, joka etsii joukkueen pelaajan, saattaisi olla luontevaa esittää paluuarvolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"None"}]},{"type":"text","value":" tilanne, jossa pelaajaa ei löydy:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pelaaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" maalit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maalit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" maalit\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" (maaleja "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maalit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Joukkue"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaajat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_pelaaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaajat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"etsi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" pelaaja "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaajat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" pelaaja\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"None"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kupa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Joukkue"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kumpulan pallo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"22"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npelaaja1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"etsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pelaaja1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npelaaja2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"etsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jukkis\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pelaaja2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Antti (maaleja 1)\nNone"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"None"}]},{"type":"text","value":"-arvojen kanssa pitää olla tarkkana. On hyvin tyypillistä, että ohjelmassa kutsutaan jotain metodia oliolle (tai pyydetään attribuutin arvoa oliolta), joka onkin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"None"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kupa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Joukkue"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kumpulan pallo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npelaaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"etsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jukkis\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Jukkiksen maalimäärä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maalit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos näin tehdään, ohjelma päättyy virheeseen:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"text","value":"Traceback (most recent call last):\nFile \""},{"type":"element","tagName":"stdin","properties":{},"children":[{"type":"text","value":"\", line 1, in "},{"type":"element","tagName":"module","properties":{},"children":[{"type":"text","value":"\nAttributeError: 'NoneType' object has no attribute 'maalit'"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"None"}]},{"type":"text","value":"-arvojen varalta onkin syytä tehdä tarkistus, ennen kuin riskialtista koodia kutsutaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kupa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Joukkue"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kumpulan pallo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npelaaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"etsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jukkis\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" pelaaja "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"is"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"None"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Jukkiksen maalimäärä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"p"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maalit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Jukkis ei pelaa Kumpulan pallossa :(\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jukkis ei pelaa Kumpulan pallossa :("}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Huoneen lyhin","tmcname":"osa09-08_huoneen_lyhin"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on valmiina luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"text","value":". Henkilöllä on nimi ja pituus. Toteutetaan tässä tehtävässä luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Huone"}]},{"type":"text","value":", jonne voi lisätä henkilöitä ja josta voi hakea ja poistaa lyhimmän henkilön."}]},{"type":"element","tagName":"h2","properties":{"id":"huone","style":"position:relative;"},"children":[{"type":"text","value":"Huone"},{"type":"element","tagName":"a","properties":{"href":"#huone","ariaLabel":"huone permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luo luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Huone"}]},{"type":"text","value":", jonka sisällä on lista henkilöitä ja jolla on seuraavat metodit:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa(henkilo: Henkilo)"}]},{"type":"text","value":" lisää huoneeseen parametrina annetun henkilön."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"on_tyhja()"}]},{"type":"text","value":" - palauttaa arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":", joka kertoo, onko huone tyhjä."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta_tiedot()"}]},{"type":"text","value":" tulostaa huoneessa olevat henkilöt"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"huone "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Huone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Huone tyhjä?\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" huone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"on_tyhja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lea\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"183"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kenya\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"182"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Auli\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"186"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"172"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Terhi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"185"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Huone tyhjä?\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" huone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"on_tyhja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_tiedot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huone tyhjä? True\nHuone tyhjä? False\nHuoneessa 5 henkilöä, yhteispituus 908 cm\nLea (183 cm)\nKenya (182 cm)\nAuli (186 cm)\nNina (172 cm)\nTerhi (185 cm)"}]}]},{"type":"element","tagName":"h2","properties":{"id":"lyhin-henkilo","style":"position:relative;"},"children":[{"type":"text","value":"Lyhin henkilö"},{"type":"element","tagName":"a","properties":{"href":"#lyhin-henkilo","ariaLabel":"lyhin henkilo permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisää luokalle "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Huone"}]},{"type":"text","value":" metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lyhin()"}]},{"type":"text","value":", joka palauttaa huoneeseen lisätyistä henkilöistä lyhimmän. Mikäli huone on tyhjä, metodi palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"None"}]},{"type":"text","value":"-viitteen. Metodin ei tule poistaa henkilöä huoneesta."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"huone "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Huone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Huone tyhjä?\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" huone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"on_tyhja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lyhin:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" huone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lyhin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lea\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"183"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kenya\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"182"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"172"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Auli\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"186"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Huone tyhjä?\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" huone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"on_tyhja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lyhin:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" huone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lyhin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_tiedot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huone tyhjä? True\nLyhin: None"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huone tyhjä? False\nLyhin: Nina"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huoneessa 4 henkilöä, yhteispituus 723 cm\nLea (183 cm)\nKenya (182 cm)\nNina (172 cm)\nAuli (186 cm)"}]}]},{"type":"element","tagName":"h2","properties":{"id":"huoneesta-ottaminen","style":"position:relative;"},"children":[{"type":"text","value":"Huoneesta ottaminen"},{"type":"element","tagName":"a","properties":{"href":"#huoneesta-ottaminen","ariaLabel":"huoneesta ottaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisää luokalle "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Huone"}]},{"type":"text","value":" metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"poista_lyhin()"}]},{"type":"text","value":", joka poistaa ja palauttaa huoneesta lyhimmän henkilön. Mikäli huone on tyhjä, metodi palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"None"}]},{"type":"text","value":"-viitteen."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"huone "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Huone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lea\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"183"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kenya\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"182"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"172"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Auli\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"186"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_tiedot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npoistettu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" huone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"poista_lyhin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Otettiin huoneesta "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"poistettu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_tiedot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huoneessa 4 henkilöä, yhteispituus 723 cm\nLea (183 cm)\nKenya (182 cm)\nNina (172 cm)\nAuli (186 cm)"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Otettiin huoneesta Nina"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huoneessa 3 henkilöä, yhteispituus 551 cm\nLea (183 cm)\nKenya (182 cm)\nAuli (186 cm)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vihje"}]},{"type":"text","value":": "},{"type":"element","tagName":"a","properties":{"href":"/osa-4/3-listat#alkioiden-lisaaminen-ja-poistaminen"},"children":[{"type":"text","value":"osassa 4"}]},{"type":"text","value":" kerrottiin, miten alkion poistaminen listalta onnistuu."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vihje2"}]},{"type":"text","value":": muista, että metodissa on mahdollista kutsua saman olion toista metodia. Eli seuraava koodi toimii:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Huone"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lyhin"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# koodi"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"poista_lyhin"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n lyhin_henkilo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lyhin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]}]}]}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat tallentaa olioita toisten olioiden sisään
  • \n
  • Tiedät, mitä tarkoittaa None
  • \n

Aikaisemmin nähtiin esimerkkejä luokista, joissa attribuutteina oli käytetty esimerkiksi listoja. Samalla tavalla myös omista luokista luotuja olioita voi käyttää toisten olioiden attribuutteina. Seuraavissa esimerkeissä on määritelty luokat Kurssi, Opiskelija ja Opintosuoritus. Opintosuorituksessa hyödynnetään kahta ensimmäistä luokkaa. Luokkien sisäinen toteutus on lyhyt, jotta esimerkki toisi esille oleellisen.

Esimerkissä jokainen luokka on kirjoitettu omaan tiedostoonsa.

Esitellään aluksi luokka Kurssi, joka on määritelty tiedostossa kurssi.py:

class Kurssi:\n    def __init__(self, nimi: str, koodi: str, opintopisteet: int):\n        self.nimi = nimi\n        self.koodi = koodi\n        self.opintopisteet = opintopisteet

Luokka Opiskelija mallintaa yhtä opiskelijaa. Luokka on määritelty tiedostossa opiskelija.py:

class Opiskelija:\n    def __init__(self, nimi: str, opiskelijanumero: str, opintopisteet: int):\n        self.nimi = nimi\n        self.opiskelijanumero = opiskelijanumero\n        self.opintopisteet = opintopisteet

Luokka Opintosuoritus hyödyntää luokkia Kurssi ja Opiskelija suorituksen tallentamiseen. Huomaa, että luokat tuodaan mukaan import-lauseella:

from kurssi import Kurssi\nfrom opiskelija import Opiskelija\n\nclass Opintosuoritus:\n    def __init__(self, opiskelija: Opiskelija, kurssi: Kurssi, arvosana: int):\n        self.opiskelija = opiskelija\n        self.kurssi = kurssi\n        self.arvosana = arvosana

Esimerkki opintosuoritusten lisäämisestä listaan:

from opintosuoritus import Opintosuoritus\nfrom kurssi import Kurssi\nfrom opiskelija import Opiskelija\n\n# Luodaan lista opiskelijoista\nopiskelijat = []\nopiskelijat.append(Opiskelija(\"Olli\", \"1234\", 10))\nopiskelijat.append(Opiskelija(\"Pekka\", \"3210\", 23))\nopiskelijat.append(Opiskelija(\"Leena\", \"9999\", 43))\nopiskelijat.append(Opiskelija(\"Tiina\", \"3333\", 8))\n\n# Kurssi Ohjelmoinnin perusteet\nohpe = Kurssi(\"Ohjelmoinnin perusteet\", \"ohpe1\", 5)\n\n# Annetaan suoritukset kaikille opiskelijoille, kaikille arvosanaksi 3\nsuoritukset = []\nfor opiskelija in opiskelijat:\n    suoritukset.append(Opintosuoritus(opiskelija, ohpe, 3))\n\n# Tulostetaan kaikista suorituksista opiskelijan nimi\nfor suoritus in suoritukset:\n    print(suoritus.opiskelija.nimi)

Olli\nPekka\nLeena\nTiina

Tarkastellaan lähemmin riviä print(suoritus.opiskelija.nimi):

    \n
  • suoritus on luokan Opintosuoritus mukainen olio
  • \n
  • Niinpä muuttuja opiskelija viittaa suoritukseen tallennettuun Opiskelija-olioon
  • \n
  • Opiskelija-luokan muuttuja nimi sisältää opiskelijan nimen
  • \n

Milloin import tarvitaan?

Edellisessä esimerkissä käytetään muutamassa kohdassa import:ia:

from opintosuoritus import Opintosuoritus\nfrom kurssi import Kurssi\nfrom opiskelija import Opiskelija\n\n# koodi

Importia tarvitaan vain jos tiedostossa käytetään jossain muualla määriteltyä koodia. Näin on esimerkiksi kun käytetään jotain Pythonin valmista kalustoa, esim. matemaattisia operaatiota tarjoavaa moduulia math:

import math\n\nx = 10\nprint(f\"luvun {x} {neliöjuuri math.sqrt(x)}\")

Edellisessä tehtävässä oletettiin, että luokat on määritelty omissa tiedostoissaan. Esimerkki toteaa mm.\nEsitellään aluksi luokka Kurssi, joka on määritelty tiedostossa kurssi.py\nja importin tarve siis johtuu tästä.

Jos kaikki koodi sijoitetaan samaan tiedostoon, kuten kaikissa kurssin ohjelmointitehtävissä ohjeistetaan, et tarvitse import:ia luomiesi luokkien käytöön.

Jos siis päädyt kirjottamaan kurssilla seuraavanlaista koodia

from henkilo import Henkilo\n\n# koodi

ratkaisusi on todennäköisesti väärä! Lisää importin käytöstä osan 7 materiaalissa.

Tehtäväpohjassa tulee kaksi luokkaa, Henkilo ja Lemmikki. Jokaisella henkilöllä on yksi lemmikki. Täydennä luokan Henkilo metodia __str__ siten, että metodi palauttaa merkkijonon, joka kertoo henkilön nimen lisäksi lemmikin nimen ja rodun alta löytyvät esimerkkitulosteen mukaisesti.

Huomaa, että metodin palauttaman merkkijonon pitää olla täsmälleen samanlainen kuin esimerkkitulosteessa esitetty!

hulda = Lemmikki(\"Hulda\", \"sekarotuinen koira\")\nleevi = Henkilo(\"Leevi\", hulda)\n\nprint(leevi)

Leevi, kaverina Hulda, joka on sekarotuinen koira

Huom: koska kaikki koodi tulee samaan tiedostoon, et tarvitse tehtävässä import:ia ollenkaan!

Olion attribuuttina lista olioita

Äskeisissä esimerkeissä oliolla oli attribuuttina yksittäinen toisen luokan olio, esim. henkilöllä attribuuttina lemmikki ja opintosuorituksella attribuuttina kurssi.

Olio-ohjelmoinnissa törmätään kutenkin usein tilanteeseen, jossa oliolla on attribuuttina joukko toisen luokan olioita. Eräs tälläinen tilanne kuvaa joukkueen ja sen pelaajien välistä yhteyttä:

class Pelaaja:\n    def __init__(self, nimi: str, maalit: int):\n        self.nimi = nimi\n        self.maalit = maalit\n\n    def __str__(self):\n        return f\"{self.nimi} (maaleja {self.maalit})\"\n\nclass Joukkue:\n    def __init__(self, nimi: str):\n        self.nimi = nimi\n        self.pelaajat = []\n\n    def lisaa_pelaaja(self, pelaaja: Pelaaja):\n        self.pelaajat.append(pelaaja)\n\n    def yhteenveto(self):\n        maalit = []\n        for pelaaja in self.pelaajat:\n            maalit.append(pelaaja.maalit)\n        print(\"Joukkue\", self.nimi)\n        print(\"Pelaajia\", len(self.pelaajat))\n        print(\"Pelaajien maalimäärät\", maalit)

Käyttöesimerkki:

kupa = Joukkue(\"Kumpulan pallo\")\nkupa.lisaa_pelaaja(Pelaaja(\"Erkki\", 10))\nkupa.lisaa_pelaaja(Pelaaja(\"Emilia\", 22))\nkupa.lisaa_pelaaja(Pelaaja(\"Antti\", 1))\nkupa.yhteenveto()

Joukkue Kumpulan pallo\nPelaajia 3\nPelaajien maalimäärät [10, 22, 1]

Tässä tehtävässä harjoitellaan lahjojen pakkaamista. Tehdään luokat Lahja ja Pakkaus. Lahjalla on nimi ja paino, ja pakkaus sisältää lahjoja.

Lahja-luokka

Tee luokka Lahja, josta muodostetut oliot kuvaavat erilaisia lahjoja. Tallennettavat tiedot ovat tavaran nimi ja paino (kg). Luokan olioiden tulee toimia seuraavasti:

kirja = Lahja(\"Aapiskukko\", 2)\n\nprint(\"Lahjan nimi:\", kirja.nimi)\nprint(\"Lahjan paino:\" ,kirja.paino)\nprint(\"Lahja:\", kirja)

Ohjelman tulostuksen tulisi olla seuraava:

Lahjan nimi: Aapiskukko\nLahjan paino: 2\nLahja: Aapiskukko (2 kg)

Pakkaus-luokka

Tee luokka Pakkaus, johon voi lisätä lahjoja ja joka pitää kirjaa pakkauksessa olevien lahjojen yhteispainosta. Luokassa tulee olla seuraavat metodit

    \n
  • lisaa_lahja(self, lahja: Lahja), joka lisää parametrina annettavan lahjan pakkaukseen. Metodi ei palauta mitään arvoa.
  • \n
  • yhteispaino(self), joka palauttaa pakkauksessa olevien lahjojen yhteispainon.
  • \n

Seuraavassa on luokan käyttöesimerkki:

kirja = Lahja(\"Aapiskukko\", 2)\n\npakkaus = Pakkaus()\npakkaus.lisaa_lahja(kirja)\nprint(pakkaus.yhteispaino())\n\ncd_levy = Lahja(\"Pink Floyd: Dark side of the moon\", 1)\npakkaus.lisaa_lahja(cd_levy)\nprint(pakkaus.yhteispaino())

2\n3

None eli viite ei mihinkään

Pythonissa muuttujat viittaavat aina johonkin olioon. On kuitenkin tilanteita, joissa haluaisimme määrittää arvon, joka ei viittaa mihinkään. Arvoa None käytetään esittämään tyhjää viittausta.

Jos esimerkiksi luokkaan joukkue lisättäisiin metodi, joka etsii joukkueen pelaajan, saattaisi olla luontevaa esittää paluuarvolla None tilanne, jossa pelaajaa ei löydy:

class Pelaaja:\n    def __init__(self, nimi: str, maalit: int):\n        self.nimi = nimi\n        self.maalit = maalit\n\n    def __str__(self):\n        return f\"{self.nimi} (maaleja {self.maalit})\"\n\nclass Joukkue:\n    def __init__(self, nimi: str):\n        self.nimi = nimi\n        self.pelaajat = []\n\n    def lisaa_pelaaja(self, pelaaja: Pelaaja):\n        self.pelaajat.append(pelaaja)\n\n    def etsi(self, nimi: str):\n        for pelaaja in self.pelaajat:\n            if pelaaja.nimi == nimi:\n                return pelaaja\n        return None

Käyttöesimerkki:

kupa = Joukkue(\"Kumpulan pallo\")\nkupa.lisaa_pelaaja(Pelaaja(\"Erkki\", 10))\nkupa.lisaa_pelaaja(Pelaaja(\"Emilia\", 22))\nkupa.lisaa_pelaaja(Pelaaja(\"Antti\", 1))\n\npelaaja1 = kupa.etsi(\"Antti\")\nprint(pelaaja1)\npelaaja2 = kupa.etsi(\"Jukkis\")\nprint(pelaaja2)

Antti (maaleja 1)\nNone

None-arvojen kanssa pitää olla tarkkana. On hyvin tyypillistä, että ohjelmassa kutsutaan jotain metodia oliolle (tai pyydetään attribuutin arvoa oliolta), joka onkin None:

kupa = Joukkue(\"Kumpulan pallo\")\nkupa.lisaa_pelaaja(Pelaaja(\"Erkki\", 10))\n\npelaaja = kupa.etsi(\"Jukkis\")\nprint(f\"Jukkiksen maalimäärä {pelaaja.maalit}\")

Jos näin tehdään, ohjelma päättyy virheeseen:

Traceback (most recent call last):\nFile \"\", line 1, in \nAttributeError: 'NoneType' object has no attribute 'maalit'

None-arvojen varalta onkin syytä tehdä tarkistus, ennen kuin riskialtista koodia kutsutaan:

kupa = Joukkue(\"Kumpulan pallo\")\nkupa.lisaa_pelaaja(Pelaaja(\"Erkki\", 10))\n\npelaaja = kupa.etsi(\"Jukkis\")\nif pelaaja is not None:\n    print(f\"Jukkiksen maalimäärä {p.maalit}\")\nelse:\n    print(f\"Jukkis ei pelaa Kumpulan pallossa :(\")

Jukkis ei pelaa Kumpulan pallossa :(

Tehtäväpohjassa on valmiina luokka Henkilo. Henkilöllä on nimi ja pituus. Toteutetaan tässä tehtävässä luokka Huone, jonne voi lisätä henkilöitä ja josta voi hakea ja poistaa lyhimmän henkilön.

Huone

Luo luokka Huone, jonka sisällä on lista henkilöitä ja jolla on seuraavat metodit:

    \n
  • lisaa(henkilo: Henkilo) lisää huoneeseen parametrina annetun henkilön.
  • \n
  • on_tyhja() - palauttaa arvon True tai False, joka kertoo, onko huone tyhjä.
  • \n
  • tulosta_tiedot() tulostaa huoneessa olevat henkilöt
  • \n

Seuraavassa käyttöesimerkki:

huone = Huone()\nprint(\"Huone tyhjä?\", huone.on_tyhja())\nhuone.lisaa(Henkilo(\"Lea\", 183))\nhuone.lisaa(Henkilo(\"Kenya\", 182))\nhuone.lisaa(Henkilo(\"Auli\", 186))\nhuone.lisaa(Henkilo(\"Nina\", 172))\nhuone.lisaa(Henkilo(\"Terhi\", 185))\nprint(\"Huone tyhjä?\", huone.on_tyhja())\nhuone.tulosta_tiedot()

Huone tyhjä? True\nHuone tyhjä? False\nHuoneessa 5 henkilöä, yhteispituus 908 cm\nLea (183 cm)\nKenya (182 cm)\nAuli (186 cm)\nNina (172 cm)\nTerhi (185 cm)

Lyhin henkilö

Lisää luokalle Huone metodi lyhin(), joka palauttaa huoneeseen lisätyistä henkilöistä lyhimmän. Mikäli huone on tyhjä, metodi palauttaa None-viitteen. Metodin ei tule poistaa henkilöä huoneesta.

huone = Huone()\n\nprint(\"Huone tyhjä?\", huone.on_tyhja())\nprint(\"Lyhin:\", huone.lyhin())\n\nhuone.lisaa(Henkilo(\"Lea\", 183))\nhuone.lisaa(Henkilo(\"Kenya\", 182))\nhuone.lisaa(Henkilo(\"Nina\", 172))\nhuone.lisaa(Henkilo(\"Auli\", 186))\n\nprint()\n\nprint(\"Huone tyhjä?\", huone.on_tyhja())\nprint(\"Lyhin:\", huone.lyhin())\n\nprint()\n\nhuone.tulosta_tiedot()

Huone tyhjä? True\nLyhin: None

Huone tyhjä? False\nLyhin: Nina

Huoneessa 4 henkilöä, yhteispituus 723 cm\nLea (183 cm)\nKenya (182 cm)\nNina (172 cm)\nAuli (186 cm)

Huoneesta ottaminen

Lisää luokalle Huone metodi poista_lyhin(), joka poistaa ja palauttaa huoneesta lyhimmän henkilön. Mikäli huone on tyhjä, metodi palauttaa None-viitteen.

huone = Huone()\n\nhuone.lisaa(Henkilo(\"Lea\", 183))\nhuone.lisaa(Henkilo(\"Kenya\", 182))\nhuone.lisaa(Henkilo(\"Nina\", 172))\nhuone.lisaa(Henkilo(\"Auli\", 186))\nhuone.tulosta_tiedot()\n\nprint()\n\npoistettu = huone.poista_lyhin()\nprint(f\"Otettiin huoneesta {poistettu.nimi}\")\n\nprint()\n\nhuone.tulosta_tiedot()

Huoneessa 4 henkilöä, yhteispituus 723 cm\nLea (183 cm)\nKenya (182 cm)\nNina (172 cm)\nAuli (186 cm)

Otettiin huoneesta Nina

Huoneessa 3 henkilöä, yhteispituus 551 cm\nLea (183 cm)\nKenya (182 cm)\nAuli (186 cm)

Vihje: osassa 4 kerrottiin, miten alkion poistaminen listalta onnistuu.

Vihje2: muista, että metodissa on mahdollista kutsua saman olion toista metodia. Eli seuraava koodi toimii:

class Huone:\n    # ...\n    def lyhin(self):\n        # koodi\n\n    def poista_lyhin(self):\n        lyhin_henkilo = self.lyhin()\n        # ...
","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-9/2-oliot-attribuuttina.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat tallentaa olioita toisten olioiden sisään"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä tarkoittaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"None"}]}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aikaisemmin nähtiin esimerkkejä luokista, joissa attribuutteina oli käytetty esimerkiksi listoja. Samalla tavalla myös omista luokista luotuja olioita voi käyttää toisten olioiden attribuutteina. Seuraavissa esimerkeissä on määritelty luokat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kurssi"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Opintosuoritus"}]},{"type":"text","value":". Opintosuorituksessa hyödynnetään kahta ensimmäistä luokkaa. Luokkien sisäinen toteutus on lyhyt, jotta esimerkki toisi esille oleellisen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkissä jokainen luokka on kirjoitettu omaan tiedostoonsa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esitellään aluksi luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kurssi"}]},{"type":"text","value":", joka on määritelty tiedostossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kurssi.py"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Kurssi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" koodi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"koodi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" koodi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opintopisteet"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"text","value":" mallintaa yhtä opiskelijaa. Luokka on määritelty tiedostossa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"opiskelija.py"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opiskelijanumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opiskelijanumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opiskelijanumero\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opintopisteet"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Opintosuoritus"}]},{"type":"text","value":" hyödyntää luokkia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kurssi"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"text","value":" suorituksen tallentamiseen. Huomaa, että luokat tuodaan mukaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":"-lauseella:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" kurssi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" Kurssi\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" opiskelija "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" Opiskelija\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opintosuoritus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kurssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Kurssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arvosana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opiskelija "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opiskelija\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kurssi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kurssi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"arvosana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" arvosana"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki opintosuoritusten lisäämisestä listaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" opintosuoritus "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" Opintosuoritus\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" kurssi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" Kurssi\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" opiskelija "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" Opiskelija\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luodaan lista opiskelijoista"}]},{"type":"text","value":"\nopiskelijat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nopiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olli\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1234\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nopiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"3210\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"23"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nopiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Leena\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"9999\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"43"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nopiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tiina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"3333\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"8"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kurssi Ohjelmoinnin perusteet"}]},{"type":"text","value":"\nohpe "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Kurssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohjelmoinnin perusteet\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ohpe1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Annetaan suoritukset kaikille opiskelijoille, kaikille arvosanaksi 3"}]},{"type":"text","value":"\nsuoritukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" opiskelija "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" opiskelijat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n suoritukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Opintosuoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" ohpe"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tulostetaan kaikista suorituksista opiskelijan nimi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" suoritus "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" suoritukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olli\nPekka\nLeena\nTiina"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan lähemmin riviä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"print(suoritus.opiskelija.nimi)"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suoritus"}]},{"type":"text","value":" on luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Opintosuoritus"}]},{"type":"text","value":" mukainen olio"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Niinpä muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"opiskelija"}]},{"type":"text","value":" viittaa suoritukseen tallennettuun "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"text","value":"-olioon"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"text","value":"-luokan muuttuja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":" sisältää opiskelijan nimen"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"h2","properties":{"id":"milloin-import-tarvitaan","style":"position:relative;"},"children":[{"type":"text","value":"Milloin import tarvitaan?"},{"type":"element","tagName":"a","properties":{"href":"#milloin-import-tarvitaan","ariaLabel":"milloin import tarvitaan permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellisessä esimerkissä käytetään muutamassa kohdassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":":ia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" opintosuoritus "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" Opintosuoritus\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" kurssi "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" Kurssi\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" opiskelija "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" Opiskelija\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# koodi"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Importia tarvitaan vain jos tiedostossa käytetään jossain muualla määriteltyä koodia. Näin on esimerkiksi kun käytetään jotain Pythonin valmista kalustoa, esim. matemaattisia operaatiota tarjoavaa moduulia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"math"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" math\n\nx "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"luvun "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"neliöjuuri math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sqrt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellisessä tehtävässä oletettiin, että luokat on määritelty omissa tiedostoissaan. Esimerkki toteaa mm.\n"},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Esitellään aluksi luokka Kurssi, joka on määritelty tiedostossa kurssi.py"}]},{"type":"text","value":"\nja importin tarve siis johtuu tästä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos kaikki koodi sijoitetaan samaan tiedostoon, kuten kaikissa kurssin ohjelmointitehtävissä ohjeistetaan, "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"et tarvitse"}]},{"type":"text","value":" "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":":ia luomiesi luokkien käytöön."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos siis päädyt kirjottamaan kurssilla seuraavanlaista koodia"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" henkilo "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" Henkilo\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# koodi"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"ratkaisusi on todennäköisesti väärä! Lisää importin käytöstä "},{"type":"element","tagName":"a","properties":{"href":"/osa-7/1-moduulit/"},"children":[{"type":"text","value":"osan 7"}]},{"type":"text","value":" materiaalissa."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Lemmikit","tmcname":"osa09-06_lemmikki"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa tulee kaksi luokkaa, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lemmikki"}]},{"type":"text","value":". Jokaisella henkilöllä on yksi lemmikki. Täydennä luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"text","value":" metodia "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":" siten, että metodi palauttaa merkkijonon, joka kertoo henkilön nimen lisäksi lemmikin nimen ja rodun alta löytyvät esimerkkitulosteen mukaisesti."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että metodin palauttaman merkkijonon pitää olla "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"täsmälleen samanlainen kuin esimerkkitulosteessa esitetty"}]},{"type":"text","value":"!"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"hulda "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Lemmikki"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Hulda\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"sekarotuinen koira\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nleevi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Leevi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" hulda"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"leevi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Leevi, kaverina Hulda, joka on sekarotuinen koira"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huom:"}]},{"type":"text","value":" koska kaikki koodi tulee samaan tiedostoon, et tarvitse tehtävässä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":":ia ollenkaan!"}]}]},{"type":"element","tagName":"h2","properties":{"id":"olion-attribuuttina-lista-olioita","style":"position:relative;"},"children":[{"type":"text","value":"Olion attribuuttina lista olioita"},{"type":"element","tagName":"a","properties":{"href":"#olion-attribuuttina-lista-olioita","ariaLabel":"olion attribuuttina lista olioita permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Äskeisissä esimerkeissä oliolla oli attribuuttina yksittäinen toisen luokan olio, esim. henkilöllä attribuuttina lemmikki ja opintosuorituksella attribuuttina kurssi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olio-ohjelmoinnissa törmätään kutenkin usein tilanteeseen, jossa oliolla on attribuuttina "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"joukko"}]},{"type":"text","value":" toisen luokan olioita. Eräs tälläinen tilanne kuvaa joukkueen ja sen pelaajien välistä yhteyttä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pelaaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" maalit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maalit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" maalit\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" (maaleja "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maalit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Joukkue"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaajat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_pelaaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaajat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"yhteenveto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n maalit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" pelaaja "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaajat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n maalit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maalit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Joukkue\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pelaajia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaajat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pelaajien maalimäärät\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" maalit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kupa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Joukkue"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kumpulan pallo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"22"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yhteenveto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Joukkue Kumpulan pallo\nPelaajia 3\nPelaajien maalimäärät [10, 22, 1]"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Lahjapakkaus","tmcname":"osa09-07_lahjapakkaus"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtävässä harjoitellaan lahjojen pakkaamista. Tehdään luokat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lahja"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pakkaus"}]},{"type":"text","value":". Lahjalla on nimi ja paino, ja pakkaus sisältää lahjoja."}]},{"type":"element","tagName":"h2","properties":{"id":"lahja-luokka","style":"position:relative;"},"children":[{"type":"text","value":"Lahja-luokka"},{"type":"element","tagName":"a","properties":{"href":"#lahja-luokka","ariaLabel":"lahja luokka permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lahja"}]},{"type":"text","value":", josta muodostetut oliot kuvaavat erilaisia lahjoja. Tallennettavat tiedot ovat tavaran nimi ja paino (kg). Luokan olioiden tulee toimia seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Lahja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aapiskukko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lahjan nimi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lahjan paino:\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paino"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lahja:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostuksen tulisi olla seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lahjan nimi: Aapiskukko\nLahjan paino: 2\nLahja: Aapiskukko (2 kg)"}]}]},{"type":"element","tagName":"h2","properties":{"id":"pakkaus-luokka","style":"position:relative;"},"children":[{"type":"text","value":"Pakkaus-luokka"},{"type":"element","tagName":"a","properties":{"href":"#pakkaus-luokka","ariaLabel":"pakkaus luokka permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pakkaus"}]},{"type":"text","value":", johon voi lisätä lahjoja ja joka pitää kirjaa pakkauksessa olevien lahjojen yhteispainosta. Luokassa tulee olla seuraavat metodit"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_lahja(self, lahja: Lahja)"}]},{"type":"text","value":", joka lisää parametrina annettavan lahjan pakkaukseen. Metodi ei palauta mitään arvoa."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"yhteispaino(self)"}]},{"type":"text","value":", joka palauttaa pakkauksessa olevien lahjojen yhteispainon."}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on luokan käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Lahja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aapiskukko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npakkaus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pakkaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npakkaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_lahja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pakkaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yhteispaino"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ncd_levy "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Lahja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pink Floyd: Dark side of the moon\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npakkaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_lahja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"cd_levy"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pakkaus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yhteispaino"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"2\n3"}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"none-eli-viite-ei-mihinkaan","style":"position:relative;"},"children":[{"type":"text","value":"None eli viite ei mihinkään"},{"type":"element","tagName":"a","properties":{"href":"#none-eli-viite-ei-mihinkaan","ariaLabel":"none eli viite ei mihinkaan permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa muuttujat viittaavat aina johonkin olioon. On kuitenkin tilanteita, joissa haluaisimme määrittää arvon, joka ei viittaa mihinkään. Arvoa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"None"}]},{"type":"text","value":" käytetään esittämään tyhjää viittausta."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos esimerkiksi luokkaan joukkue lisättäisiin metodi, joka etsii joukkueen pelaajan, saattaisi olla luontevaa esittää paluuarvolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"None"}]},{"type":"text","value":" tilanne, jossa pelaajaa ei löydy:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pelaaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" maalit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maalit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" maalit\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" (maaleja "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maalit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Joukkue"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaajat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_pelaaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaajat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"etsi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" pelaaja "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelaajat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" pelaaja\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"None"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kupa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Joukkue"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kumpulan pallo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Emilia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"22"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npelaaja1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"etsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Antti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pelaaja1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npelaaja2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"etsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jukkis\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pelaaja2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Antti (maaleja 1)\nNone"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"None"}]},{"type":"text","value":"-arvojen kanssa pitää olla tarkkana. On hyvin tyypillistä, että ohjelmassa kutsutaan jotain metodia oliolle (tai pyydetään attribuutin arvoa oliolta), joka onkin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"None"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kupa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Joukkue"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kumpulan pallo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npelaaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"etsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jukkis\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Jukkiksen maalimäärä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maalit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos näin tehdään, ohjelma päättyy virheeseen:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"text","value":"Traceback (most recent call last):\nFile \""},{"type":"element","tagName":"stdin","properties":{},"children":[{"type":"text","value":"\", line 1, in "},{"type":"element","tagName":"module","properties":{},"children":[{"type":"text","value":"\nAttributeError: 'NoneType' object has no attribute 'maalit'"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"None"}]},{"type":"text","value":"-arvojen varalta onkin syytä tehdä tarkistus, ennen kuin riskialtista koodia kutsutaan:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kupa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Joukkue"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kumpulan pallo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Erkki\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npelaaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" kupa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"etsi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Jukkis\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" pelaaja "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"is"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"None"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Jukkiksen maalimäärä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"p"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maalit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Jukkis ei pelaa Kumpulan pallossa :(\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jukkis ei pelaa Kumpulan pallossa :("}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Huoneen lyhin","tmcname":"osa09-08_huoneen_lyhin"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on valmiina luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Henkilo"}]},{"type":"text","value":". Henkilöllä on nimi ja pituus. Toteutetaan tässä tehtävässä luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Huone"}]},{"type":"text","value":", jonne voi lisätä henkilöitä ja josta voi hakea ja poistaa lyhimmän henkilön."}]},{"type":"element","tagName":"h2","properties":{"id":"huone","style":"position:relative;"},"children":[{"type":"text","value":"Huone"},{"type":"element","tagName":"a","properties":{"href":"#huone","ariaLabel":"huone permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luo luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Huone"}]},{"type":"text","value":", jonka sisällä on lista henkilöitä ja jolla on seuraavat metodit:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa(henkilo: Henkilo)"}]},{"type":"text","value":" lisää huoneeseen parametrina annetun henkilön."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"on_tyhja()"}]},{"type":"text","value":" - palauttaa arvon "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"True"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":", joka kertoo, onko huone tyhjä."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta_tiedot()"}]},{"type":"text","value":" tulostaa huoneessa olevat henkilöt"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"huone "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Huone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Huone tyhjä?\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" huone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"on_tyhja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lea\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"183"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kenya\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"182"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Auli\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"186"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"172"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Terhi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"185"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Huone tyhjä?\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" huone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"on_tyhja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_tiedot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huone tyhjä? True\nHuone tyhjä? False\nHuoneessa 5 henkilöä, yhteispituus 908 cm\nLea (183 cm)\nKenya (182 cm)\nAuli (186 cm)\nNina (172 cm)\nTerhi (185 cm)"}]}]},{"type":"element","tagName":"h2","properties":{"id":"lyhin-henkilo","style":"position:relative;"},"children":[{"type":"text","value":"Lyhin henkilö"},{"type":"element","tagName":"a","properties":{"href":"#lyhin-henkilo","ariaLabel":"lyhin henkilo permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisää luokalle "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Huone"}]},{"type":"text","value":" metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lyhin()"}]},{"type":"text","value":", joka palauttaa huoneeseen lisätyistä henkilöistä lyhimmän. Mikäli huone on tyhjä, metodi palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"None"}]},{"type":"text","value":"-viitteen. Metodin ei tule poistaa henkilöä huoneesta."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"huone "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Huone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Huone tyhjä?\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" huone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"on_tyhja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lyhin:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" huone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lyhin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lea\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"183"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kenya\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"182"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"172"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Auli\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"186"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Huone tyhjä?\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" huone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"on_tyhja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lyhin:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" huone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lyhin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_tiedot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huone tyhjä? True\nLyhin: None"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huone tyhjä? False\nLyhin: Nina"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huoneessa 4 henkilöä, yhteispituus 723 cm\nLea (183 cm)\nKenya (182 cm)\nNina (172 cm)\nAuli (186 cm)"}]}]},{"type":"element","tagName":"h2","properties":{"id":"huoneesta-ottaminen","style":"position:relative;"},"children":[{"type":"text","value":"Huoneesta ottaminen"},{"type":"element","tagName":"a","properties":{"href":"#huoneesta-ottaminen","ariaLabel":"huoneesta ottaminen permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisää luokalle "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Huone"}]},{"type":"text","value":" metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"poista_lyhin()"}]},{"type":"text","value":", joka poistaa ja palauttaa huoneesta lyhimmän henkilön. Mikäli huone on tyhjä, metodi palauttaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"None"}]},{"type":"text","value":"-viitteen."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"huone "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Huone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Lea\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"183"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kenya\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"182"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nina\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"172"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Henkilo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Auli\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"186"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_tiedot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npoistettu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" huone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"poista_lyhin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Otettiin huoneesta "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"poistettu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nhuone"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_tiedot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huoneessa 4 henkilöä, yhteispituus 723 cm\nLea (183 cm)\nKenya (182 cm)\nNina (172 cm)\nAuli (186 cm)"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Otettiin huoneesta Nina"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huoneessa 3 henkilöä, yhteispituus 551 cm\nLea (183 cm)\nKenya (182 cm)\nAuli (186 cm)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vihje"}]},{"type":"text","value":": "},{"type":"element","tagName":"a","properties":{"href":"/osa-4/3-listat#alkioiden-lisaaminen-ja-poistaminen"},"children":[{"type":"text","value":"osassa 4"}]},{"type":"text","value":" kerrottiin, miten alkion poistaminen listalta onnistuu."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Vihje2"}]},{"type":"text","value":": muista, että metodissa on mahdollista kutsua saman olion toista metodia. Eli seuraava koodi toimii:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Huone"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lyhin"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# koodi"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"poista_lyhin"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n lyhin_henkilo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lyhin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# ..."}]}]}]}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Osaat tallentaa olioita toisten olioiden sisään
  • \n
  • Tiedät, mitä tarkoittaa None
  • \n

Aikaisemmin nähtiin esimerkkejä luokista, joissa attribuutteina oli käytetty esimerkiksi listoja. Samalla tavalla myös omista luokista luotuja olioita voi käyttää toisten olioiden attribuutteina. Seuraavissa esimerkeissä on määritelty luokat Kurssi, Opiskelija ja Opintosuoritus. Opintosuorituksessa hyödynnetään kahta ensimmäistä luokkaa. Luokkien sisäinen toteutus on lyhyt, jotta esimerkki toisi esille oleellisen.

Esimerkissä jokainen luokka on kirjoitettu omaan tiedostoonsa.

Esitellään aluksi luokka Kurssi, joka on määritelty tiedostossa kurssi.py:

class Kurssi:\n    def __init__(self, nimi: str, koodi: str, opintopisteet: int):\n        self.nimi = nimi\n        self.koodi = koodi\n        self.opintopisteet = opintopisteet

Luokka Opiskelija mallintaa yhtä opiskelijaa. Luokka on määritelty tiedostossa opiskelija.py:

class Opiskelija:\n    def __init__(self, nimi: str, opiskelijanumero: str, opintopisteet: int):\n        self.nimi = nimi\n        self.opiskelijanumero = opiskelijanumero\n        self.opintopisteet = opintopisteet

Luokka Opintosuoritus hyödyntää luokkia Kurssi ja Opiskelija suorituksen tallentamiseen. Huomaa, että luokat tuodaan mukaan import-lauseella:

from kurssi import Kurssi\nfrom opiskelija import Opiskelija\n\nclass Opintosuoritus:\n    def __init__(self, opiskelija: Opiskelija, kurssi: Kurssi, arvosana: int):\n        self.opiskelija = opiskelija\n        self.kurssi = kurssi\n        self.arvosana = arvosana

Esimerkki opintosuoritusten lisäämisestä listaan:

from opintosuoritus import Opintosuoritus\nfrom kurssi import Kurssi\nfrom opiskelija import Opiskelija\n\n# Luodaan lista opiskelijoista\nopiskelijat = []\nopiskelijat.append(Opiskelija(\"Olli\", \"1234\", 10))\nopiskelijat.append(Opiskelija(\"Pekka\", \"3210\", 23))\nopiskelijat.append(Opiskelija(\"Leena\", \"9999\", 43))\nopiskelijat.append(Opiskelija(\"Tiina\", \"3333\", 8))\n\n# Kurssi Ohjelmoinnin perusteet\nohpe = Kurssi(\"Ohjelmoinnin perusteet\", \"ohpe1\", 5)\n\n# Annetaan suoritukset kaikille opiskelijoille, kaikille arvosanaksi 3\nsuoritukset = []\nfor opiskelija in opiskelijat:\n    suoritukset.append(Opintosuoritus(opiskelija, ohpe, 3))\n\n# Tulostetaan kaikista suorituksista opiskelijan nimi\nfor suoritus in suoritukset:\n    print(suoritus.opiskelija.nimi)

Olli\nPekka\nLeena\nTiina

Tarkastellaan lähemmin riviä print(suoritus.opiskelija.nimi):

    \n
  • suoritus on luokan Opintosuoritus mukainen olio
  • \n
  • Niinpä muuttuja opiskelija viittaa suoritukseen tallennettuun Opiskelija-olioon
  • \n
  • Opiskelija-luokan muuttuja nimi sisältää opiskelijan nimen
  • \n

Milloin import tarvitaan?

Edellisessä esimerkissä käytetään muutamassa kohdassa import:ia:

from opintosuoritus import Opintosuoritus\nfrom kurssi import Kurssi\nfrom opiskelija import Opiskelija\n\n# koodi

Importia tarvitaan vain jos tiedostossa käytetään jossain muualla määriteltyä koodia. Näin on esimerkiksi kun käytetään jotain Pythonin valmista kalustoa, esim. matemaattisia operaatiota tarjoavaa moduulia math:

import math\n\nx = 10\nprint(f\"luvun {x} {neliöjuuri math.sqrt(x)}\")

Edellisessä tehtävässä oletettiin, että luokat on määritelty omissa tiedostoissaan. Esimerkki toteaa mm.\nEsitellään aluksi luokka Kurssi, joka on määritelty tiedostossa kurssi.py\nja importin tarve siis johtuu tästä.

Jos kaikki koodi sijoitetaan samaan tiedostoon, kuten kaikissa kurssin ohjelmointitehtävissä ohjeistetaan, et tarvitse import:ia luomiesi luokkien käytöön.

Jos siis päädyt kirjottamaan kurssilla seuraavanlaista koodia

from henkilo import Henkilo\n\n# koodi

ratkaisusi on todennäköisesti väärä! Lisää importin käytöstä osan 7 materiaalissa.

Tehtäväpohjassa tulee kaksi luokkaa, Henkilo ja Lemmikki. Jokaisella henkilöllä on yksi lemmikki. Täydennä luokan Henkilo metodia __str__ siten, että metodi palauttaa merkkijonon, joka kertoo henkilön nimen lisäksi lemmikin nimen ja rodun alta löytyvät esimerkkitulosteen mukaisesti.

Huomaa, että metodin palauttaman merkkijonon pitää olla täsmälleen samanlainen kuin esimerkkitulosteessa esitetty!

hulda = Lemmikki(\"Hulda\", \"sekarotuinen koira\")\nleevi = Henkilo(\"Leevi\", hulda)\n\nprint(leevi)

Leevi, kaverina Hulda, joka on sekarotuinen koira

Huom: koska kaikki koodi tulee samaan tiedostoon, et tarvitse tehtävässä import:ia ollenkaan!

Olion attribuuttina lista olioita

Äskeisissä esimerkeissä oliolla oli attribuuttina yksittäinen toisen luokan olio, esim. henkilöllä attribuuttina lemmikki ja opintosuorituksella attribuuttina kurssi.

Olio-ohjelmoinnissa törmätään kutenkin usein tilanteeseen, jossa oliolla on attribuuttina joukko toisen luokan olioita. Eräs tälläinen tilanne kuvaa joukkueen ja sen pelaajien välistä yhteyttä:

class Pelaaja:\n    def __init__(self, nimi: str, maalit: int):\n        self.nimi = nimi\n        self.maalit = maalit\n\n    def __str__(self):\n        return f\"{self.nimi} (maaleja {self.maalit})\"\n\nclass Joukkue:\n    def __init__(self, nimi: str):\n        self.nimi = nimi\n        self.pelaajat = []\n\n    def lisaa_pelaaja(self, pelaaja: Pelaaja):\n        self.pelaajat.append(pelaaja)\n\n    def yhteenveto(self):\n        maalit = []\n        for pelaaja in self.pelaajat:\n            maalit.append(pelaaja.maalit)\n        print(\"Joukkue\", self.nimi)\n        print(\"Pelaajia\", len(self.pelaajat))\n        print(\"Pelaajien maalimäärät\", maalit)

Käyttöesimerkki:

kupa = Joukkue(\"Kumpulan pallo\")\nkupa.lisaa_pelaaja(Pelaaja(\"Erkki\", 10))\nkupa.lisaa_pelaaja(Pelaaja(\"Emilia\", 22))\nkupa.lisaa_pelaaja(Pelaaja(\"Antti\", 1))\nkupa.yhteenveto()

Joukkue Kumpulan pallo\nPelaajia 3\nPelaajien maalimäärät [10, 22, 1]

Tässä tehtävässä harjoitellaan lahjojen pakkaamista. Tehdään luokat Lahja ja Pakkaus. Lahjalla on nimi ja paino, ja pakkaus sisältää lahjoja.

Lahja-luokka

Tee luokka Lahja, josta muodostetut oliot kuvaavat erilaisia lahjoja. Tallennettavat tiedot ovat tavaran nimi ja paino (kg). Luokan olioiden tulee toimia seuraavasti:

kirja = Lahja(\"Aapiskukko\", 2)\n\nprint(\"Lahjan nimi:\", kirja.nimi)\nprint(\"Lahjan paino:\" ,kirja.paino)\nprint(\"Lahja:\", kirja)

Ohjelman tulostuksen tulisi olla seuraava:

Lahjan nimi: Aapiskukko\nLahjan paino: 2\nLahja: Aapiskukko (2 kg)

Pakkaus-luokka

Tee luokka Pakkaus, johon voi lisätä lahjoja ja joka pitää kirjaa pakkauksessa olevien lahjojen yhteispainosta. Luokassa tulee olla seuraavat metodit

    \n
  • lisaa_lahja(self, lahja: Lahja), joka lisää parametrina annettavan lahjan pakkaukseen. Metodi ei palauta mitään arvoa.
  • \n
  • yhteispaino(self), joka palauttaa pakkauksessa olevien lahjojen yhteispainon.
  • \n

Seuraavassa on luokan käyttöesimerkki:

kirja = Lahja(\"Aapiskukko\", 2)\n\npakkaus = Pakkaus()\npakkaus.lisaa_lahja(kirja)\nprint(pakkaus.yhteispaino())\n\ncd_levy = Lahja(\"Pink Floyd: Dark side of the moon\", 1)\npakkaus.lisaa_lahja(cd_levy)\nprint(pakkaus.yhteispaino())

2\n3

None eli viite ei mihinkään

Pythonissa muuttujat viittaavat aina johonkin olioon. On kuitenkin tilanteita, joissa haluaisimme määrittää arvon, joka ei viittaa mihinkään. Arvoa None käytetään esittämään tyhjää viittausta.

Jos esimerkiksi luokkaan joukkue lisättäisiin metodi, joka etsii joukkueen pelaajan, saattaisi olla luontevaa esittää paluuarvolla None tilanne, jossa pelaajaa ei löydy:

class Pelaaja:\n    def __init__(self, nimi: str, maalit: int):\n        self.nimi = nimi\n        self.maalit = maalit\n\n    def __str__(self):\n        return f\"{self.nimi} (maaleja {self.maalit})\"\n\nclass Joukkue:\n    def __init__(self, nimi: str):\n        self.nimi = nimi\n        self.pelaajat = []\n\n    def lisaa_pelaaja(self, pelaaja: Pelaaja):\n        self.pelaajat.append(pelaaja)\n\n    def etsi(self, nimi: str):\n        for pelaaja in self.pelaajat:\n            if pelaaja.nimi == nimi:\n                return pelaaja\n        return None

Käyttöesimerkki:

kupa = Joukkue(\"Kumpulan pallo\")\nkupa.lisaa_pelaaja(Pelaaja(\"Erkki\", 10))\nkupa.lisaa_pelaaja(Pelaaja(\"Emilia\", 22))\nkupa.lisaa_pelaaja(Pelaaja(\"Antti\", 1))\n\npelaaja1 = kupa.etsi(\"Antti\")\nprint(pelaaja1)\npelaaja2 = kupa.etsi(\"Jukkis\")\nprint(pelaaja2)

Antti (maaleja 1)\nNone

None-arvojen kanssa pitää olla tarkkana. On hyvin tyypillistä, että ohjelmassa kutsutaan jotain metodia oliolle (tai pyydetään attribuutin arvoa oliolta), joka onkin None:

kupa = Joukkue(\"Kumpulan pallo\")\nkupa.lisaa_pelaaja(Pelaaja(\"Erkki\", 10))\n\npelaaja = kupa.etsi(\"Jukkis\")\nprint(f\"Jukkiksen maalimäärä {pelaaja.maalit}\")

Jos näin tehdään, ohjelma päättyy virheeseen:

Traceback (most recent call last):\nFile \"\", line 1, in \nAttributeError: 'NoneType' object has no attribute 'maalit'

None-arvojen varalta onkin syytä tehdä tarkistus, ennen kuin riskialtista koodia kutsutaan:

kupa = Joukkue(\"Kumpulan pallo\")\nkupa.lisaa_pelaaja(Pelaaja(\"Erkki\", 10))\n\npelaaja = kupa.etsi(\"Jukkis\")\nif pelaaja is not None:\n    print(f\"Jukkiksen maalimäärä {p.maalit}\")\nelse:\n    print(f\"Jukkis ei pelaa Kumpulan pallossa :(\")

Jukkis ei pelaa Kumpulan pallossa :(

Tehtäväpohjassa on valmiina luokka Henkilo. Henkilöllä on nimi ja pituus. Toteutetaan tässä tehtävässä luokka Huone, jonne voi lisätä henkilöitä ja josta voi hakea ja poistaa lyhimmän henkilön.

Huone

Luo luokka Huone, jonka sisällä on lista henkilöitä ja jolla on seuraavat metodit:

    \n
  • lisaa(henkilo: Henkilo) lisää huoneeseen parametrina annetun henkilön.
  • \n
  • on_tyhja() - palauttaa arvon True tai False, joka kertoo, onko huone tyhjä.
  • \n
  • tulosta_tiedot() tulostaa huoneessa olevat henkilöt
  • \n

Seuraavassa käyttöesimerkki:

huone = Huone()\nprint(\"Huone tyhjä?\", huone.on_tyhja())\nhuone.lisaa(Henkilo(\"Lea\", 183))\nhuone.lisaa(Henkilo(\"Kenya\", 182))\nhuone.lisaa(Henkilo(\"Auli\", 186))\nhuone.lisaa(Henkilo(\"Nina\", 172))\nhuone.lisaa(Henkilo(\"Terhi\", 185))\nprint(\"Huone tyhjä?\", huone.on_tyhja())\nhuone.tulosta_tiedot()

Huone tyhjä? True\nHuone tyhjä? False\nHuoneessa 5 henkilöä, yhteispituus 908 cm\nLea (183 cm)\nKenya (182 cm)\nAuli (186 cm)\nNina (172 cm)\nTerhi (185 cm)

Lyhin henkilö

Lisää luokalle Huone metodi lyhin(), joka palauttaa huoneeseen lisätyistä henkilöistä lyhimmän. Mikäli huone on tyhjä, metodi palauttaa None-viitteen. Metodin ei tule poistaa henkilöä huoneesta.

huone = Huone()\n\nprint(\"Huone tyhjä?\", huone.on_tyhja())\nprint(\"Lyhin:\", huone.lyhin())\n\nhuone.lisaa(Henkilo(\"Lea\", 183))\nhuone.lisaa(Henkilo(\"Kenya\", 182))\nhuone.lisaa(Henkilo(\"Nina\", 172))\nhuone.lisaa(Henkilo(\"Auli\", 186))\n\nprint()\n\nprint(\"Huone tyhjä?\", huone.on_tyhja())\nprint(\"Lyhin:\", huone.lyhin())\n\nprint()\n\nhuone.tulosta_tiedot()

Huone tyhjä? True\nLyhin: None

Huone tyhjä? False\nLyhin: Nina

Huoneessa 4 henkilöä, yhteispituus 723 cm\nLea (183 cm)\nKenya (182 cm)\nNina (172 cm)\nAuli (186 cm)

Huoneesta ottaminen

Lisää luokalle Huone metodi poista_lyhin(), joka poistaa ja palauttaa huoneesta lyhimmän henkilön. Mikäli huone on tyhjä, metodi palauttaa None-viitteen.

huone = Huone()\n\nhuone.lisaa(Henkilo(\"Lea\", 183))\nhuone.lisaa(Henkilo(\"Kenya\", 182))\nhuone.lisaa(Henkilo(\"Nina\", 172))\nhuone.lisaa(Henkilo(\"Auli\", 186))\nhuone.tulosta_tiedot()\n\nprint()\n\npoistettu = huone.poista_lyhin()\nprint(f\"Otettiin huoneesta {poistettu.nimi}\")\n\nprint()\n\nhuone.tulosta_tiedot()

Huoneessa 4 henkilöä, yhteispituus 723 cm\nLea (183 cm)\nKenya (182 cm)\nNina (172 cm)\nAuli (186 cm)

Otettiin huoneesta Nina

Huoneessa 3 henkilöä, yhteispituus 551 cm\nLea (183 cm)\nKenya (182 cm)\nAuli (186 cm)

Vihje: osassa 4 kerrottiin, miten alkion poistaminen listalta onnistuu.

Vihje2: muista, että metodissa on mahdollista kutsua saman olion toista metodia. Eli seuraava koodi toimii:

class Huone:\n    # ...\n    def lyhin(self):\n        # koodi\n\n    def poista_lyhin(self):\n        lyhin_henkilo = self.lyhin()\n        # ...
","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-9/2-oliot-attribuuttina.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-9/3-kapselointi/page-data.json b/page-data/osa-9/3-kapselointi/page-data.json index 88d315d7b..9a2d5e268 100644 --- a/page-data/osa-9/3-kapselointi/page-data.json +++ b/page-data/osa-9/3-kapselointi/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-9/3-kapselointi", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä tarkoitetaan kapseloinnilla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat muodostaa piilotetun attribuutin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat kirjoittaa attribuutille asetus- ja havainnointimetodit"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olio-ohjelmoinnissa asiakkaalla tarkoitetaan luokkaa tai siitä muodostettuja olioita käyttävää ohjelmaa. Luokka tarjoaa asiakkaalle "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"palveluja"}]},{"type":"text","value":", joiden avulla asiakas voi käyttää olioita. Päämääränä on, että"}]},{"type":"element","tagName":"ol","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"asiakkaan kannalta luokan ja olioiden käyttö on mahdollisimman yksinkertaista ja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"olion "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"sisäinen eheys"}]},{"type":"text","value":" säilyy joka tilanteessa."}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sisäisellä eheydellä tarkoitetaan, että olion "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tila"}]},{"type":"text","value":" (eli käytännössä olion attribuuttien arvot) pysyy koko ajan hyväksyttävänä. Virheellinen tila olisi esimerkiksi sellainen, jossa päivämäärää esittävälle oliolle kuukauden numero on 13 tai opiskelijaa esittävällä oliolla opintopistemäärä on negatiivinen luku."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkinä luokkaa Opiskelija:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opiskelijanumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opiskelijanumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opiskelijanumero\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_suoritus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" opintopisteet"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"text","value":"-olio tarjoaa asiakkaalle metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_suoritus"}]},{"type":"text","value":", jolla opintopisteitä voidaan lisätä. Metodi varmistaa, että lisättävä opintopisteiden määrä on positiivinen. Esimerkiksi seuraava koodi lisää kolme suoritusta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"oskari "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Oskari Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\noskari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\noskari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\noskari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Opintopisteet:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" oskari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Opintopisteet: 20"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Asiakas pystyy kuitenkin muuttamaan opintopistemäärää myös suoraan viittaamalla attribuuttiin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"opintopisteet"}]},{"type":"text","value":". Näin olio voi päätyä virheelliseen tilaan, jossa se ei ole enää sisäisesti eheä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"oskari "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Oskari Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\noskari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Opintopisteet:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" oskari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Opintopisteet: -100"}]}]},{"type":"element","tagName":"h2","properties":{"id":"kapselointi","style":"position:relative;"},"children":[{"type":"text","value":"Kapselointi"},{"type":"element","tagName":"a","properties":{"href":"#kapselointi","ariaLabel":"kapselointi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokka voi piilottaa attribuutit asiakkailta. Pythonissa tämä tapahtuu lisäämällä attribuuttimuuttujan nimen alkuun kaksi alaviivaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkikortti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Attribuutti numero on piilotettu, nimi on näkyvissä"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__numero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" numero\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Piilotettu attribuutti ei näy asiakkaalle, vaan siihen viittaaminen aiheutta virheilmoituksen. Niinpä nimen voi tulostaa ja sitä voi muuttaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkikortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"123456\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Reijo Rahakas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Reijo Rutiköyhä\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Reijo Rahakas\nReijo Rutiköyhä"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mutta jos kortin numeroa yritetään tulostaa, seuraa virheilmoitus:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkikortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"123456\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Reijo Rahakas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"AttributeError: 'Pankkikortti' object has no attribute '__numero'"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tietojen piilottamista asiakkaalta kutsutaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kapseloinniksi"}]},{"type":"text","value":". Nimensä mukaisesti attribuutti siis \"suljetaan kapseliin\" ja asiakkaalle tarjotaan sopiva rajapinta, jonka kautta tietoa voi käsitellä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajennetaan pankkikorttiesimerkkiä niin, että kortilla on piilotettu attribuutti saldo ja tämän käsittelyyn tarkoitetut julkiset metodit, joiden avulla asiakas voi hallita saldoa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkikortti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__numero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" numero\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_rahaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" maara "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" maara\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kayta_rahaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" maara "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" maara "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" maara\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hae_saldo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo"}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkikortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"123456\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Reijo Rahakas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kayta_rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tämä ei onnistu, koska saldo ei riitä"}]},{"type":"text","value":"\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kayta_rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"5000\n5100\n4600\n4600"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Saldoa ei voi suoraan muuttaa, koska attribuutti on piilotettu, mutta sitä voi muuttaa metodeilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_rahaa"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kayta_rahaa"}]},{"type":"text","value":" ja sen voi hakea metodilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae_saldo"}]},{"type":"text","value":". Metodeihin voidaan sijoittaa sopivia tarkastuksia, joilla varmistetaan, että olion sisäinen eheys säilyy: esimerkiksi rahaa ei voi käyttää enempää kuin kortilla on saldoa jäljellä."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Auto","tmcname":"osa09-09_auto"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Auto"}]},{"type":"text","value":", jossa on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kapseloituina attribuutteina"}]},{"type":"text","value":" tieto bensatankin sisällöstä (0-60 litraa) sekä ajetuista kilometreista. Auto kuluttaa litran bensaa kilometrillä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokalla on seuraavat metodit:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tankkaa()"}]},{"type":"text","value":", joka täyttää bensatankin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"aja(km:int)"}]},{"type":"text","value":", joka ajaa parametrina olevan kilometrimäärän tai niin pitkälle kuin bensaa riittää"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":", joka näyttää esimerkin mukaisen kuvauksen autosta"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki luokan käyttämisestä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"auto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Auto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"auto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nauto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tankkaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"auto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nauto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"aja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"auto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nauto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"aja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"auto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nauto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"aja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"auto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nauto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tankkaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nauto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tankkaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"auto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Auto: ajettu 0 km, bensaa 0 litraa\nAuto: ajettu 0 km, bensaa 60 litraa\nAuto: ajettu 20 km, bensaa 40 litraa\nAuto: ajettu 60 km, bensaa 0 litraa\nAuto: ajettu 60 km, bensaa 0 litraa\nAuto: ajettu 60 km, bensaa 60 litraa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huomaa"}]},{"type":"text","value":", että bensan ja ajettujen kilometrien määrä on kapseloitava, niihin ei tule pystyä vaikuttamaan muuten kuin auton metodeja kutsumalla."}]}]},{"type":"element","tagName":"h2","properties":{"id":"asetus--ja-havainnointimetodit","style":"position:relative;"},"children":[{"type":"text","value":"Asetus- ja havainnointimetodit"},{"type":"element","tagName":"a","properties":{"href":"#asetus--ja-havainnointimetodit","ariaLabel":"asetus ja havainnointimetodit permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python tarjoaa myös suoraviivaisemman syntaksin attribuuttien havainnoimiselle ja asettamiselle. Tarkastellaan ensin esimerkkinä yksinkertaista luokkaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lompakko"}]},{"type":"text","value":", jossa ainoa attribuutti "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rahaa"}]},{"type":"text","value":" on suojattu asiakkailta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Lompakko"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__rahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkaan voidaan lisätä havainnointi- ja asetusmetodit, joilla asiakas voi hallita rahamäärää:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Lompakko"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__rahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Havainnointimetodi"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"rahaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__rahaa\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Asetusmetodi"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"rahaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" rahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__rahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rahaa"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokalle siis määritellään ensin havainnointimetodi, joka palauttaa rahamäärän, ja sitten asetusmetodi, joka asettaa rahamäärän ja varmistaa, että uusi rahamäärä ei ole negatiivinen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kutsuminen tapahtuu esimerkiksi näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lompsa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Lompakko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lompsa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nlompsa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"50"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lompsa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nlompsa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"30"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lompsa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"0\n50\n50"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Asiakkaan kannalta metodien kutsuminen muistuttaa attribuuttien kutsumista, koska kutsussa ei käytetä sulkuja vaan voi kirjoittaa esimerkiksi"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lompsa.rahaa = 50"}]},{"type":"text","value":". Tarkoituksena onkin piilottaa (eli kapseloida) sisäinen toteutus ja tarjota asiakkaalle vaivaton tapa muokata olion tietoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellisessä esimerkissä on kuitenkin yksi pieni vika: asiakas ei saa mitään viestiä siitä, että negatiivisen rahasumman asettaminen ei toimi. Kun arvo on selvästi virheellinen, hyvä tapa viestiä tästä on heittää poikkeus. Tässä tapauksessa oikea poikkeus voisi olla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ValueError"}]},{"type":"text","value":", joka kertoo että arvo on väärä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Korjattu versio luokasta ja testikoodi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Lompakko"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__rahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Havainnointimetodi"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"rahaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__rahaa\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Asetusmetodi"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"rahaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" rahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__rahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rahaa\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Rahasumma ei saa olla negatiivinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lompsa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"30"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lompsa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"ValueError: Rahasumma ei saa olla negatiivinen"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että havainnointimetodi eli "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"-dekoraattori pitää esitellä luokassa ennen asetusmetodia, muuten seuraa virhe. Tämä johtuu siitä, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"-dekoraattori määrittelee käytettävän \"asetusattribuutin\" nimen (edellisessä esimerkiksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rahaa"}]},{"type":"text","value":"), ja asetusmetodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":".setter"}]},{"type":"text","value":" liittää siihen uuden toiminnallisuuden."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Äänite","tmcname":"osa09-10_aanite"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Aanite"}]},{"type":"text","value":", joka mallintaa yksittäistä äänitettä. Luokalla on yksi piilotettu attribuutti, kokonaislukutyyppinen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__pituus"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita luokalle"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"konstruktori, joka saa parametrikseen pituuden"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"havainnointimetodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pituus"}]},{"type":"text","value":", joka palauttaa pituuden"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"asetusmetodi, joka asettaa pituuden arvon"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkaa siis käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"the_wall "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Aanite"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"43"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"the_wall"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nthe_wall"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"44"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"the_wall"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"43\n44"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos pituudeksi yritetään asettaa nollaa pienempää arvoa joko konstruktorissa tai asetusmetodissa, tulee tuottaa virhe "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ValueError"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos et muista miten poikkeus tuotetaan, kertaa\n"},{"type":"element","tagName":"a","properties":{"href":"/osa-6/3-virheet#poikkeusten-tuottaminen"},"children":[{"type":"text","value":"osan 6"}]},{"type":"text","value":" materiaalista."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Katsotaan vielä esimerkki luokasta, jolla on kaksi suojattua attribuuttia ja molemmille havainnointi- ja asetusmetodit:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pelaaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelinumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__pelinumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pelinumero\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"nimi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"nimi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"!="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nimi ei voi olla tyhjä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pelinumero"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__pelinumero\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@pelinumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pelinumero"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelinumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" pelinumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__pelinumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pelinumero\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pelinumeron täytyy olla positiviinen kokonaisluku\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"pelaaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Palloilija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelinumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Paula Palloilija\""}]},{"type":"text","value":"\npelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelinumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelinumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka Palloilija\n10\nPaula Palloilija\n11"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kolmantena esimerkkinä tarkastellaan luokkaa, joka mallintaa päiväkirjaa. Huomaa, että omistajalla on asetus- ja havainnointimetodit, mutta merkintöjen lisäys on toteutettu \"perinteisillä\" metodeilla. Tämä siksi, että asiakkaalle ei ole haluttu tarjota suoraan pääsyä tietorakenteeseen, johon merkinnät tallennetaan. Kapseloinnista on tässä sekin hyöty, että sisäistä toteutusta voidaan myöhemmin muuttaa (esim. vaihtamalla lista vaikka sanakirjaksi) ilman, että asiakkaan täytyy muuttaa omaa koodiaan."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Paivakirja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" omistaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" omistaja\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__merkinnat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"omistaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__omistaja\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@omistaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"omistaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" omistaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"!="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" omistaja\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Omistaja ei voi olla tyhjä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_merkinta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" merkinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__merkinnat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"merkinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Yhteensä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__merkinnat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"merkintää\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" merkinta "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__merkinnat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"- \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" merkinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"paivakirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Paivakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npaivakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_merkinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tänään söin puuroa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npaivakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_merkinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tänään opettelin olio-ohjelmointia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npaivakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_merkinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tänään menin ajoissa nukkumaan\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npaivakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yhteensä 3 merkintää"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tänään söin puuroa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tänään opettelin olio-ohjelmointia"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tänään menin ajoissa nukkumaan"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Säähavaintoasema","tmcname":"osa09-11_havaintoasema"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Havaintoasema"}]},{"type":"text","value":", johon voidaan tallentaa säähavaintoja. Luokalla on seuraavat julkiset piirteet:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"konstruktori, joka saa parametriksen aseman nimen"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_havainto(havainto: str)"}]},{"type":"text","value":", joka lisää havainnon listan peräään"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viimeisin_havainto()"}]},{"type":"text","value":", joka palauttaa viimeksi lisätyn havainnon. Jos havaintoja ei ole tehty, metodi palauttaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tyhjän merkkijonon"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"havaintojen_maara()"}]},{"type":"text","value":", joka palauttaa havaintojen yhteismäärän"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":", joka palauttaa aseman nimen ja havaintojen yhteismäärän alla olevan esimerkin mukaisessa muodossa."}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokan kaikkien attribuuttien pitää olla asiakkaalta piilossa. Saat itse päättää luokan sisäisen toteutuksen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki luokan käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"asema "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Havaintoasema"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kumpula\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nasema"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_havainto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sadetta 10mm\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nasema"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_havainto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aurinkoista\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"asema"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"viimeisin_havainto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nasema"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_havainto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ukkosta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"asema"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"viimeisin_havainto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"asema"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"havaintojen_maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"asema"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aurinkoista\nUkkosta\n3\nKumpula, 3 havaintoa"}]}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, mitä tarkoitetaan kapseloinnilla
  • \n
  • Osaat muodostaa piilotetun attribuutin
  • \n
  • Osaat kirjoittaa attribuutille asetus- ja havainnointimetodit
  • \n

Olio-ohjelmoinnissa asiakkaalla tarkoitetaan luokkaa tai siitä muodostettuja olioita käyttävää ohjelmaa. Luokka tarjoaa asiakkaalle palveluja, joiden avulla asiakas voi käyttää olioita. Päämääränä on, että

    \n
  1. asiakkaan kannalta luokan ja olioiden käyttö on mahdollisimman yksinkertaista ja
  2. \n
  3. olion sisäinen eheys säilyy joka tilanteessa.
  4. \n

Sisäisellä eheydellä tarkoitetaan, että olion tila (eli käytännössä olion attribuuttien arvot) pysyy koko ajan hyväksyttävänä. Virheellinen tila olisi esimerkiksi sellainen, jossa päivämäärää esittävälle oliolle kuukauden numero on 13 tai opiskelijaa esittävällä oliolla opintopistemäärä on negatiivinen luku.

Tarkastellaan esimerkkinä luokkaa Opiskelija:

class Opiskelija:\n    def __init__(self, nimi: str, opiskelijanumero: str):\n        self.nimi = nimi\n        self.opiskelijanumero = opiskelijanumero\n        self.opintopisteet = 0\n\n    def lisaa_suoritus(self, opintopisteet):\n        if opintopisteet > 0:\n            self.opintopisteet += opintopisteet

Opiskelija-olio tarjoaa asiakkaalle metodin lisaa_suoritus, jolla opintopisteitä voidaan lisätä. Metodi varmistaa, että lisättävä opintopisteiden määrä on positiivinen. Esimerkiksi seuraava koodi lisää kolme suoritusta:

oskari = Opiskelija(\"Oskari Opiskelija\", \"12345\")\noskari.lisaa_suoritus(5)\noskari.lisaa_suoritus(5)\noskari.lisaa_suoritus(10)\nprint(\"Opintopisteet:\", oskari.opintopisteet)

Opintopisteet: 20

Asiakas pystyy kuitenkin muuttamaan opintopistemäärää myös suoraan viittaamalla attribuuttiin opintopisteet. Näin olio voi päätyä virheelliseen tilaan, jossa se ei ole enää sisäisesti eheä:

oskari = Opiskelija(\"Oskari Opiskelija\", \"12345\")\noskari.opintopisteet = -100\nprint(\"Opintopisteet:\", oskari.opintopisteet)

Opintopisteet: -100

Kapselointi

Luokka voi piilottaa attribuutit asiakkailta. Pythonissa tämä tapahtuu lisäämällä attribuuttimuuttujan nimen alkuun kaksi alaviivaa __:

class Pankkikortti:\n    # Attribuutti numero on piilotettu, nimi on näkyvissä\n    def __init__(self, numero: str, nimi: str):\n        self.__numero = numero\n        self.nimi = nimi

Piilotettu attribuutti ei näy asiakkaalle, vaan siihen viittaaminen aiheutta virheilmoituksen. Niinpä nimen voi tulostaa ja sitä voi muuttaa:

kortti = Pankkikortti(\"123456\",\"Reijo Rahakas\")\nprint(kortti.nimi)\nkortti.nimi = \"Reijo Rutiköyhä\"\nprint(kortti.nimi)

Reijo Rahakas\nReijo Rutiköyhä

Mutta jos kortin numeroa yritetään tulostaa, seuraa virheilmoitus:

kortti = Pankkikortti(\"123456\",\"Reijo Rahakas\")\nprint(kortti.__numero)

AttributeError: 'Pankkikortti' object has no attribute '__numero'

Tietojen piilottamista asiakkaalta kutsutaan kapseloinniksi. Nimensä mukaisesti attribuutti siis \"suljetaan kapseliin\" ja asiakkaalle tarjotaan sopiva rajapinta, jonka kautta tietoa voi käsitellä.

Laajennetaan pankkikorttiesimerkkiä niin, että kortilla on piilotettu attribuutti saldo ja tämän käsittelyyn tarkoitetut julkiset metodit, joiden avulla asiakas voi hallita saldoa:

class Pankkikortti:\n    def __init__(self, numero: str, nimi: str, saldo: float):\n        self.__numero = numero\n        self.nimi = nimi\n        self.__saldo = saldo\n\n    def lisaa_rahaa(self, maara: float):\n        if maara > 0:\n            self.__saldo += maara\n\n    def kayta_rahaa(self, maara: float):\n        if maara > 0 and maara <= self.__saldo:\n            self.__saldo -= maara\n\n    def hae_saldo(self):\n        return self.__saldo
kortti = Pankkikortti(\"123456\", \"Reijo Rahakas\", 5000)\nprint(kortti.hae_saldo())\nkortti.lisaa_rahaa(100)\nprint(kortti.hae_saldo())\nkortti.kayta_rahaa(500)\nprint(kortti.hae_saldo())\n# Tämä ei onnistu, koska saldo ei riitä\nkortti.kayta_rahaa(10000)\nprint(kortti.hae_saldo())

5000\n5100\n4600\n4600

Saldoa ei voi suoraan muuttaa, koska attribuutti on piilotettu, mutta sitä voi muuttaa metodeilla lisaa_rahaa ja kayta_rahaa ja sen voi hakea metodilla hae_saldo. Metodeihin voidaan sijoittaa sopivia tarkastuksia, joilla varmistetaan, että olion sisäinen eheys säilyy: esimerkiksi rahaa ei voi käyttää enempää kuin kortilla on saldoa jäljellä.

Toteuta luokka Auto, jossa on kapseloituina attribuutteina tieto bensatankin sisällöstä (0-60 litraa) sekä ajetuista kilometreista. Auto kuluttaa litran bensaa kilometrillä.

Luokalla on seuraavat metodit:

    \n
  • tankkaa(), joka täyttää bensatankin
  • \n
  • aja(km:int), joka ajaa parametrina olevan kilometrimäärän tai niin pitkälle kuin bensaa riittää
  • \n
  • __str__, joka näyttää esimerkin mukaisen kuvauksen autosta
  • \n

Esimerkki luokan käyttämisestä:

auto = Auto()\nprint(auto)\nauto.tankkaa()\nprint(auto)\nauto.aja(20)\nprint(auto)\nauto.aja(50)\nprint(auto)\nauto.aja(10)\nprint(auto)\nauto.tankkaa()\nauto.tankkaa()\nprint(auto)

Auto: ajettu 0 km, bensaa 0 litraa\nAuto: ajettu 0 km, bensaa 60 litraa\nAuto: ajettu 20 km, bensaa 40 litraa\nAuto: ajettu 60 km, bensaa 0 litraa\nAuto: ajettu 60 km, bensaa 0 litraa\nAuto: ajettu 60 km, bensaa 60 litraa

Huomaa, että bensan ja ajettujen kilometrien määrä on kapseloitava, niihin ei tule pystyä vaikuttamaan muuten kuin auton metodeja kutsumalla.

Asetus- ja havainnointimetodit

Python tarjoaa myös suoraviivaisemman syntaksin attribuuttien havainnoimiselle ja asettamiselle. Tarkastellaan ensin esimerkkinä yksinkertaista luokkaa Lompakko, jossa ainoa attribuutti rahaa on suojattu asiakkailta:

class Lompakko:\n    def __init__(self):\n        self.__rahaa = 0

Luokkaan voidaan lisätä havainnointi- ja asetusmetodit, joilla asiakas voi hallita rahamäärää:

class Lompakko:\n    def __init__(self):\n        self.__rahaa = 0\n\n    # Havainnointimetodi\n    @property\n    def rahaa(self):\n        return self.__rahaa\n\n    # Asetusmetodi\n    @rahaa.setter\n    def rahaa(self, rahaa):\n        if rahaa >= 0:\n            self.__rahaa = rahaa

Luokalle siis määritellään ensin havainnointimetodi, joka palauttaa rahamäärän, ja sitten asetusmetodi, joka asettaa rahamäärän ja varmistaa, että uusi rahamäärä ei ole negatiivinen.

Kutsuminen tapahtuu esimerkiksi näin:

lompsa = Lompakko()\nprint(lompsa.rahaa)\n\nlompsa.rahaa = 50\nprint(lompsa.rahaa)\n\nlompsa.rahaa = -30\nprint(lompsa.rahaa)

0\n50\n50

Asiakkaan kannalta metodien kutsuminen muistuttaa attribuuttien kutsumista, koska kutsussa ei käytetä sulkuja vaan voi kirjoittaa esimerkiksilompsa.rahaa = 50. Tarkoituksena onkin piilottaa (eli kapseloida) sisäinen toteutus ja tarjota asiakkaalle vaivaton tapa muokata olion tietoja.

Edellisessä esimerkissä on kuitenkin yksi pieni vika: asiakas ei saa mitään viestiä siitä, että negatiivisen rahasumman asettaminen ei toimi. Kun arvo on selvästi virheellinen, hyvä tapa viestiä tästä on heittää poikkeus. Tässä tapauksessa oikea poikkeus voisi olla ValueError, joka kertoo että arvo on väärä.

Korjattu versio luokasta ja testikoodi:

class Lompakko:\n    def __init__(self):\n        self.__rahaa = 0\n\n    # Havainnointimetodi\n    @property\n    def rahaa(self):\n        return self.__rahaa\n\n    # Asetusmetodi\n    @rahaa.setter\n    def rahaa(self, rahaa):\n        if rahaa >= 0:\n            self.__rahaa = rahaa\n        else:\n            raise ValueError(\"Rahasumma ei saa olla negatiivinen\")
lompsa.rahaa = -30\nprint(lompsa.rahaa)

ValueError: Rahasumma ei saa olla negatiivinen

Huomaa, että havainnointimetodi eli @property-dekoraattori pitää esitellä luokassa ennen asetusmetodia, muuten seuraa virhe. Tämä johtuu siitä, että @property-dekoraattori määrittelee käytettävän \"asetusattribuutin\" nimen (edellisessä esimerkiksi rahaa), ja asetusmetodi .setter liittää siihen uuden toiminnallisuuden.

Kirjoita luokka Aanite, joka mallintaa yksittäistä äänitettä. Luokalla on yksi piilotettu attribuutti, kokonaislukutyyppinen __pituus.

Kirjoita luokalle

    \n
  • konstruktori, joka saa parametrikseen pituuden
  • \n
  • havainnointimetodi pituus, joka palauttaa pituuden
  • \n
  • asetusmetodi, joka asettaa pituuden arvon
  • \n

Luokkaa siis käytetään seuraavasti:

the_wall = Aanite(43)\nprint(the_wall.pituus)\nthe_wall.pituus = 44\nprint(the_wall.pituus)

43\n44

Jos pituudeksi yritetään asettaa nollaa pienempää arvoa joko konstruktorissa tai asetusmetodissa, tulee tuottaa virhe ValueError.

Jos et muista miten poikkeus tuotetaan, kertaa\nosan 6 materiaalista.

Katsotaan vielä esimerkki luokasta, jolla on kaksi suojattua attribuuttia ja molemmille havainnointi- ja asetusmetodit:

class Pelaaja:\n    def __init__(self, nimi: str, pelinumero: int):\n        self.__nimi = nimi\n        self.__pelinumero = pelinumero\n\n    @property\n    def nimi(self):\n        return self.__nimi\n\n    @nimi.setter\n    def nimi(self, nimi: str):\n        if nimi != \"\":\n            self.__nimi = nimi\n        else:\n            raise ValueError(\"Nimi ei voi olla tyhjä\")\n\n    @property\n    def pelinumero(self):\n        return self.__pelinumero\n\n    @pelinumero.setter\n    def pelinumero(self, pelinumero: int):\n        if pelinumero > 0:\n            self.__pelinumero = pelinumero\n        else:\n            raise ValueError(\"Pelinumeron täytyy olla positiviinen kokonaisluku\")
pelaaja = Pelaaja(\"Pekka Palloilija\", 10)\nprint(pelaaja.nimi)\nprint(pelaaja.pelinumero)\n\npelaaja.nimi = \"Paula Palloilija\"\npelaaja.pelinumero = 11\nprint(pelaaja.nimi)\nprint(pelaaja.pelinumero)

Pekka Palloilija\n10\nPaula Palloilija\n11

Kolmantena esimerkkinä tarkastellaan luokkaa, joka mallintaa päiväkirjaa. Huomaa, että omistajalla on asetus- ja havainnointimetodit, mutta merkintöjen lisäys on toteutettu \"perinteisillä\" metodeilla. Tämä siksi, että asiakkaalle ei ole haluttu tarjota suoraan pääsyä tietorakenteeseen, johon merkinnät tallennetaan. Kapseloinnista on tässä sekin hyöty, että sisäistä toteutusta voidaan myöhemmin muuttaa (esim. vaihtamalla lista vaikka sanakirjaksi) ilman, että asiakkaan täytyy muuttaa omaa koodiaan.

class Paivakirja:\n    def __init__(self, omistaja: str):\n        self.__omistaja = omistaja\n        self.__merkinnat = []\n\n    @property\n    def omistaja(self):\n        return self.__omistaja\n\n    @omistaja.setter\n    def omistaja(self, omistaja):\n        if omistaja != \"\":\n            self.__omistaja = omistaja\n        else:\n            raise ValueError(\"Omistaja ei voi olla tyhjä\")\n\n    def lisaa_merkinta(self, merkinta: str):\n        self.__merkinnat.append(merkinta)\n\n    def tulosta(self):\n        print(\"Yhteensä\", len(self.__merkinnat), \"merkintää\")\n        for merkinta in self.__merkinnat:\n            print(\"- \" + merkinta)
paivakirja = Paivakirja(\"Pekka\")\npaivakirja.lisaa_merkinta(\"Tänään söin puuroa\")\npaivakirja.lisaa_merkinta(\"Tänään opettelin olio-ohjelmointia\")\npaivakirja.lisaa_merkinta(\"Tänään menin ajoissa nukkumaan\")\npaivakirja.tulosta()

Yhteensä 3 merkintää

    \n
  • Tänään söin puuroa
  • \n
  • Tänään opettelin olio-ohjelmointia
  • \n
  • Tänään menin ajoissa nukkumaan
  • \n

Kirjoita luokka Havaintoasema, johon voidaan tallentaa säähavaintoja. Luokalla on seuraavat julkiset piirteet:

    \n
  • konstruktori, joka saa parametriksen aseman nimen
  • \n
  • metodi lisaa_havainto(havainto: str), joka lisää havainnon listan peräään
  • \n
  • metodi viimeisin_havainto(), joka palauttaa viimeksi lisätyn havainnon. Jos havaintoja ei ole tehty, metodi palauttaa tyhjän merkkijonon.
  • \n
  • metodi havaintojen_maara(), joka palauttaa havaintojen yhteismäärän
  • \n
  • metodi __str__, joka palauttaa aseman nimen ja havaintojen yhteismäärän alla olevan esimerkin mukaisessa muodossa.
  • \n

Luokan kaikkien attribuuttien pitää olla asiakkaalta piilossa. Saat itse päättää luokan sisäisen toteutuksen.

Esimerkki luokan käytöstä:

asema = Havaintoasema(\"Kumpula\")\nasema.lisaa_havainto(\"Sadetta 10mm\")\nasema.lisaa_havainto(\"Aurinkoista\")\nprint(asema.viimeisin_havainto())\n\nasema.lisaa_havainto(\"Ukkosta\")\nprint(asema.viimeisin_havainto())\n\nprint(asema.havaintojen_maara())\nprint(asema)

Aurinkoista\nUkkosta\n3\nKumpula, 3 havaintoa

","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-9/3-kapselointi.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, mitä tarkoitetaan kapseloinnilla"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat muodostaa piilotetun attribuutin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat kirjoittaa attribuutille asetus- ja havainnointimetodit"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olio-ohjelmoinnissa asiakkaalla tarkoitetaan luokkaa tai siitä muodostettuja olioita käyttävää ohjelmaa. Luokka tarjoaa asiakkaalle "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"palveluja"}]},{"type":"text","value":", joiden avulla asiakas voi käyttää olioita. Päämääränä on, että"}]},{"type":"element","tagName":"ol","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"asiakkaan kannalta luokan ja olioiden käyttö on mahdollisimman yksinkertaista ja"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"olion "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"sisäinen eheys"}]},{"type":"text","value":" säilyy joka tilanteessa."}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sisäisellä eheydellä tarkoitetaan, että olion "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tila"}]},{"type":"text","value":" (eli käytännössä olion attribuuttien arvot) pysyy koko ajan hyväksyttävänä. Virheellinen tila olisi esimerkiksi sellainen, jossa päivämäärää esittävälle oliolle kuukauden numero on 13 tai opiskelijaa esittävällä oliolla opintopistemäärä on negatiivinen luku."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkinä luokkaa Opiskelija:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opiskelijanumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opiskelijanumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opiskelijanumero\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_suoritus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" opintopisteet"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"text","value":"-olio tarjoaa asiakkaalle metodin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_suoritus"}]},{"type":"text","value":", jolla opintopisteitä voidaan lisätä. Metodi varmistaa, että lisättävä opintopisteiden määrä on positiivinen. Esimerkiksi seuraava koodi lisää kolme suoritusta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"oskari "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Oskari Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\noskari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\noskari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\noskari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Opintopisteet:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" oskari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Opintopisteet: 20"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Asiakas pystyy kuitenkin muuttamaan opintopistemäärää myös suoraan viittaamalla attribuuttiin "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"opintopisteet"}]},{"type":"text","value":". Näin olio voi päätyä virheelliseen tilaan, jossa se ei ole enää sisäisesti eheä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"oskari "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Oskari Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\noskari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Opintopisteet:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" oskari"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Opintopisteet: -100"}]}]},{"type":"element","tagName":"h2","properties":{"id":"kapselointi","style":"position:relative;"},"children":[{"type":"text","value":"Kapselointi"},{"type":"element","tagName":"a","properties":{"href":"#kapselointi","ariaLabel":"kapselointi permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokka voi piilottaa attribuutit asiakkailta. Pythonissa tämä tapahtuu lisäämällä attribuuttimuuttujan nimen alkuun kaksi alaviivaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__"}]},{"type":"text","value":":"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkikortti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Attribuutti numero on piilotettu, nimi on näkyvissä"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__numero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" numero\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Piilotettu attribuutti ei näy asiakkaalle, vaan siihen viittaaminen aiheutta virheilmoituksen. Niinpä nimen voi tulostaa ja sitä voi muuttaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkikortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"123456\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Reijo Rahakas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Reijo Rutiköyhä\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Reijo Rahakas\nReijo Rutiköyhä"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Mutta jos kortin numeroa yritetään tulostaa, seuraa virheilmoitus:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkikortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"123456\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Reijo Rahakas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"AttributeError: 'Pankkikortti' object has no attribute '__numero'"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tietojen piilottamista asiakkaalta kutsutaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kapseloinniksi"}]},{"type":"text","value":". Nimensä mukaisesti attribuutti siis \"suljetaan kapseliin\" ja asiakkaalle tarjotaan sopiva rajapinta, jonka kautta tietoa voi käsitellä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Laajennetaan pankkikorttiesimerkkiä niin, että kortilla on piilotettu attribuutti saldo ja tämän käsittelyyn tarkoitetut julkiset metodit, joiden avulla asiakas voi hallita saldoa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pankkikortti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__numero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" numero\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_rahaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" maara "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" maara\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kayta_rahaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" maara "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" maara "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-="}]},{"type":"text","value":" maara\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hae_saldo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo"}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kortti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkikortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"123456\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Reijo Rahakas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kayta_rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tämä ei onnistu, koska saldo ei riitä"}]},{"type":"text","value":"\nkortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kayta_rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kortti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"hae_saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"5000\n5100\n4600\n4600"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Saldoa ei voi suoraan muuttaa, koska attribuutti on piilotettu, mutta sitä voi muuttaa metodeilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_rahaa"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"kayta_rahaa"}]},{"type":"text","value":" ja sen voi hakea metodilla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hae_saldo"}]},{"type":"text","value":". Metodeihin voidaan sijoittaa sopivia tarkastuksia, joilla varmistetaan, että olion sisäinen eheys säilyy: esimerkiksi rahaa ei voi käyttää enempää kuin kortilla on saldoa jäljellä."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Auto","tmcname":"osa09-09_auto"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Toteuta luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Auto"}]},{"type":"text","value":", jossa on "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"kapseloituina attribuutteina"}]},{"type":"text","value":" tieto bensatankin sisällöstä (0-60 litraa) sekä ajetuista kilometreista. Auto kuluttaa litran bensaa kilometrillä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokalla on seuraavat metodit:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tankkaa()"}]},{"type":"text","value":", joka täyttää bensatankin"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"aja(km:int)"}]},{"type":"text","value":", joka ajaa parametrina olevan kilometrimäärän tai niin pitkälle kuin bensaa riittää"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":", joka näyttää esimerkin mukaisen kuvauksen autosta"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki luokan käyttämisestä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"auto "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Auto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"auto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nauto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tankkaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"auto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nauto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"aja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"20"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"auto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nauto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"aja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"50"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"auto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nauto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"aja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"auto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nauto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tankkaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nauto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tankkaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"auto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Auto: ajettu 0 km, bensaa 0 litraa\nAuto: ajettu 0 km, bensaa 60 litraa\nAuto: ajettu 20 km, bensaa 40 litraa\nAuto: ajettu 60 km, bensaa 0 litraa\nAuto: ajettu 60 km, bensaa 0 litraa\nAuto: ajettu 60 km, bensaa 60 litraa"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Huomaa"}]},{"type":"text","value":", että bensan ja ajettujen kilometrien määrä on kapseloitava, niihin ei tule pystyä vaikuttamaan muuten kuin auton metodeja kutsumalla."}]}]},{"type":"element","tagName":"h2","properties":{"id":"asetus--ja-havainnointimetodit","style":"position:relative;"},"children":[{"type":"text","value":"Asetus- ja havainnointimetodit"},{"type":"element","tagName":"a","properties":{"href":"#asetus--ja-havainnointimetodit","ariaLabel":"asetus ja havainnointimetodit permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Python tarjoaa myös suoraviivaisemman syntaksin attribuuttien havainnoimiselle ja asettamiselle. Tarkastellaan ensin esimerkkinä yksinkertaista luokkaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lompakko"}]},{"type":"text","value":", jossa ainoa attribuutti "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rahaa"}]},{"type":"text","value":" on suojattu asiakkailta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Lompakko"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__rahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkaan voidaan lisätä havainnointi- ja asetusmetodit, joilla asiakas voi hallita rahamäärää:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Lompakko"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__rahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Havainnointimetodi"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"rahaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__rahaa\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Asetusmetodi"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"rahaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" rahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__rahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rahaa"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokalle siis määritellään ensin havainnointimetodi, joka palauttaa rahamäärän, ja sitten asetusmetodi, joka asettaa rahamäärän ja varmistaa, että uusi rahamäärä ei ole negatiivinen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kutsuminen tapahtuu esimerkiksi näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lompsa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Lompakko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lompsa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nlompsa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"50"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lompsa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nlompsa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"30"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lompsa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"0\n50\n50"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Asiakkaan kannalta metodien kutsuminen muistuttaa attribuuttien kutsumista, koska kutsussa ei käytetä sulkuja vaan voi kirjoittaa esimerkiksi"},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lompsa.rahaa = 50"}]},{"type":"text","value":". Tarkoituksena onkin piilottaa (eli kapseloida) sisäinen toteutus ja tarjota asiakkaalle vaivaton tapa muokata olion tietoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Edellisessä esimerkissä on kuitenkin yksi pieni vika: asiakas ei saa mitään viestiä siitä, että negatiivisen rahasumman asettaminen ei toimi. Kun arvo on selvästi virheellinen, hyvä tapa viestiä tästä on heittää poikkeus. Tässä tapauksessa oikea poikkeus voisi olla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ValueError"}]},{"type":"text","value":", joka kertoo että arvo on väärä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Korjattu versio luokasta ja testikoodi:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Lompakko"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__rahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Havainnointimetodi"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"rahaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__rahaa\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Asetusmetodi"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"rahaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" rahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__rahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rahaa\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Rahasumma ei saa olla negatiivinen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lompsa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rahaa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"30"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lompsa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rahaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"ValueError: Rahasumma ei saa olla negatiivinen"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että havainnointimetodi eli "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"-dekoraattori pitää esitellä luokassa ennen asetusmetodia, muuten seuraa virhe. Tämä johtuu siitä, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"-dekoraattori määrittelee käytettävän \"asetusattribuutin\" nimen (edellisessä esimerkiksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rahaa"}]},{"type":"text","value":"), ja asetusmetodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":".setter"}]},{"type":"text","value":" liittää siihen uuden toiminnallisuuden."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Äänite","tmcname":"osa09-10_aanite"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Aanite"}]},{"type":"text","value":", joka mallintaa yksittäistä äänitettä. Luokalla on yksi piilotettu attribuutti, kokonaislukutyyppinen "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__pituus"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita luokalle"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"konstruktori, joka saa parametrikseen pituuden"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"havainnointimetodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"pituus"}]},{"type":"text","value":", joka palauttaa pituuden"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"asetusmetodi, joka asettaa pituuden arvon"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkaa siis käytetään seuraavasti:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"the_wall "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Aanite"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"43"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"the_wall"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nthe_wall"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pituus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"44"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"the_wall"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"43\n44"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos pituudeksi yritetään asettaa nollaa pienempää arvoa joko konstruktorissa tai asetusmetodissa, tulee tuottaa virhe "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ValueError"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos et muista miten poikkeus tuotetaan, kertaa\n"},{"type":"element","tagName":"a","properties":{"href":"/osa-6/3-virheet#poikkeusten-tuottaminen"},"children":[{"type":"text","value":"osan 6"}]},{"type":"text","value":" materiaalista."}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Katsotaan vielä esimerkki luokasta, jolla on kaksi suojattua attribuuttia ja molemmille havainnointi- ja asetusmetodit:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Pelaaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelinumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__pelinumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pelinumero\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"nimi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"nimi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"!="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nimi ei voi olla tyhjä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pelinumero"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__pelinumero\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@pelinumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pelinumero"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" pelinumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" pelinumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__pelinumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" pelinumero\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pelinumeron täytyy olla positiviinen kokonaisluku\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"pelaaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka Palloilija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelinumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Paula Palloilija\""}]},{"type":"text","value":"\npelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelinumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"11"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pelaaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pelinumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pekka Palloilija\n10\nPaula Palloilija\n11"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kolmantena esimerkkinä tarkastellaan luokkaa, joka mallintaa päiväkirjaa. Huomaa, että omistajalla on asetus- ja havainnointimetodit, mutta merkintöjen lisäys on toteutettu \"perinteisillä\" metodeilla. Tämä siksi, että asiakkaalle ei ole haluttu tarjota suoraan pääsyä tietorakenteeseen, johon merkinnät tallennetaan. Kapseloinnista on tässä sekin hyöty, että sisäistä toteutusta voidaan myöhemmin muuttaa (esim. vaihtamalla lista vaikka sanakirjaksi) ilman, että asiakkaan täytyy muuttaa omaa koodiaan."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Paivakirja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" omistaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" omistaja\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__merkinnat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"omistaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__omistaja\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@omistaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"omistaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" omistaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"!="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" omistaja\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Omistaja ei voi olla tyhjä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_merkinta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" merkinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__merkinnat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"merkinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"tulosta"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Yhteensä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__merkinnat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"merkintää\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" merkinta "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__merkinnat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"- \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" merkinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"paivakirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Paivakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pekka\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npaivakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_merkinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tänään söin puuroa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npaivakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_merkinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tänään opettelin olio-ohjelmointia\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npaivakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_merkinta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tänään menin ajoissa nukkumaan\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npaivakirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yhteensä 3 merkintää"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tänään söin puuroa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tänään opettelin olio-ohjelmointia"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tänään menin ajoissa nukkumaan"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Säähavaintoasema","tmcname":"osa09-11_havaintoasema"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Havaintoasema"}]},{"type":"text","value":", johon voidaan tallentaa säähavaintoja. Luokalla on seuraavat julkiset piirteet:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"konstruktori, joka saa parametriksen aseman nimen"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_havainto(havainto: str)"}]},{"type":"text","value":", joka lisää havainnon listan peräään"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"viimeisin_havainto()"}]},{"type":"text","value":", joka palauttaa viimeksi lisätyn havainnon. Jos havaintoja ei ole tehty, metodi palauttaa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"tyhjän merkkijonon"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"havaintojen_maara()"}]},{"type":"text","value":", joka palauttaa havaintojen yhteismäärän"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":", joka palauttaa aseman nimen ja havaintojen yhteismäärän alla olevan esimerkin mukaisessa muodossa."}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokan kaikkien attribuuttien pitää olla asiakkaalta piilossa. Saat itse päättää luokan sisäisen toteutuksen."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki luokan käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"asema "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Havaintoasema"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kumpula\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nasema"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_havainto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sadetta 10mm\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nasema"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_havainto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aurinkoista\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"asema"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"viimeisin_havainto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nasema"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_havainto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ukkosta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"asema"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"viimeisin_havainto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"asema"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"havaintojen_maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"asema"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aurinkoista\nUkkosta\n3\nKumpula, 3 havaintoa"}]}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, mitä tarkoitetaan kapseloinnilla
  • \n
  • Osaat muodostaa piilotetun attribuutin
  • \n
  • Osaat kirjoittaa attribuutille asetus- ja havainnointimetodit
  • \n

Olio-ohjelmoinnissa asiakkaalla tarkoitetaan luokkaa tai siitä muodostettuja olioita käyttävää ohjelmaa. Luokka tarjoaa asiakkaalle palveluja, joiden avulla asiakas voi käyttää olioita. Päämääränä on, että

    \n
  1. asiakkaan kannalta luokan ja olioiden käyttö on mahdollisimman yksinkertaista ja
  2. \n
  3. olion sisäinen eheys säilyy joka tilanteessa.
  4. \n

Sisäisellä eheydellä tarkoitetaan, että olion tila (eli käytännössä olion attribuuttien arvot) pysyy koko ajan hyväksyttävänä. Virheellinen tila olisi esimerkiksi sellainen, jossa päivämäärää esittävälle oliolle kuukauden numero on 13 tai opiskelijaa esittävällä oliolla opintopistemäärä on negatiivinen luku.

Tarkastellaan esimerkkinä luokkaa Opiskelija:

class Opiskelija:\n    def __init__(self, nimi: str, opiskelijanumero: str):\n        self.nimi = nimi\n        self.opiskelijanumero = opiskelijanumero\n        self.opintopisteet = 0\n\n    def lisaa_suoritus(self, opintopisteet):\n        if opintopisteet > 0:\n            self.opintopisteet += opintopisteet

Opiskelija-olio tarjoaa asiakkaalle metodin lisaa_suoritus, jolla opintopisteitä voidaan lisätä. Metodi varmistaa, että lisättävä opintopisteiden määrä on positiivinen. Esimerkiksi seuraava koodi lisää kolme suoritusta:

oskari = Opiskelija(\"Oskari Opiskelija\", \"12345\")\noskari.lisaa_suoritus(5)\noskari.lisaa_suoritus(5)\noskari.lisaa_suoritus(10)\nprint(\"Opintopisteet:\", oskari.opintopisteet)

Opintopisteet: 20

Asiakas pystyy kuitenkin muuttamaan opintopistemäärää myös suoraan viittaamalla attribuuttiin opintopisteet. Näin olio voi päätyä virheelliseen tilaan, jossa se ei ole enää sisäisesti eheä:

oskari = Opiskelija(\"Oskari Opiskelija\", \"12345\")\noskari.opintopisteet = -100\nprint(\"Opintopisteet:\", oskari.opintopisteet)

Opintopisteet: -100

Kapselointi

Luokka voi piilottaa attribuutit asiakkailta. Pythonissa tämä tapahtuu lisäämällä attribuuttimuuttujan nimen alkuun kaksi alaviivaa __:

class Pankkikortti:\n    # Attribuutti numero on piilotettu, nimi on näkyvissä\n    def __init__(self, numero: str, nimi: str):\n        self.__numero = numero\n        self.nimi = nimi

Piilotettu attribuutti ei näy asiakkaalle, vaan siihen viittaaminen aiheutta virheilmoituksen. Niinpä nimen voi tulostaa ja sitä voi muuttaa:

kortti = Pankkikortti(\"123456\",\"Reijo Rahakas\")\nprint(kortti.nimi)\nkortti.nimi = \"Reijo Rutiköyhä\"\nprint(kortti.nimi)

Reijo Rahakas\nReijo Rutiköyhä

Mutta jos kortin numeroa yritetään tulostaa, seuraa virheilmoitus:

kortti = Pankkikortti(\"123456\",\"Reijo Rahakas\")\nprint(kortti.__numero)

AttributeError: 'Pankkikortti' object has no attribute '__numero'

Tietojen piilottamista asiakkaalta kutsutaan kapseloinniksi. Nimensä mukaisesti attribuutti siis \"suljetaan kapseliin\" ja asiakkaalle tarjotaan sopiva rajapinta, jonka kautta tietoa voi käsitellä.

Laajennetaan pankkikorttiesimerkkiä niin, että kortilla on piilotettu attribuutti saldo ja tämän käsittelyyn tarkoitetut julkiset metodit, joiden avulla asiakas voi hallita saldoa:

class Pankkikortti:\n    def __init__(self, numero: str, nimi: str, saldo: float):\n        self.__numero = numero\n        self.nimi = nimi\n        self.__saldo = saldo\n\n    def lisaa_rahaa(self, maara: float):\n        if maara > 0:\n            self.__saldo += maara\n\n    def kayta_rahaa(self, maara: float):\n        if maara > 0 and maara <= self.__saldo:\n            self.__saldo -= maara\n\n    def hae_saldo(self):\n        return self.__saldo
kortti = Pankkikortti(\"123456\", \"Reijo Rahakas\", 5000)\nprint(kortti.hae_saldo())\nkortti.lisaa_rahaa(100)\nprint(kortti.hae_saldo())\nkortti.kayta_rahaa(500)\nprint(kortti.hae_saldo())\n# Tämä ei onnistu, koska saldo ei riitä\nkortti.kayta_rahaa(10000)\nprint(kortti.hae_saldo())

5000\n5100\n4600\n4600

Saldoa ei voi suoraan muuttaa, koska attribuutti on piilotettu, mutta sitä voi muuttaa metodeilla lisaa_rahaa ja kayta_rahaa ja sen voi hakea metodilla hae_saldo. Metodeihin voidaan sijoittaa sopivia tarkastuksia, joilla varmistetaan, että olion sisäinen eheys säilyy: esimerkiksi rahaa ei voi käyttää enempää kuin kortilla on saldoa jäljellä.

Toteuta luokka Auto, jossa on kapseloituina attribuutteina tieto bensatankin sisällöstä (0-60 litraa) sekä ajetuista kilometreista. Auto kuluttaa litran bensaa kilometrillä.

Luokalla on seuraavat metodit:

    \n
  • tankkaa(), joka täyttää bensatankin
  • \n
  • aja(km:int), joka ajaa parametrina olevan kilometrimäärän tai niin pitkälle kuin bensaa riittää
  • \n
  • __str__, joka näyttää esimerkin mukaisen kuvauksen autosta
  • \n

Esimerkki luokan käyttämisestä:

auto = Auto()\nprint(auto)\nauto.tankkaa()\nprint(auto)\nauto.aja(20)\nprint(auto)\nauto.aja(50)\nprint(auto)\nauto.aja(10)\nprint(auto)\nauto.tankkaa()\nauto.tankkaa()\nprint(auto)

Auto: ajettu 0 km, bensaa 0 litraa\nAuto: ajettu 0 km, bensaa 60 litraa\nAuto: ajettu 20 km, bensaa 40 litraa\nAuto: ajettu 60 km, bensaa 0 litraa\nAuto: ajettu 60 km, bensaa 0 litraa\nAuto: ajettu 60 km, bensaa 60 litraa

Huomaa, että bensan ja ajettujen kilometrien määrä on kapseloitava, niihin ei tule pystyä vaikuttamaan muuten kuin auton metodeja kutsumalla.

Asetus- ja havainnointimetodit

Python tarjoaa myös suoraviivaisemman syntaksin attribuuttien havainnoimiselle ja asettamiselle. Tarkastellaan ensin esimerkkinä yksinkertaista luokkaa Lompakko, jossa ainoa attribuutti rahaa on suojattu asiakkailta:

class Lompakko:\n    def __init__(self):\n        self.__rahaa = 0

Luokkaan voidaan lisätä havainnointi- ja asetusmetodit, joilla asiakas voi hallita rahamäärää:

class Lompakko:\n    def __init__(self):\n        self.__rahaa = 0\n\n    # Havainnointimetodi\n    @property\n    def rahaa(self):\n        return self.__rahaa\n\n    # Asetusmetodi\n    @rahaa.setter\n    def rahaa(self, rahaa):\n        if rahaa >= 0:\n            self.__rahaa = rahaa

Luokalle siis määritellään ensin havainnointimetodi, joka palauttaa rahamäärän, ja sitten asetusmetodi, joka asettaa rahamäärän ja varmistaa, että uusi rahamäärä ei ole negatiivinen.

Kutsuminen tapahtuu esimerkiksi näin:

lompsa = Lompakko()\nprint(lompsa.rahaa)\n\nlompsa.rahaa = 50\nprint(lompsa.rahaa)\n\nlompsa.rahaa = -30\nprint(lompsa.rahaa)

0\n50\n50

Asiakkaan kannalta metodien kutsuminen muistuttaa attribuuttien kutsumista, koska kutsussa ei käytetä sulkuja vaan voi kirjoittaa esimerkiksilompsa.rahaa = 50. Tarkoituksena onkin piilottaa (eli kapseloida) sisäinen toteutus ja tarjota asiakkaalle vaivaton tapa muokata olion tietoja.

Edellisessä esimerkissä on kuitenkin yksi pieni vika: asiakas ei saa mitään viestiä siitä, että negatiivisen rahasumman asettaminen ei toimi. Kun arvo on selvästi virheellinen, hyvä tapa viestiä tästä on heittää poikkeus. Tässä tapauksessa oikea poikkeus voisi olla ValueError, joka kertoo että arvo on väärä.

Korjattu versio luokasta ja testikoodi:

class Lompakko:\n    def __init__(self):\n        self.__rahaa = 0\n\n    # Havainnointimetodi\n    @property\n    def rahaa(self):\n        return self.__rahaa\n\n    # Asetusmetodi\n    @rahaa.setter\n    def rahaa(self, rahaa):\n        if rahaa >= 0:\n            self.__rahaa = rahaa\n        else:\n            raise ValueError(\"Rahasumma ei saa olla negatiivinen\")
lompsa.rahaa = -30\nprint(lompsa.rahaa)

ValueError: Rahasumma ei saa olla negatiivinen

Huomaa, että havainnointimetodi eli @property-dekoraattori pitää esitellä luokassa ennen asetusmetodia, muuten seuraa virhe. Tämä johtuu siitä, että @property-dekoraattori määrittelee käytettävän \"asetusattribuutin\" nimen (edellisessä esimerkiksi rahaa), ja asetusmetodi .setter liittää siihen uuden toiminnallisuuden.

Kirjoita luokka Aanite, joka mallintaa yksittäistä äänitettä. Luokalla on yksi piilotettu attribuutti, kokonaislukutyyppinen __pituus.

Kirjoita luokalle

    \n
  • konstruktori, joka saa parametrikseen pituuden
  • \n
  • havainnointimetodi pituus, joka palauttaa pituuden
  • \n
  • asetusmetodi, joka asettaa pituuden arvon
  • \n

Luokkaa siis käytetään seuraavasti:

the_wall = Aanite(43)\nprint(the_wall.pituus)\nthe_wall.pituus = 44\nprint(the_wall.pituus)

43\n44

Jos pituudeksi yritetään asettaa nollaa pienempää arvoa joko konstruktorissa tai asetusmetodissa, tulee tuottaa virhe ValueError.

Jos et muista miten poikkeus tuotetaan, kertaa\nosan 6 materiaalista.

Katsotaan vielä esimerkki luokasta, jolla on kaksi suojattua attribuuttia ja molemmille havainnointi- ja asetusmetodit:

class Pelaaja:\n    def __init__(self, nimi: str, pelinumero: int):\n        self.__nimi = nimi\n        self.__pelinumero = pelinumero\n\n    @property\n    def nimi(self):\n        return self.__nimi\n\n    @nimi.setter\n    def nimi(self, nimi: str):\n        if nimi != \"\":\n            self.__nimi = nimi\n        else:\n            raise ValueError(\"Nimi ei voi olla tyhjä\")\n\n    @property\n    def pelinumero(self):\n        return self.__pelinumero\n\n    @pelinumero.setter\n    def pelinumero(self, pelinumero: int):\n        if pelinumero > 0:\n            self.__pelinumero = pelinumero\n        else:\n            raise ValueError(\"Pelinumeron täytyy olla positiviinen kokonaisluku\")
pelaaja = Pelaaja(\"Pekka Palloilija\", 10)\nprint(pelaaja.nimi)\nprint(pelaaja.pelinumero)\n\npelaaja.nimi = \"Paula Palloilija\"\npelaaja.pelinumero = 11\nprint(pelaaja.nimi)\nprint(pelaaja.pelinumero)

Pekka Palloilija\n10\nPaula Palloilija\n11

Kolmantena esimerkkinä tarkastellaan luokkaa, joka mallintaa päiväkirjaa. Huomaa, että omistajalla on asetus- ja havainnointimetodit, mutta merkintöjen lisäys on toteutettu \"perinteisillä\" metodeilla. Tämä siksi, että asiakkaalle ei ole haluttu tarjota suoraan pääsyä tietorakenteeseen, johon merkinnät tallennetaan. Kapseloinnista on tässä sekin hyöty, että sisäistä toteutusta voidaan myöhemmin muuttaa (esim. vaihtamalla lista vaikka sanakirjaksi) ilman, että asiakkaan täytyy muuttaa omaa koodiaan.

class Paivakirja:\n    def __init__(self, omistaja: str):\n        self.__omistaja = omistaja\n        self.__merkinnat = []\n\n    @property\n    def omistaja(self):\n        return self.__omistaja\n\n    @omistaja.setter\n    def omistaja(self, omistaja):\n        if omistaja != \"\":\n            self.__omistaja = omistaja\n        else:\n            raise ValueError(\"Omistaja ei voi olla tyhjä\")\n\n    def lisaa_merkinta(self, merkinta: str):\n        self.__merkinnat.append(merkinta)\n\n    def tulosta(self):\n        print(\"Yhteensä\", len(self.__merkinnat), \"merkintää\")\n        for merkinta in self.__merkinnat:\n            print(\"- \" + merkinta)
paivakirja = Paivakirja(\"Pekka\")\npaivakirja.lisaa_merkinta(\"Tänään söin puuroa\")\npaivakirja.lisaa_merkinta(\"Tänään opettelin olio-ohjelmointia\")\npaivakirja.lisaa_merkinta(\"Tänään menin ajoissa nukkumaan\")\npaivakirja.tulosta()

Yhteensä 3 merkintää

    \n
  • Tänään söin puuroa
  • \n
  • Tänään opettelin olio-ohjelmointia
  • \n
  • Tänään menin ajoissa nukkumaan
  • \n

Kirjoita luokka Havaintoasema, johon voidaan tallentaa säähavaintoja. Luokalla on seuraavat julkiset piirteet:

    \n
  • konstruktori, joka saa parametriksen aseman nimen
  • \n
  • metodi lisaa_havainto(havainto: str), joka lisää havainnon listan peräään
  • \n
  • metodi viimeisin_havainto(), joka palauttaa viimeksi lisätyn havainnon. Jos havaintoja ei ole tehty, metodi palauttaa tyhjän merkkijonon.
  • \n
  • metodi havaintojen_maara(), joka palauttaa havaintojen yhteismäärän
  • \n
  • metodi __str__, joka palauttaa aseman nimen ja havaintojen yhteismäärän alla olevan esimerkin mukaisessa muodossa.
  • \n

Luokan kaikkien attribuuttien pitää olla asiakkaalta piilossa. Saat itse päättää luokan sisäisen toteutuksen.

Esimerkki luokan käytöstä:

asema = Havaintoasema(\"Kumpula\")\nasema.lisaa_havainto(\"Sadetta 10mm\")\nasema.lisaa_havainto(\"Aurinkoista\")\nprint(asema.viimeisin_havainto())\n\nasema.lisaa_havainto(\"Ukkosta\")\nprint(asema.viimeisin_havainto())\n\nprint(asema.havaintojen_maara())\nprint(asema)

Aurinkoista\nUkkosta\n3\nKumpula, 3 havaintoa

","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-9/3-kapselointi.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-9/4-metodien-nakyvyys/page-data.json b/page-data/osa-9/4-metodien-nakyvyys/page-data.json index 69b8109cf..0de3d2032 100644 --- a/page-data/osa-9/4-metodien-nakyvyys/page-data.json +++ b/page-data/osa-9/4-metodien-nakyvyys/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-9/4-metodien-nakyvyys", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten metodin näkyvyys määritellään Pythonissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat kirjoittaa piilotettuja metodeita"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokassa olevien metodien näkyvyyteen voidaan vaikuttaa samalla tavalla kuin attribuuttien näkyvyyteen. Jos metodin nimi alkaa kahdella alaviivalla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__"}]},{"type":"text","value":", metodi ei ole näkyvissä asiakkaille."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käytännössä mekanismia käytetään hiukan eri tavalla: piilotettujen attribuuttien käyttöä varten kirjoitetaan usein julkiset havainnointi- ja asetusmetodit. Piilotettu metodi on kuitenkin yleensä tarkoitettu vain luokan sisäiseen käyttöön, apumetodiksi asiakkaalta piilotettujen operaatioiden toteuttamiseksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Piilotettua metodia voidaan kutsua luokan sisällä normaalisti, mutta kutsuttaessa pitää muistaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":"-aluke. Tarkastellaan esimerkkinä sähköpostin vastaanottajaa mallintavaa luokkaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Vastaanottaja"}]},{"type":"text","value":", jossa yksityistä apumetodia käytetään tarkistamaan sähköpostiosoitteen oikeellisuus:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Vastaanottaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tarkasta_sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__sposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sposti\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sähköposti ei kelpaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__tarkasta_sposti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Yksinkertainen tarkastus: osoitteessa on yli 5 merkkiä ja piste ja @-merkki"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\".\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sposti "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"@\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sposti"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos asiakas yrittää kutsua metodia, seuraa virhe:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"pertti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Vastaanottaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pertti Keinonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pertti@example.com\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npertti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tarkasta_sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"jokumuu@example.com\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"AttributeError: 'Vastaanottaja' object has no attribute '__tarkasta_sposti'"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Samaa apumetodia kannattaa kutsua myös sähköpostia asettaessa - lisätään siis luokkaan esimerkin vuoksi havainnointi- ja asetusmetodit sähköpostille:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Vastaanottaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tarkasta_sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__sposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sposti\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sähköposti ei kelpaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__tarkasta_sposti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Yksinkertainen tarkastus: osoitteessa on yli 5 merkkiä ja piste ja @-merkki"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\".\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sposti "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"@\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sposti\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"sposti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__sposti\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"sposti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tarkasta_sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__sposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sposti\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sähköposti ei kelpaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan sitten toista esimerkkiä. Luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Korttipakka"}]},{"type":"text","value":" mallintaa nimensä mukaisesti 52 kortin korttipakkaa. Apumetodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__alusta_pakka"}]},{"type":"text","value":" luo uuden sekoitetun pakan oliota luotaessa. Vastaava alustus voitaisiin toki tehdä myös metodissa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__init__"}]},{"type":"text","value":", mutta erillisen apumetodin käyttö tekee koodista siistimpää ja mahdollistaa alustusmetodin kutsumisen myös muualta luokasta tarvittaessa."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" random "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" shuffle\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Korttipakka"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__alusta_pakka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__alusta_pakka"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__pakka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Laitetaan kaikki kortit pakkaan"}]},{"type":"text","value":"\n maat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pata\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hertta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"risti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ruutu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" maa "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" maat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" numero "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"14"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__pakka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Sekoitetaan pakka"}]},{"type":"text","value":"\n shuffle"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__pakka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"jaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" korttien_maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n kasi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Siirretään pakasta ylimmät kortit käteen"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"korttien_maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n kasi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__pakka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pop"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" kasi"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava koodi testaa luokkaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"korttipakka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Korttipakka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkasi1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" korttipakka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"jaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kasi1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkasi2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" korttipakka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"jaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kasi2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma tulostaa esimerkiksi"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[('pata', 7), ('pata', 11), ('hertta', 7), ('ruutu', 3), ('pata', 4)]\n[('risti', 8), ('pata', 12), ('ruutu', 13), ('risti', 11), ('pata', 10)]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Piilotettuja metodeja tarvitaan yleensä harvemmin kuin piilotettuja attribuutteja. Metodi kannattaa piilottaa, jos asiakas ei tarvitse siihen suoraa pääsyä, ja varsinkin silloin, jos on todennäköistä, että asiakas voisi sotkea olion sisäisen eheyden metodia kutsumalla."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Palvelumaksu","tmcname":"osa09-12_palvelumaksu"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"text","value":", joka mallintaa pankkitiliä. Luokalla tulee olla"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"konstruktori, joka saa parametrikseen tilinomistajan (str), tilinumeron (str) ja saldon (float)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"talleta(summa: float)"}]},{"type":"text","value":", jolla tilille voidaan tallettaa rahaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nosta(summa: float)"}]},{"type":"text","value":", joka nostaa tililtä rahasumman"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"havainnointimetodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"saldo"}]},{"type":"text","value":", joka palauttaa tilin saldon"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisäksi luokalla on yksityinen metodi"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__palvelumaksu()"}]},{"type":"text","value":", joka vähentää tililtä yhden prosentin rahaa. Luokassa kutsutaan tätä metodia aina, kun asiakas kutsuu jompaa kumpaa metodeista "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"talleta"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nosta"}]},{"type":"text","value":". Prosentti vähennetään aina varsinaisen operaation jälkeen (eli. esimerkiksi vasta sitten, kun rahat on talletettu)."}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kaikki luokan attribuutit ovat yksityisiä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki luokan käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Raimo Rahakas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345-6789\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"talleta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"891.0\n981.09"}]}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, miten metodin näkyvyys määritellään Pythonissa
  • \n
  • Osaat kirjoittaa piilotettuja metodeita
  • \n

Luokassa olevien metodien näkyvyyteen voidaan vaikuttaa samalla tavalla kuin attribuuttien näkyvyyteen. Jos metodin nimi alkaa kahdella alaviivalla __, metodi ei ole näkyvissä asiakkaille.

Käytännössä mekanismia käytetään hiukan eri tavalla: piilotettujen attribuuttien käyttöä varten kirjoitetaan usein julkiset havainnointi- ja asetusmetodit. Piilotettu metodi on kuitenkin yleensä tarkoitettu vain luokan sisäiseen käyttöön, apumetodiksi asiakkaalta piilotettujen operaatioiden toteuttamiseksi.

Piilotettua metodia voidaan kutsua luokan sisällä normaalisti, mutta kutsuttaessa pitää muistaa self-aluke. Tarkastellaan esimerkkinä sähköpostin vastaanottajaa mallintavaa luokkaa Vastaanottaja, jossa yksityistä apumetodia käytetään tarkistamaan sähköpostiosoitteen oikeellisuus:

class Vastaanottaja:\n    def __init__(self, nimi: str, sposti: str):\n        self.__nimi = nimi\n        if self.__tarkasta_sposti(sposti):\n            self.__sposti = sposti\n        else:\n            raise ValueError(\"Sähköposti ei kelpaa\")\n\n    def __tarkasta_sposti(self, sposti: str):\n        # Yksinkertainen tarkastus: osoitteessa on yli 5 merkkiä ja piste ja @-merkki\n        return len(sposti) > 5 and \".\" in sposti and \"@\" in sposti

Jos asiakas yrittää kutsua metodia, seuraa virhe:

pertti = Vastaanottaja(\"Pertti Keinonen\", \"pertti@example.com\")\npertti.__tarkasta_sposti(\"jokumuu@example.com\")

AttributeError: 'Vastaanottaja' object has no attribute '__tarkasta_sposti'

Samaa apumetodia kannattaa kutsua myös sähköpostia asettaessa - lisätään siis luokkaan esimerkin vuoksi havainnointi- ja asetusmetodit sähköpostille:

class Vastaanottaja:\n    def __init__(self, nimi: str, sposti: str):\n        self.__nimi = nimi\n        if self.__tarkasta_sposti(sposti):\n            self.__sposti = sposti\n        else:\n            raise ValueError(\"Sähköposti ei kelpaa\")\n\n    def __tarkasta_sposti(self, sposti: str):\n        # Yksinkertainen tarkastus: osoitteessa on yli 5 merkkiä ja piste ja @-merkki\n        return len(sposti) > 5 and \".\" in sposti and \"@\" in sposti\n\n    @property\n    def sposti(self):\n        return self.__sposti\n\n    @sposti.setter\n    def sposti(self, sposti: str):\n        if self.__tarkasta_sposti(sposti):\n            self.__sposti = sposti\n        else:\n            raise ValueError(\"Sähköposti ei kelpaa\")

Tarkastellaan sitten toista esimerkkiä. Luokka Korttipakka mallintaa nimensä mukaisesti 52 kortin korttipakkaa. Apumetodi __alusta_pakka luo uuden sekoitetun pakan oliota luotaessa. Vastaava alustus voitaisiin toki tehdä myös metodissa __init__, mutta erillisen apumetodin käyttö tekee koodista siistimpää ja mahdollistaa alustusmetodin kutsumisen myös muualta luokasta tarvittaessa.

from random import shuffle\n\nclass Korttipakka:\n    def __init__(self):\n        self.__alusta_pakka()\n\n    def __alusta_pakka(self):\n        self.__pakka = []\n        # Laitetaan kaikki kortit pakkaan\n        maat = [\"pata\", \"hertta\", \"risti\", \"ruutu\"]\n        for maa in maat:\n            for numero in range(1, 14):\n                self.__pakka.append((maa, numero))\n        # Sekoitetaan pakka\n        shuffle(self.__pakka)\n\n    def jaa(self, korttien_maara: int):\n        kasi = []\n        # Siirretään pakasta ylimmät kortit käteen\n        for i in range(korttien_maara):\n            kasi.append(self.__pakka.pop())\n        return kasi

Seuraava koodi testaa luokkaa:

korttipakka = Korttipakka()\nkasi1 = korttipakka.jaa(5)\nprint(kasi1)\nkasi2 = korttipakka.jaa(5)\nprint(kasi2)

Ohjelma tulostaa esimerkiksi

[('pata', 7), ('pata', 11), ('hertta', 7), ('ruutu', 3), ('pata', 4)]\n[('risti', 8), ('pata', 12), ('ruutu', 13), ('risti', 11), ('pata', 10)]

Piilotettuja metodeja tarvitaan yleensä harvemmin kuin piilotettuja attribuutteja. Metodi kannattaa piilottaa, jos asiakas ei tarvitse siihen suoraa pääsyä, ja varsinkin silloin, jos on todennäköistä, että asiakas voisi sotkea olion sisäisen eheyden metodia kutsumalla.

Kirjoita luokka Pankkitili, joka mallintaa pankkitiliä. Luokalla tulee olla

    \n
  • konstruktori, joka saa parametrikseen tilinomistajan (str), tilinumeron (str) ja saldon (float)
  • \n
  • metodi talleta(summa: float), jolla tilille voidaan tallettaa rahaa
  • \n
  • metodi nosta(summa: float), joka nostaa tililtä rahasumman
  • \n
  • havainnointimetodi saldo, joka palauttaa tilin saldon
  • \n

Lisäksi luokalla on yksityinen metodi

    \n
  • __palvelumaksu(), joka vähentää tililtä yhden prosentin rahaa. Luokassa kutsutaan tätä metodia aina, kun asiakas kutsuu jompaa kumpaa metodeista talleta tai nosta. Prosentti vähennetään aina varsinaisen operaation jälkeen (eli. esimerkiksi vasta sitten, kun rahat on talletettu).
  • \n

Kaikki luokan attribuutit ovat yksityisiä.

Esimerkki luokan käytöstä:

tili = Pankkitili(\"Raimo Rahakas\", \"12345-6789\", 1000)\ntili.nosta(100)\nprint(tili.saldo)\ntili.talleta(100)\nprint(tili.saldo)\n

891.0\n981.09

","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-9/4-metodien-nakyvyys.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät, miten metodin näkyvyys määritellään Pythonissa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat kirjoittaa piilotettuja metodeita"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokassa olevien metodien näkyvyyteen voidaan vaikuttaa samalla tavalla kuin attribuuttien näkyvyyteen. Jos metodin nimi alkaa kahdella alaviivalla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__"}]},{"type":"text","value":", metodi ei ole näkyvissä asiakkaille."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Käytännössä mekanismia käytetään hiukan eri tavalla: piilotettujen attribuuttien käyttöä varten kirjoitetaan usein julkiset havainnointi- ja asetusmetodit. Piilotettu metodi on kuitenkin yleensä tarkoitettu vain luokan sisäiseen käyttöön, apumetodiksi asiakkaalta piilotettujen operaatioiden toteuttamiseksi."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Piilotettua metodia voidaan kutsua luokan sisällä normaalisti, mutta kutsuttaessa pitää muistaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":"-aluke. Tarkastellaan esimerkkinä sähköpostin vastaanottajaa mallintavaa luokkaa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Vastaanottaja"}]},{"type":"text","value":", jossa yksityistä apumetodia käytetään tarkistamaan sähköpostiosoitteen oikeellisuus:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Vastaanottaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tarkasta_sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__sposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sposti\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sähköposti ei kelpaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__tarkasta_sposti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Yksinkertainen tarkastus: osoitteessa on yli 5 merkkiä ja piste ja @-merkki"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\".\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sposti "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"@\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sposti"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos asiakas yrittää kutsua metodia, seuraa virhe:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"pertti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Vastaanottaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pertti Keinonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pertti@example.com\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npertti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tarkasta_sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"jokumuu@example.com\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"AttributeError: 'Vastaanottaja' object has no attribute '__tarkasta_sposti'"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Samaa apumetodia kannattaa kutsua myös sähköpostia asettaessa - lisätään siis luokkaan esimerkin vuoksi havainnointi- ja asetusmetodit sähköpostille:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Vastaanottaja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tarkasta_sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__sposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sposti\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sähköposti ei kelpaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__tarkasta_sposti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Yksinkertainen tarkastus: osoitteessa on yli 5 merkkiä ja piste ja @-merkki"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\".\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sposti "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"@\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" sposti\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"sposti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__sposti\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"sposti"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tarkasta_sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sposti"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__sposti "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" sposti\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Sähköposti ei kelpaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan sitten toista esimerkkiä. Luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Korttipakka"}]},{"type":"text","value":" mallintaa nimensä mukaisesti 52 kortin korttipakkaa. Apumetodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__alusta_pakka"}]},{"type":"text","value":" luo uuden sekoitetun pakan oliota luotaessa. Vastaava alustus voitaisiin toki tehdä myös metodissa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__init__"}]},{"type":"text","value":", mutta erillisen apumetodin käyttö tekee koodista siistimpää ja mahdollistaa alustusmetodin kutsumisen myös muualta luokasta tarvittaessa."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"from"}]},{"type":"text","value":" random "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" shuffle\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Korttipakka"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__alusta_pakka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__alusta_pakka"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__pakka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Laitetaan kaikki kortit pakkaan"}]},{"type":"text","value":"\n maat "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"pata\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"hertta\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"risti\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"ruutu\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" maa "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" maat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" numero "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"14"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__pakka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Sekoitetaan pakka"}]},{"type":"text","value":"\n shuffle"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__pakka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"jaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" korttien_maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n kasi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Siirretään pakasta ylimmät kortit käteen"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"range"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"korttien_maara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n kasi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__pakka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pop"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" kasi"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraava koodi testaa luokkaa:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"korttipakka "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Korttipakka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkasi1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" korttipakka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"jaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kasi1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkasi2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" korttipakka"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"jaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kasi2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelma tulostaa esimerkiksi"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"[('pata', 7), ('pata', 11), ('hertta', 7), ('ruutu', 3), ('pata', 4)]\n[('risti', 8), ('pata', 12), ('ruutu', 13), ('risti', 11), ('pata', 10)]"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Piilotettuja metodeja tarvitaan yleensä harvemmin kuin piilotettuja attribuutteja. Metodi kannattaa piilottaa, jos asiakas ei tarvitse siihen suoraa pääsyä, ja varsinkin silloin, jos on todennäköistä, että asiakas voisi sotkea olion sisäisen eheyden metodia kutsumalla."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Palvelumaksu","tmcname":"osa09-12_palvelumaksu"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Pankkitili"}]},{"type":"text","value":", joka mallintaa pankkitiliä. Luokalla tulee olla"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"konstruktori, joka saa parametrikseen tilinomistajan (str), tilinumeron (str) ja saldon (float)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"talleta(summa: float)"}]},{"type":"text","value":", jolla tilille voidaan tallettaa rahaa"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nosta(summa: float)"}]},{"type":"text","value":", joka nostaa tililtä rahasumman"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"havainnointimetodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"saldo"}]},{"type":"text","value":", joka palauttaa tilin saldon"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisäksi luokalla on yksityinen metodi"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__palvelumaksu()"}]},{"type":"text","value":", joka vähentää tililtä yhden prosentin rahaa. Luokassa kutsutaan tätä metodia aina, kun asiakas kutsuu jompaa kumpaa metodeista "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"talleta"}]},{"type":"text","value":" tai "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nosta"}]},{"type":"text","value":". Prosentti vähennetään aina varsinaisen operaation jälkeen (eli. esimerkiksi vasta sitten, kun rahat on talletettu)."}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kaikki luokan attribuutit ovat yksityisiä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkki luokan käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Pankkitili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Raimo Rahakas\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345-6789\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nosta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"talleta"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"891.0\n981.09"}]}]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tiedät, miten metodin näkyvyys määritellään Pythonissa
  • \n
  • Osaat kirjoittaa piilotettuja metodeita
  • \n

Luokassa olevien metodien näkyvyyteen voidaan vaikuttaa samalla tavalla kuin attribuuttien näkyvyyteen. Jos metodin nimi alkaa kahdella alaviivalla __, metodi ei ole näkyvissä asiakkaille.

Käytännössä mekanismia käytetään hiukan eri tavalla: piilotettujen attribuuttien käyttöä varten kirjoitetaan usein julkiset havainnointi- ja asetusmetodit. Piilotettu metodi on kuitenkin yleensä tarkoitettu vain luokan sisäiseen käyttöön, apumetodiksi asiakkaalta piilotettujen operaatioiden toteuttamiseksi.

Piilotettua metodia voidaan kutsua luokan sisällä normaalisti, mutta kutsuttaessa pitää muistaa self-aluke. Tarkastellaan esimerkkinä sähköpostin vastaanottajaa mallintavaa luokkaa Vastaanottaja, jossa yksityistä apumetodia käytetään tarkistamaan sähköpostiosoitteen oikeellisuus:

class Vastaanottaja:\n    def __init__(self, nimi: str, sposti: str):\n        self.__nimi = nimi\n        if self.__tarkasta_sposti(sposti):\n            self.__sposti = sposti\n        else:\n            raise ValueError(\"Sähköposti ei kelpaa\")\n\n    def __tarkasta_sposti(self, sposti: str):\n        # Yksinkertainen tarkastus: osoitteessa on yli 5 merkkiä ja piste ja @-merkki\n        return len(sposti) > 5 and \".\" in sposti and \"@\" in sposti

Jos asiakas yrittää kutsua metodia, seuraa virhe:

pertti = Vastaanottaja(\"Pertti Keinonen\", \"pertti@example.com\")\npertti.__tarkasta_sposti(\"jokumuu@example.com\")

AttributeError: 'Vastaanottaja' object has no attribute '__tarkasta_sposti'

Samaa apumetodia kannattaa kutsua myös sähköpostia asettaessa - lisätään siis luokkaan esimerkin vuoksi havainnointi- ja asetusmetodit sähköpostille:

class Vastaanottaja:\n    def __init__(self, nimi: str, sposti: str):\n        self.__nimi = nimi\n        if self.__tarkasta_sposti(sposti):\n            self.__sposti = sposti\n        else:\n            raise ValueError(\"Sähköposti ei kelpaa\")\n\n    def __tarkasta_sposti(self, sposti: str):\n        # Yksinkertainen tarkastus: osoitteessa on yli 5 merkkiä ja piste ja @-merkki\n        return len(sposti) > 5 and \".\" in sposti and \"@\" in sposti\n\n    @property\n    def sposti(self):\n        return self.__sposti\n\n    @sposti.setter\n    def sposti(self, sposti: str):\n        if self.__tarkasta_sposti(sposti):\n            self.__sposti = sposti\n        else:\n            raise ValueError(\"Sähköposti ei kelpaa\")

Tarkastellaan sitten toista esimerkkiä. Luokka Korttipakka mallintaa nimensä mukaisesti 52 kortin korttipakkaa. Apumetodi __alusta_pakka luo uuden sekoitetun pakan oliota luotaessa. Vastaava alustus voitaisiin toki tehdä myös metodissa __init__, mutta erillisen apumetodin käyttö tekee koodista siistimpää ja mahdollistaa alustusmetodin kutsumisen myös muualta luokasta tarvittaessa.

from random import shuffle\n\nclass Korttipakka:\n    def __init__(self):\n        self.__alusta_pakka()\n\n    def __alusta_pakka(self):\n        self.__pakka = []\n        # Laitetaan kaikki kortit pakkaan\n        maat = [\"pata\", \"hertta\", \"risti\", \"ruutu\"]\n        for maa in maat:\n            for numero in range(1, 14):\n                self.__pakka.append((maa, numero))\n        # Sekoitetaan pakka\n        shuffle(self.__pakka)\n\n    def jaa(self, korttien_maara: int):\n        kasi = []\n        # Siirretään pakasta ylimmät kortit käteen\n        for i in range(korttien_maara):\n            kasi.append(self.__pakka.pop())\n        return kasi

Seuraava koodi testaa luokkaa:

korttipakka = Korttipakka()\nkasi1 = korttipakka.jaa(5)\nprint(kasi1)\nkasi2 = korttipakka.jaa(5)\nprint(kasi2)

Ohjelma tulostaa esimerkiksi

[('pata', 7), ('pata', 11), ('hertta', 7), ('ruutu', 3), ('pata', 4)]\n[('risti', 8), ('pata', 12), ('ruutu', 13), ('risti', 11), ('pata', 10)]

Piilotettuja metodeja tarvitaan yleensä harvemmin kuin piilotettuja attribuutteja. Metodi kannattaa piilottaa, jos asiakas ei tarvitse siihen suoraa pääsyä, ja varsinkin silloin, jos on todennäköistä, että asiakas voisi sotkea olion sisäisen eheyden metodia kutsumalla.

Kirjoita luokka Pankkitili, joka mallintaa pankkitiliä. Luokalla tulee olla

    \n
  • konstruktori, joka saa parametrikseen tilinomistajan (str), tilinumeron (str) ja saldon (float)
  • \n
  • metodi talleta(summa: float), jolla tilille voidaan tallettaa rahaa
  • \n
  • metodi nosta(summa: float), joka nostaa tililtä rahasumman
  • \n
  • havainnointimetodi saldo, joka palauttaa tilin saldon
  • \n

Lisäksi luokalla on yksityinen metodi

    \n
  • __palvelumaksu(), joka vähentää tililtä yhden prosentin rahaa. Luokassa kutsutaan tätä metodia aina, kun asiakas kutsuu jompaa kumpaa metodeista talleta tai nosta. Prosentti vähennetään aina varsinaisen operaation jälkeen (eli. esimerkiksi vasta sitten, kun rahat on talletettu).
  • \n

Kaikki luokan attribuutit ovat yksityisiä.

Esimerkki luokan käytöstä:

tili = Pankkitili(\"Raimo Rahakas\", \"12345-6789\", 1000)\ntili.nosta(100)\nprint(tili.saldo)\ntili.talleta(100)\nprint(tili.saldo)\n

891.0\n981.09

","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-9/4-metodien-nakyvyys.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-9/5-staattiset-piirteet/page-data.json b/page-data/osa-9/5-staattiset-piirteet/page-data.json index 96e621dbe..e4441ff2d 100644 --- a/page-data/osa-9/5-staattiset-piirteet/page-data.json +++ b/page-data/osa-9/5-staattiset-piirteet/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-9/5-staattiset-piirteet", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ymmärrät käsitteet luokkamuuttuja ja luokkametodi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät miten staattiset piirteet eroavat olioiden piirteistä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat lisätä staattisia piirteitä omiin luokkiin"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olio-ohjelmoinnissa puhutaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"piirteistä"}]},{"type":"text","value":". Näillä tarkoitetaan olion ominaisuuksia: luokan sisälle kirjoitettuja metodeja ja luokassa määriteltyjä muuttujia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tähän mennessä olemme käsitelleen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"olioiden piirteitä"}]},{"type":"text","value":" eli oliometodeita ja attribuutteja. Olio-ohjelmointiin kuuluvat kuitenkin myös "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"luokan piirteet"}]},{"type":"text","value":", joita kutsutaan usein myös "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"staattisiksi piirteiksi"}]},{"type":"text","value":". Myös käsitettä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"luokkamuuttuja"}]},{"type":"text","value":" käytetään."}]},{"type":"element","tagName":"h2","properties":{"id":"luokkamuuttujat","style":"position:relative;"},"children":[{"type":"text","value":"Luokkamuuttujat"},{"type":"element","tagName":"a","properties":{"href":"#luokkamuuttujat","ariaLabel":"luokkamuuttujat permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten on aiemmin opittu, jokaisella oliolla on omat itsenäiset arvonsa attribuuteille. Attribuuttien lisäksi luokassa voidaan määritellä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"luokkamuuttujia"}]},{"type":"text","value":" eli staattisia muuttujia. Luokkamuuttujalla tarkoitetaan muuttujaa, jota käytetään luokan kautta eikä luokasta muodostettujen olioiden kautta. Luokkamuuttujalla on yksi yhteinen arvo riippumatta siitä, montako oliota luokasta muodostetaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkamuuttujan määrittely eroaa attribuutista siinä, että se määritellään ilman "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":"-aluketta. Jos luokkamuuttujaa halutaan käyttää koko luokassa ja mahdollisesti luokan ulkopuoleltakin, se tulee määritellä metodien ulkopuolella."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Korkotili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n yleiskorko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.03"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilinumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" korko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tilinumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tilinumero\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__korko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" korko\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_korko"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Korko on yleiskorko + tilin korko"}]},{"type":"text","value":"\n korko_yhteensa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Korkotili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yleiskorko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__korko\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" korko_yhteensa\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"saldo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska yleiskorko on määritelty luokassa eikä metodin sisällä eikä sen alustuksessa ole käytetty "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":"-aluketta, se on luokkamuuttuja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkamuuttujaan viitataan luokan nimen avulla, esimerkiksi näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Yleiskorko on olioista riippumaton"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Yleiskorko on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" Korkotili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yleiskorko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Korkotili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.05"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Lisätään kokonaiskorko saldoon"}]},{"type":"text","value":"\ntili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_korko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yleiskorko on 0.03\n1080.0"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkamuuttujiin viitataan siis luokan nimen avulla, esimerkiksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Korkotili.yleiskorko"}]},{"type":"text","value":", ja oliomuuttujiin eli attribuutteihin olion nimen avulla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tili.saldo"}]},{"type":"text","value":". Oliomuuttujiin voi luonnollisesti viitata vasta, kun luokasta on muodostettu olio."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkamuuttujaa on kätevä käyttää, kun halutaan tallentaa arvoja, jotka on jaettu kaikkien olioiden kesken. Edellisessä esimerkissä oletetaan, että kaikilla pankkitileillä on sama yleiskorkoprosentti, jonka lisäksi tilille voidaan erikseen määrittää oma korkoprosenttinsa. Yleiskorkokin voi muuttua, mutta muutos vaikuttaa kaikkiin luokasta muodostettuihin olioihin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Korkotili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n yleiskorko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.03"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilinumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" korko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tilinumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tilinumero\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__korko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" korko\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_korko"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Korko on yleiskorko + tilin korko"}]},{"type":"text","value":"\n korko_yhteensa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Korkotili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yleiskorko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__korko\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" korko_yhteensa\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"saldo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kokonaiskorko"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__korko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" Korkotili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yleiskorko"}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tili1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Korkotili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.03"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntili2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Korkotili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"54321\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"200"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.06"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Yleiskorko:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" Korkotili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yleiskorko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tili1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kokonaiskorko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tili2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kokonaiskorko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Nostetaan yleiskorko 10 prosenttiin"}]},{"type":"text","value":"\nKorkotili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yleiskorko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.10"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Yleiskorko:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" Korkotili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yleiskorko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tili1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kokonaiskorko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tili2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kokonaiskorko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yleiskorko: 0.03\n0.06\n0.09\nYleiskorko: 0.1\n0.13\n0.16"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun yleiskorko nousee, kaikkien luokasta määriteltyjen tilien kokonaiskorko nousee. Huomaa, että kokonaiskorko on määritelty havainnointimetodiksi, vaikkei vastaavaa attribuuttia olekaan suoraan määritelty. Metodi palauttaa tilin koron ja yleiskoron summan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan vielä toista esimerkkiä. Luokassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Puhelinnumero"}]},{"type":"text","value":" on maatunnukset tallennettuna sanakirjaan. Lista maatunnuksista on yhteinen kaikille luokasta luoduille puhelinnumero-olioille, koska maatunnus saman maan puhelinnumeroille on aina sama."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Puhelinnumero"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n maatunnukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suomi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"+358\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ruotsi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"+46\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Yhdysvallat\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"+1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__puhelinnumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" puhelinnumero\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__maa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" maa\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"puhelinnumero"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Puhelinnumerosta jää etunolla pois, kun maatunnus lisätään alkuun"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" Puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maatunnukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"paulan_nro "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Paula Pythonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"050 1234 567\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suomi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"paulan_nro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"+358 50 1234 567"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun puhelinnumero-olio luodaan, tallennetaan nimen ja numeron lisäksi maa. Kun numero haetaan havainnointimetodilla, haetaan numeron eteen maatunnus luokkamuuttujasta olion attribuuttiin tallennetun maatiedon avulla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkiluokka on toiminnallisuudeltaan melko vajavainen. Katsotaan vielä, miltä näyttäisi parempi toteutus, jossa on havainnointi- ja asetusmetodit eri attribuuteille:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Puhelinnumero"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n maatunnukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suomi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"+358\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ruotsi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"+46\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Yhdysvallat\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"+1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tämä kutsuu metodia puhelinnumero.setter"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"puhelinnumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" puhelinnumero\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tämä kutsuu metodia maa.setter"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" maa\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Havainnointimetodissa yhdistetään maatunnus ja puhelinnumero"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"puhelinnumero"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Puhelinnumerosta jää etunolla pois, kun maatunnus lisätään alkuun"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" Puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maatunnukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"puhelinnumero"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Varmistetaan, että puhelinnumerossa on vain numeroita ja välilyöntejä"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1234567890 \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Puhelinnumero saa sisältää vain lukuja ja välilyöntejä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__puhelinnumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" numero\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Pelkkä puhelinnumero ilman maatunnusta"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"paikallinen_numero"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__puhelinnumero\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"maa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__maa\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"maa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Varmistetaan, että maa on maatunnusten listalla"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" maa "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" Puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maatunnukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Annettua maata ei löydy listalta.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__maa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" maa\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"nimi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"nimi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n pnro "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pertti Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"040 111 1111\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ruotsi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pnro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pnro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pnro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paikallinen_numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"+46 40 111 1111 (Pertti Python)\n+46 40 111 1111\n040 111 1111"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Postinumerot","tmcname":"osa09-13_postinumerot"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on määritelty luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kaupunki"}]},{"type":"text","value":", joka mallintaa yksittäistä kaupunkia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisää luokkaan luokkamuuttuja postinumerot, joka viittaa sanakirjaan. Sanakirjassa jokainen avain on kaupungin nimi ja arvo postinumero. Molemmat ovat merkkijonoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanakirjasta tulee löytyä seuraavat postinumerot:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Helsinki 00100"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Turku 20100"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tampere 33100"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Jyväskylä 40100"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Oulu 90100"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuta toiminnallisuutta ei tarvitse toteuttaa."}]}]},{"type":"element","tagName":"h2","properties":{"id":"luokkametodit","style":"position:relative;"},"children":[{"type":"text","value":"Luokkametodit"},{"type":"element","tagName":"a","properties":{"href":"#luokkametodit","ariaLabel":"luokkametodit permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkametodi eli staattinen metodi on luokassa oleva metodi, jota ei ole sidottu mihinkään luokasta muodostettuun olioon. Niinpä luokkametodia voi kutsua ilman, että luokasta muodostetaan oliota."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkametodit ovat yleensä työkalumetodeja, jotka liittyvät jotenkin luokkaan mutta joita on tarkoituksenmukaista kutsua ilman olion muodostamista. Luokkametodit ovat yleensä julkisia, jolloin niitä voidaan kutsua sekä luokan ulkopuolelta että luokan ja siitä muodostettujen olioiden sisältä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkametodi merkitään annotaatiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"@classmethod"}]},{"type":"text","value":" ja sen ensimmäinen parametri on aina "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"cls"}]},{"type":"text","value":". Tunnistetta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"cls"}]},{"type":"text","value":" käytetään samaan tapaan kuin tunnistetta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":", mutta erotuksena on, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"cls"}]},{"type":"text","value":" viittaa luokkaan ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":" viittaa olioon. Kummallekaan parametrille ei anneta kutsuessa arvoa, vaan Python tekee sen automaattisesti."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi luokassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Rekisteriote"}]},{"type":"text","value":" voisi olla staattinen metodi, jolla voidaan tarkistaa, onko annettu rekisteritunnus oikeamuotoinen. Metodi on staattinen, jotta tunnuksen voi tarkastaa myös ilman, että luodaan uutta oliota luokasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Rekisteriote"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" omistaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" merkki"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" rekisteritunnus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" omistaja\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__merkki "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" merkki\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__vuosi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" vuosi\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kutsutaan metodia rekisteritunnus.setter"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rekisteritunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rekisteritunnus\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"rekisteritunnus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__rekisteritunnus\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@rekisteritunnus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"rekisteritunnus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tunnus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" Rekisteriote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rekisteritunnus_kelpaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tunnus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__rekisteritunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tunnus\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Rekisteritunnus ei kelpaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luokkametodi tunnuksen validoimiseksi"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@classmethod"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"rekisteritunnus_kelpaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"cls"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tunnus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tunnus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"or"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"-\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tunnus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tarkastellaan alku- ja loppuosaa erikseen"}]},{"type":"text","value":"\n alku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" loppu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tunnus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"-\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Alkuosassa saa olla vain kirjaimia"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" alku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" merkki"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lower"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"abcdefghijklmnopqrstuvwxyzåäö\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Loppuosassa saa olla vain numeroita"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" loppu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1234567890\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ote "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Rekisteriote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto Autoilija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Volvo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1992\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"abc-123\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" Rekisteriote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rekisteritunnus_kelpaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"xyz-789\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tämä on validi tunnus!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä on validi tunnus!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rekisteriotteen oikeellisuuden voi tarkistaa kutsumalla metodia (esimerkiksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Rekisteriote.rekisteritunnus_kelpaa(\"xyz-789\"))"}]},{"type":"text","value":") ilman, että muodostaa luokasta oliota. Samaa metodia kutsutaan myös uutta oliota muodostaessa luokan konstruktorista. Huomaa kuitenkin, että myös tässä kutsussa viitataan metodiin luokan nimen avulla eikä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":"-tunnisteella!"}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Lista-apuri","tmcname":"osa09-14_lista_apuri"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ListaApuri"}]},{"type":"text","value":", jossa on seuraavat kaksi luokkametodia:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suurin_frekvenssi(lista: list)"}]},{"type":"text","value":" palauttaa alkion, jota esiintyy annetussa listassa eniten"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tuplia(lista: list)"}]},{"type":"text","value":" palauttaa sellaisten alkioden lukumäärän, jotka esiintyvät listassa vähintään kahdesti"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodeja tulee voida käyttää ilman, että luokasta luodaan oliota. Esimerkki luokan käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ListaApuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"suurin_frekvenssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ListaApuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tuplia"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"5\n3"}]}]}]}]},"html":"

Tämän osion jälkeen:

    \n
  • Ymmärrät käsitteet luokkamuuttuja ja luokkametodi
  • \n
  • Tiedät miten staattiset piirteet eroavat olioiden piirteistä
  • \n
  • Osaat lisätä staattisia piirteitä omiin luokkiin
  • \n

Olio-ohjelmoinnissa puhutaan piirteistä. Näillä tarkoitetaan olion ominaisuuksia: luokan sisälle kirjoitettuja metodeja ja luokassa määriteltyjä muuttujia.

Tähän mennessä olemme käsitelleen olioiden piirteitä eli oliometodeita ja attribuutteja. Olio-ohjelmointiin kuuluvat kuitenkin myös luokan piirteet, joita kutsutaan usein myös staattisiksi piirteiksi. Myös käsitettä luokkamuuttuja käytetään.

Luokkamuuttujat

Kuten on aiemmin opittu, jokaisella oliolla on omat itsenäiset arvonsa attribuuteille. Attribuuttien lisäksi luokassa voidaan määritellä luokkamuuttujia eli staattisia muuttujia. Luokkamuuttujalla tarkoitetaan muuttujaa, jota käytetään luokan kautta eikä luokasta muodostettujen olioiden kautta. Luokkamuuttujalla on yksi yhteinen arvo riippumatta siitä, montako oliota luokasta muodostetaan.

Luokkamuuttujan määrittely eroaa attribuutista siinä, että se määritellään ilman self-aluketta. Jos luokkamuuttujaa halutaan käyttää koko luokassa ja mahdollisesti luokan ulkopuoleltakin, se tulee määritellä metodien ulkopuolella.

class Korkotili:\n    yleiskorko = 0.03\n\n    def __init__(self, tilinumero: str, saldo: float, korko: float):\n        self.__tilinumero = tilinumero\n        self.__saldo = saldo\n        self.__korko = korko\n\n    def lisaa_korko(self):\n        # Korko on yleiskorko + tilin korko\n        korko_yhteensa = Korkotili.yleiskorko + self.__korko\n        self.__saldo += self.__saldo * korko_yhteensa\n\n    @property\n    def saldo(self):\n        return self.__saldo

Koska yleiskorko on määritelty luokassa eikä metodin sisällä eikä sen alustuksessa ole käytetty self-aluketta, se on luokkamuuttuja.

Luokkamuuttujaan viitataan luokan nimen avulla, esimerkiksi näin:

# Yleiskorko on olioista riippumaton\nprint(\"Yleiskorko on\", Korkotili.yleiskorko)\n\ntili = Korkotili(\"12345\", 1000, 0.05)\n# Lisätään kokonaiskorko saldoon\ntili.lisaa_korko()\nprint(tili.saldo)

Yleiskorko on 0.03\n1080.0

Luokkamuuttujiin viitataan siis luokan nimen avulla, esimerkiksi Korkotili.yleiskorko, ja oliomuuttujiin eli attribuutteihin olion nimen avulla tili.saldo. Oliomuuttujiin voi luonnollisesti viitata vasta, kun luokasta on muodostettu olio.

Luokkamuuttujaa on kätevä käyttää, kun halutaan tallentaa arvoja, jotka on jaettu kaikkien olioiden kesken. Edellisessä esimerkissä oletetaan, että kaikilla pankkitileillä on sama yleiskorkoprosentti, jonka lisäksi tilille voidaan erikseen määrittää oma korkoprosenttinsa. Yleiskorkokin voi muuttua, mutta muutos vaikuttaa kaikkiin luokasta muodostettuihin olioihin:

class Korkotili:\n    yleiskorko = 0.03\n\n    def __init__(self, tilinumero: str, saldo: float, korko: float):\n        self.__tilinumero = tilinumero\n        self.__saldo = saldo\n        self.__korko = korko\n\n    def lisaa_korko(self):\n        # Korko on yleiskorko + tilin korko\n        korko_yhteensa = Korkotili.yleiskorko + self.__korko\n        self.__saldo += self.__saldo * korko_yhteensa\n\n    @property\n    def saldo(self):\n        return self.__saldo\n\n    @property\n    def kokonaiskorko(self):\n        return self.__korko + Korkotili.yleiskorko
tili1 = Korkotili(\"12345\", 100, 0.03)\ntili2 = Korkotili(\"54321\", 200, 0.06)\n\nprint(\"Yleiskorko:\", Korkotili.yleiskorko)\nprint(tili1.kokonaiskorko)\nprint(tili2.kokonaiskorko)\n\n# Nostetaan yleiskorko 10 prosenttiin\nKorkotili.yleiskorko = 0.10\n\nprint(\"Yleiskorko:\", Korkotili.yleiskorko)\nprint(tili1.kokonaiskorko)\nprint(tili2.kokonaiskorko)

Yleiskorko: 0.03\n0.06\n0.09\nYleiskorko: 0.1\n0.13\n0.16

Kun yleiskorko nousee, kaikkien luokasta määriteltyjen tilien kokonaiskorko nousee. Huomaa, että kokonaiskorko on määritelty havainnointimetodiksi, vaikkei vastaavaa attribuuttia olekaan suoraan määritelty. Metodi palauttaa tilin koron ja yleiskoron summan.

Tarkastellaan vielä toista esimerkkiä. Luokassa Puhelinnumero on maatunnukset tallennettuna sanakirjaan. Lista maatunnuksista on yhteinen kaikille luokasta luoduille puhelinnumero-olioille, koska maatunnus saman maan puhelinnumeroille on aina sama.

class Puhelinnumero:\n    maatunnukset = {\"Suomi\": \"+358\", \"Ruotsi\": \"+46\", \"Yhdysvallat\": \"+1\"}\n\n    def __init__(self, nimi: str, puhelinnumero: str, maa: str):\n        self.__nimi = nimi\n        self.__puhelinnumero = puhelinnumero\n        self.__maa = maa\n\n    @property\n    def puhelinnumero(self):\n        # Puhelinnumerosta jää etunolla pois, kun maatunnus lisätään alkuun\n        return Puhelinnumero.maatunnukset[self.__maa] + \" \" + self.__puhelinnumero[1:]
paulan_nro = Puhelinnumero(\"Paula Pythonen\", \"050 1234 567\", \"Suomi\")\nprint(paulan_nro.puhelinnumero)

+358 50 1234 567

Kun puhelinnumero-olio luodaan, tallennetaan nimen ja numeron lisäksi maa. Kun numero haetaan havainnointimetodilla, haetaan numeron eteen maatunnus luokkamuuttujasta olion attribuuttiin tallennetun maatiedon avulla.

Esimerkkiluokka on toiminnallisuudeltaan melko vajavainen. Katsotaan vielä, miltä näyttäisi parempi toteutus, jossa on havainnointi- ja asetusmetodit eri attribuuteille:

class Puhelinnumero:\n    maatunnukset = {\"Suomi\": \"+358\", \"Ruotsi\": \"+46\", \"Yhdysvallat\": \"+1\"}\n\n    def __init__(self, nimi: str, puhelinnumero: str, maa: str):\n        self.__nimi = nimi\n        # Tämä kutsuu metodia puhelinnumero.setter\n        self.puhelinnumero = puhelinnumero\n        # Tämä kutsuu metodia maa.setter\n        self.maa = maa\n\n    # Havainnointimetodissa yhdistetään maatunnus ja puhelinnumero\n    @property\n    def puhelinnumero(self):\n        # Puhelinnumerosta jää etunolla pois, kun maatunnus lisätään alkuun\n        return Puhelinnumero.maatunnukset[self.__maa] + \" \" + self.__puhelinnumero[1:]\n\n    @puhelinnumero.setter\n    def puhelinnumero(self, numero):\n        # Varmistetaan, että puhelinnumerossa on vain numeroita ja välilyöntejä\n        for merkki in numero:\n            if merkki not in \"1234567890 \":\n                raise ValueError(\"Puhelinnumero saa sisältää vain lukuja ja välilyöntejä\")\n        self.__puhelinnumero = numero\n\n    # Pelkkä puhelinnumero ilman maatunnusta\n    @property\n    def paikallinen_numero(self):\n        return self.__puhelinnumero\n\n    @property\n    def maa(self):\n        return self.__maa\n\n    @maa.setter\n    def maa(self, maa):\n        # Varmistetaan, että maa on maatunnusten listalla\n        if maa not in Puhelinnumero.maatunnukset:\n            raise ValueError(\"Annettua maata ei löydy listalta.\")\n        self.__maa = maa\n\n    @property\n    def nimi(self):\n        return self.__nimi\n\n    @nimi.setter\n    def nimi(self, nimi):\n        self.__nimi = nimi\n\n    def __str__(self):\n        return f\"{self.puhelinnumero} ({self.__nimi})\"
if __name__ == \"__main__\":\n    pnro = Puhelinnumero(\"Pertti Python\", \"040 111 1111\", \"Ruotsi\")\n    print(pnro)\n    print(pnro.puhelinnumero)\n    print(pnro.paikallinen_numero)

+46 40 111 1111 (Pertti Python)\n+46 40 111 1111\n040 111 1111

Tehtäväpohjassa on määritelty luokka Kaupunki, joka mallintaa yksittäistä kaupunkia.

Lisää luokkaan luokkamuuttuja postinumerot, joka viittaa sanakirjaan. Sanakirjassa jokainen avain on kaupungin nimi ja arvo postinumero. Molemmat ovat merkkijonoja.

Sanakirjasta tulee löytyä seuraavat postinumerot:

    \n
  • Helsinki 00100
  • \n
  • Turku 20100
  • \n
  • Tampere 33100
  • \n
  • Jyväskylä 40100
  • \n
  • Oulu 90100
  • \n

Muuta toiminnallisuutta ei tarvitse toteuttaa.

Luokkametodit

Luokkametodi eli staattinen metodi on luokassa oleva metodi, jota ei ole sidottu mihinkään luokasta muodostettuun olioon. Niinpä luokkametodia voi kutsua ilman, että luokasta muodostetaan oliota.

Luokkametodit ovat yleensä työkalumetodeja, jotka liittyvät jotenkin luokkaan mutta joita on tarkoituksenmukaista kutsua ilman olion muodostamista. Luokkametodit ovat yleensä julkisia, jolloin niitä voidaan kutsua sekä luokan ulkopuolelta että luokan ja siitä muodostettujen olioiden sisältä.

Luokkametodi merkitään annotaatiolla @classmethod ja sen ensimmäinen parametri on aina cls. Tunnistetta cls käytetään samaan tapaan kuin tunnistetta self, mutta erotuksena on, että cls viittaa luokkaan ja self viittaa olioon. Kummallekaan parametrille ei anneta kutsuessa arvoa, vaan Python tekee sen automaattisesti.

Esimerkiksi luokassa Rekisteriote voisi olla staattinen metodi, jolla voidaan tarkistaa, onko annettu rekisteritunnus oikeamuotoinen. Metodi on staattinen, jotta tunnuksen voi tarkastaa myös ilman, että luodaan uutta oliota luokasta:

class Rekisteriote:\n    def __init__(self, omistaja: str, merkki: str, vuosi: int, rekisteritunnus: str):\n        self.__omistaja = omistaja\n        self.__merkki = merkki\n        self.__vuosi = vuosi\n\n        # Kutsutaan metodia rekisteritunnus.setter\n        self.rekisteritunnus = rekisteritunnus\n\n    @property\n    def rekisteritunnus(self):\n        return self.__rekisteritunnus\n\n    @rekisteritunnus.setter\n    def rekisteritunnus(self, tunnus):\n        if Rekisteriote.rekisteritunnus_kelpaa(tunnus):\n            self.__rekisteritunnus = tunnus\n        else:\n            raise ValueError(\"Rekisteritunnus ei kelpaa\")\n\n    # Luokkametodi tunnuksen validoimiseksi\n    @classmethod\n    def rekisteritunnus_kelpaa(cls, tunnus: str):\n        if len(tunnus) < 3 or \"-\" not in tunnus:\n            return False\n\n        # Tarkastellaan alku- ja loppuosaa erikseen\n        alku, loppu = tunnus.split(\"-\")\n\n        # Alkuosassa saa olla vain kirjaimia\n        for merkki in alku:\n            if merkki.lower() not in \"abcdefghijklmnopqrstuvwxyzåäö\":\n                return False\n\n        # Loppuosassa saa olla vain numeroita\n        for merkki in loppu:\n            if merkki not in \"1234567890\":\n                return False\n\n        return True
ote = Rekisteriote(\"Arto Autoilija\", \"Volvo\", \"1992\", \"abc-123\")\n\nif Rekisteriote.rekisteritunnus_kelpaa(\"xyz-789\"):\n    print(\"Tämä on validi tunnus!\")

Tämä on validi tunnus!

Rekisteriotteen oikeellisuuden voi tarkistaa kutsumalla metodia (esimerkiksi Rekisteriote.rekisteritunnus_kelpaa(\"xyz-789\"))) ilman, että muodostaa luokasta oliota. Samaa metodia kutsutaan myös uutta oliota muodostaessa luokan konstruktorista. Huomaa kuitenkin, että myös tässä kutsussa viitataan metodiin luokan nimen avulla eikä self-tunnisteella!

Kirjoita luokka ListaApuri, jossa on seuraavat kaksi luokkametodia:

    \n
  • Metodi suurin_frekvenssi(lista: list) palauttaa alkion, jota esiintyy annetussa listassa eniten
  • \n
  • Metodi tuplia(lista: list) palauttaa sellaisten alkioden lukumäärän, jotka esiintyvät listassa vähintään kahdesti
  • \n

Metodeja tulee voida käyttää ilman, että luokasta luodaan oliota. Esimerkki luokan käytöstä:

luvut = [1, 1, 2, 1, 3, 3, 4, 5, 5, 5, 6, 5, 5, 5]\nprint(ListaApuri.suurin_frekvenssi(luvut))\nprint(ListaApuri.tuplia(luvut))

5\n3

","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-9/5-staattiset-piirteet.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Ymmärrät käsitteet luokkamuuttuja ja luokkametodi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiedät miten staattiset piirteet eroavat olioiden piirteistä"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat lisätä staattisia piirteitä omiin luokkiin"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Olio-ohjelmoinnissa puhutaan "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"piirteistä"}]},{"type":"text","value":". Näillä tarkoitetaan olion ominaisuuksia: luokan sisälle kirjoitettuja metodeja ja luokassa määriteltyjä muuttujia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tähän mennessä olemme käsitelleen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"olioiden piirteitä"}]},{"type":"text","value":" eli oliometodeita ja attribuutteja. Olio-ohjelmointiin kuuluvat kuitenkin myös "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"luokan piirteet"}]},{"type":"text","value":", joita kutsutaan usein myös "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"staattisiksi piirteiksi"}]},{"type":"text","value":". Myös käsitettä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"luokkamuuttuja"}]},{"type":"text","value":" käytetään."}]},{"type":"element","tagName":"h2","properties":{"id":"luokkamuuttujat","style":"position:relative;"},"children":[{"type":"text","value":"Luokkamuuttujat"},{"type":"element","tagName":"a","properties":{"href":"#luokkamuuttujat","ariaLabel":"luokkamuuttujat permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kuten on aiemmin opittu, jokaisella oliolla on omat itsenäiset arvonsa attribuuteille. Attribuuttien lisäksi luokassa voidaan määritellä "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"luokkamuuttujia"}]},{"type":"text","value":" eli staattisia muuttujia. Luokkamuuttujalla tarkoitetaan muuttujaa, jota käytetään luokan kautta eikä luokasta muodostettujen olioiden kautta. Luokkamuuttujalla on yksi yhteinen arvo riippumatta siitä, montako oliota luokasta muodostetaan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkamuuttujan määrittely eroaa attribuutista siinä, että se määritellään ilman "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":"-aluketta. Jos luokkamuuttujaa halutaan käyttää koko luokassa ja mahdollisesti luokan ulkopuoleltakin, se tulee määritellä metodien ulkopuolella."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Korkotili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n yleiskorko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.03"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilinumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" korko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tilinumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tilinumero\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__korko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" korko\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_korko"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Korko on yleiskorko + tilin korko"}]},{"type":"text","value":"\n korko_yhteensa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Korkotili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yleiskorko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__korko\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" korko_yhteensa\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"saldo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Koska yleiskorko on määritelty luokassa eikä metodin sisällä eikä sen alustuksessa ole käytetty "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":"-aluketta, se on luokkamuuttuja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkamuuttujaan viitataan luokan nimen avulla, esimerkiksi näin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Yleiskorko on olioista riippumaton"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Yleiskorko on\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" Korkotili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yleiskorko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ntili "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Korkotili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.05"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Lisätään kokonaiskorko saldoon"}]},{"type":"text","value":"\ntili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_korko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yleiskorko on 0.03\n1080.0"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkamuuttujiin viitataan siis luokan nimen avulla, esimerkiksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Korkotili.yleiskorko"}]},{"type":"text","value":", ja oliomuuttujiin eli attribuutteihin olion nimen avulla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tili.saldo"}]},{"type":"text","value":". Oliomuuttujiin voi luonnollisesti viitata vasta, kun luokasta on muodostettu olio."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkamuuttujaa on kätevä käyttää, kun halutaan tallentaa arvoja, jotka on jaettu kaikkien olioiden kesken. Edellisessä esimerkissä oletetaan, että kaikilla pankkitileillä on sama yleiskorkoprosentti, jonka lisäksi tilille voidaan erikseen määrittää oma korkoprosenttinsa. Yleiskorkokin voi muuttua, mutta muutos vaikuttaa kaikkiin luokasta muodostettuihin olioihin:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Korkotili"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n yleiskorko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.03"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tilinumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" saldo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" korko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__tilinumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tilinumero\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" saldo\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__korko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" korko\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_korko"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Korko on yleiskorko + tilin korko"}]},{"type":"text","value":"\n korko_yhteensa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Korkotili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yleiskorko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__korko\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+="}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" korko_yhteensa\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"saldo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__saldo\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"kokonaiskorko"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__korko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" Korkotili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yleiskorko"}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"tili1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Korkotili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"100"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.03"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntili2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Korkotili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"54321\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"200"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.06"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Yleiskorko:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" Korkotili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yleiskorko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tili1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kokonaiskorko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tili2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kokonaiskorko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Nostetaan yleiskorko 10 prosenttiin"}]},{"type":"text","value":"\nKorkotili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yleiskorko "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0.10"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Yleiskorko:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" Korkotili"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yleiskorko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tili1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kokonaiskorko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tili2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"kokonaiskorko"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Yleiskorko: 0.03\n0.06\n0.09\nYleiskorko: 0.1\n0.13\n0.16"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun yleiskorko nousee, kaikkien luokasta määriteltyjen tilien kokonaiskorko nousee. Huomaa, että kokonaiskorko on määritelty havainnointimetodiksi, vaikkei vastaavaa attribuuttia olekaan suoraan määritelty. Metodi palauttaa tilin koron ja yleiskoron summan."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan vielä toista esimerkkiä. Luokassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Puhelinnumero"}]},{"type":"text","value":" on maatunnukset tallennettuna sanakirjaan. Lista maatunnuksista on yhteinen kaikille luokasta luoduille puhelinnumero-olioille, koska maatunnus saman maan puhelinnumeroille on aina sama."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Puhelinnumero"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n maatunnukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suomi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"+358\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ruotsi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"+46\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Yhdysvallat\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"+1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__puhelinnumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" puhelinnumero\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__maa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" maa\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"puhelinnumero"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Puhelinnumerosta jää etunolla pois, kun maatunnus lisätään alkuun"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" Puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maatunnukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"paulan_nro "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Paula Pythonen\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"050 1234 567\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suomi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"paulan_nro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"+358 50 1234 567"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kun puhelinnumero-olio luodaan, tallennetaan nimen ja numeron lisäksi maa. Kun numero haetaan havainnointimetodilla, haetaan numeron eteen maatunnus luokkamuuttujasta olion attribuuttiin tallennetun maatiedon avulla."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkkiluokka on toiminnallisuudeltaan melko vajavainen. Katsotaan vielä, miltä näyttäisi parempi toteutus, jossa on havainnointi- ja asetusmetodit eri attribuuteille:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Puhelinnumero"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n maatunnukset "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Suomi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"+358\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ruotsi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"+46\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Yhdysvallat\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"+1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tämä kutsuu metodia puhelinnumero.setter"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"puhelinnumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" puhelinnumero\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tämä kutsuu metodia maa.setter"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" maa\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Havainnointimetodissa yhdistetään maatunnus ja puhelinnumero"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"puhelinnumero"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Puhelinnumerosta jää etunolla pois, kun maatunnus lisätään alkuun"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" Puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maatunnukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\" \""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"puhelinnumero"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Varmistetaan, että puhelinnumerossa on vain numeroita ja välilyöntejä"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1234567890 \""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Puhelinnumero saa sisältää vain lukuja ja välilyöntejä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__puhelinnumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" numero\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Pelkkä puhelinnumero ilman maatunnusta"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"paikallinen_numero"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__puhelinnumero\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"maa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__maa\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"maa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" maa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Varmistetaan, että maa on maatunnusten listalla"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" maa "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" Puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"maatunnukset"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Annettua maata ei löydy listalta.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__maa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" maa\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"nimi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"nimi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" __name__ "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"__main__\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n pnro "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Pertti Python\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"040 111 1111\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ruotsi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pnro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pnro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"puhelinnumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pnro"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paikallinen_numero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"+46 40 111 1111 (Pertti Python)\n+46 40 111 1111\n040 111 1111"}]}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Postinumerot","tmcname":"osa09-13_postinumerot"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tehtäväpohjassa on määritelty luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Kaupunki"}]},{"type":"text","value":", joka mallintaa yksittäistä kaupunkia."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisää luokkaan luokkamuuttuja postinumerot, joka viittaa sanakirjaan. Sanakirjassa jokainen avain on kaupungin nimi ja arvo postinumero. Molemmat ovat merkkijonoja."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sanakirjasta tulee löytyä seuraavat postinumerot:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Helsinki 00100"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Turku 20100"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tampere 33100"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Jyväskylä 40100"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Oulu 90100"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muuta toiminnallisuutta ei tarvitse toteuttaa."}]}]},{"type":"element","tagName":"h2","properties":{"id":"luokkametodit","style":"position:relative;"},"children":[{"type":"text","value":"Luokkametodit"},{"type":"element","tagName":"a","properties":{"href":"#luokkametodit","ariaLabel":"luokkametodit permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkametodi eli staattinen metodi on luokassa oleva metodi, jota ei ole sidottu mihinkään luokasta muodostettuun olioon. Niinpä luokkametodia voi kutsua ilman, että luokasta muodostetaan oliota."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkametodit ovat yleensä työkalumetodeja, jotka liittyvät jotenkin luokkaan mutta joita on tarkoituksenmukaista kutsua ilman olion muodostamista. Luokkametodit ovat yleensä julkisia, jolloin niitä voidaan kutsua sekä luokan ulkopuolelta että luokan ja siitä muodostettujen olioiden sisältä."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokkametodi merkitään annotaatiolla "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"@classmethod"}]},{"type":"text","value":" ja sen ensimmäinen parametri on aina "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"cls"}]},{"type":"text","value":". Tunnistetta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"cls"}]},{"type":"text","value":" käytetään samaan tapaan kuin tunnistetta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":", mutta erotuksena on, että "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"cls"}]},{"type":"text","value":" viittaa luokkaan ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":" viittaa olioon. Kummallekaan parametrille ei anneta kutsuessa arvoa, vaan Python tekee sen automaattisesti."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esimerkiksi luokassa "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Rekisteriote"}]},{"type":"text","value":" voisi olla staattinen metodi, jolla voidaan tarkistaa, onko annettu rekisteritunnus oikeamuotoinen. Metodi on staattinen, jotta tunnuksen voi tarkastaa myös ilman, että luodaan uutta oliota luokasta:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Rekisteriote"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" omistaja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" merkki"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" vuosi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" rekisteritunnus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__omistaja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" omistaja\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__merkki "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" merkki\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__vuosi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" vuosi\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kutsutaan metodia rekisteritunnus.setter"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rekisteritunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" rekisteritunnus\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"rekisteritunnus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__rekisteritunnus\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@rekisteritunnus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"rekisteritunnus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tunnus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" Rekisteriote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rekisteritunnus_kelpaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tunnus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__rekisteritunnus "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tunnus\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Rekisteritunnus ei kelpaa\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luokkametodi tunnuksen validoimiseksi"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@classmethod"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"rekisteritunnus_kelpaa"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"cls"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tunnus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tunnus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"or"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"-\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" tunnus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Tarkastellaan alku- ja loppuosaa erikseen"}]},{"type":"text","value":"\n alku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" loppu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tunnus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"split"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"-\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Alkuosassa saa olla vain kirjaimia"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" alku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" merkki"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lower"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"abcdefghijklmnopqrstuvwxyzåäö\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Loppuosassa saa olla vain numeroita"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" loppu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" merkki "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"not"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"in"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1234567890\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"False"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"ote "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Rekisteriote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Arto Autoilija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Volvo\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"1992\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"abc-123\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" Rekisteriote"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"rekisteritunnus_kelpaa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"xyz-789\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tämä on validi tunnus!\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämä on validi tunnus!"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rekisteriotteen oikeellisuuden voi tarkistaa kutsumalla metodia (esimerkiksi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Rekisteriote.rekisteritunnus_kelpaa(\"xyz-789\"))"}]},{"type":"text","value":") ilman, että muodostaa luokasta oliota. Samaa metodia kutsutaan myös uutta oliota muodostaessa luokan konstruktorista. Huomaa kuitenkin, että myös tässä kutsussa viitataan metodiin luokan nimen avulla eikä "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"self"}]},{"type":"text","value":"-tunnisteella!"}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Lista-apuri","tmcname":"osa09-14_lista_apuri"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjoita luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ListaApuri"}]},{"type":"text","value":", jossa on seuraavat kaksi luokkametodia:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"suurin_frekvenssi(lista: list)"}]},{"type":"text","value":" palauttaa alkion, jota esiintyy annetussa listassa eniten"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tuplia(lista: list)"}]},{"type":"text","value":" palauttaa sellaisten alkioden lukumäärän, jotka esiintyvät listassa vähintään kahdesti"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Metodeja tulee voida käyttää ilman, että luokasta luodaan oliota. Esimerkki luokan käytöstä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"luvut "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ListaApuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"suurin_frekvenssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"ListaApuri"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tuplia"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"luvut"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"5\n3"}]}]}]}]},"html":"

Tämän osion jälkeen:

    \n
  • Ymmärrät käsitteet luokkamuuttuja ja luokkametodi
  • \n
  • Tiedät miten staattiset piirteet eroavat olioiden piirteistä
  • \n
  • Osaat lisätä staattisia piirteitä omiin luokkiin
  • \n

Olio-ohjelmoinnissa puhutaan piirteistä. Näillä tarkoitetaan olion ominaisuuksia: luokan sisälle kirjoitettuja metodeja ja luokassa määriteltyjä muuttujia.

Tähän mennessä olemme käsitelleen olioiden piirteitä eli oliometodeita ja attribuutteja. Olio-ohjelmointiin kuuluvat kuitenkin myös luokan piirteet, joita kutsutaan usein myös staattisiksi piirteiksi. Myös käsitettä luokkamuuttuja käytetään.

Luokkamuuttujat

Kuten on aiemmin opittu, jokaisella oliolla on omat itsenäiset arvonsa attribuuteille. Attribuuttien lisäksi luokassa voidaan määritellä luokkamuuttujia eli staattisia muuttujia. Luokkamuuttujalla tarkoitetaan muuttujaa, jota käytetään luokan kautta eikä luokasta muodostettujen olioiden kautta. Luokkamuuttujalla on yksi yhteinen arvo riippumatta siitä, montako oliota luokasta muodostetaan.

Luokkamuuttujan määrittely eroaa attribuutista siinä, että se määritellään ilman self-aluketta. Jos luokkamuuttujaa halutaan käyttää koko luokassa ja mahdollisesti luokan ulkopuoleltakin, se tulee määritellä metodien ulkopuolella.

class Korkotili:\n    yleiskorko = 0.03\n\n    def __init__(self, tilinumero: str, saldo: float, korko: float):\n        self.__tilinumero = tilinumero\n        self.__saldo = saldo\n        self.__korko = korko\n\n    def lisaa_korko(self):\n        # Korko on yleiskorko + tilin korko\n        korko_yhteensa = Korkotili.yleiskorko + self.__korko\n        self.__saldo += self.__saldo * korko_yhteensa\n\n    @property\n    def saldo(self):\n        return self.__saldo

Koska yleiskorko on määritelty luokassa eikä metodin sisällä eikä sen alustuksessa ole käytetty self-aluketta, se on luokkamuuttuja.

Luokkamuuttujaan viitataan luokan nimen avulla, esimerkiksi näin:

# Yleiskorko on olioista riippumaton\nprint(\"Yleiskorko on\", Korkotili.yleiskorko)\n\ntili = Korkotili(\"12345\", 1000, 0.05)\n# Lisätään kokonaiskorko saldoon\ntili.lisaa_korko()\nprint(tili.saldo)

Yleiskorko on 0.03\n1080.0

Luokkamuuttujiin viitataan siis luokan nimen avulla, esimerkiksi Korkotili.yleiskorko, ja oliomuuttujiin eli attribuutteihin olion nimen avulla tili.saldo. Oliomuuttujiin voi luonnollisesti viitata vasta, kun luokasta on muodostettu olio.

Luokkamuuttujaa on kätevä käyttää, kun halutaan tallentaa arvoja, jotka on jaettu kaikkien olioiden kesken. Edellisessä esimerkissä oletetaan, että kaikilla pankkitileillä on sama yleiskorkoprosentti, jonka lisäksi tilille voidaan erikseen määrittää oma korkoprosenttinsa. Yleiskorkokin voi muuttua, mutta muutos vaikuttaa kaikkiin luokasta muodostettuihin olioihin:

class Korkotili:\n    yleiskorko = 0.03\n\n    def __init__(self, tilinumero: str, saldo: float, korko: float):\n        self.__tilinumero = tilinumero\n        self.__saldo = saldo\n        self.__korko = korko\n\n    def lisaa_korko(self):\n        # Korko on yleiskorko + tilin korko\n        korko_yhteensa = Korkotili.yleiskorko + self.__korko\n        self.__saldo += self.__saldo * korko_yhteensa\n\n    @property\n    def saldo(self):\n        return self.__saldo\n\n    @property\n    def kokonaiskorko(self):\n        return self.__korko + Korkotili.yleiskorko
tili1 = Korkotili(\"12345\", 100, 0.03)\ntili2 = Korkotili(\"54321\", 200, 0.06)\n\nprint(\"Yleiskorko:\", Korkotili.yleiskorko)\nprint(tili1.kokonaiskorko)\nprint(tili2.kokonaiskorko)\n\n# Nostetaan yleiskorko 10 prosenttiin\nKorkotili.yleiskorko = 0.10\n\nprint(\"Yleiskorko:\", Korkotili.yleiskorko)\nprint(tili1.kokonaiskorko)\nprint(tili2.kokonaiskorko)

Yleiskorko: 0.03\n0.06\n0.09\nYleiskorko: 0.1\n0.13\n0.16

Kun yleiskorko nousee, kaikkien luokasta määriteltyjen tilien kokonaiskorko nousee. Huomaa, että kokonaiskorko on määritelty havainnointimetodiksi, vaikkei vastaavaa attribuuttia olekaan suoraan määritelty. Metodi palauttaa tilin koron ja yleiskoron summan.

Tarkastellaan vielä toista esimerkkiä. Luokassa Puhelinnumero on maatunnukset tallennettuna sanakirjaan. Lista maatunnuksista on yhteinen kaikille luokasta luoduille puhelinnumero-olioille, koska maatunnus saman maan puhelinnumeroille on aina sama.

class Puhelinnumero:\n    maatunnukset = {\"Suomi\": \"+358\", \"Ruotsi\": \"+46\", \"Yhdysvallat\": \"+1\"}\n\n    def __init__(self, nimi: str, puhelinnumero: str, maa: str):\n        self.__nimi = nimi\n        self.__puhelinnumero = puhelinnumero\n        self.__maa = maa\n\n    @property\n    def puhelinnumero(self):\n        # Puhelinnumerosta jää etunolla pois, kun maatunnus lisätään alkuun\n        return Puhelinnumero.maatunnukset[self.__maa] + \" \" + self.__puhelinnumero[1:]
paulan_nro = Puhelinnumero(\"Paula Pythonen\", \"050 1234 567\", \"Suomi\")\nprint(paulan_nro.puhelinnumero)

+358 50 1234 567

Kun puhelinnumero-olio luodaan, tallennetaan nimen ja numeron lisäksi maa. Kun numero haetaan havainnointimetodilla, haetaan numeron eteen maatunnus luokkamuuttujasta olion attribuuttiin tallennetun maatiedon avulla.

Esimerkkiluokka on toiminnallisuudeltaan melko vajavainen. Katsotaan vielä, miltä näyttäisi parempi toteutus, jossa on havainnointi- ja asetusmetodit eri attribuuteille:

class Puhelinnumero:\n    maatunnukset = {\"Suomi\": \"+358\", \"Ruotsi\": \"+46\", \"Yhdysvallat\": \"+1\"}\n\n    def __init__(self, nimi: str, puhelinnumero: str, maa: str):\n        self.__nimi = nimi\n        # Tämä kutsuu metodia puhelinnumero.setter\n        self.puhelinnumero = puhelinnumero\n        # Tämä kutsuu metodia maa.setter\n        self.maa = maa\n\n    # Havainnointimetodissa yhdistetään maatunnus ja puhelinnumero\n    @property\n    def puhelinnumero(self):\n        # Puhelinnumerosta jää etunolla pois, kun maatunnus lisätään alkuun\n        return Puhelinnumero.maatunnukset[self.__maa] + \" \" + self.__puhelinnumero[1:]\n\n    @puhelinnumero.setter\n    def puhelinnumero(self, numero):\n        # Varmistetaan, että puhelinnumerossa on vain numeroita ja välilyöntejä\n        for merkki in numero:\n            if merkki not in \"1234567890 \":\n                raise ValueError(\"Puhelinnumero saa sisältää vain lukuja ja välilyöntejä\")\n        self.__puhelinnumero = numero\n\n    # Pelkkä puhelinnumero ilman maatunnusta\n    @property\n    def paikallinen_numero(self):\n        return self.__puhelinnumero\n\n    @property\n    def maa(self):\n        return self.__maa\n\n    @maa.setter\n    def maa(self, maa):\n        # Varmistetaan, että maa on maatunnusten listalla\n        if maa not in Puhelinnumero.maatunnukset:\n            raise ValueError(\"Annettua maata ei löydy listalta.\")\n        self.__maa = maa\n\n    @property\n    def nimi(self):\n        return self.__nimi\n\n    @nimi.setter\n    def nimi(self, nimi):\n        self.__nimi = nimi\n\n    def __str__(self):\n        return f\"{self.puhelinnumero} ({self.__nimi})\"
if __name__ == \"__main__\":\n    pnro = Puhelinnumero(\"Pertti Python\", \"040 111 1111\", \"Ruotsi\")\n    print(pnro)\n    print(pnro.puhelinnumero)\n    print(pnro.paikallinen_numero)

+46 40 111 1111 (Pertti Python)\n+46 40 111 1111\n040 111 1111

Tehtäväpohjassa on määritelty luokka Kaupunki, joka mallintaa yksittäistä kaupunkia.

Lisää luokkaan luokkamuuttuja postinumerot, joka viittaa sanakirjaan. Sanakirjassa jokainen avain on kaupungin nimi ja arvo postinumero. Molemmat ovat merkkijonoja.

Sanakirjasta tulee löytyä seuraavat postinumerot:

    \n
  • Helsinki 00100
  • \n
  • Turku 20100
  • \n
  • Tampere 33100
  • \n
  • Jyväskylä 40100
  • \n
  • Oulu 90100
  • \n

Muuta toiminnallisuutta ei tarvitse toteuttaa.

Luokkametodit

Luokkametodi eli staattinen metodi on luokassa oleva metodi, jota ei ole sidottu mihinkään luokasta muodostettuun olioon. Niinpä luokkametodia voi kutsua ilman, että luokasta muodostetaan oliota.

Luokkametodit ovat yleensä työkalumetodeja, jotka liittyvät jotenkin luokkaan mutta joita on tarkoituksenmukaista kutsua ilman olion muodostamista. Luokkametodit ovat yleensä julkisia, jolloin niitä voidaan kutsua sekä luokan ulkopuolelta että luokan ja siitä muodostettujen olioiden sisältä.

Luokkametodi merkitään annotaatiolla @classmethod ja sen ensimmäinen parametri on aina cls. Tunnistetta cls käytetään samaan tapaan kuin tunnistetta self, mutta erotuksena on, että cls viittaa luokkaan ja self viittaa olioon. Kummallekaan parametrille ei anneta kutsuessa arvoa, vaan Python tekee sen automaattisesti.

Esimerkiksi luokassa Rekisteriote voisi olla staattinen metodi, jolla voidaan tarkistaa, onko annettu rekisteritunnus oikeamuotoinen. Metodi on staattinen, jotta tunnuksen voi tarkastaa myös ilman, että luodaan uutta oliota luokasta:

class Rekisteriote:\n    def __init__(self, omistaja: str, merkki: str, vuosi: int, rekisteritunnus: str):\n        self.__omistaja = omistaja\n        self.__merkki = merkki\n        self.__vuosi = vuosi\n\n        # Kutsutaan metodia rekisteritunnus.setter\n        self.rekisteritunnus = rekisteritunnus\n\n    @property\n    def rekisteritunnus(self):\n        return self.__rekisteritunnus\n\n    @rekisteritunnus.setter\n    def rekisteritunnus(self, tunnus):\n        if Rekisteriote.rekisteritunnus_kelpaa(tunnus):\n            self.__rekisteritunnus = tunnus\n        else:\n            raise ValueError(\"Rekisteritunnus ei kelpaa\")\n\n    # Luokkametodi tunnuksen validoimiseksi\n    @classmethod\n    def rekisteritunnus_kelpaa(cls, tunnus: str):\n        if len(tunnus) < 3 or \"-\" not in tunnus:\n            return False\n\n        # Tarkastellaan alku- ja loppuosaa erikseen\n        alku, loppu = tunnus.split(\"-\")\n\n        # Alkuosassa saa olla vain kirjaimia\n        for merkki in alku:\n            if merkki.lower() not in \"abcdefghijklmnopqrstuvwxyzåäö\":\n                return False\n\n        # Loppuosassa saa olla vain numeroita\n        for merkki in loppu:\n            if merkki not in \"1234567890\":\n                return False\n\n        return True
ote = Rekisteriote(\"Arto Autoilija\", \"Volvo\", \"1992\", \"abc-123\")\n\nif Rekisteriote.rekisteritunnus_kelpaa(\"xyz-789\"):\n    print(\"Tämä on validi tunnus!\")

Tämä on validi tunnus!

Rekisteriotteen oikeellisuuden voi tarkistaa kutsumalla metodia (esimerkiksi Rekisteriote.rekisteritunnus_kelpaa(\"xyz-789\"))) ilman, että muodostaa luokasta oliota. Samaa metodia kutsutaan myös uutta oliota muodostaessa luokan konstruktorista. Huomaa kuitenkin, että myös tässä kutsussa viitataan metodiin luokan nimen avulla eikä self-tunnisteella!

Kirjoita luokka ListaApuri, jossa on seuraavat kaksi luokkametodia:

    \n
  • Metodi suurin_frekvenssi(lista: list) palauttaa alkion, jota esiintyy annetussa listassa eniten
  • \n
  • Metodi tuplia(lista: list) palauttaa sellaisten alkioden lukumäärän, jotka esiintyvät listassa vähintään kahdesti
  • \n

Metodeja tulee voida käyttää ilman, että luokasta luodaan oliota. Esimerkki luokan käytöstä:

luvut = [1, 1, 2, 1, 3, 3, 4, 5, 5, 5, 6, 5, 5, 5]\nprint(ListaApuri.suurin_frekvenssi(luvut))\nprint(ListaApuri.tuplia(luvut))

5\n3

","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-9/5-staattiset-piirteet.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-9/6-lisaa-esimerkkeja/page-data.json b/page-data/osa-9/6-lisaa-esimerkkeja/page-data.json index 9ddbdb4a3..f1438bfad 100644 --- a/page-data/osa-9/6-lisaa-esimerkkeja/page-data.json +++ b/page-data/osa-9/6-lisaa-esimerkkeja/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-content-template-js", "path": "/osa-9/6-lisaa-esimerkkeja", - "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tunnet lisää esimerkkejä luokista ja olioista"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää parametrien oletusarvoja metodeissa"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan seuraavaksi esimerkkiä, joka muodostuu kahdesta luokasta. Luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Piste"}]},{"type":"text","value":" mallintaa yhtä pistettä kaksiulotteisessa koordinaatistossa ja luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Jana"}]},{"type":"text","value":" kahden pisteen välistä janaa. Luokkien toiminta on kommentoitu koodiin."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" math\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Piste"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Luokka mallintaa pistettä kaksiulotteisessa koordinaatistossa \"\"\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Attribuutit ovat julkisia, koska mitkä tahansa arvot käyvät x:n ja y:n arvoiksi"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" x\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" y\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luokkametodi palauttaa uuden pisteen paikassa (0, 0)"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Huomaa, että luokan sisältä voi palauttaa olion luokasta"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@classmethod"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"origo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"cls"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" Piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luokkametodi muodostaa uuden pisteen annetun pisteen perusteella"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Uusi piste on peilikuva annetusta pisteestä jommankumman tai molempien akselien suhteen"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Esimerkiksi pisteen (1, 3) peilikuva x-akselin suhteen on (1, -3)"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@classmethod"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"peilikuva"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"cls"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" peilaa_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"bool"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" peilaa_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"bool"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"x\n y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"y\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" peilaa_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"y\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" peilaa_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"x\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" Piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Jana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Luokka mallintaa janaa kaksiulotteisessa koordinaatistossa \"\"\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" alku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" loppu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Attribuutit ovat julkisia, koska mitkä tahansa pisteet kelpaavat"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"alku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" alku\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"loppu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" loppu\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodi laskee janan pituuden Pythagoraan lauseella"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pituus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"loppu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"alku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"loppu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"alku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sqrt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodi palauttaa janan keskipisteen"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"keskipiste"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n keskix "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"alku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"loppu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n keskiy "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"alku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"loppu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" Piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"keskix"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" keskiy"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"alku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ... "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"loppu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"piste "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\norigo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"origo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"origo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npiste2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"peilikuva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"piste2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\njana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Jana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" piste2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"keskipiste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"(1, 3)\n(0, 0)\n(-1, -3)\n6.324555320336759\n(0.0, 0.0)\n(1, 3) ... (-1, -3)"}]}]},{"type":"element","tagName":"h2","properties":{"id":"parametrien-oletusarvot","style":"position:relative;"},"children":[{"type":"text","value":"Parametrien oletusarvot"},{"type":"element","tagName":"a","properties":{"href":"#parametrien-oletusarvot","ariaLabel":"parametrien oletusarvot permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa mille tahansa parametrille voidaan asettaa oletusarvo. Oletusarvoja voidaan käyttää sekä funktioiden että metodien parametreissa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos parametrille on annettu oletusarvo, sille ei ole pakko antaa arvoa kutsuttaessa. Jos arvo annetaan, se syrjäyttää oletusarvon, ja jos arvoa ei anneta, käytetään oletusarvoa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oletusarvot ovat usein hyödyllisiä konstruktoreissa: jos on oletettavaa, ettei tiettyä tietoa ole aina olemassa oliota luodessa, on parempi antaa sille vakioarvo konstruktorissa kuin antaa tämä asiakkaan huoleksi. Tämä on asiakkaalle helpompaa ja myös ylläpitää olion sisäistä eheyttä, kun voidaan esimerkiksi olla varmoja, että \"tyhjä\" arvo on aina samanlainen (muuten se voisi olla esimerkiksi merkkijono "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":", arvo "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"None"}]},{"type":"text","value":" tai merkkijono "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"ei asetettu\""}]},{"type":"text","value":")."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkinä luokkaa, joka mallintaa opiskelijaa. Pakollisia kenttiä luodessa ovat opiskelijanumero ja nimi ja näistä opiskelijanumeroa ei pysty myöhemmin muuttamaan. Opintopisteet ja muistiinpanot voi halutessaan antaa oliota luodessa, mutta niille on myös asetettu oletusarvot. Luokan toiminta on kommentoitu suoraan ohjelmakoodin yhteyteen."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Mallintaa yhtä opiskelijaa \"\"\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opiskelijanumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kutsuu asetusmetodia"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijanumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Opiskelijanumerossa tulee olla vähintään 5 merkkiä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__opiskelijanumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opiskelijanumero\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kutsuu asetusmetodia"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opintopisteet\n\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__muistiinpanot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" muistiinpanot\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"nimi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"nimi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"!="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nimi ei voi olla tyhjä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"opiskelijanumero"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__opiskelijanumero\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"opintopisteet"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__opintopisteet\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"opintopisteet"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" op"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" op "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" op\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Opintopisteet ei voi olla negatiivinen luku\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"muistiinpanot"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__muistiinpanot\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"muistiinpanot"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__muistiinpanot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" muistiinpanot\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"yhteenveto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Opiskelija "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opiskelijanumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"):\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"- opintopisteitä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"- muistiinpanot: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Annetaan pelkkä nimi ja op.nro"}]},{"type":"text","value":"\nopiskelija1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olli Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nopiskelija1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yhteenveto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Annetaan nimi, op.nro ja opintopisteet"}]},{"type":"text","value":"\nopiskelija2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Outi Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"54321\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"25"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nopiskelija2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yhteenveto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Annetaan kaikki tiedot"}]},{"type":"text","value":"\nopiskelija3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olavi Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"99999\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"140"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lisäaika tentissä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nopiskelija3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yhteenveto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Ei anneta opintopisteitä, mutta annetaan muistiinpanot"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Huomaa, että parametri pitää nyt nimetä, kun järjestys eroaa tavallisesta"}]},{"type":"text","value":"\nopiskelija4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Onerva Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"98765\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"poissaoleva lukuvuonna 20-21\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nopiskelija4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yhteenveto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Opiskelija Olli Opiskelija (12345):"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"opintopisteitä 0"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"muistiinpanot:"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Opiskelija Outi Opiskelija (54321):"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"opintopisteitä 25"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"muistiinpanot:"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Opiskelija Olavi Opiskelija (99999):"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"opintopisteitä 140"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"muistiinpanot: lisäaika tentissä"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Opiskelija Onerva Opiskelija (98765):"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"opintopisteitä 0"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"muistiinpanot: poissaoleva lukuvuonna 20-21"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että attribuutille opiskelijanumero ei ole määritelty asetusmetodia, koska ideana on, että opiskelijanumero ei voi muuttua."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Parametrien oletusarvojen käyttöön liittyy kuitenkin eräs huomattavan iso \"mutta\" joka ilmenee seuraavasti esimerkistä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tehdyt_kurssit"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehdyt_kurssit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tehdyt_kurssit\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_suoritus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kurssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehdyt_kurssit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kurssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"opiskelija1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olli Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nopiskelija2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Outi Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nopiskelija1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohpe\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nopiskelija1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tira\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelija1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehdyt_kurssit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelija2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehdyt_kurssit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['Ohpe', 'Tira']\n['Ohpe', 'Tira']"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomataan siis, että kurssisuorituksen lisääminen Ollille muuttaa myös Outin kurssisuorituksia. Ilmiö johtuu siitä, että Python uudelleenkäyttää oletusarvoa. Yllä oleva tapa luoda opiskelijat vastaa siis seuraavaa koodia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kurssit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nopiskelija1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olli Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kurssit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nopiskelija2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Outi Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kurssit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tästä johtuen parametrin oletusarvona ei koskaan tulisi käyttää monimutkaisempia tietorakenteita kuten listoja. Korjattu versio luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"text","value":" konstruktorista on seuraava:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tehdyt_kurssit"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"None"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tehdyt_kurssit "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"is"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"None"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehdyt_kurssit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehdyt_kurssit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tehdyt_kurssit\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_suoritus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kurssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehdyt_kurssit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kurssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"opiskelija1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olli Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nopiskelija2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Outi Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nopiskelija1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohpe\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nopiskelija1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tira\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelija1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehdyt_kurssit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelija2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehdyt_kurssit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['Ohpe', 'Tira']\n[]"}]}]},{"type":"element","tagName":"h2","properties":{"id":"loppuhuipennus","style":"position:relative;"},"children":[{"type":"text","value":"Loppuhuipennus"},{"type":"element","tagName":"a","properties":{"href":"#loppuhuipennus","ariaLabel":"loppuhuipennus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaikka seuraava tehtävä on tässä luvussa, et tarvitse tehtävän ratkaisemiseen mitään muuta kun luvussa "},{"type":"element","tagName":"a","properties":{"href":"/osa-9/2-oliot-attribuuttina"},"children":[{"type":"text","value":"Oliot attribuuttina"}]},{"type":"text","value":" esiteltyjä tekniikoita. Tehtävä on käytännössä hyvin samanlainen kuin tuon luvun tehtävät "},{"type":"element","tagName":"a","properties":{"href":"/osa-9/2-oliot-attribuuttina#programming-exercise-lahjapakkaus"},"children":[{"type":"text","value":"lahjapakkaus"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"a","properties":{"href":"/osa-9/2-oliot-attribuuttina#programming-exercise-huoneen-lyhin"},"children":[{"type":"text","value":"huoneen lyhin"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Tavara, Matkalaukku ja Lastiruuma","tmcname":"osa09-15_tavara_matkalaukku_lastiruuma"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtäväsarjassa tehdään luokat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tavara"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Matkalaukku"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lastiruuma"}]},{"type":"text","value":", joiden avulla harjoitellaan lisää olioita, jotka sisältävät toisia olioita."}]},{"type":"element","tagName":"h2","properties":{"id":"tavara-luokka","style":"position:relative;"},"children":[{"type":"text","value":"Tavara-luokka"},{"type":"element","tagName":"a","properties":{"href":"#tavara-luokka","ariaLabel":"tavara luokka permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tavara"}]},{"type":"text","value":", josta muodostetut oliot vastaavat erilaisia tavaroita. Tallennettavat tiedot ovat tavaran nimi ja paino (kg)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokan tulee toimia seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aapiskukko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npuhelin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nokia 3210\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kirjan nimi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kirjan paino:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paino"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kirja:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Puhelin:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" puhelin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostuksen tulisi olla seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjan nimi: Aapiskukko\nKirjan paino: 2\nKirja: Aapiskukko (2 kg)\nPuhelin: Nokia 3210 (1 kg)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tavaralla on siis metodit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"paino"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":" jotka palauttavat tavaran tiedot."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokan tulee tallentaa tieto nimestä ja painosta kapseloituna, eli seuraava ei saa onnistua:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aapiskukko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paino "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"matkalaukku-luokka","style":"position:relative;"},"children":[{"type":"text","value":"Matkalaukku-luokka"},{"type":"element","tagName":"a","properties":{"href":"#matkalaukku-luokka","ariaLabel":"matkalaukku luokka permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Matkalaukku"}]},{"type":"text","value":". Matkalaukkuun liittyy tavaroita ja maksimipaino, joka määrittelee tavaroiden suurimman mahdollisen yhteispainon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisää luokkaan seuraavat:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"konstruktori, jolle annetaan maksimipaino"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_tavara"}]},{"type":"text","value":", joka lisää parametrina annettavan tavaran matkalaukkuun. Metodi ei palauta mitään arvoa."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":", joka palauttaa merkkijonon muotoa \"x tavaraa (y kg)\""}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokan tulee valvoa, että sen sisältämien tavaroiden yhteispaino ei ylitä maksimipainoa. Jos maksimipaino ylittyisi lisättävän tavaran vuoksi, metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_tavara"}]},{"type":"text","value":" ei saa lisätä uutta tavaraa laukkuun."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on luokan käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aapiskukko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npuhelin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nokia 3210\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntiiliskivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tiiliskivi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nmatkalaukku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nmatkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nmatkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"puhelin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nmatkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tiiliskivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostuksen tulisi olla seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"0 tavaraa (0 kg)\n1 tavaraa (2 kg)\n2 tavaraa (3 kg)\n2 tavaraa (3 kg)"}]}]},{"type":"element","tagName":"h2","properties":{"id":"kielenhuoltoa","style":"position:relative;"},"children":[{"type":"text","value":"Kielenhuoltoa"},{"type":"element","tagName":"a","properties":{"href":"#kielenhuoltoa","ariaLabel":"kielenhuoltoa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ilmoitus \"1 tavaraa\" ei ole kovin hyvää suomea, vaan olisi parempi sanoa \"1 tavara\". Tee tämä muutos luokassa sijaitsevaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":"-metodiin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt edellisen ohjelman tulostuksen tulisi olla seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"0 tavaraa (0 kg)\n1 tavara (2 kg)\n2 tavaraa (3 kg)\n2 tavaraa (3 kg)"}]}]},{"type":"element","tagName":"h2","properties":{"id":"kaikki-tavarat","style":"position:relative;"},"children":[{"type":"text","value":"Kaikki tavarat"},{"type":"element","tagName":"a","properties":{"href":"#kaikki-tavarat","ariaLabel":"kaikki tavarat permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisää luokkaan seuraavat metodit:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta_tavarat"}]},{"type":"text","value":", joka tulostaa kaikki matkalaukussa olevat tavarat"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"paino"}]},{"type":"text","value":", joka palauttaa matkalaukun yhteispainoa kuvaavan kokonaisluvun, joka on sen sisältävien tavaroiden painojen summa"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on luokan käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aapiskukko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npuhelin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nokia 3210\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntiiliskivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tiiliskivi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nmatkalaukku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmatkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmatkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"puhelin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmatkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tiiliskivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Matkalaukussa on seuraavat tavarat:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmatkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_tavarat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npaino_yht "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paino"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Yhteispaino: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"paino_yht"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" kg\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostuksen tulisi olla seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Matkalaukussa on seuraavat tavarat:\nAapiskukko (2 kg)\nNokia 3210 (1 kg)\nTiiliskivi (4 kg)\nYhteispaino: 7 kg"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muokkaa myös luokkaasi siten, että käytät vain kahta oliomuuttujaa. Toinen sisältää maksimipainon, toinen on lista laukussa olevista tavaroista."}]},{"type":"element","tagName":"h2","properties":{"id":"raskain-tavara","style":"position:relative;"},"children":[{"type":"text","value":"Raskain tavara"},{"type":"element","tagName":"a","properties":{"href":"#raskain-tavara","ariaLabel":"raskain tavara permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisää vielä luokkaan metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"raskain_tavara"}]},{"type":"text","value":", joka palauttaa painoltaan suurimman tavaran. Jos yhtä raskaita tavaroita on useita, metodi voi palauttaa minkä tahansa niistä. Metodin tulee palauttaa olioviite. Jos laukku on tyhjä, palauta arvo "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"None"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on luokan käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aapiskukko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npuhelin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nokia 3210\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntiiliskivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tiiliskivi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nmatkalaukku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmatkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmatkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"puhelin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmatkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tiiliskivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nraskain "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"raskain_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Raskain tavara: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"raskain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostuksen tulisi olla seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Raskain tavara: Tiiliskivi (4 kg)"}]}]},{"type":"element","tagName":"h2","properties":{"id":"lastiruuma-luokka","style":"position:relative;"},"children":[{"type":"text","value":"Lastiruuma-luokka"},{"type":"element","tagName":"a","properties":{"href":"#lastiruuma-luokka","ariaLabel":"lastiruuma luokka permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lastiruuma"}]},{"type":"text","value":", johon liittyvät seuraavat metodit:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"konstruktori, jolle annetaan maksimipaino"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_matkalaukku"}]},{"type":"text","value":", joka lisää parametrina annetun matkalaukun lastiruumaan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":", joka palauttaa merkkijonon muotoa \"x matkalaukkua, tilaa y kg\""}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokan tulee valvoa, että sen matkalaukkujen yhteispaino ei ylitä maksimipainoa. Jos maksimipaino ylittyisi uuden matkalaukun vuoksi, metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_matkalaukku"}]},{"type":"text","value":" ei saa lisätä uutta matkalaukkua."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on luokan käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lastiruuma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Lastiruuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lastiruuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aapiskukko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npuhelin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nokia 3210\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntiiliskivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tiiliskivi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nadan_laukku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nadan_laukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nadan_laukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"puhelin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npekan_laukku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npekan_laukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tiiliskivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nlastiruuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"adan_laukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lastiruuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nlastiruuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_laukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lastiruuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"0 matkalaukkua, tilaa 1000 kg\n1 matkalaukku, tilaa 997 kg\n2 matkalaukkua, tilaa 993 kg"}]}]},{"type":"element","tagName":"h2","properties":{"id":"lastiruuman-sisalto","style":"position:relative;"},"children":[{"type":"text","value":"Lastiruuman sisältö"},{"type":"element","tagName":"a","properties":{"href":"#lastiruuman-sisalto","ariaLabel":"lastiruuman sisalto permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisää luokkaan metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta_tavarat"}]},{"type":"text","value":", joka tulostaa kaikki lastiruuman matkalaukuissa olevat tavarat."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on luokan käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aapiskukko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npuhelin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nokia 3210\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntiiliskivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tiiliskivi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nadan_laukku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nadan_laukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nadan_laukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"puhelin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npekan_laukku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npekan_laukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tiiliskivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nlastiruuma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Lastiruuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlastiruuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"adan_laukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlastiruuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_laukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ruuman matkalaukuissa on seuraavat tavarat:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlastiruuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_tavarat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostuksen tulisi olla seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ruuman matkalaukuissa on seuraavat tavarat:\nAapiskukko (2 kg)\nNokia 3210 (1 kg)\nTiiliskivi (4 kg)"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa lopuksi osion loppukyselyyn:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tunnet lisää esimerkkejä luokista ja olioista
  • \n
  • Osaat käyttää parametrien oletusarvoja metodeissa
  • \n

Tarkastellaan seuraavaksi esimerkkiä, joka muodostuu kahdesta luokasta. Luokka Piste mallintaa yhtä pistettä kaksiulotteisessa koordinaatistossa ja luokka Jana kahden pisteen välistä janaa. Luokkien toiminta on kommentoitu koodiin.

import math\n\nclass Piste:\n    \"\"\" Luokka mallintaa pistettä kaksiulotteisessa koordinaatistossa \"\"\"\n\n    def __init__(self, x: float, y: float):\n        # Attribuutit ovat julkisia, koska mitkä tahansa arvot käyvät x:n ja y:n arvoiksi\n        self.x = x\n        self.y = y\n\n    # Luokkametodi palauttaa uuden pisteen paikassa (0, 0)\n    # Huomaa, että luokan sisältä voi palauttaa olion luokasta\n    @classmethod\n    def origo(cls):\n        return Piste(0, 0)\n\n    # Luokkametodi muodostaa uuden pisteen annetun pisteen perusteella\n    # Uusi piste on peilikuva annetusta pisteestä jommankumman tai molempien akselien suhteen\n    # Esimerkiksi pisteen (1, 3) peilikuva x-akselin suhteen on (1, -3)\n    @classmethod\n    def peilikuva(cls, piste, peilaa_x: bool, peilaa_y: bool):\n        x = piste.x\n        y = piste.y\n        if peilaa_x:\n            y = -y\n        if peilaa_y:\n            x = -x\n\n        return Piste(x, y)\n\n    def __str__(self):\n        return f\"({self.x}, {self.y})\"\n\nclass Jana:\n    \"\"\" Luokka mallintaa janaa kaksiulotteisessa koordinaatistossa \"\"\"\n\n    def __init__(self, alku: Piste, loppu: Piste):\n        # Attribuutit ovat julkisia, koska mitkä tahansa pisteet kelpaavat\n        self.alku = alku\n        self.loppu = loppu\n\n    # Metodi laskee janan pituuden Pythagoraan lauseella\n    def pituus(self):\n        summa = (self.loppu.x - self.alku.x) ** 2 + (self.loppu.y - self.alku.y) ** 2\n        return math.sqrt(summa)\n\n    # Metodi palauttaa janan keskipisteen\n    def keskipiste(self):\n        keskix = (self.alku.x + self.loppu.x) / 2\n        keskiy = (self.alku.y + self.loppu.y) / 2\n        return Piste(keskix, keskiy)\n\n    def __str__(self):\n        return f\"{self.alku} ... {self.loppu}\"
piste = Piste(1,3)\nprint(piste)\n\norigo = Piste.origo()\nprint(origo)\n\npiste2 = Piste.peilikuva(piste, True, True)\nprint(piste2)\n\njana = Jana(piste, piste2)\nprint(jana.pituus())\nprint(jana.keskipiste())\nprint(jana)

(1, 3)\n(0, 0)\n(-1, -3)\n6.324555320336759\n(0.0, 0.0)\n(1, 3) ... (-1, -3)

Parametrien oletusarvot

Pythonissa mille tahansa parametrille voidaan asettaa oletusarvo. Oletusarvoja voidaan käyttää sekä funktioiden että metodien parametreissa.

Jos parametrille on annettu oletusarvo, sille ei ole pakko antaa arvoa kutsuttaessa. Jos arvo annetaan, se syrjäyttää oletusarvon, ja jos arvoa ei anneta, käytetään oletusarvoa.

Oletusarvot ovat usein hyödyllisiä konstruktoreissa: jos on oletettavaa, ettei tiettyä tietoa ole aina olemassa oliota luodessa, on parempi antaa sille vakioarvo konstruktorissa kuin antaa tämä asiakkaan huoleksi. Tämä on asiakkaalle helpompaa ja myös ylläpitää olion sisäistä eheyttä, kun voidaan esimerkiksi olla varmoja, että \"tyhjä\" arvo on aina samanlainen (muuten se voisi olla esimerkiksi merkkijono \"\", arvo None tai merkkijono \"ei asetettu\").

Tarkastellaan esimerkkinä luokkaa, joka mallintaa opiskelijaa. Pakollisia kenttiä luodessa ovat opiskelijanumero ja nimi ja näistä opiskelijanumeroa ei pysty myöhemmin muuttamaan. Opintopisteet ja muistiinpanot voi halutessaan antaa oliota luodessa, mutta niille on myös asetettu oletusarvot. Luokan toiminta on kommentoitu suoraan ohjelmakoodin yhteyteen.

class Opiskelija:\n    \"\"\" Mallintaa yhtä opiskelijaa \"\"\"\n\n    def __init__(self, nimi: str, opiskelijanumero: str, opintopisteet:int = 0, muistiinpanot:str = \"\"):\n        # kutsuu asetusmetodia\n        self.nimi = nimi\n\n        if len(opiskelijanumero) < 5:\n            raise ValueError(\"Opiskelijanumerossa tulee olla vähintään 5 merkkiä\")\n\n        self.__opiskelijanumero = opiskelijanumero\n\n        # Kutsuu asetusmetodia\n        self.opintopisteet = opintopisteet\n\n        self.__muistiinpanot = muistiinpanot\n\n    @property\n    def nimi(self):\n        return self.__nimi\n\n    @nimi.setter\n    def nimi(self, nimi):\n        if nimi != \"\":\n            self.__nimi = nimi\n        else:\n            raise ValueError(\"Nimi ei voi olla tyhjä\")\n\n    @property\n    def opiskelijanumero(self):\n        return self.__opiskelijanumero\n\n    @property\n    def opintopisteet(self):\n        return self.__opintopisteet\n\n    @opintopisteet.setter\n    def opintopisteet(self, op):\n        if op >= 0:\n            self.__opintopisteet = op\n        else:\n            raise ValueError(\"Opintopisteet ei voi olla negatiivinen luku\")\n\n    @property\n    def muistiinpanot(self):\n        return self.__muistiinpanot\n\n    @muistiinpanot.setter\n    def muistiinpanot(self, muistiinpanot):\n        self.__muistiinpanot = muistiinpanot\n\n    def yhteenveto(self):\n        print(f\"Opiskelija {self.__nimi} ({self.opiskelijanumero}):\")\n        print(f\"- opintopisteitä {self.__opintopisteet}\")\n        print(f\"- muistiinpanot: {self.muistiinpanot}\")
# Annetaan pelkkä nimi ja op.nro\nopiskelija1 = Opiskelija(\"Olli Opiskelija\", \"12345\")\nopiskelija1.yhteenveto()\n\n# Annetaan nimi, op.nro ja opintopisteet\nopiskelija2 = Opiskelija(\"Outi Opiskelija\", \"54321\", 25)\nopiskelija2.yhteenveto()\n\n# Annetaan kaikki tiedot\nopiskelija3 = Opiskelija(\"Olavi Opiskelija\", \"99999\", 140, \"lisäaika tentissä\")\nopiskelija3.yhteenveto()\n\n# Ei anneta opintopisteitä, mutta annetaan muistiinpanot\n# Huomaa, että parametri pitää nyt nimetä, kun järjestys eroaa tavallisesta\nopiskelija4 = Opiskelija(\"Onerva Opiskelija\", \"98765\", muistiinpanot=\"poissaoleva lukuvuonna 20-21\")\nopiskelija4.yhteenveto()

Opiskelija Olli Opiskelija (12345):

    \n
  • opintopisteitä 0
  • \n
  • muistiinpanot:
  • \n

Opiskelija Outi Opiskelija (54321):

    \n
  • opintopisteitä 25
  • \n
  • muistiinpanot:
  • \n

Opiskelija Olavi Opiskelija (99999):

    \n
  • opintopisteitä 140
  • \n
  • muistiinpanot: lisäaika tentissä
  • \n

Opiskelija Onerva Opiskelija (98765):

    \n
  • opintopisteitä 0
  • \n
  • muistiinpanot: poissaoleva lukuvuonna 20-21
  • \n

Huomaa, että attribuutille opiskelijanumero ei ole määritelty asetusmetodia, koska ideana on, että opiskelijanumero ei voi muuttua.

Parametrien oletusarvojen käyttöön liittyy kuitenkin eräs huomattavan iso \"mutta\" joka ilmenee seuraavasti esimerkistä:

class Opiskelija:\n    def __init__(self, nimi, tehdyt_kurssit=[]):\n        self.nimi = nimi\n        self.tehdyt_kurssit = tehdyt_kurssit\n\n    def lisaa_suoritus(self, kurssi):\n        self.tehdyt_kurssit.append(kurssi)
opiskelija1 = Opiskelija(\"Olli Opiskelija\")\nopiskelija2 = Opiskelija(\"Outi Opiskelija\")\n\nopiskelija1.lisaa_suoritus(\"Ohpe\")\nopiskelija1.lisaa_suoritus(\"Tira\")\n\nprint(opiskelija1.tehdyt_kurssit)\nprint(opiskelija2.tehdyt_kurssit)

['Ohpe', 'Tira']\n['Ohpe', 'Tira']

Huomataan siis, että kurssisuorituksen lisääminen Ollille muuttaa myös Outin kurssisuorituksia. Ilmiö johtuu siitä, että Python uudelleenkäyttää oletusarvoa. Yllä oleva tapa luoda opiskelijat vastaa siis seuraavaa koodia:

kurssit = []\nopiskelija1 = Opiskelija(\"Olli Opiskelija\", kurssit)\nopiskelija2 = Opiskelija(\"Outi Opiskelija\", kurssit)

Tästä johtuen parametrin oletusarvona ei koskaan tulisi käyttää monimutkaisempia tietorakenteita kuten listoja. Korjattu versio luokan Opiskelija konstruktorista on seuraava:

class Opiskelija:\n    def __init__(self, nimi, tehdyt_kurssit=None):\n        self.nimi = nimi\n        if tehdyt_kurssit is None:\n            self.tehdyt_kurssit = []\n        else:\n            self.tehdyt_kurssit = tehdyt_kurssit\n\n    def lisaa_suoritus(self, kurssi):\n        self.tehdyt_kurssit.append(kurssi)
opiskelija1 = Opiskelija(\"Olli Opiskelija\")\nopiskelija2 = Opiskelija(\"Outi Opiskelija\")\n\nopiskelija1.lisaa_suoritus(\"Ohpe\")\nopiskelija1.lisaa_suoritus(\"Tira\")\n\nprint(opiskelija1.tehdyt_kurssit)\nprint(opiskelija2.tehdyt_kurssit)

['Ohpe', 'Tira']\n[]

Loppuhuipennus

Vaikka seuraava tehtävä on tässä luvussa, et tarvitse tehtävän ratkaisemiseen mitään muuta kun luvussa Oliot attribuuttina esiteltyjä tekniikoita. Tehtävä on käytännössä hyvin samanlainen kuin tuon luvun tehtävät lahjapakkaus ja huoneen lyhin.

Tässä tehtäväsarjassa tehdään luokat Tavara, Matkalaukku ja Lastiruuma, joiden avulla harjoitellaan lisää olioita, jotka sisältävät toisia olioita.

Tavara-luokka

Tee luokka Tavara, josta muodostetut oliot vastaavat erilaisia tavaroita. Tallennettavat tiedot ovat tavaran nimi ja paino (kg).

Luokan tulee toimia seuraavasti

kirja = Tavara(\"Aapiskukko\", 2)\npuhelin = Tavara(\"Nokia 3210\", 1)\n\nprint(\"Kirjan nimi:\", kirja.nimi())\nprint(\"Kirjan paino:\", kirja.paino())\n\nprint(\"Kirja:\", kirja)\nprint(\"Puhelin:\", puhelin)

Ohjelman tulostuksen tulisi olla seuraava:

Kirjan nimi: Aapiskukko\nKirjan paino: 2\nKirja: Aapiskukko (2 kg)\nPuhelin: Nokia 3210 (1 kg)

Tavaralla on siis metodit paino ja nimi jotka palauttavat tavaran tiedot.

Luokan tulee tallentaa tieto nimestä ja painosta kapseloituna, eli seuraava ei saa onnistua:

kirja = Tavara(\"Aapiskukko\", 2)\nkirja.paino = 10

Matkalaukku-luokka

Tee luokka Matkalaukku. Matkalaukkuun liittyy tavaroita ja maksimipaino, joka määrittelee tavaroiden suurimman mahdollisen yhteispainon.

Lisää luokkaan seuraavat:

    \n
  • konstruktori, jolle annetaan maksimipaino
  • \n
  • metodi lisaa_tavara, joka lisää parametrina annettavan tavaran matkalaukkuun. Metodi ei palauta mitään arvoa.
  • \n
  • metodi __str__, joka palauttaa merkkijonon muotoa \"x tavaraa (y kg)\"
  • \n

Luokan tulee valvoa, että sen sisältämien tavaroiden yhteispaino ei ylitä maksimipainoa. Jos maksimipaino ylittyisi lisättävän tavaran vuoksi, metodi lisaa_tavara ei saa lisätä uutta tavaraa laukkuun.

Seuraavassa on luokan käyttöesimerkki:

kirja = Tavara(\"Aapiskukko\", 2)\npuhelin = Tavara(\"Nokia 3210\", 1)\ntiiliskivi = Tavara(\"Tiiliskivi\", 4)\n\nmatkalaukku = Matkalaukku(5)\nprint(matkalaukku)\n\nmatkalaukku.lisaa_tavara(kirja)\nprint(matkalaukku)\n\nmatkalaukku.lisaa_tavara(puhelin)\nprint(matkalaukku)\n\nmatkalaukku.lisaa_tavara(tiiliskivi)\nprint(matkalaukku)

Ohjelman tulostuksen tulisi olla seuraava:

0 tavaraa (0 kg)\n1 tavaraa (2 kg)\n2 tavaraa (3 kg)\n2 tavaraa (3 kg)

Kielenhuoltoa

Ilmoitus \"1 tavaraa\" ei ole kovin hyvää suomea, vaan olisi parempi sanoa \"1 tavara\". Tee tämä muutos luokassa sijaitsevaan __str__-metodiin.

Nyt edellisen ohjelman tulostuksen tulisi olla seuraava:

0 tavaraa (0 kg)\n1 tavara (2 kg)\n2 tavaraa (3 kg)\n2 tavaraa (3 kg)

Kaikki tavarat

Lisää luokkaan seuraavat metodit:

    \n
  • tulosta_tavarat, joka tulostaa kaikki matkalaukussa olevat tavarat
  • \n
  • paino, joka palauttaa matkalaukun yhteispainoa kuvaavan kokonaisluvun, joka on sen sisältävien tavaroiden painojen summa
  • \n

Seuraavassa on luokan käyttöesimerkki:

kirja = Tavara(\"Aapiskukko\", 2)\npuhelin = Tavara(\"Nokia 3210\", 1)\ntiiliskivi = Tavara(\"Tiiliskivi\", 4)\n\nmatkalaukku = Matkalaukku(10)\nmatkalaukku.lisaa_tavara(kirja)\nmatkalaukku.lisaa_tavara(puhelin)\nmatkalaukku.lisaa_tavara(tiiliskivi)\n\nprint(\"Matkalaukussa on seuraavat tavarat:\")\nmatkalaukku.tulosta_tavarat()\npaino_yht = matkalaukku.paino()\nprint(f\"Yhteispaino: {paino_yht} kg\")

Ohjelman tulostuksen tulisi olla seuraava:

Matkalaukussa on seuraavat tavarat:\nAapiskukko (2 kg)\nNokia 3210 (1 kg)\nTiiliskivi (4 kg)\nYhteispaino: 7 kg

Muokkaa myös luokkaasi siten, että käytät vain kahta oliomuuttujaa. Toinen sisältää maksimipainon, toinen on lista laukussa olevista tavaroista.

Raskain tavara

Lisää vielä luokkaan metodi raskain_tavara, joka palauttaa painoltaan suurimman tavaran. Jos yhtä raskaita tavaroita on useita, metodi voi palauttaa minkä tahansa niistä. Metodin tulee palauttaa olioviite. Jos laukku on tyhjä, palauta arvo None.

Seuraavassa on luokan käyttöesimerkki:

kirja = Tavara(\"Aapiskukko\", 2)\npuhelin = Tavara(\"Nokia 3210\", 1)\ntiiliskivi = Tavara(\"Tiiliskivi\", 4)\n\nmatkalaukku = Matkalaukku(10)\nmatkalaukku.lisaa_tavara(kirja)\nmatkalaukku.lisaa_tavara(puhelin)\nmatkalaukku.lisaa_tavara(tiiliskivi)\n\nraskain = matkalaukku.raskain_tavara()\nprint(f\"Raskain tavara: {raskain}\")

Ohjelman tulostuksen tulisi olla seuraava:

Raskain tavara: Tiiliskivi (4 kg)

Lastiruuma-luokka

Tee luokka Lastiruuma, johon liittyvät seuraavat metodit:

    \n
  • konstruktori, jolle annetaan maksimipaino
  • \n
  • metodi lisaa_matkalaukku, joka lisää parametrina annetun matkalaukun lastiruumaan
  • \n
  • metodi __str__, joka palauttaa merkkijonon muotoa \"x matkalaukkua, tilaa y kg\"
  • \n

Luokan tulee valvoa, että sen matkalaukkujen yhteispaino ei ylitä maksimipainoa. Jos maksimipaino ylittyisi uuden matkalaukun vuoksi, metodi lisaa_matkalaukku ei saa lisätä uutta matkalaukkua.

Seuraavassa on luokan käyttöesimerkki:

lastiruuma = Lastiruuma(1000)\nprint(lastiruuma)\n\nkirja = Tavara(\"Aapiskukko\", 2)\npuhelin = Tavara(\"Nokia 3210\", 1)\ntiiliskivi = Tavara(\"Tiiliskivi\", 4)\n\nadan_laukku = Matkalaukku(10)\nadan_laukku.lisaa_tavara(kirja)\nadan_laukku.lisaa_tavara(puhelin)\n\npekan_laukku = Matkalaukku(10)\npekan_laukku.lisaa_tavara(tiiliskivi)\n\nlastiruuma.lisaa_matkalaukku(adan_laukku)\nprint(lastiruuma)\n\nlastiruuma.lisaa_matkalaukku(pekan_laukku)\nprint(lastiruuma)

0 matkalaukkua, tilaa 1000 kg\n1 matkalaukku, tilaa 997 kg\n2 matkalaukkua, tilaa 993 kg

Lastiruuman sisältö

Lisää luokkaan metodi tulosta_tavarat, joka tulostaa kaikki lastiruuman matkalaukuissa olevat tavarat.

Seuraavassa on luokan käyttöesimerkki:

kirja = Tavara(\"Aapiskukko\", 2)\npuhelin = Tavara(\"Nokia 3210\", 1)\ntiiliskivi = Tavara(\"Tiiliskivi\", 4)\n\nadan_laukku = Matkalaukku(10)\nadan_laukku.lisaa_tavara(kirja)\nadan_laukku.lisaa_tavara(puhelin)\n\npekan_laukku = Matkalaukku(10)\npekan_laukku.lisaa_tavara(tiiliskivi)\n\nlastiruuma = Lastiruuma(1000)\nlastiruuma.lisaa_matkalaukku(adan_laukku)\nlastiruuma.lisaa_matkalaukku(pekan_laukku)\n\nprint(\"Ruuman matkalaukuissa on seuraavat tavarat:\")\nlastiruuma.tulosta_tavarat()

Ohjelman tulostuksen tulisi olla seuraava:

Ruuman matkalaukuissa on seuraavat tavarat:\nAapiskukko (2 kg)\nNokia 3210 (1 kg)\nTiiliskivi (4 kg)

Vastaa lopuksi osion loppukyselyyn:

","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-9/6-lisaa-esimerkkeja.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"text-box","properties":{"variant":"learningObjectives","name":"Oppimistavoitteet"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tämän osion jälkeen"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tunnet lisää esimerkkejä luokista ja olioista"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Osaat käyttää parametrien oletusarvoja metodeissa"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan seuraavaksi esimerkkiä, joka muodostuu kahdesta luokasta. Luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Piste"}]},{"type":"text","value":" mallintaa yhtä pistettä kaksiulotteisessa koordinaatistossa ja luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Jana"}]},{"type":"text","value":" kahden pisteen välistä janaa. Luokkien toiminta on kommentoitu koodiin."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"import"}]},{"type":"text","value":" math\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Piste"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Luokka mallintaa pistettä kaksiulotteisessa koordinaatistossa \"\"\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"float"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Attribuutit ovat julkisia, koska mitkä tahansa arvot käyvät x:n ja y:n arvoiksi"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" x\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" y\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luokkametodi palauttaa uuden pisteen paikassa (0, 0)"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Huomaa, että luokan sisältä voi palauttaa olion luokasta"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@classmethod"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"origo"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"cls"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" Piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Luokkametodi muodostaa uuden pisteen annetun pisteen perusteella"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Uusi piste on peilikuva annetusta pisteestä jommankumman tai molempien akselien suhteen"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Esimerkiksi pisteen (1, 3) peilikuva x-akselin suhteen on (1, -3)"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@classmethod"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"peilikuva"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"cls"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" peilaa_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"bool"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" peilaa_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"bool"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"x\n y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"y\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" peilaa_x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"y\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" peilaa_y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"x\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" Piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":", "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":")\""}]}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Jana"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Luokka mallintaa janaa kaksiulotteisessa koordinaatistossa \"\"\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" alku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" loppu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" Piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Attribuutit ovat julkisia, koska mitkä tahansa pisteet kelpaavat"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"alku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" alku\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"loppu "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" loppu\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodi laskee janan pituuden Pythagoraan lauseella"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pituus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n summa "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"loppu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"alku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"loppu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"alku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"sqrt"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"summa"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Metodi palauttaa janan keskipisteen"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"keskipiste"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n keskix "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"alku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"x "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"loppu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n keskiy "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"alku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"y "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"loppu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"y"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"/"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" Piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"keskix"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" keskiy"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__str__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\""}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"alku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ... "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"loppu"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"piste "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\norigo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"origo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"origo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npiste2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"peilikuva"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"True"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"piste2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\njana "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Jana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"piste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" piste2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"pituus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"keskipiste"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"jana"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"(1, 3)\n(0, 0)\n(-1, -3)\n6.324555320336759\n(0.0, 0.0)\n(1, 3) ... (-1, -3)"}]}]},{"type":"element","tagName":"h2","properties":{"id":"parametrien-oletusarvot","style":"position:relative;"},"children":[{"type":"text","value":"Parametrien oletusarvot"},{"type":"element","tagName":"a","properties":{"href":"#parametrien-oletusarvot","ariaLabel":"parametrien oletusarvot permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pythonissa mille tahansa parametrille voidaan asettaa oletusarvo. Oletusarvoja voidaan käyttää sekä funktioiden että metodien parametreissa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Jos parametrille on annettu oletusarvo, sille ei ole pakko antaa arvoa kutsuttaessa. Jos arvo annetaan, se syrjäyttää oletusarvon, ja jos arvoa ei anneta, käytetään oletusarvoa."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Oletusarvot ovat usein hyödyllisiä konstruktoreissa: jos on oletettavaa, ettei tiettyä tietoa ole aina olemassa oliota luodessa, on parempi antaa sille vakioarvo konstruktorissa kuin antaa tämä asiakkaan huoleksi. Tämä on asiakkaalle helpompaa ja myös ylläpitää olion sisäistä eheyttä, kun voidaan esimerkiksi olla varmoja, että \"tyhjä\" arvo on aina samanlainen (muuten se voisi olla esimerkiksi merkkijono "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"\""}]},{"type":"text","value":", arvo "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"None"}]},{"type":"text","value":" tai merkkijono "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"ei asetettu\""}]},{"type":"text","value":")."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarkastellaan esimerkkinä luokkaa, joka mallintaa opiskelijaa. Pakollisia kenttiä luodessa ovat opiskelijanumero ja nimi ja näistä opiskelijanumeroa ei pysty myöhemmin muuttamaan. Opintopisteet ja muistiinpanot voi halutessaan antaa oliota luodessa, mutta niille on myös asetettu oletusarvot. Luokan toiminta on kommentoitu suoraan ohjelmakoodin yhteyteen."}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","triple-quoted-string","string"]},"children":[{"type":"text","value":"\"\"\" Mallintaa yhtä opiskelijaa \"\"\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opiskelijanumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"int"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"str"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# kutsuu asetusmetodia"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin"]},"children":[{"type":"text","value":"len"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelijanumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Opiskelijanumerossa tulee olla vähintään 5 merkkiä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__opiskelijanumero "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opiskelijanumero\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Kutsuu asetusmetodia"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" opintopisteet\n\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__muistiinpanot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" muistiinpanot\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"nimi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"nimi"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"!="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nimi ei voi olla tyhjä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"opiskelijanumero"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__opiskelijanumero\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"opintopisteet"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__opintopisteet\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"opintopisteet"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" op"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" op "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__opintopisteet "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" op\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"raise"}]},{"type":"text","value":" ValueError"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Opintopisteet ei voi olla negatiivinen luku\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@property"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"muistiinpanot"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__muistiinpanot\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","decorator","annotation","punctuation"]},"children":[{"type":"text","value":"@muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"setter"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"muistiinpanot"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__muistiinpanot "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" muistiinpanot\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"yhteenveto"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Opiskelija "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" ("}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"opiskelijanumero"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"):\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"- opintopisteitä "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"__opintopisteet"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"- muistiinpanot: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Annetaan pelkkä nimi ja op.nro"}]},{"type":"text","value":"\nopiskelija1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olli Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"12345\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nopiskelija1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yhteenveto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Annetaan nimi, op.nro ja opintopisteet"}]},{"type":"text","value":"\nopiskelija2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Outi Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"54321\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"25"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nopiskelija2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yhteenveto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Annetaan kaikki tiedot"}]},{"type":"text","value":"\nopiskelija3 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olavi Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"99999\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"140"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lisäaika tentissä\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nopiskelija3"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yhteenveto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Ei anneta opintopisteitä, mutta annetaan muistiinpanot"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"# Huomaa, että parametri pitää nyt nimetä, kun järjestys eroaa tavallisesta"}]},{"type":"text","value":"\nopiskelija4 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Onerva Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"98765\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" muistiinpanot"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"poissaoleva lukuvuonna 20-21\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nopiskelija4"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"yhteenveto"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Opiskelija Olli Opiskelija (12345):"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"opintopisteitä 0"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"muistiinpanot:"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Opiskelija Outi Opiskelija (54321):"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"opintopisteitä 25"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"muistiinpanot:"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Opiskelija Olavi Opiskelija (99999):"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"opintopisteitä 140"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"muistiinpanot: lisäaika tentissä"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Opiskelija Onerva Opiskelija (98765):"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"opintopisteitä 0"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"muistiinpanot: poissaoleva lukuvuonna 20-21"}]},{"type":"text","value":"\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomaa, että attribuutille opiskelijanumero ei ole määritelty asetusmetodia, koska ideana on, että opiskelijanumero ei voi muuttua."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Parametrien oletusarvojen käyttöön liittyy kuitenkin eräs huomattavan iso \"mutta\" joka ilmenee seuraavasti esimerkistä:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tehdyt_kurssit"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehdyt_kurssit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tehdyt_kurssit\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_suoritus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kurssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehdyt_kurssit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kurssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"opiskelija1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olli Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nopiskelija2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Outi Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nopiskelija1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohpe\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nopiskelija1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tira\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelija1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehdyt_kurssit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelija2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehdyt_kurssit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['Ohpe', 'Tira']\n['Ohpe', 'Tira']"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Huomataan siis, että kurssisuorituksen lisääminen Ollille muuttaa myös Outin kurssisuorituksia. Ilmiö johtuu siitä, että Python uudelleenkäyttää oletusarvoa. Yllä oleva tapa luoda opiskelijat vastaa siis seuraavaa koodia:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kurssit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\nopiskelija1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olli Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kurssit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nopiskelija2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Outi Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kurssit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tästä johtuen parametrin oletusarvona ei koskaan tulisi käyttää monimutkaisempia tietorakenteita kuten listoja. Korjattu versio luokan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"text","value":" konstruktorista on seuraava:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Opiskelija"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"__init__"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" tehdyt_kurssit"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"None"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" nimi\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" tehdyt_kurssit "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"is"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"None"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehdyt_kurssit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehdyt_kurssit "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" tehdyt_kurssit\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"def"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"lisaa_suoritus"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kurssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n self"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehdyt_kurssit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"append"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kurssi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"opiskelija1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Olli Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nopiskelija2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Opiskelija"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Outi Opiskelija\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nopiskelija1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ohpe\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nopiskelija1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_suoritus"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tira\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelija1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehdyt_kurssit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"opiskelija2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tehdyt_kurssit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"['Ohpe', 'Tira']\n[]"}]}]},{"type":"element","tagName":"h2","properties":{"id":"loppuhuipennus","style":"position:relative;"},"children":[{"type":"text","value":"Loppuhuipennus"},{"type":"element","tagName":"a","properties":{"href":"#loppuhuipennus","ariaLabel":"loppuhuipennus permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vaikka seuraava tehtävä on tässä luvussa, et tarvitse tehtävän ratkaisemiseen mitään muuta kun luvussa "},{"type":"element","tagName":"a","properties":{"href":"/osa-9/2-oliot-attribuuttina"},"children":[{"type":"text","value":"Oliot attribuuttina"}]},{"type":"text","value":" esiteltyjä tekniikoita. Tehtävä on käytännössä hyvin samanlainen kuin tuon luvun tehtävät "},{"type":"element","tagName":"a","properties":{"href":"/osa-9/2-oliot-attribuuttina#programming-exercise-lahjapakkaus"},"children":[{"type":"text","value":"lahjapakkaus"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"a","properties":{"href":"/osa-9/2-oliot-attribuuttina#programming-exercise-huoneen-lyhin"},"children":[{"type":"text","value":"huoneen lyhin"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"programming-exercise","properties":{"name":"Tavara, Matkalaukku ja Lastiruuma","tmcname":"osa09-15_tavara_matkalaukku_lastiruuma"},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tässä tehtäväsarjassa tehdään luokat "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tavara"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Matkalaukku"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lastiruuma"}]},{"type":"text","value":", joiden avulla harjoitellaan lisää olioita, jotka sisältävät toisia olioita."}]},{"type":"element","tagName":"h2","properties":{"id":"tavara-luokka","style":"position:relative;"},"children":[{"type":"text","value":"Tavara-luokka"},{"type":"element","tagName":"a","properties":{"href":"#tavara-luokka","ariaLabel":"tavara luokka permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Tavara"}]},{"type":"text","value":", josta muodostetut oliot vastaavat erilaisia tavaroita. Tallennettavat tiedot ovat tavaran nimi ja paino (kg)."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokan tulee toimia seuraavasti"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aapiskukko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npuhelin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nokia 3210\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kirjan nimi:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"nimi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kirjan paino:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paino"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Kirja:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Puhelin:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" puhelin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostuksen tulisi olla seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kirjan nimi: Aapiskukko\nKirjan paino: 2\nKirja: Aapiskukko (2 kg)\nPuhelin: Nokia 3210 (1 kg)"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tavaralla on siis metodit "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"paino"}]},{"type":"text","value":" ja "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"nimi"}]},{"type":"text","value":" jotka palauttavat tavaran tiedot."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokan tulee tallentaa tieto nimestä ja painosta kapseloituna, eli seuraava ei saa onnistua:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aapiskukko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nkirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paino "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]}]}]}]},{"type":"element","tagName":"h2","properties":{"id":"matkalaukku-luokka","style":"position:relative;"},"children":[{"type":"text","value":"Matkalaukku-luokka"},{"type":"element","tagName":"a","properties":{"href":"#matkalaukku-luokka","ariaLabel":"matkalaukku luokka permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Matkalaukku"}]},{"type":"text","value":". Matkalaukkuun liittyy tavaroita ja maksimipaino, joka määrittelee tavaroiden suurimman mahdollisen yhteispainon."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisää luokkaan seuraavat:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"konstruktori, jolle annetaan maksimipaino"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_tavara"}]},{"type":"text","value":", joka lisää parametrina annettavan tavaran matkalaukkuun. Metodi ei palauta mitään arvoa."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":", joka palauttaa merkkijonon muotoa \"x tavaraa (y kg)\""}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokan tulee valvoa, että sen sisältämien tavaroiden yhteispaino ei ylitä maksimipainoa. Jos maksimipaino ylittyisi lisättävän tavaran vuoksi, metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_tavara"}]},{"type":"text","value":" ei saa lisätä uutta tavaraa laukkuun."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on luokan käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aapiskukko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npuhelin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nokia 3210\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntiiliskivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tiiliskivi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nmatkalaukku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nmatkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nmatkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"puhelin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nmatkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tiiliskivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostuksen tulisi olla seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"0 tavaraa (0 kg)\n1 tavaraa (2 kg)\n2 tavaraa (3 kg)\n2 tavaraa (3 kg)"}]}]},{"type":"element","tagName":"h2","properties":{"id":"kielenhuoltoa","style":"position:relative;"},"children":[{"type":"text","value":"Kielenhuoltoa"},{"type":"element","tagName":"a","properties":{"href":"#kielenhuoltoa","ariaLabel":"kielenhuoltoa permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ilmoitus \"1 tavaraa\" ei ole kovin hyvää suomea, vaan olisi parempi sanoa \"1 tavara\". Tee tämä muutos luokassa sijaitsevaan "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":"-metodiin."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nyt edellisen ohjelman tulostuksen tulisi olla seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"0 tavaraa (0 kg)\n1 tavara (2 kg)\n2 tavaraa (3 kg)\n2 tavaraa (3 kg)"}]}]},{"type":"element","tagName":"h2","properties":{"id":"kaikki-tavarat","style":"position:relative;"},"children":[{"type":"text","value":"Kaikki tavarat"},{"type":"element","tagName":"a","properties":{"href":"#kaikki-tavarat","ariaLabel":"kaikki tavarat permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisää luokkaan seuraavat metodit:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta_tavarat"}]},{"type":"text","value":", joka tulostaa kaikki matkalaukussa olevat tavarat"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"paino"}]},{"type":"text","value":", joka palauttaa matkalaukun yhteispainoa kuvaavan kokonaisluvun, joka on sen sisältävien tavaroiden painojen summa"}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on luokan käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aapiskukko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npuhelin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nokia 3210\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntiiliskivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tiiliskivi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nmatkalaukku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmatkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmatkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"puhelin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmatkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tiiliskivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Matkalaukussa on seuraavat tavarat:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmatkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_tavarat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npaino_yht "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"paino"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Yhteispaino: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"paino_yht"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":" kg\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostuksen tulisi olla seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Matkalaukussa on seuraavat tavarat:\nAapiskukko (2 kg)\nNokia 3210 (1 kg)\nTiiliskivi (4 kg)\nYhteispaino: 7 kg"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Muokkaa myös luokkaasi siten, että käytät vain kahta oliomuuttujaa. Toinen sisältää maksimipainon, toinen on lista laukussa olevista tavaroista."}]},{"type":"element","tagName":"h2","properties":{"id":"raskain-tavara","style":"position:relative;"},"children":[{"type":"text","value":"Raskain tavara"},{"type":"element","tagName":"a","properties":{"href":"#raskain-tavara","ariaLabel":"raskain tavara permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisää vielä luokkaan metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"raskain_tavara"}]},{"type":"text","value":", joka palauttaa painoltaan suurimman tavaran. Jos yhtä raskaita tavaroita on useita, metodi voi palauttaa minkä tahansa niistä. Metodin tulee palauttaa olioviite. Jos laukku on tyhjä, palauta arvo "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"None"}]},{"type":"text","value":"."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on luokan käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aapiskukko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npuhelin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nokia 3210\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntiiliskivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tiiliskivi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nmatkalaukku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmatkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmatkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"puhelin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nmatkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tiiliskivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nraskain "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"raskain_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string-interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"f\"Raskain tavara: "}]},{"type":"element","tagName":"span","properties":{"className":["token","interpolation"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"raskain"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\""}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostuksen tulisi olla seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Raskain tavara: Tiiliskivi (4 kg)"}]}]},{"type":"element","tagName":"h2","properties":{"id":"lastiruuma-luokka","style":"position:relative;"},"children":[{"type":"text","value":"Lastiruuma-luokka"},{"type":"element","tagName":"a","properties":{"href":"#lastiruuma-luokka","ariaLabel":"lastiruuma luokka permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tee luokka "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"Lastiruuma"}]},{"type":"text","value":", johon liittyvät seuraavat metodit:"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"konstruktori, jolle annetaan maksimipaino"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_matkalaukku"}]},{"type":"text","value":", joka lisää parametrina annetun matkalaukun lastiruumaan"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"__str__"}]},{"type":"text","value":", joka palauttaa merkkijonon muotoa \"x matkalaukkua, tilaa y kg\""}]},{"type":"text","value":"\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Luokan tulee valvoa, että sen matkalaukkujen yhteispaino ei ylitä maksimipainoa. Jos maksimipaino ylittyisi uuden matkalaukun vuoksi, metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"lisaa_matkalaukku"}]},{"type":"text","value":" ei saa lisätä uutta matkalaukkua."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on luokan käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"lastiruuma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Lastiruuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lastiruuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nkirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aapiskukko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npuhelin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nokia 3210\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntiiliskivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tiiliskivi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nadan_laukku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nadan_laukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nadan_laukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"puhelin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npekan_laukku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npekan_laukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tiiliskivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nlastiruuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"adan_laukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lastiruuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nlastiruuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_laukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"lastiruuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"0 matkalaukkua, tilaa 1000 kg\n1 matkalaukku, tilaa 997 kg\n2 matkalaukkua, tilaa 993 kg"}]}]},{"type":"element","tagName":"h2","properties":{"id":"lastiruuman-sisalto","style":"position:relative;"},"children":[{"type":"text","value":"Lastiruuman sisältö"},{"type":"element","tagName":"a","properties":{"href":"#lastiruuman-sisalto","ariaLabel":"lastiruuman sisalto permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lisää luokkaan metodi "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"tulosta_tavarat"}]},{"type":"text","value":", joka tulostaa kaikki lastiruuman matkalaukuissa olevat tavarat."}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Seuraavassa on luokan käyttöesimerkki:"}]},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"python"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-python"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-python"]},"children":[{"type":"text","value":"kirja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Aapiskukko\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npuhelin "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Nokia 3210\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ntiiliskivi "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Tiiliskivi\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nadan_laukku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nadan_laukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"kirja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nadan_laukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"puhelin"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\npekan_laukku "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\npekan_laukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_tavara"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"tiiliskivi"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nlastiruuma "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Lastiruuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlastiruuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"adan_laukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlastiruuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"lisaa_matkalaukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"pekan_laukku"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"print"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ruuman matkalaukuissa on seuraavat tavarat:\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nlastiruuma"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"tulosta_tavarat"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ohjelman tulostuksen tulisi olla seuraava:"}]},{"type":"element","tagName":"sample-output","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ruuman matkalaukuissa on seuraavat tavarat:\nAapiskukko (2 kg)\nNokia 3210 (1 kg)\nTiiliskivi (4 kg)"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vastaa lopuksi osion loppukyselyyn:"}]},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"quiz","properties":{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11"},"children":[]}]}]},"html":"

Tämän osion jälkeen

    \n
  • Tunnet lisää esimerkkejä luokista ja olioista
  • \n
  • Osaat käyttää parametrien oletusarvoja metodeissa
  • \n

Tarkastellaan seuraavaksi esimerkkiä, joka muodostuu kahdesta luokasta. Luokka Piste mallintaa yhtä pistettä kaksiulotteisessa koordinaatistossa ja luokka Jana kahden pisteen välistä janaa. Luokkien toiminta on kommentoitu koodiin.

import math\n\nclass Piste:\n    \"\"\" Luokka mallintaa pistettä kaksiulotteisessa koordinaatistossa \"\"\"\n\n    def __init__(self, x: float, y: float):\n        # Attribuutit ovat julkisia, koska mitkä tahansa arvot käyvät x:n ja y:n arvoiksi\n        self.x = x\n        self.y = y\n\n    # Luokkametodi palauttaa uuden pisteen paikassa (0, 0)\n    # Huomaa, että luokan sisältä voi palauttaa olion luokasta\n    @classmethod\n    def origo(cls):\n        return Piste(0, 0)\n\n    # Luokkametodi muodostaa uuden pisteen annetun pisteen perusteella\n    # Uusi piste on peilikuva annetusta pisteestä jommankumman tai molempien akselien suhteen\n    # Esimerkiksi pisteen (1, 3) peilikuva x-akselin suhteen on (1, -3)\n    @classmethod\n    def peilikuva(cls, piste, peilaa_x: bool, peilaa_y: bool):\n        x = piste.x\n        y = piste.y\n        if peilaa_x:\n            y = -y\n        if peilaa_y:\n            x = -x\n\n        return Piste(x, y)\n\n    def __str__(self):\n        return f\"({self.x}, {self.y})\"\n\nclass Jana:\n    \"\"\" Luokka mallintaa janaa kaksiulotteisessa koordinaatistossa \"\"\"\n\n    def __init__(self, alku: Piste, loppu: Piste):\n        # Attribuutit ovat julkisia, koska mitkä tahansa pisteet kelpaavat\n        self.alku = alku\n        self.loppu = loppu\n\n    # Metodi laskee janan pituuden Pythagoraan lauseella\n    def pituus(self):\n        summa = (self.loppu.x - self.alku.x) ** 2 + (self.loppu.y - self.alku.y) ** 2\n        return math.sqrt(summa)\n\n    # Metodi palauttaa janan keskipisteen\n    def keskipiste(self):\n        keskix = (self.alku.x + self.loppu.x) / 2\n        keskiy = (self.alku.y + self.loppu.y) / 2\n        return Piste(keskix, keskiy)\n\n    def __str__(self):\n        return f\"{self.alku} ... {self.loppu}\"
piste = Piste(1,3)\nprint(piste)\n\norigo = Piste.origo()\nprint(origo)\n\npiste2 = Piste.peilikuva(piste, True, True)\nprint(piste2)\n\njana = Jana(piste, piste2)\nprint(jana.pituus())\nprint(jana.keskipiste())\nprint(jana)

(1, 3)\n(0, 0)\n(-1, -3)\n6.324555320336759\n(0.0, 0.0)\n(1, 3) ... (-1, -3)

Parametrien oletusarvot

Pythonissa mille tahansa parametrille voidaan asettaa oletusarvo. Oletusarvoja voidaan käyttää sekä funktioiden että metodien parametreissa.

Jos parametrille on annettu oletusarvo, sille ei ole pakko antaa arvoa kutsuttaessa. Jos arvo annetaan, se syrjäyttää oletusarvon, ja jos arvoa ei anneta, käytetään oletusarvoa.

Oletusarvot ovat usein hyödyllisiä konstruktoreissa: jos on oletettavaa, ettei tiettyä tietoa ole aina olemassa oliota luodessa, on parempi antaa sille vakioarvo konstruktorissa kuin antaa tämä asiakkaan huoleksi. Tämä on asiakkaalle helpompaa ja myös ylläpitää olion sisäistä eheyttä, kun voidaan esimerkiksi olla varmoja, että \"tyhjä\" arvo on aina samanlainen (muuten se voisi olla esimerkiksi merkkijono \"\", arvo None tai merkkijono \"ei asetettu\").

Tarkastellaan esimerkkinä luokkaa, joka mallintaa opiskelijaa. Pakollisia kenttiä luodessa ovat opiskelijanumero ja nimi ja näistä opiskelijanumeroa ei pysty myöhemmin muuttamaan. Opintopisteet ja muistiinpanot voi halutessaan antaa oliota luodessa, mutta niille on myös asetettu oletusarvot. Luokan toiminta on kommentoitu suoraan ohjelmakoodin yhteyteen.

class Opiskelija:\n    \"\"\" Mallintaa yhtä opiskelijaa \"\"\"\n\n    def __init__(self, nimi: str, opiskelijanumero: str, opintopisteet:int = 0, muistiinpanot:str = \"\"):\n        # kutsuu asetusmetodia\n        self.nimi = nimi\n\n        if len(opiskelijanumero) < 5:\n            raise ValueError(\"Opiskelijanumerossa tulee olla vähintään 5 merkkiä\")\n\n        self.__opiskelijanumero = opiskelijanumero\n\n        # Kutsuu asetusmetodia\n        self.opintopisteet = opintopisteet\n\n        self.__muistiinpanot = muistiinpanot\n\n    @property\n    def nimi(self):\n        return self.__nimi\n\n    @nimi.setter\n    def nimi(self, nimi):\n        if nimi != \"\":\n            self.__nimi = nimi\n        else:\n            raise ValueError(\"Nimi ei voi olla tyhjä\")\n\n    @property\n    def opiskelijanumero(self):\n        return self.__opiskelijanumero\n\n    @property\n    def opintopisteet(self):\n        return self.__opintopisteet\n\n    @opintopisteet.setter\n    def opintopisteet(self, op):\n        if op >= 0:\n            self.__opintopisteet = op\n        else:\n            raise ValueError(\"Opintopisteet ei voi olla negatiivinen luku\")\n\n    @property\n    def muistiinpanot(self):\n        return self.__muistiinpanot\n\n    @muistiinpanot.setter\n    def muistiinpanot(self, muistiinpanot):\n        self.__muistiinpanot = muistiinpanot\n\n    def yhteenveto(self):\n        print(f\"Opiskelija {self.__nimi} ({self.opiskelijanumero}):\")\n        print(f\"- opintopisteitä {self.__opintopisteet}\")\n        print(f\"- muistiinpanot: {self.muistiinpanot}\")
# Annetaan pelkkä nimi ja op.nro\nopiskelija1 = Opiskelija(\"Olli Opiskelija\", \"12345\")\nopiskelija1.yhteenveto()\n\n# Annetaan nimi, op.nro ja opintopisteet\nopiskelija2 = Opiskelija(\"Outi Opiskelija\", \"54321\", 25)\nopiskelija2.yhteenveto()\n\n# Annetaan kaikki tiedot\nopiskelija3 = Opiskelija(\"Olavi Opiskelija\", \"99999\", 140, \"lisäaika tentissä\")\nopiskelija3.yhteenveto()\n\n# Ei anneta opintopisteitä, mutta annetaan muistiinpanot\n# Huomaa, että parametri pitää nyt nimetä, kun järjestys eroaa tavallisesta\nopiskelija4 = Opiskelija(\"Onerva Opiskelija\", \"98765\", muistiinpanot=\"poissaoleva lukuvuonna 20-21\")\nopiskelija4.yhteenveto()

Opiskelija Olli Opiskelija (12345):

    \n
  • opintopisteitä 0
  • \n
  • muistiinpanot:
  • \n

Opiskelija Outi Opiskelija (54321):

    \n
  • opintopisteitä 25
  • \n
  • muistiinpanot:
  • \n

Opiskelija Olavi Opiskelija (99999):

    \n
  • opintopisteitä 140
  • \n
  • muistiinpanot: lisäaika tentissä
  • \n

Opiskelija Onerva Opiskelija (98765):

    \n
  • opintopisteitä 0
  • \n
  • muistiinpanot: poissaoleva lukuvuonna 20-21
  • \n

Huomaa, että attribuutille opiskelijanumero ei ole määritelty asetusmetodia, koska ideana on, että opiskelijanumero ei voi muuttua.

Parametrien oletusarvojen käyttöön liittyy kuitenkin eräs huomattavan iso \"mutta\" joka ilmenee seuraavasti esimerkistä:

class Opiskelija:\n    def __init__(self, nimi, tehdyt_kurssit=[]):\n        self.nimi = nimi\n        self.tehdyt_kurssit = tehdyt_kurssit\n\n    def lisaa_suoritus(self, kurssi):\n        self.tehdyt_kurssit.append(kurssi)
opiskelija1 = Opiskelija(\"Olli Opiskelija\")\nopiskelija2 = Opiskelija(\"Outi Opiskelija\")\n\nopiskelija1.lisaa_suoritus(\"Ohpe\")\nopiskelija1.lisaa_suoritus(\"Tira\")\n\nprint(opiskelija1.tehdyt_kurssit)\nprint(opiskelija2.tehdyt_kurssit)

['Ohpe', 'Tira']\n['Ohpe', 'Tira']

Huomataan siis, että kurssisuorituksen lisääminen Ollille muuttaa myös Outin kurssisuorituksia. Ilmiö johtuu siitä, että Python uudelleenkäyttää oletusarvoa. Yllä oleva tapa luoda opiskelijat vastaa siis seuraavaa koodia:

kurssit = []\nopiskelija1 = Opiskelija(\"Olli Opiskelija\", kurssit)\nopiskelija2 = Opiskelija(\"Outi Opiskelija\", kurssit)

Tästä johtuen parametrin oletusarvona ei koskaan tulisi käyttää monimutkaisempia tietorakenteita kuten listoja. Korjattu versio luokan Opiskelija konstruktorista on seuraava:

class Opiskelija:\n    def __init__(self, nimi, tehdyt_kurssit=None):\n        self.nimi = nimi\n        if tehdyt_kurssit is None:\n            self.tehdyt_kurssit = []\n        else:\n            self.tehdyt_kurssit = tehdyt_kurssit\n\n    def lisaa_suoritus(self, kurssi):\n        self.tehdyt_kurssit.append(kurssi)
opiskelija1 = Opiskelija(\"Olli Opiskelija\")\nopiskelija2 = Opiskelija(\"Outi Opiskelija\")\n\nopiskelija1.lisaa_suoritus(\"Ohpe\")\nopiskelija1.lisaa_suoritus(\"Tira\")\n\nprint(opiskelija1.tehdyt_kurssit)\nprint(opiskelija2.tehdyt_kurssit)

['Ohpe', 'Tira']\n[]

Loppuhuipennus

Vaikka seuraava tehtävä on tässä luvussa, et tarvitse tehtävän ratkaisemiseen mitään muuta kun luvussa Oliot attribuuttina esiteltyjä tekniikoita. Tehtävä on käytännössä hyvin samanlainen kuin tuon luvun tehtävät lahjapakkaus ja huoneen lyhin.

Tässä tehtäväsarjassa tehdään luokat Tavara, Matkalaukku ja Lastiruuma, joiden avulla harjoitellaan lisää olioita, jotka sisältävät toisia olioita.

Tavara-luokka

Tee luokka Tavara, josta muodostetut oliot vastaavat erilaisia tavaroita. Tallennettavat tiedot ovat tavaran nimi ja paino (kg).

Luokan tulee toimia seuraavasti

kirja = Tavara(\"Aapiskukko\", 2)\npuhelin = Tavara(\"Nokia 3210\", 1)\n\nprint(\"Kirjan nimi:\", kirja.nimi())\nprint(\"Kirjan paino:\", kirja.paino())\n\nprint(\"Kirja:\", kirja)\nprint(\"Puhelin:\", puhelin)

Ohjelman tulostuksen tulisi olla seuraava:

Kirjan nimi: Aapiskukko\nKirjan paino: 2\nKirja: Aapiskukko (2 kg)\nPuhelin: Nokia 3210 (1 kg)

Tavaralla on siis metodit paino ja nimi jotka palauttavat tavaran tiedot.

Luokan tulee tallentaa tieto nimestä ja painosta kapseloituna, eli seuraava ei saa onnistua:

kirja = Tavara(\"Aapiskukko\", 2)\nkirja.paino = 10

Matkalaukku-luokka

Tee luokka Matkalaukku. Matkalaukkuun liittyy tavaroita ja maksimipaino, joka määrittelee tavaroiden suurimman mahdollisen yhteispainon.

Lisää luokkaan seuraavat:

    \n
  • konstruktori, jolle annetaan maksimipaino
  • \n
  • metodi lisaa_tavara, joka lisää parametrina annettavan tavaran matkalaukkuun. Metodi ei palauta mitään arvoa.
  • \n
  • metodi __str__, joka palauttaa merkkijonon muotoa \"x tavaraa (y kg)\"
  • \n

Luokan tulee valvoa, että sen sisältämien tavaroiden yhteispaino ei ylitä maksimipainoa. Jos maksimipaino ylittyisi lisättävän tavaran vuoksi, metodi lisaa_tavara ei saa lisätä uutta tavaraa laukkuun.

Seuraavassa on luokan käyttöesimerkki:

kirja = Tavara(\"Aapiskukko\", 2)\npuhelin = Tavara(\"Nokia 3210\", 1)\ntiiliskivi = Tavara(\"Tiiliskivi\", 4)\n\nmatkalaukku = Matkalaukku(5)\nprint(matkalaukku)\n\nmatkalaukku.lisaa_tavara(kirja)\nprint(matkalaukku)\n\nmatkalaukku.lisaa_tavara(puhelin)\nprint(matkalaukku)\n\nmatkalaukku.lisaa_tavara(tiiliskivi)\nprint(matkalaukku)

Ohjelman tulostuksen tulisi olla seuraava:

0 tavaraa (0 kg)\n1 tavaraa (2 kg)\n2 tavaraa (3 kg)\n2 tavaraa (3 kg)

Kielenhuoltoa

Ilmoitus \"1 tavaraa\" ei ole kovin hyvää suomea, vaan olisi parempi sanoa \"1 tavara\". Tee tämä muutos luokassa sijaitsevaan __str__-metodiin.

Nyt edellisen ohjelman tulostuksen tulisi olla seuraava:

0 tavaraa (0 kg)\n1 tavara (2 kg)\n2 tavaraa (3 kg)\n2 tavaraa (3 kg)

Kaikki tavarat

Lisää luokkaan seuraavat metodit:

    \n
  • tulosta_tavarat, joka tulostaa kaikki matkalaukussa olevat tavarat
  • \n
  • paino, joka palauttaa matkalaukun yhteispainoa kuvaavan kokonaisluvun, joka on sen sisältävien tavaroiden painojen summa
  • \n

Seuraavassa on luokan käyttöesimerkki:

kirja = Tavara(\"Aapiskukko\", 2)\npuhelin = Tavara(\"Nokia 3210\", 1)\ntiiliskivi = Tavara(\"Tiiliskivi\", 4)\n\nmatkalaukku = Matkalaukku(10)\nmatkalaukku.lisaa_tavara(kirja)\nmatkalaukku.lisaa_tavara(puhelin)\nmatkalaukku.lisaa_tavara(tiiliskivi)\n\nprint(\"Matkalaukussa on seuraavat tavarat:\")\nmatkalaukku.tulosta_tavarat()\npaino_yht = matkalaukku.paino()\nprint(f\"Yhteispaino: {paino_yht} kg\")

Ohjelman tulostuksen tulisi olla seuraava:

Matkalaukussa on seuraavat tavarat:\nAapiskukko (2 kg)\nNokia 3210 (1 kg)\nTiiliskivi (4 kg)\nYhteispaino: 7 kg

Muokkaa myös luokkaasi siten, että käytät vain kahta oliomuuttujaa. Toinen sisältää maksimipainon, toinen on lista laukussa olevista tavaroista.

Raskain tavara

Lisää vielä luokkaan metodi raskain_tavara, joka palauttaa painoltaan suurimman tavaran. Jos yhtä raskaita tavaroita on useita, metodi voi palauttaa minkä tahansa niistä. Metodin tulee palauttaa olioviite. Jos laukku on tyhjä, palauta arvo None.

Seuraavassa on luokan käyttöesimerkki:

kirja = Tavara(\"Aapiskukko\", 2)\npuhelin = Tavara(\"Nokia 3210\", 1)\ntiiliskivi = Tavara(\"Tiiliskivi\", 4)\n\nmatkalaukku = Matkalaukku(10)\nmatkalaukku.lisaa_tavara(kirja)\nmatkalaukku.lisaa_tavara(puhelin)\nmatkalaukku.lisaa_tavara(tiiliskivi)\n\nraskain = matkalaukku.raskain_tavara()\nprint(f\"Raskain tavara: {raskain}\")

Ohjelman tulostuksen tulisi olla seuraava:

Raskain tavara: Tiiliskivi (4 kg)

Lastiruuma-luokka

Tee luokka Lastiruuma, johon liittyvät seuraavat metodit:

    \n
  • konstruktori, jolle annetaan maksimipaino
  • \n
  • metodi lisaa_matkalaukku, joka lisää parametrina annetun matkalaukun lastiruumaan
  • \n
  • metodi __str__, joka palauttaa merkkijonon muotoa \"x matkalaukkua, tilaa y kg\"
  • \n

Luokan tulee valvoa, että sen matkalaukkujen yhteispaino ei ylitä maksimipainoa. Jos maksimipaino ylittyisi uuden matkalaukun vuoksi, metodi lisaa_matkalaukku ei saa lisätä uutta matkalaukkua.

Seuraavassa on luokan käyttöesimerkki:

lastiruuma = Lastiruuma(1000)\nprint(lastiruuma)\n\nkirja = Tavara(\"Aapiskukko\", 2)\npuhelin = Tavara(\"Nokia 3210\", 1)\ntiiliskivi = Tavara(\"Tiiliskivi\", 4)\n\nadan_laukku = Matkalaukku(10)\nadan_laukku.lisaa_tavara(kirja)\nadan_laukku.lisaa_tavara(puhelin)\n\npekan_laukku = Matkalaukku(10)\npekan_laukku.lisaa_tavara(tiiliskivi)\n\nlastiruuma.lisaa_matkalaukku(adan_laukku)\nprint(lastiruuma)\n\nlastiruuma.lisaa_matkalaukku(pekan_laukku)\nprint(lastiruuma)

0 matkalaukkua, tilaa 1000 kg\n1 matkalaukku, tilaa 997 kg\n2 matkalaukkua, tilaa 993 kg

Lastiruuman sisältö

Lisää luokkaan metodi tulosta_tavarat, joka tulostaa kaikki lastiruuman matkalaukuissa olevat tavarat.

Seuraavassa on luokan käyttöesimerkki:

kirja = Tavara(\"Aapiskukko\", 2)\npuhelin = Tavara(\"Nokia 3210\", 1)\ntiiliskivi = Tavara(\"Tiiliskivi\", 4)\n\nadan_laukku = Matkalaukku(10)\nadan_laukku.lisaa_tavara(kirja)\nadan_laukku.lisaa_tavara(puhelin)\n\npekan_laukku = Matkalaukku(10)\npekan_laukku.lisaa_tavara(tiiliskivi)\n\nlastiruuma = Lastiruuma(1000)\nlastiruuma.lisaa_matkalaukku(adan_laukku)\nlastiruuma.lisaa_matkalaukku(pekan_laukku)\n\nprint(\"Ruuman matkalaukuissa on seuraavat tavarat:\")\nlastiruuma.tulosta_tavarat()

Ohjelman tulostuksen tulisi olla seuraava:

Ruuman matkalaukuissa on seuraavat tavarat:\nAapiskukko (2 kg)\nNokia 3210 (1 kg)\nTiiliskivi (4 kg)

Vastaa lopuksi osion loppukyselyyn:

","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-9/6-lisaa-esimerkkeja.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"}}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"}}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"}}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"}}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"}}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"}}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."}}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."}}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."}}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"}}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"}}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"}}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"}}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"}}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"}}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"}}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"}}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"}}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"}}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"}}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"}}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"}}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"}}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"}}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"}}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"}}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"}}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"}}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"}}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"}}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"}}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"}}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"}}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"}}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"}}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"}}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"}}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"}}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"}}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"}}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"}}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"}}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"}}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"}}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"}}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"}}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"}}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"}}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"}}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"}}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"}}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"}}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"}}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"}}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"}}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"}}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"}}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"}}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"}}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"}}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"}}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"}}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"}}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"}}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"}}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"}}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"}}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"}}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"}}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"}}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"}}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"}}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"}}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"}}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"}}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"}}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"}}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"}}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"}}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"}}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"}}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"}}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"}}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"}}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"}}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"}}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"}}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/page-data/osa-9/page-data.json b/page-data/osa-9/page-data.json index 9f7a64664..78d8f66e3 100644 --- a/page-data/osa-9/page-data.json +++ b/page-data/osa-9/page-data.json @@ -1,5 +1,5 @@ { "componentChunkName": "component---src-templates-course-part-overview-template-js", "path": "/osa-9", - "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-9","title":"Osa 9"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-9/index.md"},"allPages":{"edges":[{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}}]}},"pageContext":{}}, + "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"pages-in-this-section","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"exercises-in-this-section","properties":{},"children":[]}]}],"data":{"quirksMode":false}},"html":"
\n
","frontmatter":{"path":"/osa-9","title":"Osa 9"},"fileAbsolutePath":"/home/runner/work/ohjelmointi-23/ohjelmointi-23/data/osa-9/index.md"},"allPages":{"edges":[{"node":{"id":"781443ac-62cd-5efc-891a-09d1ba6b20f0","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"3fa41162-c2ef-558a-b7e7-9f8165abf53b","frontmatter":{"path":"/arvostelu-ja-kokeet","title":"Arvostelu ja kokeet"},"moocfiExercises":[]}},{"node":{"id":"d45502ca-e338-5afa-9839-8ab617ad6ddf","frontmatter":{"path":"/","title":"Tietoa kurssista"},"moocfiExercises":[]}},{"node":{"id":"7eca7bbe-fb6b-59e5-a674-c0eaf5c89761","frontmatter":{"path":"/kaikki-tehtavat","title":"Kaikki tehtävät"},"moocfiExercises":[]}},{"node":{"id":"1efc8cfc-157a-5088-914b-c9901a0d1f5f","frontmatter":{"path":"/tuki","title":"Tukea tehtäviin"},"moocfiExercises":[]}},{"node":{"id":"d7412ce2-d77b-51de-bcba-4313eddec4f5","frontmatter":{"path":"/usein-kysytyt-kysymykset","title":"Usein kysytyt kysymykset"},"moocfiExercises":[]}},{"node":{"id":"9c49fdd5-713f-532e-a16b-8041b239b696","frontmatter":{"path":"/verkkotentti-ohja","title":"Ohjelmoinnin jatkokurssin verkkotentti 20.01."},"moocfiExercises":[]}},{"node":{"id":"c2658c25-bd6c-5b1f-ad41-22924eb16b0f","frontmatter":{"path":"/verkkotentti-ohpe","title":"Ohjelmoinnin perusteiden verkkotentti 13.01."},"moocfiExercises":[]}},{"node":{"id":"0818c444-38eb-58ab-b129-9abb78c99e32","frontmatter":{"path":"/verkkotentti","title":"Verkkotentti 4.6."},"moocfiExercises":[]}},{"node":{"id":"682404c6-0aa3-5968-98ec-2a1fc780513b","frontmatter":{"path":"/virheilmoitukset","title":"Yleiset virheilmoitukset"},"moocfiExercises":[]}},{"node":{"id":"9af06cbb-4843-5f1e-a5af-eb0a2244a123","frontmatter":{"path":"/osa-1/1-ohjelmoinnin-aloittaminen","title":"Ohjelmoinnin aloittaminen"},"moocfiExercises":[{"id":"Hymiö","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Korjaa ohjelma: seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ukko Nooa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Minuutit vuodessa","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"Ohjelma tulostaa koodia","type":"programming-exercise","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"},{"id":"4d085eeb-fee6-5087-a9b4-6749f4ea4111","type":"quiz","parentPagePath":"/osa-1/1-ohjelmoinnin-aloittaminen"}]}},{"node":{"id":"43608516-b36a-504e-916a-ae320b95133c","frontmatter":{"path":"/sanasto","title":"Sanasto"},"moocfiExercises":[]}},{"node":{"id":"c95594d0-17e1-5910-9a58-222279545385","frontmatter":{"path":"/osa-1/2-tietoa-kayttajalta","title":"Tietoa käyttäjältä"},"moocfiExercises":[{"id":"Nimi kahdesti","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimet huutomerkillä","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Nimi ja osoite","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":" Korjaa ohjelma: Lausahdukset","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-1/2-tietoa-kayttajalta"},{"id":"260a58a9-a12e-5a55-835b-26cfac247f57","type":"quiz","parentPagePath":"/osa-1/2-tietoa-kayttajalta"}]}},{"node":{"id":"d6271ead-1356-530b-b7a2-7fde11626262","frontmatter":{"path":"/osa-1/3-lisaa-muuttujista","title":"Lisää muuttujista"},"moocfiExercises":[{"id":"6a4ceb56-be87-5007-add2-1f28fad7bdfc","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Välilyönnillä vai ilman","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Laskutoimitukset","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"Korjaa ohjelma: Tulostukset samalle riville","type":"programming-exercise","parentPagePath":"/osa-1/3-lisaa-muuttujista"},{"id":"7322e73e-d6c5-5490-af97-ec69c45e720b","type":"quiz","parentPagePath":"/osa-1/3-lisaa-muuttujista"}]}},{"node":{"id":"57d29be3-18d6-5bd0-90af-4ac4811f94c4","frontmatter":{"path":"/osa-1/4-laskentaa-luvuilla","title":"Laskentaa luvuilla"},"moocfiExercises":[{"id":"Luku kertaa viisi","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Nimi ja ikä","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Vuorokaudet sekunteina","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Korjaa ohjelma: Lukujen tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja tulo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Lukujen summa ja keskiarvo","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Ruokailukustannukset","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"Opiskelijat ryhmiin","type":"programming-exercise","parentPagePath":"/osa-1/4-laskentaa-luvuilla"},{"id":"a9b97b42-4bfe-55aa-a1d4-8f8db058b50a","type":"quiz","parentPagePath":"/osa-1/4-laskentaa-luvuilla"}]}},{"node":{"id":"823d3610-17bf-5f85-89b5-43e57eca30a4","frontmatter":{"path":"/osa-1","title":"Osa 1"},"moocfiExercises":[]}},{"node":{"id":"1540f76b-3101-5b05-8095-6a07cfecbbcf","frontmatter":{"path":"/osa-1/5-ehtorakenne","title":"Ehtorakenne"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Itseisarvo","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Keittoa vai ei","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Luvun suuruusluokka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Laskin","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Lämpötilat","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Palkka","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Korjaa ohjelma: Korkoa kortille","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Huomiset vaatteet","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"Toisen asteen yhtälön ratkaiseminen","type":"programming-exercise","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"db5009e5-a4b7-5e82-a297-e2cc36b5b3d3","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"},{"id":"6316a9cd-a952-581f-b1c7-93e0cb694faa","type":"quiz","parentPagePath":"/osa-1/5-ehtorakenne"}]}},{"node":{"id":"3ec62a05-6764-5cde-8038-746a88db6a37","frontmatter":{"path":"/osa-10/2-nakyvyysmaareet","title":"Näkyvyysmääreet"},"moocfiExercises":[{"id":"Superryhmä","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"},{"id":"Salainen taikajuoma","type":"programming-exercise","parentPagePath":"/osa-10/2-nakyvyysmaareet"}]}},{"node":{"id":"6e251a7e-0806-5da7-b733-412c15549f51","frontmatter":{"path":"/osa-10/1-luokkahierarkiat","title":"Luokkahierarkiat"},"moocfiExercises":[{"id":"Kannettava tietokone","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pelimuseo","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Pinta-alat","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"},{"id":"Sanapeli","type":"programming-exercise","parentPagePath":"/osa-10/1-luokkahierarkiat"}]}},{"node":{"id":"004a0d76-9a6d-5eb9-a48b-a190cffb324b","frontmatter":{"path":"/osa-10/3-olio-ohjelmoinnin-tekniikoita","title":"Olio-ohjelmoinnin tekniikoita"},"moocfiExercises":[{"id":"Raha","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Päiväys","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"},{"id":"Iteroitava kauppalista","type":"programming-exercise","parentPagePath":"/osa-10/3-olio-ohjelmoinnin-tekniikoita"}]}},{"node":{"id":"125f6bea-e97f-5d9d-b47a-db94dc87c4a5","frontmatter":{"path":"/osa-10","title":"Osa 10"},"moocfiExercises":[]}},{"node":{"id":"987e3ed9-1843-54bf-9527-7068ab9cd537","frontmatter":{"path":"/osa-10/4-lisaa-esimerkkeja","title":"Laajemman sovelluksen kehittäminen"},"moocfiExercises":[{"id":"Puhelinluettelon laajennus, osa 1","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Puhelinluettelon laajennus, osa 2","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"Opintorekisteri","type":"programming-exercise","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"},{"id":"adf5276f-057a-5ac0-85b1-024443782145","type":"quiz","parentPagePath":"/osa-10/4-lisaa-esimerkkeja"}]}},{"node":{"id":"b0f941d1-935a-5b8e-b0b6-cdca5bcf3193","frontmatter":{"path":"/osa-11/1-koosteet","title":"Koosteet"},"moocfiExercises":[{"id":"Neliojuuret","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Tähtirivit","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Paras koetulos","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Pituudet","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Poista pienemmät","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Vokaalilla alkavat","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"},{"id":"Lottorivi","type":"programming-exercise","parentPagePath":"/osa-11/1-koosteet"}]}},{"node":{"id":"55d0885e-35f5-5b91-9d70-5c56104e21c3","frontmatter":{"path":"/osa-11/3-rekursio","title":"Rekursio"},"moocfiExercises":[{"id":"Suurempia lukuja","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Rekursiivinen summa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"},{"id":"Sulut tasapainossa","type":"programming-exercise","parentPagePath":"/osa-11/3-rekursio"}]}},{"node":{"id":"ab1d50f8-af25-52d6-b392-0fa7d333fdb1","frontmatter":{"path":"/osa-11/4-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Suurin alkio","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Pomot ja alaiset","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirja","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"Tilauskirjasovellus","type":"programming-exercise","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"},{"id":"d9bb47f3-47c2-5e56-9845-628d9977c542","type":"quiz","parentPagePath":"/osa-11/4-lisaa-esimerkkeja"}]}},{"node":{"id":"09be19c7-c865-52dd-b481-57c840fdc8cc","frontmatter":{"path":"/osa-11","title":"Osa 11"},"moocfiExercises":[]}},{"node":{"id":"bb59b8b2-39dc-55c5-bb11-de8715c89959","frontmatter":{"path":"/osa-11/2-lisaa-koosteesta","title":"Lisää koosteesta"},"moocfiExercises":[{"id":"Suodata kielletyt","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Kauppalistan tuotteet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Halvempien hintaero","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Merkkijonojen pituudet","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"},{"id":"Yleisimmät sanat","type":"programming-exercise","parentPagePath":"/osa-11/2-lisaa-koosteesta"}]}},{"node":{"id":"277cb442-b803-5462-a834-936d3be9de8a","frontmatter":{"path":"/osa-12/2-generaattorit","title":"Generaattorit"},"moocfiExercises":[{"id":"Parilliset luvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Alkuluvut","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-12/2-generaattorit"}]}},{"node":{"id":"19e9173c-b471-5c92-a896-10ce7377ef41","frontmatter":{"path":"/osa-12/1-funktio-parametrina","title":"Funktio parametrina"},"moocfiExercises":[{"id":"Järjestys varastosaldon mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys tuotantokausien mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Järjestys pisteiden mukaan","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilyreitti","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Kiipeilykalliot","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Palloilijat","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"},{"id":"Tuotteiden haku","type":"programming-exercise","parentPagePath":"/osa-12/1-funktio-parametrina"}]}},{"node":{"id":"326a2899-ee13-524c-bd28-cab01148354f","frontmatter":{"path":"/osa-12","title":"Osa 12"},"moocfiExercises":[]}},{"node":{"id":"71d31f73-e033-50f6-9808-c87debf29d45","frontmatter":{"path":"/osa-12/4-saannolliset-lausekkeet","title":"Säännölliset lausekkeet"},"moocfiExercises":[{"id":"Säännölliset lausekkeet","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"Tilastot ojennukseen","type":"programming-exercise","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"},{"id":"9d660c41-3094-5bf4-b084-30407dea276d","type":"quiz","parentPagePath":"/osa-12/4-saannolliset-lausekkeet"}]}},{"node":{"id":"9bdbe0ad-904f-5a81-9797-7e12826192d0","frontmatter":{"path":"/osa-12/3-funktionaalista-ohjelmointia","title":"Funktionaalista ohjelmointia"},"moocfiExercises":[{"id":"Suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Rajatut suoritukset","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"},{"id":"Opintopisteet","type":"programming-exercise","parentPagePath":"/osa-12/3-funktionaalista-ohjelmointia"}]}},{"node":{"id":"d858e4c1-9eb9-5e68-94e9-45506696dd62","frontmatter":{"path":"/osa-13/1-pygame-kayttoon","title":"Pygame käyttöön"},"moocfiExercises":[{"id":"Neljä robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Robotit rivissä","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Sata robottia","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"},{"id":"Satunnaiset robotit","type":"programming-exercise","parentPagePath":"/osa-13/1-pygame-kayttoon"}]}},{"node":{"id":"c609cb13-bb56-58ef-837f-b1201a5dec06","frontmatter":{"path":"/osa-13/2-animaatio","title":"Animaatio"},"moocfiExercises":[{"id":"Pystyliike","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Reunan kierto","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Kaksi robottia","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Piirileikki","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Pomppiva pallo","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"},{"id":"Robotti-invaasio","type":"programming-exercise","parentPagePath":"/osa-13/2-animaatio"}]}},{"node":{"id":"fb932393-5883-559a-811c-be8788078d29","frontmatter":{"path":"/osa-13/3-tapahtumat","title":"Tapahtumat"},"moocfiExercises":[{"id":"Neljä suuntaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Neljä seinää","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Kaksi pelaajaa","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotti ja hiiri","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"},{"id":"Robotin paikka","type":"programming-exercise","parentPagePath":"/osa-13/3-tapahtumat"}]}},{"node":{"id":"36b56417-e276-533e-b120-1135924837e6","frontmatter":{"path":"/osa-13/4-lisaa-tekniikoita","title":"Lisää tekniikoita"},"moocfiExercises":[{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"Asteroidit","type":"programming-exercise","parentPagePath":"/osa-13/4-lisaa-tekniikoita"},{"id":"a294aaeb-6a75-512e-9560-22e538e4cb87","type":"quiz","parentPagePath":"/osa-13/4-lisaa-tekniikoita"}]}},{"node":{"id":"5d8ee8d6-3e80-571c-8b67-872b2f29c84d","frontmatter":{"path":"/osa-13","title":"Osa 13"},"moocfiExercises":[]}},{"node":{"id":"c40c9ed7-8f66-5079-979f-38b8c7cf39c0","frontmatter":{"path":"/osa-14/2-robo-ja-laatikot","title":"Robotti ja laatikot"},"moocfiExercises":[]}},{"node":{"id":"ea358708-379d-550f-a0e7-cf4948487bb7","frontmatter":{"path":"/osa-14","title":"Osa 14"},"moocfiExercises":[]}},{"node":{"id":"9dd02728-0265-5c86-ae22-47ce783974c3","frontmatter":{"path":"/osa-14/1-peliprojekti","title":"Peliprojekti"},"moocfiExercises":[]}},{"node":{"id":"24cb39a4-39d3-5b53-a5c5-d0ae1e2aedb5","frontmatter":{"path":"/osa-14/4-oma-peli","title":"Oma peli"},"moocfiExercises":[{"id":"a4f0c714-747c-5da9-b2c4-9f101f49be12","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"072e5e5a-8a6c-5e2c-9701-7c6f9d323d91","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"},{"id":"ec5d26c4-c6d0-56a5-ae8f-2cf58cbe7f96","type":"quiz","parentPagePath":"/osa-14/4-oma-peli"}]}},{"node":{"id":"51a33014-c5e5-5b4b-a074-7104d480b07d","frontmatter":{"path":"/osa-14/3-pelin-viimeistely","title":"Pelin viimeistely"},"moocfiExercises":[]}},{"node":{"id":"5a5866bd-32cf-5955-90f8-754ceb8ba054","frontmatter":{"path":"/osa-2/2-else-elif","title":"Lisää ehtolauseita"},"moocfiExercises":[{"id":"Täysi-ikäisyys","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":" Suurempi tai yhtäsuuri","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Vanhempi","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"Aakkosjärjestyksessä viimeinen","type":"programming-exercise","parentPagePath":"/osa-2/2-else-elif"},{"id":"518a3af0-3773-5fbd-bbf2-5a82bdf3212d","type":"quiz","parentPagePath":"/osa-2/2-else-elif"}]}},{"node":{"id":"c31a7d12-88b6-52b3-afe8-446248d5a823","frontmatter":{"path":"/osa-2/1-ohjelmoinnin-termeja","title":"Ohjelmoinnin termejä"},"moocfiExercises":[{"id":"Korjaa virheet","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Merkkien määrä","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"Tyyppimuunnos","type":"programming-exercise","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"},{"id":"d267e7eb-f4cb-51db-9089-d1a49994f1f1","type":"quiz","parentPagePath":"/osa-2/1-ohjelmoinnin-termeja"}]}},{"node":{"id":"ad386bca-acee-52ab-b523-663e2313300f","frontmatter":{"path":"/osa-2/3-ehtojen-yhdistäminen","title":"Ehtojen yhdistäminen"},"moocfiExercises":[{"id":"Iän tarkistus","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Veljenpojat","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Arvosana ja pisteet","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Aakkosjärjestyksessä keskimmäinen","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"Lahjaverolaskuri","type":"programming-exercise","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"},{"id":"cd32ec18-caf4-56fb-aeb1-e5fb767fbd7a","type":"quiz","parentPagePath":"/osa-2/3-ehtojen-yhdistäminen"}]}},{"node":{"id":"4ee54339-f0d6-5e76-a1b4-5ea478a3c81d","frontmatter":{"path":"/osa-2","title":"Osa 2"},"moocfiExercises":[]}},{"node":{"id":"93b44a9e-ff78-5d3a-bcc7-0c5824a2eb49","frontmatter":{"path":"/osa-3/1-ehdot-silmukoissa","title":"Ehdot silmukoissa"},"moocfiExercises":[{"id":"Tulosta luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvut","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Kahden potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Luvun n potenssit","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 1","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"Peräkkäisten summa, versio 2","type":"programming-exercise","parentPagePath":"/osa-3/1-ehdot-silmukoissa"},{"id":"2b66a88b-973a-5cec-b9ef-0926e5ecc2c5","type":"quiz","parentPagePath":"/osa-3/1-ehdot-silmukoissa"}]}},{"node":{"id":"2f5c67d6-0aba-5643-8236-28a3b4304aa5","frontmatter":{"path":"/osa-2/4-yksinkertainen-silmukka","title":"Yksinkertainen silmukka"},"moocfiExercises":[{"id":"Jatketaanko","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Syötteen rajaus","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lähtölaskenta","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Salasana uudelleen","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"PIN ja yritysten määrä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Seuraava karkausvuosi","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Tarina","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"Lukujen käsittelyä","type":"programming-exercise","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"71abac8c-0fc5-51fe-81cc-c605495db56e","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"},{"id":"e658a273-0d9e-5fe0-92d2-9a4833073796","type":"quiz","parentPagePath":"/osa-2/4-yksinkertainen-silmukka"}]}},{"node":{"id":"8ff22700-3c56-5718-8e6b-885de05714db","frontmatter":{"path":"/osa-3/2-merkkijonojen-kasittely","title":"Merkkijonojen käsittely"},"moocfiExercises":[{"id":"Monta jonoa","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Pidempi jono","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Lopusta alkuun","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen ja toiseksi viimeinen","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitaviiva","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Risuaitasuorakulmio","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Alleviivaus","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Tasaus oikeaan","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Sanalaatikko","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 1","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Osajonot 2","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Löytyvätkö vokaalit","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Ensimmäisen osajonon haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Kaikkien osajonojen haku","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"Toinen esiintymä","type":"programming-exercise","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"},{"id":"c5153430-cc5e-5fc8-9f9e-af4a06167a0f","type":"quiz","parentPagePath":"/osa-3/2-merkkijonojen-kasittely"}]}},{"node":{"id":"ba4e3fc0-57a9-587a-91b4-3197934f8582","frontmatter":{"path":"/osa-3/3-lisaa-silmukoista","title":"Lisää silmukoista"},"moocfiExercises":[{"id":"Kertotaulut","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Sanojen ensimmäiset kirjaimet","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Parit ympäri","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"Vuorotellen","type":"programming-exercise","parentPagePath":"/osa-3/3-lisaa-silmukoista"},{"id":"e2f853d1-544b-55c5-b257-7bc531034d9a","type":"quiz","parentPagePath":"/osa-3/3-lisaa-silmukoista"}]}},{"node":{"id":"d438dfa8-61e3-5fd1-9afc-489cb8ee1966","frontmatter":{"path":"/osa-3","title":"Osa 3"},"moocfiExercises":[]}},{"node":{"id":"06f3746a-dff0-5e03-9fc3-fc95dd04215b","frontmatter":{"path":"/osa-3/4-omat-funktiot","title":"Omat funktiot"},"moocfiExercises":[{"id":"Seitsemän veljestä","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Ensimmäinen merkki","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Monta tulostusta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Shakkilauta","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"Sananeliö","type":"programming-exercise","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"36e8c4c5-bb71-51ac-85cf-d79b955b41d3","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"},{"id":"c0df9677-2cb5-5ae1-b4b7-275ba5e534aa","type":"quiz","parentPagePath":"/osa-3/4-omat-funktiot"}]}},{"node":{"id":"3cf4b410-cedb-5462-a52f-ede19111f94f","frontmatter":{"path":"/osa-4/1-vscode","title":"Visual Studio Code -editori, Python-tulkki ja debuggeri"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/osa-4/1-vscode"}]}},{"node":{"id":"cee91c61-42c3-5c2b-aaee-28b0059128b0","frontmatter":{"path":"/osa-4/2-lisaa-funktioista","title":"Lisää funktioista"},"moocfiExercises":[{"id":"Viiva","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risulaatikko","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Risuneliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Neliö","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kolmio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Kuvio","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Joulukuusi","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Luvuista suurin","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Merkit samat","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"Eka, toka ja vika sana","type":"programming-exercise","parentPagePath":"/osa-4/2-lisaa-funktioista"},{"id":"497c46b6-3edd-597e-a50f-a4b6aa013948","type":"quiz","parentPagePath":"/osa-4/2-lisaa-funktioista"}]}},{"node":{"id":"2f77b300-dd28-5ac7-82ef-b144463ca04a","frontmatter":{"path":"/osa-4/4-silmukat-ja-iterointi","title":"Silmukat ja iterointi"},"moocfiExercises":[{"id":"Tulostus tähdillä","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Negatiivisesta positiiviseen","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Tähdet","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Anagrammi","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Palindromit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Positiivisten summa","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Parilliset","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Summalista","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Uniikit","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmän pituus","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan lyhin","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"Listan pisimmät","type":"programming-exercise","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"},{"id":"35160dc1-19b5-51e4-b779-5299765ff2f2","type":"quiz","parentPagePath":"/osa-4/4-silmukat-ja-iterointi"}]}},{"node":{"id":"3603fbd0-3026-571c-bb4d-2a438cca1271","frontmatter":{"path":"/osa-4/3-listat","title":"Listat"},"moocfiExercises":[{"id":"Alkioiden arvojen muutokset","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Alkioiden lisäys listaan","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lisäys ja poisto","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Sama sana kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Lista kahdesti","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Listan pituus","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Keskiarvo","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"Vaihteluväli","type":"programming-exercise","parentPagePath":"/osa-4/3-listat"},{"id":"7e6bcb22-cfcc-5908-a370-b69d792e4fe1","type":"quiz","parentPagePath":"/osa-4/3-listat"}]}},{"node":{"id":"b7c39ee6-dfc6-5a16-a559-838278ee6096","frontmatter":{"path":"/osa-4/6-lisaa-rakenteista","title":"Lisää merkkijonoista ja listoista"},"moocfiExercises":[{"id":"Kaikki väärinpäin","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Eniten kirjaimia","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Vokaalit pois","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Poista isot","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Naapureita listassa","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"Arvosanatilasto","type":"programming-exercise","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"1dbc837b-d925-5f7f-b248-5bf90a09540c","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"},{"id":"9b354cf1-f413-5ec3-befd-992039b09100","type":"quiz","parentPagePath":"/osa-4/6-lisaa-rakenteista"}]}},{"node":{"id":"58976917-6c96-59d5-91ba-5d1642b342a8","frontmatter":{"path":"/osa-4/5-tulostuksen-muotoilu","title":"Tulostuksen muotoilu"},"moocfiExercises":[{"id":"Lukulistasta merkkijonolistaksi","type":"programming-exercise","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"},{"id":"aae62107-cdf7-5af8-9256-b057a53d522b","type":"quiz","parentPagePath":"/osa-4/5-tulostuksen-muotoilu"}]}},{"node":{"id":"172c5d43-30de-5870-ab9a-602864d2b373","frontmatter":{"path":"/osa-4","title":"Osa 4"},"moocfiExercises":[]}},{"node":{"id":"3b791b2d-e698-57ac-84c3-b8ec8b807461","frontmatter":{"path":"/osa-5/1-lisaa-listoja","title":"Lisää listoista"},"moocfiExercises":[{"id":"Pisin merkkijono","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Alkioiden määrä","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Go","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: rivit oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: sarakkeet oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: neliöt oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"Sudoku: ruudukko oikein","type":"programming-exercise","parentPagePath":"/osa-5/1-lisaa-listoja"},{"id":"ee5b8fc7-11bd-532a-8462-2f19587db240","type":"quiz","parentPagePath":"/osa-5/1-lisaa-listoja"}]}},{"node":{"id":"404f261f-9765-595d-806e-cab3000a97bb","frontmatter":{"path":"/osa-5/2-viittaukset","title":"Viittaukset"},"moocfiExercises":[{"id":"Alkiot tuplana","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Poista pienin","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: ruudukon tulostus ja luvun lisäys","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Sudoku: luvun lisäys ruudukon kopioon","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Ristinolla","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"Matriisin kääntö","type":"programming-exercise","parentPagePath":"/osa-5/2-viittaukset"},{"id":"7384687a-fe87-53d4-be99-05a98f5e467e","type":"quiz","parentPagePath":"/osa-5/2-viittaukset"}]}},{"node":{"id":"91522fd2-d6c1-5c1e-9f0e-adf8cd16ac86","frontmatter":{"path":"/osa-5/3-dictionary","title":"Sanakirja"},"moocfiExercises":[{"id":"Kertaa kymmenen","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Kertomat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Histogrammi","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 1","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Puhelinluettelo, versio 2","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Sanakirjan kääntö","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Luvut sanoina","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Elokuvarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"Etsi elokuvat","type":"programming-exercise","parentPagePath":"/osa-5/3-dictionary"},{"id":"61bfc0f9-fcbf-56ec-a157-afed3fe96128","type":"quiz","parentPagePath":"/osa-5/3-dictionary"}]}},{"node":{"id":"dd3178a1-ed24-5654-87c6-4277edd21bea","frontmatter":{"path":"/osa-5/4-tuple","title":"Tuple"},"moocfiExercises":[{"id":"Muodosta tuple","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhin henkilöistä","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Vanhemmat henkilöt","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Opiskelijarekisteri","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"Kirjainruudukko","type":"programming-exercise","parentPagePath":"/osa-5/4-tuple"},{"id":"80966e29-402a-55c4-a555-49ec9f14d65c","type":"quiz","parentPagePath":"/osa-5/4-tuple"},{"id":"115efd0a-e1c3-52ea-a81a-b020d1863707","type":"quiz","parentPagePath":"/osa-5/4-tuple"}]}},{"node":{"id":"e7644b24-fbdd-5507-b031-163d95965b0d","frontmatter":{"path":"/osa-5","title":"Osa 5"},"moocfiExercises":[]}},{"node":{"id":"36208a39-360c-5c51-8b7b-cccbbc40c535","frontmatter":{"path":"/osa-6/2-tiedostojen-kirjoittaminen","title":"Tiedostojen kirjoittaminen"},"moocfiExercises":[{"id":"Omistuskirjoitus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Päiväkirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Aineiston suodatus","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Henkilöt talteen","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Kurssin tulokset, osa 4","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Sanahaku","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"Muistava sanakirja","type":"programming-exercise","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"},{"id":"a4414b90-5cf5-520c-8c9e-2f18fed17fd5","type":"quiz","parentPagePath":"/osa-6/2-tiedostojen-kirjoittaminen"}]}},{"node":{"id":"dd1465d5-33db-54ca-a186-1554136fd05a","frontmatter":{"path":"/osa-6/1-tiedostojen-lukeminen","title":"Tiedostojen lukeminen"},"moocfiExercises":[{"id":"Suurin luku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Hedelmäkauppa","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Matriisi","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 1","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 2","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kurssin tulokset, osa 3","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Reseptihaku","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"Kaupunkipyörät","type":"programming-exercise","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"},{"id":"d8fd5f8f-1185-50d0-9d08-9cd248a5989e","type":"quiz","parentPagePath":"/osa-6/1-tiedostojen-lukeminen"}]}},{"node":{"id":"f275970a-6996-51cc-900d-8e7ce4a99388","frontmatter":{"path":"/osa-6/4-paikalliset-muuttujat","title":"Paikalliset ja globaalit muuttujat"},"moocfiExercises":[{"id":"1a4f83c9-bf41-50b5-97cc-3c360c104918","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"},{"id":"38bfba91-2ce2-5c43-9f6c-74788096ed6d","type":"quiz","parentPagePath":"/osa-6/4-paikalliset-muuttujat"}]}},{"node":{"id":"11516666-f983-5dd9-8985-1f49d26bd448","frontmatter":{"path":"/osa-6/3-virheet","title":"Virhetilanteisiin varautuminen"},"moocfiExercises":[{"id":"Syötteen luku","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Parametrien validointi ","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"Virheelliset lottonumerot","type":"programming-exercise","parentPagePath":"/osa-6/3-virheet"},{"id":"bbc6d86e-5d2e-5614-b71f-f92532ae48e7","type":"quiz","parentPagePath":"/osa-6/3-virheet"}]}},{"node":{"id":"c50386b9-aeae-5ee5-bcd1-759d6fd231f3","frontmatter":{"path":"/osa-6","title":"Osa 6"},"moocfiExercises":[]}},{"node":{"id":"a2d3c383-bfce-5fae-9056-84021a8acf24","frontmatter":{"path":"/osa-7/1-moduulit","title":"Moduulit"},"moocfiExercises":[{"id":"Hypotenuusa","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Erikoismerkit","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"Murtoluvuilla laskeminen","type":"programming-exercise","parentPagePath":"/osa-7/1-moduulit"},{"id":"2ae7a041-d84f-5a17-9d1a-d1f8cf68f5d0","type":"quiz","parentPagePath":"/osa-7/1-moduulit"}]}},{"node":{"id":"b334c705-f8a7-5722-9895-425a9f6ea3b9","frontmatter":{"path":"/osa-7/3-aikojen-kasittely","title":"Aikojen käsittely"},"moocfiExercises":[{"id":"Kuinka vanha","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Henkilötunnus oikein?","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"Ruutuaika","type":"programming-exercise","parentPagePath":"/osa-7/3-aikojen-kasittely"},{"id":"5602ad2e-213e-5d65-a2ae-56283d90b57d","type":"quiz","parentPagePath":"/osa-7/3-aikojen-kasittely"}]}},{"node":{"id":"8dd0097c-71f3-5cc3-b92d-e39e36b4674d","frontmatter":{"path":"/osa-7/2-satunnaisuus","title":"Satunnaisuus"},"moocfiExercises":[{"id":"Lottonumerot","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 1","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Salasanan arpoja, osa 2","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Noppasimulaatio","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"Satunnaiset sanat","type":"programming-exercise","parentPagePath":"/osa-7/2-satunnaisuus"},{"id":"30ffe369-3fca-5938-b75e-6151ca6ee717","type":"quiz","parentPagePath":"/osa-7/2-satunnaisuus"}]}},{"node":{"id":"a170899b-51c4-500a-95a8-fbf1a45b4fa5","frontmatter":{"path":"/osa-7/4-datan-kasittely","title":"Datan käsittely"},"moocfiExercises":[{"id":"JSON-tiedoston käsittely","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kurssien tilastot","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Kuka huijasi, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"Spellchecker, versio 2","type":"programming-exercise","parentPagePath":"/osa-7/4-datan-kasittely"},{"id":"d4423633-73ba-5c8a-9cf8-1bad619354dd","type":"quiz","parentPagePath":"/osa-7/4-datan-kasittely"}]}},{"node":{"id":"89493aab-a194-58a9-9ae0-cfccfb12dd8f","frontmatter":{"path":"/osa-7/5-omat-moduulit","title":"Oman moduulin tekeminen"},"moocfiExercises":[{"id":"Merkkiapuri","type":"programming-exercise","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"17a3c8a1-ea6d-5225-9d7f-3fc699067be2","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"},{"id":"3d4fe376-f6d3-5628-92ca-4d5096764f4f","type":"quiz","parentPagePath":"/osa-7/5-omat-moduulit"}]}},{"node":{"id":"cca5c192-47a3-570b-a2e7-63f981e8ba44","frontmatter":{"path":"/osa-7/6-lisaa-pythonista","title":"Lisää Pythonista"},"moocfiExercises":[{"id":"Oma ohjelmointikieli","type":"programming-exercise","parentPagePath":"/osa-7/6-lisaa-pythonista"},{"id":"edb3d4c4-6ceb-5ef6-8f03-370aa11fa4bb","type":"quiz","parentPagePath":"/osa-7/6-lisaa-pythonista"}]}},{"node":{"id":"a52f3741-78aa-55e7-9749-683a9362d9ea","frontmatter":{"path":"/osa-7","title":"Osa 7"},"moocfiExercises":[]}},{"node":{"id":"0fcf5b47-a320-5fc3-8eb5-c77c93995f1e","frontmatter":{"path":"/osa-8/2-luokat-ja-oliot","title":"Luokat ja oliot"},"moocfiExercises":[{"id":"Vuodet listaan","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"},{"id":"Kauppalista","type":"programming-exercise","parentPagePath":"/osa-8/2-luokat-ja-oliot"}]}},{"node":{"id":"23de8fa7-b885-5b11-a063-3fc42741e096","frontmatter":{"path":"/osa-8/1-oliot-ja-metodit","title":"Oliot ja metodit"},"moocfiExercises":[{"id":"Pienin keskiarvo","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"},{"id":"Rivien summat","type":"programming-exercise","parentPagePath":"/osa-8/1-oliot-ja-metodit"}]}},{"node":{"id":"e04cf959-b755-5df1-ae81-cb5b094ed338","frontmatter":{"path":"/osa-8/3-omat-luokat","title":"Omat luokat"},"moocfiExercises":[{"id":"Kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Kirjoita luokat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Muodosta lemmikki","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Vanhempi kirja","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"},{"id":"Genren kirjat","type":"programming-exercise","parentPagePath":"/osa-8/3-omat-luokat"}]}},{"node":{"id":"672765b4-e1b6-5d59-add2-33fc62920402","frontmatter":{"path":"/osa-8/4-metodit-omissa-luokissa","title":"Metodit omissa luokissa"},"moocfiExercises":[{"id":"Vähenevä laskuri","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Etu- ja sukunimi","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"},{"id":"Lukutilasto","type":"programming-exercise","parentPagePath":"/osa-8/4-metodit-omissa-luokissa"}]}},{"node":{"id":"494f05d3-5d32-510e-b79f-8742818c82a8","frontmatter":{"path":"/osa-8","title":"Osa 8"},"moocfiExercises":[]}},{"node":{"id":"57223003-a5b2-5e23-9fa4-98ea25599eab","frontmatter":{"path":"/osa-9/2-oliot-attribuuttina","title":"Oliot attribuuttina"},"moocfiExercises":[{"id":"Lemmikit","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Lahjapakkaus","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"},{"id":"Huoneen lyhin","type":"programming-exercise","parentPagePath":"/osa-9/2-oliot-attribuuttina"}]}},{"node":{"id":"19313a53-7d8c-57f2-aea2-e64538898f54","frontmatter":{"path":"/osa-9/1-oliot-ja-viittaukset","title":"Oliot ja viittaukset"},"moocfiExercises":[{"id":"Nopein auto","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Hyväksytyt suoritukset","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Kasvatuslaitos","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Maksukortti ja kassapääte","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"},{"id":"Asuntovertailu","type":"programming-exercise","parentPagePath":"/osa-9/1-oliot-ja-viittaukset"}]}},{"node":{"id":"24d21a8a-566d-52bc-8c02-f78aece7b37e","frontmatter":{"path":"/osa-9/3-kapselointi","title":"Kapselointi"},"moocfiExercises":[{"id":"Auto","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Äänite","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"},{"id":"Säähavaintoasema","type":"programming-exercise","parentPagePath":"/osa-9/3-kapselointi"}]}},{"node":{"id":"a74ac15c-8a52-56a1-b736-e718bc2a46d7","frontmatter":{"path":"/osa-9/4-metodien-nakyvyys","title":"Metodien näkyvyys"},"moocfiExercises":[{"id":"Palvelumaksu","type":"programming-exercise","parentPagePath":"/osa-9/4-metodien-nakyvyys"}]}},{"node":{"id":"178b6864-07cf-5596-b9ad-fdf532e52fe3","frontmatter":{"path":"/osa-9/5-staattiset-piirteet","title":"Staattiset piirteet"},"moocfiExercises":[{"id":"Postinumerot","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"},{"id":"Lista-apuri","type":"programming-exercise","parentPagePath":"/osa-9/5-staattiset-piirteet"}]}},{"node":{"id":"90753078-b47d-515c-9f4a-a27f5d6d1071","frontmatter":{"path":"/osa-9","title":"Osa 9"},"moocfiExercises":[]}},{"node":{"id":"af4e225d-efdd-5278-a286-2c889d345dff","frontmatter":{"path":"/osa-8/5-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Sekuntikello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Kello","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Maksukortti","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"Sarja","type":"programming-exercise","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"},{"id":"82ce577b-1caa-580f-baa7-bb2f14dd63af","type":"quiz","parentPagePath":"/osa-8/5-lisaa-esimerkkeja"}]}},{"node":{"id":"9234bad5-9622-54fe-bea5-1120b0d1c54c","frontmatter":{"path":"/osa-9/6-lisaa-esimerkkeja","title":"Lisää esimerkkejä"},"moocfiExercises":[{"id":"Tavara, Matkalaukku ja Lastiruuma","type":"programming-exercise","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"},{"id":"e966cdfa-7abe-55d5-905a-f0a7448ddd11","type":"quiz","parentPagePath":"/osa-9/6-lisaa-esimerkkeja"}]}}]}},"pageContext":{}}, "staticQueryHashes": ["1357757885","994120085"]} \ No newline at end of file diff --git a/profile/index.html b/profile/index.html index 047e74dea..35c27be2c 100644 --- a/profile/index.html +++ b/profile/index.html @@ -57,4 +57,4 @@ } } }) -
Redirecting...
\ No newline at end of file +
Redirecting...
\ No newline at end of file diff --git a/report-issue/index.html b/report-issue/index.html index 43685e9a7..cb1a0a5a6 100644 --- a/report-issue/index.html +++ b/report-issue/index.html @@ -134,4 +134,4 @@ } } }) -

Näin ilmoitat virheen materiaalissa


Voit ilmoittaa huomaamasi virheen kurssin Github-projekin virheilmoitustaululle. Github on yleinen palvelu, jossa voi hallinnoida ja jakaa muille projekteja, ohjelmistoja ja lähdekoodia.

Virheiden ilmoittaminen vaatii käyttäjätunnukset Githubiin. Jos sinulla ei ole vielä Github-tunnusta, voit luoda sen täältä

Ennen kuin avaat uuden virheilmoituksen löytämästäsi virheestä, katsothan täältä ettei siitä ole jo avointa ilmoitusta.


Luo virheilmoitus näin

  1. Paina yllä olevaa nappia.
  2. Laita ilmoituksen otsikoksi lyhyt ja ytimekäs kuvaus ongelmasta, esimerkiksi "Osan 1 tehtävässä 30 kirjoitusvirhe".
  3. Kirjoita kommenttiosioon tarkempi kuvaus ongelmasta, esimerkiksi "Osan 1 tehtävän 30 esimerkkitulosteessa on kirjoitusvirhe. Esimerkkitulosteen ylläoleva koodi sisältää rivin System.out.println("Syötä liukuluku");, mutta esimerkkitulosteessa lukee "Juota liukuluku"".
  4. Paina lopuksi vihreää nappia "Submit new issue".

Saatamme kysyä ilmoituksestasi tarkentavia kysymyksiä, jos emme osaa korjata ongelmaa ilman apuasi. Näistä kysymyksistä pitäisi tulla sähköposti-ilmoitus siihen osoitteeseen, jonka liitit Github-tunnukseesi.

Kiitos kun autat meitä parantamaan materiaaleja!

\ No newline at end of file +

Näin ilmoitat virheen materiaalissa


Voit ilmoittaa huomaamasi virheen kurssin Github-projekin virheilmoitustaululle. Github on yleinen palvelu, jossa voi hallinnoida ja jakaa muille projekteja, ohjelmistoja ja lähdekoodia.

Virheiden ilmoittaminen vaatii käyttäjätunnukset Githubiin. Jos sinulla ei ole vielä Github-tunnusta, voit luoda sen täältä

Ennen kuin avaat uuden virheilmoituksen löytämästäsi virheestä, katsothan täältä ettei siitä ole jo avointa ilmoitusta.


Luo virheilmoitus näin

  1. Paina yllä olevaa nappia.
  2. Laita ilmoituksen otsikoksi lyhyt ja ytimekäs kuvaus ongelmasta, esimerkiksi "Osan 1 tehtävässä 30 kirjoitusvirhe".
  3. Kirjoita kommenttiosioon tarkempi kuvaus ongelmasta, esimerkiksi "Osan 1 tehtävän 30 esimerkkitulosteessa on kirjoitusvirhe. Esimerkkitulosteen ylläoleva koodi sisältää rivin System.out.println("Syötä liukuluku");, mutta esimerkkitulosteessa lukee "Juota liukuluku"".
  4. Paina lopuksi vihreää nappia "Submit new issue".

Saatamme kysyä ilmoituksestasi tarkentavia kysymyksiä, jos emme osaa korjata ongelmaa ilman apuasi. Näistä kysymyksistä pitäisi tulla sähköposti-ilmoitus siihen osoitteeseen, jonka liitit Github-tunnukseesi.

Kiitos kun autat meitä parantamaan materiaaleja!

\ No newline at end of file diff --git a/sanasto/index.html b/sanasto/index.html index e67839e27..7fe679d5e 100644 --- a/sanasto/index.html +++ b/sanasto/index.html @@ -137,4 +137,4 @@ } } }) -
\ No newline at end of file +
\ No newline at end of file diff --git a/sign-in/index.html b/sign-in/index.html index 33acc5fa9..6efb8e7ef 100644 --- a/sign-in/index.html +++ b/sign-in/index.html @@ -140,4 +140,4 @@ } } }) -
\ No newline at end of file +
\ No newline at end of file diff --git a/sign-up/index.html b/sign-up/index.html index 4cb0a7066..7338d8284 100644 --- a/sign-up/index.html +++ b/sign-up/index.html @@ -140,4 +140,4 @@ } } }) -

Luo käyttäjätunnus

Tämä kurssi käyttää mooc.fi käyttäjätunnuksia. Jos olet aikaisemmin tehnyt mooc.fi -kursseja, voit käyttää sisäänkirjautumissivulla olemassaolevia tunnuksiasi. Tällä sivulla voit luoda uuden tunnuksen, joka toimii suurimmassa osassa mooc.fi:n kursseissa ja palveluissa.
\ No newline at end of file +

Luo käyttäjätunnus

Tämä kurssi käyttää mooc.fi käyttäjätunnuksia. Jos olet aikaisemmin tehnyt mooc.fi -kursseja, voit käyttää sisäänkirjautumissivulla olemassaolevia tunnuksiasi. Tällä sivulla voit luoda uuden tunnuksen, joka toimii suurimmassa osassa mooc.fi:n kursseissa ja palveluissa.
\ No newline at end of file diff --git a/tuki/index.html b/tuki/index.html index ce8f95794..f3fa2ceec 100644 --- a/tuki/index.html +++ b/tuki/index.html @@ -138,7 +138,7 @@ } } }) -

Tukea tehtäviin

Syksyn ohjausajat

+

Tukea tehtäviin

Syksyn ohjausajat

2023 kurssilla järjestetään ohjausta sekä Kumpulan kampuksella että Discordissa. Kampuksella ohjaus järjestetään Exactumin BK107-luokassa. Ohjaus järjestetään alla olevan aikataulun mukaisesti

@@ -224,4 +224,4 @@

Discord

Discord on viestintäsovellus, josta saat lisätietoa täältä.

Löydät kurssin kanavat täältä.

-

Ohjausaikana ohjaaja päivystää kurssikanavilla ja vastaa myös yksityisviesteihin. Discordissa käydään keskustelua kurssista myös ohjausaikojen ulkopuolella, joten sinne kannattaa liittyä!

\ No newline at end of file +

Ohjausaikana ohjaaja päivystää kurssikanavilla ja vastaa myös yksityisviesteihin. Discordissa käydään keskustelua kurssista myös ohjausaikojen ulkopuolella, joten sinne kannattaa liittyä!

\ No newline at end of file diff --git a/usein-kysytyt-kysymykset/index.html b/usein-kysytyt-kysymykset/index.html index b608da418..998d459f7 100644 --- a/usein-kysytyt-kysymykset/index.html +++ b/usein-kysytyt-kysymykset/index.html @@ -140,7 +140,7 @@ } } }) -

Usein kysytyt kysymykset

Sisällysluettelo

+

Usein kysytyt kysymykset

Sisällysluettelo

Löysin virheen materiaalista tai tehtävästä

Voit ilmoittaa asiasta kurssikanavalla ohjaajalle tai sähköpostitse kurssin ylläpitäjille osoitteeseen ohjelmoinnin-mooc@helsinki.fi. Kiitos!

Miksi TMC:ssä ei näy kaikki kurssin osat? Miten saan ladattua kaikkien osien ohjelmointitehtävät?

@@ -165,4 +165,4 @@

Kela haluaa minulta todistuksen opiskelustani

Ohjaa Kela tälle sivulle:

Ohjelmoinnin perusteet on kaikille avoin ja ilmainen verkkokurssi. Kurssin käymistä voi verrata kirjan lainaamiseen kirjastosta. Kirjastosta lainattava kirja saattaa liittyä johonkin yliopisto-opintoihin liittyvään kurssiin. Aivan samalla tavalla kuin kirjastosta lainattava kirja, verkkokurssimme on luettavissa huvin ja itsensä sivistämisen vuoksi tai yliopisto-opintojen edistämiseksi.

-

Ohjelmoinnin perusteet vastaa Helsingin yliopiston 5 opintopisteen kurssia. Kurssin suorittajat eivät kuitenkaan automaattisesti ole Helsingin yliopiston opiskelijoita, emmekä pakota ketään suorittamaan kurssia opintopisteisiin johtavassa muodossa. Kurssin suorittamisesta voi kuitenkin halutessaan saada opintopisteitä. Kurssille osallistuminen ei oikeuta opintotukeen.

\ No newline at end of file +

Ohjelmoinnin perusteet vastaa Helsingin yliopiston 5 opintopisteen kurssia. Kurssin suorittajat eivät kuitenkaan automaattisesti ole Helsingin yliopiston opiskelijoita, emmekä pakota ketään suorittamaan kurssia opintopisteisiin johtavassa muodossa. Kurssin suorittamisesta voi kuitenkin halutessaan saada opintopisteitä. Kurssille osallistuminen ei oikeuta opintotukeen.

\ No newline at end of file diff --git a/verkkotentti-ohja/index.html b/verkkotentti-ohja/index.html index a3a30ad8c..c82227232 100644 --- a/verkkotentti-ohja/index.html +++ b/verkkotentti-ohja/index.html @@ -136,7 +136,7 @@ } } }) -

Ohjelmoinnin jatkokurssin verkkotentti 20.01.

    +

    Ohjelmoinnin jatkokurssin verkkotentti 20.01.

    Tenttiin osallistuminen

      @@ -194,4 +194,4 @@
    • Tenttivastaukset tarkistetaan plagoinnintunnistusohjelmalla. Huijaus johtaa aina vähintään tenttisuorituksen hylkäämiseen, mahdollisesti myös kurssilta poistamiseen.
    • Tenttikysymykset muistuttavat kurssimateriaalin tehtäviä - tenttiin valmistautumiseksi kannattaa siis kertailla materiaalia.
    • Kurssin tulokset tulevat kokeen jälkeen sähköpostitse opintopisteohjeiden kera.
    • -
    \ No newline at end of file +
\ No newline at end of file diff --git a/verkkotentti-ohpe/index.html b/verkkotentti-ohpe/index.html index 24bd34e0d..9be9d3aa8 100644 --- a/verkkotentti-ohpe/index.html +++ b/verkkotentti-ohpe/index.html @@ -134,7 +134,7 @@ } } }) -

Ohjelmoinnin perusteiden verkkotentti 13.01.

    +

    Ohjelmoinnin perusteiden verkkotentti 13.01.

    Tenttiin osallistuminen

      @@ -192,4 +192,4 @@
    • Tenttivastaukset tarkistetaan plagoinnintunnistusohjelmalla. Huijaus johtaa aina vähintään tenttisuorituksen hylkäämiseen, mahdollisesti myös kurssilta poistamiseen.
    • Tenttikysymykset muistuttavat kurssimateriaalin tehtäviä - tenttiin valmistautumiseksi kannattaa siis kertailla materiaalia.
    • Kurssin tulokset tulevat kokeen jälkeen sähköpostitse opintopisteohjeiden kera.
    • -
    \ No newline at end of file +
\ No newline at end of file diff --git a/verkkotentti/index.html b/verkkotentti/index.html index 3c27e8d46..478519ea8 100644 --- a/verkkotentti/index.html +++ b/verkkotentti/index.html @@ -134,7 +134,7 @@ } } }) -

Verkkotentti 4.6.

Ohjelmoinnin jatkokurssi

    +

    Verkkotentti 4.6.

    Ohjelmoinnin jatkokurssi

    Tenttiin osallistuminen

      @@ -192,4 +192,4 @@
    • Tenttivastaukset tarkistetaan plagoinnintunnistusohjelmalla. Huijaus johtaa aina vähintään tenttisuorituksen hylkäämiseen, mahdollisesti myös kurssilta poistamiseen.
    • Tenttikysymykset muistuttavat kurssimateriaalin tehtäviä - tenttiin valmistautumiseksi kannattaa siis kertailla materiaalia.
    • Kurssin tulokset tulevat kokeen jälkeen sähköpostitse opintopisteohjeiden kera.
    • -
    \ No newline at end of file +
\ No newline at end of file diff --git a/virheilmoitukset/index.html b/virheilmoitukset/index.html index c62f815ff..cf95de1d4 100644 --- a/virheilmoitukset/index.html +++ b/virheilmoitukset/index.html @@ -143,7 +143,7 @@ } } }) -

Yleiset virheilmoitukset

Tällä sivulla kerrotaan yleisistä virheilmoituksista joihin saatat törmätä kurssin aikana.

+

Yleiset virheilmoitukset

Tällä sivulla kerrotaan yleisistä virheilmoituksista joihin saatat törmätä kurssin aikana.

Tehtävä ei mene läpi, vaikka tuloste on identtinen esimerkkitulosteen kanssa

Tarkista että ohjelmasi ei tulosta ylimääräisiä välilyöntejä. Huomaa että print -funktion sisällä pilkku luo automaattisesti välilyönnin yhdistettävien merkkijonojen välille.

    print("Hello","World!")    # Tulostuu: Hello World!
@@ -174,4 +174,4 @@

print(ika//2) # virhe: muuttujaa ika ei ole muutettu kokonaisluvuksi

TypeError: cannot concatenate 'str' and 'int' objects on line [rivinumero]

-

Katso ylempi kohta.

\ No newline at end of file +

Katso ylempi kohta.

\ No newline at end of file diff --git a/webpack-runtime-f1d78a558bd0a329cac6.js b/webpack-runtime-e0a18af5b515cd69e75f.js similarity index 97% rename from webpack-runtime-f1d78a558bd0a329cac6.js rename to webpack-runtime-e0a18af5b515cd69e75f.js index 53ef6026d..84665facb 100644 --- a/webpack-runtime-f1d78a558bd0a329cac6.js +++ b/webpack-runtime-e0a18af5b515cd69e75f.js @@ -1,2 +1,2 @@ -!function(){"use strict";var e,t,n,r,o,c,a,f={},i={};function u(e){var t=i[e];if(void 0!==t)return t.exports;var n=i[e]={id:e,loaded:!1,exports:{}};return f[e].call(n.exports,n,n.exports,u),n.loaded=!0,n.exports}u.m=f,e=[],u.O=function(t,n,r,o){if(!n){var c=1/0;for(i=0;i=o)&&Object.keys(u.O).every((function(e){return u.O[e](n[f])}))?n.splice(f--,1):(a=!1,o0&&e[i-1][2]>o;i--)e[i]=e[i-1];e[i]=[n,r,o]},u.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return u.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},u.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var o=Object.create(null);u.r(o);var c={};t=t||[null,n({}),n([]),n(n)];for(var a=2&r&&e;"object"==typeof a&&!~t.indexOf(a);a=n(a))Object.getOwnPropertyNames(a).forEach((function(t){c[t]=function(){return e[t]}}));return c.default=function(){return e},u.d(o,c),o},u.d=function(e,t){for(var n in t)u.o(t,n)&&!u.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},u.f={},u.e=function(e){return Promise.all(Object.keys(u.f).reduce((function(t,n){return u.f[n](e,t),t}),[]))},u.u=function(e){return({189:"cc84befe9f3b078651796bc41bb16359c6cbd2f0",230:"component---src-templates-info-page-template-js",280:"component---src-templates-course-content-template-js",294:"component---src-pages-report-issue-js",306:"component---src-pages-credits-js",351:"commons",420:"component---src-templates-course-part-overview-template-js",422:"component---src-pages-sign-in-js",423:"2e6bde05",440:"component---src-templates-vocabulary-template-js",486:"component---src-pages-profile-js",532:"styles",663:"e8647879",687:"68272a89a1b042e3903e12a3152da1808a184a36",717:"component---src-pages-sign-up-js",775:"component---src-pages-edit-page-js",809:"0f1ac474",816:"a106a7ea",839:"212634c4",851:"component---src-pages-missing-info-js",877:"component---src-templates-course-info-template-js",879:"1d66764951084db883db07dda20028756fc8a649",883:"component---src-pages-404-js",948:"2cca2479",976:"c16184b3"}[e]||e)+"-"+{7:"0b33fb0477d5401fa0e3",189:"fcc42655014d72eeb49b",230:"51c52531d4f995df939b",280:"1bcad4f1823dc6d4d917",294:"454358a9fe92a58740aa",306:"e45df14e666616725d0a",351:"042af59ccee387ac69c9",420:"a7ea35c32a28a83c1a22",422:"f72269660942911b5d11",423:"2e783c5d3c07bf495025",440:"f98daf0c731911440ea2",486:"6974f9ced1bd89cd2cd0",532:"3ebca88c5c9c2e58e0f1",663:"2a55d0bd4baeec3fd269",687:"84221f4700e826eedf47",717:"027fb446c35a0d079e44",775:"46d1a94c69aaddf177ed",809:"54ed7e942a0e2d75c584",816:"01165df484d018eced77",839:"5d7e72da3b0eac1ee0d0",851:"71ef90ce0a303103360f",875:"72942d74e722bfeb089c",877:"8e9634ee8537c850fd8a",879:"7b1f1c531c96d37b6cc4",883:"fa7c59f917df21d99cf8",948:"5d6bd31cf02ef4cb4b20",976:"70c6bdec623e2863fc60"}[e]+".js"},u.miniCssF=function(e){return"styles.b89e8426c25f32642026.css"},u.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),u.hmd=function(e){return(e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:function(){throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e},u.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="ohjelmoinnin-mooc:",u.l=function(e,t,n,c){if(r[e])r[e].push(t);else{var a,f;if(void 0!==n)for(var i=document.getElementsByTagName("script"),s=0;s=o)&&Object.keys(u.O).every((function(e){return u.O[e](n[f])}))?n.splice(f--,1):(a=!1,o0&&e[i-1][2]>o;i--)e[i]=e[i-1];e[i]=[n,r,o]},u.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return u.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},u.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var o=Object.create(null);u.r(o);var c={};t=t||[null,n({}),n([]),n(n)];for(var a=2&r&&e;"object"==typeof a&&!~t.indexOf(a);a=n(a))Object.getOwnPropertyNames(a).forEach((function(t){c[t]=function(){return e[t]}}));return c.default=function(){return e},u.d(o,c),o},u.d=function(e,t){for(var n in t)u.o(t,n)&&!u.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},u.f={},u.e=function(e){return Promise.all(Object.keys(u.f).reduce((function(t,n){return u.f[n](e,t),t}),[]))},u.u=function(e){return({189:"cc84befe9f3b078651796bc41bb16359c6cbd2f0",230:"component---src-templates-info-page-template-js",280:"component---src-templates-course-content-template-js",294:"component---src-pages-report-issue-js",306:"component---src-pages-credits-js",351:"commons",420:"component---src-templates-course-part-overview-template-js",422:"component---src-pages-sign-in-js",423:"2e6bde05",440:"component---src-templates-vocabulary-template-js",486:"component---src-pages-profile-js",532:"styles",663:"e8647879",687:"68272a89a1b042e3903e12a3152da1808a184a36",717:"component---src-pages-sign-up-js",775:"component---src-pages-edit-page-js",809:"0f1ac474",816:"a106a7ea",839:"212634c4",851:"component---src-pages-missing-info-js",877:"component---src-templates-course-info-template-js",879:"1d66764951084db883db07dda20028756fc8a649",883:"component---src-pages-404-js",948:"2cca2479",976:"c16184b3"}[e]||e)+"-"+{7:"0b33fb0477d5401fa0e3",189:"fcc42655014d72eeb49b",230:"51c52531d4f995df939b",280:"1bcad4f1823dc6d4d917",294:"454358a9fe92a58740aa",306:"e45df14e666616725d0a",351:"b45a34d9f38c59e43d0c",420:"a7ea35c32a28a83c1a22",422:"f72269660942911b5d11",423:"2e783c5d3c07bf495025",440:"f98daf0c731911440ea2",486:"6974f9ced1bd89cd2cd0",532:"3ebca88c5c9c2e58e0f1",663:"2a55d0bd4baeec3fd269",687:"84221f4700e826eedf47",717:"027fb446c35a0d079e44",775:"46d1a94c69aaddf177ed",809:"54ed7e942a0e2d75c584",816:"01165df484d018eced77",839:"5d7e72da3b0eac1ee0d0",851:"71ef90ce0a303103360f",875:"72942d74e722bfeb089c",877:"8e9634ee8537c850fd8a",879:"7b1f1c531c96d37b6cc4",883:"fa7c59f917df21d99cf8",948:"5d6bd31cf02ef4cb4b20",976:"70c6bdec623e2863fc60"}[e]+".js"},u.miniCssF=function(e){return"styles.b89e8426c25f32642026.css"},u.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),u.hmd=function(e){return(e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:function(){throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e},u.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="ohjelmoinnin-mooc:",u.l=function(e,t,n,c){if(r[e])r[e].push(t);else{var a,f;if(void 0!==n)for(var i=document.getElementsByTagName("script"),s=0;s 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tresult = fn();\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? function(obj) { return Object.getPrototypeOf(obj); } : function(obj) { return obj.__proto__; };\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach(function(key) { def[key] = function() { return value[key]; }; });\n\t}\n\tdef['default'] = function() { return value; };\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"ohjelmoinnin-mooc:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\t;\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","var createStylesheet = function(chunkId, fullhref, resolve, reject) {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tvar onLinkComplete = function(event) {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + realHref + \")\");\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tlinkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\tdocument.head.appendChild(linkTag);\n\treturn linkTag;\n};\nvar findStylesheet = function(href, fullhref) {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = function(chunkId) {\n\treturn new Promise(function(resolve, reject) {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t658: 0\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\"532\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(function() {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, function(e) {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"189\":\"cc84befe9f3b078651796bc41bb16359c6cbd2f0\",\"230\":\"component---src-templates-info-page-template-js\",\"280\":\"component---src-templates-course-content-template-js\",\"294\":\"component---src-pages-report-issue-js\",\"306\":\"component---src-pages-credits-js\",\"351\":\"commons\",\"420\":\"component---src-templates-course-part-overview-template-js\",\"422\":\"component---src-pages-sign-in-js\",\"423\":\"2e6bde05\",\"440\":\"component---src-templates-vocabulary-template-js\",\"486\":\"component---src-pages-profile-js\",\"532\":\"styles\",\"663\":\"e8647879\",\"687\":\"68272a89a1b042e3903e12a3152da1808a184a36\",\"717\":\"component---src-pages-sign-up-js\",\"775\":\"component---src-pages-edit-page-js\",\"809\":\"0f1ac474\",\"816\":\"a106a7ea\",\"839\":\"212634c4\",\"851\":\"component---src-pages-missing-info-js\",\"877\":\"component---src-templates-course-info-template-js\",\"879\":\"1d66764951084db883db07dda20028756fc8a649\",\"883\":\"component---src-pages-404-js\",\"948\":\"2cca2479\",\"976\":\"c16184b3\"}[chunkId] || chunkId) + \"-\" + {\"7\":\"0b33fb0477d5401fa0e3\",\"189\":\"fcc42655014d72eeb49b\",\"230\":\"51c52531d4f995df939b\",\"280\":\"1bcad4f1823dc6d4d917\",\"294\":\"454358a9fe92a58740aa\",\"306\":\"e45df14e666616725d0a\",\"351\":\"042af59ccee387ac69c9\",\"420\":\"a7ea35c32a28a83c1a22\",\"422\":\"f72269660942911b5d11\",\"423\":\"2e783c5d3c07bf495025\",\"440\":\"f98daf0c731911440ea2\",\"486\":\"6974f9ced1bd89cd2cd0\",\"532\":\"3ebca88c5c9c2e58e0f1\",\"663\":\"2a55d0bd4baeec3fd269\",\"687\":\"84221f4700e826eedf47\",\"717\":\"027fb446c35a0d079e44\",\"775\":\"46d1a94c69aaddf177ed\",\"809\":\"54ed7e942a0e2d75c584\",\"816\":\"01165df484d018eced77\",\"839\":\"5d7e72da3b0eac1ee0d0\",\"851\":\"71ef90ce0a303103360f\",\"875\":\"72942d74e722bfeb089c\",\"877\":\"8e9634ee8537c850fd8a\",\"879\":\"7b1f1c531c96d37b6cc4\",\"883\":\"fa7c59f917df21d99cf8\",\"948\":\"5d6bd31cf02ef4cb4b20\",\"976\":\"70c6bdec623e2863fc60\"}[chunkId] + \".js\";\n};","// This function allow to reference all chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + \"styles\" + \".\" + \"b89e8426c25f32642026\" + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.hmd = function(module) {\n\tmodule = Object.create(module);\n\tif (!module.children) module.children = [];\n\tObject.defineProperty(module, 'exports', {\n\t\tenumerable: true,\n\t\tset: function() {\n\t\t\tthrow new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);\n\t\t}\n\t});\n\treturn module;\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.p = \"/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t658: 0,\n\t532: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(!/^(532|658)$/.test(chunkId)) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tfor(moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) var result = runtime(__webpack_require__);\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkIds[i]] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkohjelmoinnin_mooc\"] = self[\"webpackChunkohjelmoinnin_mooc\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://ohjelmoinnin-mooc/webpack/runtime/chunk loaded","webpack://ohjelmoinnin-mooc/webpack/runtime/create fake namespace object","webpack://ohjelmoinnin-mooc/webpack/runtime/load script","webpack://ohjelmoinnin-mooc/webpack/runtime/css loading","webpack://ohjelmoinnin-mooc/webpack/bootstrap","webpack://ohjelmoinnin-mooc/webpack/runtime/compat get default export","webpack://ohjelmoinnin-mooc/webpack/runtime/define property getters","webpack://ohjelmoinnin-mooc/webpack/runtime/ensure chunk","webpack://ohjelmoinnin-mooc/webpack/runtime/get javascript chunk filename","webpack://ohjelmoinnin-mooc/webpack/runtime/get mini-css chunk filename","webpack://ohjelmoinnin-mooc/webpack/runtime/global","webpack://ohjelmoinnin-mooc/webpack/runtime/harmony module decorator","webpack://ohjelmoinnin-mooc/webpack/runtime/hasOwnProperty shorthand","webpack://ohjelmoinnin-mooc/webpack/runtime/make namespace object","webpack://ohjelmoinnin-mooc/webpack/runtime/node module decorator","webpack://ohjelmoinnin-mooc/webpack/runtime/publicPath","webpack://ohjelmoinnin-mooc/webpack/runtime/jsonp chunk loading"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","loadStylesheet","installedCssChunks","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","id","loaded","__webpack_modules__","call","m","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","key","splice","n","getter","__esModule","d","a","getPrototypeOf","obj","__proto__","t","value","mode","this","then","ns","create","r","def","current","indexOf","getOwnPropertyNames","forEach","definition","o","defineProperty","enumerable","get","f","e","chunkId","Promise","all","reduce","promises","u","miniCssF","g","globalThis","Function","window","hmd","children","set","Error","prop","prototype","hasOwnProperty","l","url","done","push","script","needAttach","scripts","document","getElementsByTagName","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","setTimeout","bind","type","target","head","appendChild","Symbol","toStringTag","nmd","paths","p","resolve","reject","href","fullhref","existingLinkTags","dataHref","tag","rel","existingStyleTags","findStylesheet","linkTag","errorType","realHref","err","code","request","createStylesheet","miniCss","installedChunks","installedChunkData","test","promise","error","realSrc","message","name","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","chunkLoadingGlobal","self"],"mappings":"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","file":"webpack-runtime-e0a18af5b515cd69e75f.js","sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tresult = fn();\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? function(obj) { return Object.getPrototypeOf(obj); } : function(obj) { return obj.__proto__; };\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach(function(key) { def[key] = function() { return value[key]; }; });\n\t}\n\tdef['default'] = function() { return value; };\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"ohjelmoinnin-mooc:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\t;\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","var createStylesheet = function(chunkId, fullhref, resolve, reject) {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tvar onLinkComplete = function(event) {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + realHref + \")\");\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tlinkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\tdocument.head.appendChild(linkTag);\n\treturn linkTag;\n};\nvar findStylesheet = function(href, fullhref) {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = function(chunkId) {\n\treturn new Promise(function(resolve, reject) {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t658: 0\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\"532\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(function() {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, function(e) {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"189\":\"cc84befe9f3b078651796bc41bb16359c6cbd2f0\",\"230\":\"component---src-templates-info-page-template-js\",\"280\":\"component---src-templates-course-content-template-js\",\"294\":\"component---src-pages-report-issue-js\",\"306\":\"component---src-pages-credits-js\",\"351\":\"commons\",\"420\":\"component---src-templates-course-part-overview-template-js\",\"422\":\"component---src-pages-sign-in-js\",\"423\":\"2e6bde05\",\"440\":\"component---src-templates-vocabulary-template-js\",\"486\":\"component---src-pages-profile-js\",\"532\":\"styles\",\"663\":\"e8647879\",\"687\":\"68272a89a1b042e3903e12a3152da1808a184a36\",\"717\":\"component---src-pages-sign-up-js\",\"775\":\"component---src-pages-edit-page-js\",\"809\":\"0f1ac474\",\"816\":\"a106a7ea\",\"839\":\"212634c4\",\"851\":\"component---src-pages-missing-info-js\",\"877\":\"component---src-templates-course-info-template-js\",\"879\":\"1d66764951084db883db07dda20028756fc8a649\",\"883\":\"component---src-pages-404-js\",\"948\":\"2cca2479\",\"976\":\"c16184b3\"}[chunkId] || chunkId) + \"-\" + {\"7\":\"0b33fb0477d5401fa0e3\",\"189\":\"fcc42655014d72eeb49b\",\"230\":\"51c52531d4f995df939b\",\"280\":\"1bcad4f1823dc6d4d917\",\"294\":\"454358a9fe92a58740aa\",\"306\":\"e45df14e666616725d0a\",\"351\":\"b45a34d9f38c59e43d0c\",\"420\":\"a7ea35c32a28a83c1a22\",\"422\":\"f72269660942911b5d11\",\"423\":\"2e783c5d3c07bf495025\",\"440\":\"f98daf0c731911440ea2\",\"486\":\"6974f9ced1bd89cd2cd0\",\"532\":\"3ebca88c5c9c2e58e0f1\",\"663\":\"2a55d0bd4baeec3fd269\",\"687\":\"84221f4700e826eedf47\",\"717\":\"027fb446c35a0d079e44\",\"775\":\"46d1a94c69aaddf177ed\",\"809\":\"54ed7e942a0e2d75c584\",\"816\":\"01165df484d018eced77\",\"839\":\"5d7e72da3b0eac1ee0d0\",\"851\":\"71ef90ce0a303103360f\",\"875\":\"72942d74e722bfeb089c\",\"877\":\"8e9634ee8537c850fd8a\",\"879\":\"7b1f1c531c96d37b6cc4\",\"883\":\"fa7c59f917df21d99cf8\",\"948\":\"5d6bd31cf02ef4cb4b20\",\"976\":\"70c6bdec623e2863fc60\"}[chunkId] + \".js\";\n};","// This function allow to reference all chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + \"styles\" + \".\" + \"b89e8426c25f32642026\" + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.hmd = function(module) {\n\tmodule = Object.create(module);\n\tif (!module.children) module.children = [];\n\tObject.defineProperty(module, 'exports', {\n\t\tenumerable: true,\n\t\tset: function() {\n\t\t\tthrow new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);\n\t\t}\n\t});\n\treturn module;\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.p = \"/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t658: 0,\n\t532: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(!/^(532|658)$/.test(chunkId)) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tfor(moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) var result = runtime(__webpack_require__);\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkIds[i]] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkohjelmoinnin_mooc\"] = self[\"webpackChunkohjelmoinnin_mooc\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));"],"sourceRoot":""} \ No newline at end of file diff --git a/webpack.stats.json b/webpack.stats.json index 99550b7a4..cef8135bd 100644 --- a/webpack.stats.json +++ b/webpack.stats.json @@ -1 +1 @@ -{"namedChunkGroups":{"polyfill":{"name":"polyfill","assets":[{"name":"webpack-runtime-f1d78a558bd0a329cac6.js","size":6602},{"name":"commons-042af59ccee387ac69c9.js","size":859073},{"name":"dc6a8720040df98778fe970bf6c000a41750d3ae-2bd38ff93dc85bdbe2d4.js","size":12740},{"name":"polyfill-e26ba5d48381e69dba68.js","size":84904}],"filteredAssets":0,"assetsSize":963319,"filteredAuxiliaryAssets":6,"auxiliaryAssetsSize":4132125},"app":{"name":"app","assets":[{"name":"webpack-runtime-f1d78a558bd0a329cac6.js","size":6602},{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"framework-fe20080b3088a9e05400.js","size":129780},{"name":"dc6a8720040df98778fe970bf6c000a41750d3ae-2bd38ff93dc85bdbe2d4.js","size":12740},{"name":"app-7487be8b990017a49a12.js","size":155109}],"filteredAssets":0,"assetsSize":381563,"filteredAuxiliaryAssets":76,"auxiliaryAssetsSize":2266842},"component---src-pages-404-js":{"name":"component---src-pages-404-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"commons-042af59ccee387ac69c9.js","size":859073},{"name":"component---src-pages-404-js-fa7c59f917df21d99cf8.js","size":522}],"filteredAssets":0,"assetsSize":951108,"filteredAuxiliaryAssets":78,"auxiliaryAssetsSize":6630856},"component---src-pages-credits-js":{"name":"component---src-pages-credits-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"commons-042af59ccee387ac69c9.js","size":859073},{"name":"component---src-pages-credits-js-e45df14e666616725d0a.js","size":2429}],"filteredAssets":0,"assetsSize":953015,"filteredAuxiliaryAssets":78,"auxiliaryAssetsSize":6633657},"component---src-pages-edit-page-js":{"name":"component---src-pages-edit-page-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"commons-042af59ccee387ac69c9.js","size":859073},{"name":"component---src-pages-edit-page-js-46d1a94c69aaddf177ed.js","size":4483}],"filteredAssets":0,"assetsSize":955069,"filteredAuxiliaryAssets":78,"auxiliaryAssetsSize":6644609},"component---src-pages-missing-info-js":{"name":"component---src-pages-missing-info-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"commons-042af59ccee387ac69c9.js","size":859073},{"name":"68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","size":50316},{"name":"1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","size":17325},{"name":"component---src-pages-missing-info-js-71ef90ce0a303103360f.js","size":9690}],"filteredAssets":0,"assetsSize":1027917,"filteredAuxiliaryAssets":80,"auxiliaryAssetsSize":6937129},"component---src-pages-profile-js":{"name":"component---src-pages-profile-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"commons-042af59ccee387ac69c9.js","size":859073},{"name":"68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","size":50316},{"name":"1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","size":17325},{"name":"component---src-pages-profile-js-6974f9ced1bd89cd2cd0.js","size":17182}],"filteredAssets":0,"assetsSize":1035409,"filteredAuxiliaryAssets":80,"auxiliaryAssetsSize":6965160},"component---src-pages-report-issue-js":{"name":"component---src-pages-report-issue-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"commons-042af59ccee387ac69c9.js","size":859073},{"name":"component---src-pages-report-issue-js-454358a9fe92a58740aa.js","size":3771}],"filteredAssets":0,"assetsSize":954357,"filteredAuxiliaryAssets":78,"auxiliaryAssetsSize":6642619},"component---src-pages-sign-in-js":{"name":"component---src-pages-sign-in-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"commons-042af59ccee387ac69c9.js","size":859073},{"name":"68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","size":50316},{"name":"component---src-pages-sign-in-js-f72269660942911b5d11.js","size":3859}],"filteredAssets":0,"assetsSize":1004761,"filteredAuxiliaryAssets":79,"auxiliaryAssetsSize":6855207},"component---src-pages-sign-up-js":{"name":"component---src-pages-sign-up-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"commons-042af59ccee387ac69c9.js","size":859073},{"name":"68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","size":50316},{"name":"1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","size":17325},{"name":"component---src-pages-sign-up-js-027fb446c35a0d079e44.js","size":15876}],"filteredAssets":0,"assetsSize":1034103,"filteredAuxiliaryAssets":81,"auxiliaryAssetsSize":6961762},"component---src-templates-course-content-template-js":{"name":"component---src-templates-course-content-template-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"e8647879-2a55d0bd4baeec3fd269.js","size":56717},{"name":"commons-042af59ccee387ac69c9.js","size":859073},{"name":"68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","size":50316},{"name":"1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","size":17325},{"name":"cc84befe9f3b078651796bc41bb16359c6cbd2f0-fcc42655014d72eeb49b.js","size":719263},{"name":"component---src-templates-course-content-template-js-1bcad4f1823dc6d4d917.js","size":5125}],"filteredAssets":0,"assetsSize":1799332,"filteredAuxiliaryAssets":82,"auxiliaryAssetsSize":9565978},"component---src-templates-course-info-template-js":{"name":"component---src-templates-course-info-template-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"e8647879-2a55d0bd4baeec3fd269.js","size":56717},{"name":"commons-042af59ccee387ac69c9.js","size":859073},{"name":"68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","size":50316},{"name":"1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","size":17325},{"name":"cc84befe9f3b078651796bc41bb16359c6cbd2f0-fcc42655014d72eeb49b.js","size":719263},{"name":"component---src-templates-course-info-template-js-8e9634ee8537c850fd8a.js","size":2879}],"filteredAssets":0,"assetsSize":1797086,"filteredAuxiliaryAssets":82,"auxiliaryAssetsSize":9558983},"component---src-templates-course-part-overview-template-js":{"name":"component---src-templates-course-part-overview-template-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"e8647879-2a55d0bd4baeec3fd269.js","size":56717},{"name":"commons-042af59ccee387ac69c9.js","size":859073},{"name":"68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","size":50316},{"name":"1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","size":17325},{"name":"cc84befe9f3b078651796bc41bb16359c6cbd2f0-fcc42655014d72eeb49b.js","size":719263},{"name":"component---src-templates-course-part-overview-template-js-a7ea35c32a28a83c1a22.js","size":2070}],"filteredAssets":0,"assetsSize":1796277,"filteredAuxiliaryAssets":82,"auxiliaryAssetsSize":9557526},"component---src-templates-info-page-template-js":{"name":"component---src-templates-info-page-template-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"e8647879-2a55d0bd4baeec3fd269.js","size":56717},{"name":"commons-042af59ccee387ac69c9.js","size":859073},{"name":"68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","size":50316},{"name":"1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","size":17325},{"name":"cc84befe9f3b078651796bc41bb16359c6cbd2f0-fcc42655014d72eeb49b.js","size":719263},{"name":"component---src-templates-info-page-template-js-51c52531d4f995df939b.js","size":2694}],"filteredAssets":0,"assetsSize":1796901,"filteredAuxiliaryAssets":82,"auxiliaryAssetsSize":9558204},"component---src-templates-vocabulary-template-js":{"name":"component---src-templates-vocabulary-template-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"e8647879-2a55d0bd4baeec3fd269.js","size":56717},{"name":"commons-042af59ccee387ac69c9.js","size":859073},{"name":"68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","size":50316},{"name":"1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","size":17325},{"name":"cc84befe9f3b078651796bc41bb16359c6cbd2f0-fcc42655014d72eeb49b.js","size":719263},{"name":"component---src-templates-vocabulary-template-js-f98daf0c731911440ea2.js","size":1525}],"filteredAssets":0,"assetsSize":1795732,"filteredAuxiliaryAssets":82,"auxiliaryAssetsSize":9557014}},"assetsByChunkName":{"polyfill":["webpack-runtime-f1d78a558bd0a329cac6.js","commons-042af59ccee387ac69c9.js","dc6a8720040df98778fe970bf6c000a41750d3ae-2bd38ff93dc85bdbe2d4.js","polyfill-e26ba5d48381e69dba68.js"],"app":["webpack-runtime-f1d78a558bd0a329cac6.js","styles.b89e8426c25f32642026.css","framework-fe20080b3088a9e05400.js","dc6a8720040df98778fe970bf6c000a41750d3ae-2bd38ff93dc85bdbe2d4.js","app-7487be8b990017a49a12.js"],"component---src-pages-404-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","commons-042af59ccee387ac69c9.js","component---src-pages-404-js-fa7c59f917df21d99cf8.js"],"component---src-pages-credits-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","commons-042af59ccee387ac69c9.js","component---src-pages-credits-js-e45df14e666616725d0a.js"],"component---src-pages-edit-page-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","commons-042af59ccee387ac69c9.js","component---src-pages-edit-page-js-46d1a94c69aaddf177ed.js"],"component---src-pages-missing-info-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","commons-042af59ccee387ac69c9.js","68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","component---src-pages-missing-info-js-71ef90ce0a303103360f.js"],"component---src-pages-profile-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","commons-042af59ccee387ac69c9.js","68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","component---src-pages-profile-js-6974f9ced1bd89cd2cd0.js"],"component---src-pages-report-issue-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","commons-042af59ccee387ac69c9.js","component---src-pages-report-issue-js-454358a9fe92a58740aa.js"],"component---src-pages-sign-in-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","commons-042af59ccee387ac69c9.js","68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","component---src-pages-sign-in-js-f72269660942911b5d11.js"],"component---src-pages-sign-up-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","commons-042af59ccee387ac69c9.js","68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","component---src-pages-sign-up-js-027fb446c35a0d079e44.js"],"component---src-templates-course-content-template-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","e8647879-2a55d0bd4baeec3fd269.js","commons-042af59ccee387ac69c9.js","68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","cc84befe9f3b078651796bc41bb16359c6cbd2f0-fcc42655014d72eeb49b.js","component---src-templates-course-content-template-js-1bcad4f1823dc6d4d917.js"],"component---src-templates-course-info-template-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","e8647879-2a55d0bd4baeec3fd269.js","commons-042af59ccee387ac69c9.js","68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","cc84befe9f3b078651796bc41bb16359c6cbd2f0-fcc42655014d72eeb49b.js","component---src-templates-course-info-template-js-8e9634ee8537c850fd8a.js"],"component---src-templates-course-part-overview-template-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","e8647879-2a55d0bd4baeec3fd269.js","commons-042af59ccee387ac69c9.js","68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","cc84befe9f3b078651796bc41bb16359c6cbd2f0-fcc42655014d72eeb49b.js","component---src-templates-course-part-overview-template-js-a7ea35c32a28a83c1a22.js"],"component---src-templates-info-page-template-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","e8647879-2a55d0bd4baeec3fd269.js","commons-042af59ccee387ac69c9.js","68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","cc84befe9f3b078651796bc41bb16359c6cbd2f0-fcc42655014d72eeb49b.js","component---src-templates-info-page-template-js-51c52531d4f995df939b.js"],"component---src-templates-vocabulary-template-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","e8647879-2a55d0bd4baeec3fd269.js","commons-042af59ccee387ac69c9.js","68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","cc84befe9f3b078651796bc41bb16359c6cbd2f0-fcc42655014d72eeb49b.js","component---src-templates-vocabulary-template-js-f98daf0c731911440ea2.js"]},"childAssetsByChunkName":{}} \ No newline at end of file +{"namedChunkGroups":{"polyfill":{"name":"polyfill","assets":[{"name":"webpack-runtime-e0a18af5b515cd69e75f.js","size":6602},{"name":"commons-b45a34d9f38c59e43d0c.js","size":859147},{"name":"dc6a8720040df98778fe970bf6c000a41750d3ae-2bd38ff93dc85bdbe2d4.js","size":12740},{"name":"polyfill-e26ba5d48381e69dba68.js","size":84904}],"filteredAssets":0,"assetsSize":963393,"filteredAuxiliaryAssets":6,"auxiliaryAssetsSize":4132264},"app":{"name":"app","assets":[{"name":"webpack-runtime-e0a18af5b515cd69e75f.js","size":6602},{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"framework-fe20080b3088a9e05400.js","size":129780},{"name":"dc6a8720040df98778fe970bf6c000a41750d3ae-2bd38ff93dc85bdbe2d4.js","size":12740},{"name":"app-7487be8b990017a49a12.js","size":155109}],"filteredAssets":0,"assetsSize":381563,"filteredAuxiliaryAssets":76,"auxiliaryAssetsSize":2266842},"component---src-pages-404-js":{"name":"component---src-pages-404-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"commons-b45a34d9f38c59e43d0c.js","size":859147},{"name":"component---src-pages-404-js-fa7c59f917df21d99cf8.js","size":522}],"filteredAssets":0,"assetsSize":951182,"filteredAuxiliaryAssets":78,"auxiliaryAssetsSize":6630995},"component---src-pages-credits-js":{"name":"component---src-pages-credits-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"commons-b45a34d9f38c59e43d0c.js","size":859147},{"name":"component---src-pages-credits-js-e45df14e666616725d0a.js","size":2429}],"filteredAssets":0,"assetsSize":953089,"filteredAuxiliaryAssets":78,"auxiliaryAssetsSize":6633796},"component---src-pages-edit-page-js":{"name":"component---src-pages-edit-page-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"commons-b45a34d9f38c59e43d0c.js","size":859147},{"name":"component---src-pages-edit-page-js-46d1a94c69aaddf177ed.js","size":4483}],"filteredAssets":0,"assetsSize":955143,"filteredAuxiliaryAssets":78,"auxiliaryAssetsSize":6644748},"component---src-pages-missing-info-js":{"name":"component---src-pages-missing-info-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"commons-b45a34d9f38c59e43d0c.js","size":859147},{"name":"68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","size":50316},{"name":"1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","size":17325},{"name":"component---src-pages-missing-info-js-71ef90ce0a303103360f.js","size":9690}],"filteredAssets":0,"assetsSize":1027991,"filteredAuxiliaryAssets":80,"auxiliaryAssetsSize":6937268},"component---src-pages-profile-js":{"name":"component---src-pages-profile-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"commons-b45a34d9f38c59e43d0c.js","size":859147},{"name":"68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","size":50316},{"name":"1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","size":17325},{"name":"component---src-pages-profile-js-6974f9ced1bd89cd2cd0.js","size":17182}],"filteredAssets":0,"assetsSize":1035483,"filteredAuxiliaryAssets":80,"auxiliaryAssetsSize":6965299},"component---src-pages-report-issue-js":{"name":"component---src-pages-report-issue-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"commons-b45a34d9f38c59e43d0c.js","size":859147},{"name":"component---src-pages-report-issue-js-454358a9fe92a58740aa.js","size":3771}],"filteredAssets":0,"assetsSize":954431,"filteredAuxiliaryAssets":78,"auxiliaryAssetsSize":6642758},"component---src-pages-sign-in-js":{"name":"component---src-pages-sign-in-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"commons-b45a34d9f38c59e43d0c.js","size":859147},{"name":"68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","size":50316},{"name":"component---src-pages-sign-in-js-f72269660942911b5d11.js","size":3859}],"filteredAssets":0,"assetsSize":1004835,"filteredAuxiliaryAssets":79,"auxiliaryAssetsSize":6855346},"component---src-pages-sign-up-js":{"name":"component---src-pages-sign-up-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"commons-b45a34d9f38c59e43d0c.js","size":859147},{"name":"68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","size":50316},{"name":"1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","size":17325},{"name":"component---src-pages-sign-up-js-027fb446c35a0d079e44.js","size":15876}],"filteredAssets":0,"assetsSize":1034177,"filteredAuxiliaryAssets":81,"auxiliaryAssetsSize":6961901},"component---src-templates-course-content-template-js":{"name":"component---src-templates-course-content-template-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"e8647879-2a55d0bd4baeec3fd269.js","size":56717},{"name":"commons-b45a34d9f38c59e43d0c.js","size":859147},{"name":"68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","size":50316},{"name":"1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","size":17325},{"name":"cc84befe9f3b078651796bc41bb16359c6cbd2f0-fcc42655014d72eeb49b.js","size":719263},{"name":"component---src-templates-course-content-template-js-1bcad4f1823dc6d4d917.js","size":5125}],"filteredAssets":0,"assetsSize":1799406,"filteredAuxiliaryAssets":82,"auxiliaryAssetsSize":9566117},"component---src-templates-course-info-template-js":{"name":"component---src-templates-course-info-template-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"e8647879-2a55d0bd4baeec3fd269.js","size":56717},{"name":"commons-b45a34d9f38c59e43d0c.js","size":859147},{"name":"68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","size":50316},{"name":"1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","size":17325},{"name":"cc84befe9f3b078651796bc41bb16359c6cbd2f0-fcc42655014d72eeb49b.js","size":719263},{"name":"component---src-templates-course-info-template-js-8e9634ee8537c850fd8a.js","size":2879}],"filteredAssets":0,"assetsSize":1797160,"filteredAuxiliaryAssets":82,"auxiliaryAssetsSize":9559122},"component---src-templates-course-part-overview-template-js":{"name":"component---src-templates-course-part-overview-template-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"e8647879-2a55d0bd4baeec3fd269.js","size":56717},{"name":"commons-b45a34d9f38c59e43d0c.js","size":859147},{"name":"68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","size":50316},{"name":"1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","size":17325},{"name":"cc84befe9f3b078651796bc41bb16359c6cbd2f0-fcc42655014d72eeb49b.js","size":719263},{"name":"component---src-templates-course-part-overview-template-js-a7ea35c32a28a83c1a22.js","size":2070}],"filteredAssets":0,"assetsSize":1796351,"filteredAuxiliaryAssets":82,"auxiliaryAssetsSize":9557665},"component---src-templates-info-page-template-js":{"name":"component---src-templates-info-page-template-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"e8647879-2a55d0bd4baeec3fd269.js","size":56717},{"name":"commons-b45a34d9f38c59e43d0c.js","size":859147},{"name":"68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","size":50316},{"name":"1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","size":17325},{"name":"cc84befe9f3b078651796bc41bb16359c6cbd2f0-fcc42655014d72eeb49b.js","size":719263},{"name":"component---src-templates-info-page-template-js-51c52531d4f995df939b.js","size":2694}],"filteredAssets":0,"assetsSize":1796975,"filteredAuxiliaryAssets":82,"auxiliaryAssetsSize":9558343},"component---src-templates-vocabulary-template-js":{"name":"component---src-templates-vocabulary-template-js","assets":[{"name":"styles.b89e8426c25f32642026.css","size":77332},{"name":"c16184b3-70c6bdec623e2863fc60.js","size":10788},{"name":"2cca2479-5d6bd31cf02ef4cb4b20.js","size":3393},{"name":"e8647879-2a55d0bd4baeec3fd269.js","size":56717},{"name":"commons-b45a34d9f38c59e43d0c.js","size":859147},{"name":"68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","size":50316},{"name":"1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","size":17325},{"name":"cc84befe9f3b078651796bc41bb16359c6cbd2f0-fcc42655014d72eeb49b.js","size":719263},{"name":"component---src-templates-vocabulary-template-js-f98daf0c731911440ea2.js","size":1525}],"filteredAssets":0,"assetsSize":1795806,"filteredAuxiliaryAssets":82,"auxiliaryAssetsSize":9557153}},"assetsByChunkName":{"polyfill":["webpack-runtime-e0a18af5b515cd69e75f.js","commons-b45a34d9f38c59e43d0c.js","dc6a8720040df98778fe970bf6c000a41750d3ae-2bd38ff93dc85bdbe2d4.js","polyfill-e26ba5d48381e69dba68.js"],"app":["webpack-runtime-e0a18af5b515cd69e75f.js","styles.b89e8426c25f32642026.css","framework-fe20080b3088a9e05400.js","dc6a8720040df98778fe970bf6c000a41750d3ae-2bd38ff93dc85bdbe2d4.js","app-7487be8b990017a49a12.js"],"component---src-pages-404-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","commons-b45a34d9f38c59e43d0c.js","component---src-pages-404-js-fa7c59f917df21d99cf8.js"],"component---src-pages-credits-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","commons-b45a34d9f38c59e43d0c.js","component---src-pages-credits-js-e45df14e666616725d0a.js"],"component---src-pages-edit-page-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","commons-b45a34d9f38c59e43d0c.js","component---src-pages-edit-page-js-46d1a94c69aaddf177ed.js"],"component---src-pages-missing-info-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","commons-b45a34d9f38c59e43d0c.js","68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","component---src-pages-missing-info-js-71ef90ce0a303103360f.js"],"component---src-pages-profile-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","commons-b45a34d9f38c59e43d0c.js","68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","component---src-pages-profile-js-6974f9ced1bd89cd2cd0.js"],"component---src-pages-report-issue-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","commons-b45a34d9f38c59e43d0c.js","component---src-pages-report-issue-js-454358a9fe92a58740aa.js"],"component---src-pages-sign-in-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","commons-b45a34d9f38c59e43d0c.js","68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","component---src-pages-sign-in-js-f72269660942911b5d11.js"],"component---src-pages-sign-up-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","commons-b45a34d9f38c59e43d0c.js","68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","component---src-pages-sign-up-js-027fb446c35a0d079e44.js"],"component---src-templates-course-content-template-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","e8647879-2a55d0bd4baeec3fd269.js","commons-b45a34d9f38c59e43d0c.js","68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","cc84befe9f3b078651796bc41bb16359c6cbd2f0-fcc42655014d72eeb49b.js","component---src-templates-course-content-template-js-1bcad4f1823dc6d4d917.js"],"component---src-templates-course-info-template-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","e8647879-2a55d0bd4baeec3fd269.js","commons-b45a34d9f38c59e43d0c.js","68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","cc84befe9f3b078651796bc41bb16359c6cbd2f0-fcc42655014d72eeb49b.js","component---src-templates-course-info-template-js-8e9634ee8537c850fd8a.js"],"component---src-templates-course-part-overview-template-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","e8647879-2a55d0bd4baeec3fd269.js","commons-b45a34d9f38c59e43d0c.js","68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","cc84befe9f3b078651796bc41bb16359c6cbd2f0-fcc42655014d72eeb49b.js","component---src-templates-course-part-overview-template-js-a7ea35c32a28a83c1a22.js"],"component---src-templates-info-page-template-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","e8647879-2a55d0bd4baeec3fd269.js","commons-b45a34d9f38c59e43d0c.js","68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","cc84befe9f3b078651796bc41bb16359c6cbd2f0-fcc42655014d72eeb49b.js","component---src-templates-info-page-template-js-51c52531d4f995df939b.js"],"component---src-templates-vocabulary-template-js":["styles.b89e8426c25f32642026.css","c16184b3-70c6bdec623e2863fc60.js","2cca2479-5d6bd31cf02ef4cb4b20.js","e8647879-2a55d0bd4baeec3fd269.js","commons-b45a34d9f38c59e43d0c.js","68272a89a1b042e3903e12a3152da1808a184a36-84221f4700e826eedf47.js","1d66764951084db883db07dda20028756fc8a649-7b1f1c531c96d37b6cc4.js","cc84befe9f3b078651796bc41bb16359c6cbd2f0-fcc42655014d72eeb49b.js","component---src-templates-vocabulary-template-js-f98daf0c731911440ea2.js"]},"childAssetsByChunkName":{}} \ No newline at end of file